Compare commits

...

3 Commits

  1. 10
      admin/src/app/views/contract/components/contract-edit.vue
  2. 2
      admin/src/app/views/customer_resources/customer_resources.vue
  3. 2
      niucloud/app/adminapi/controller/contract/Contract.php
  4. 29
      niucloud/app/api/controller/login/Login.php
  5. 18
      niucloud/app/api/controller/member/Member.php
  6. 2
      niucloud/app/api/route/file.php
  7. 6
      niucloud/app/api/route/member.php
  8. 4
      niucloud/app/api/route/route.php
  9. 16
      niucloud/app/common.php
  10. 21
      niucloud/app/listener/personnel/Student.php
  11. 4
      niucloud/app/service/admin/contract/ContractService.php
  12. 2
      niucloud/app/service/admin/course/CourseService.php
  13. 2
      niucloud/app/service/admin/customer_resources/CustomerResourcesService.php
  14. 47
      niucloud/app/service/api/member/MemberService.php
  15. 57
      niucloud/app/service/core/contract_sign/ContractSign.php
  16. 3
      niucloud/composer.json

10
admin/src/app/views/contract/components/contract-edit.vue

@ -8,6 +8,10 @@
<el-form-item :label="t('contractTemplate')">
<upload-file v-model="formData.contract_template" />
</el-form-item>
<el-form-item label="模板占位符" >
<el-input v-model="formData.placeholder" clearable placeholder="请输入模板占位符" class="input-width" />
</el-form-item>
<el-form-item :label="t('contractStatus')" prop="contract_status">
<el-select class="input-width" v-model="formData.contract_status" clearable :placeholder="t('contractStatusPlaceholder')">
@ -36,6 +40,9 @@
<el-form-item :label="t('remarks')" >
<el-input v-model="formData.remarks" clearable :placeholder="t('remarksPlaceholder')" class="input-width" />
</el-form-item>
</el-form>
@ -69,7 +76,8 @@ const initialFormData = {
contract_template: '',
contract_status: '',
contract_type: '',
remarks: '',
remarks: '',
placeholder:''
}
const formData: Record<string, any> = reactive({ ...initialFormData })

2
admin/src/app/views/customer_resources/customer_resources.vue

@ -265,7 +265,7 @@
if (pageName == '业绩分配') {
customerResourcesTable.searchParam.type = 'yjfp';
} else if (pageName == '客户资源列表') {
} else if (pageName == '客户资源') {
customerResourcesTable.searchParam.type = 'khzy';
} else if (pageName == '资源列表') {
customerResourcesTable.searchParam.type = 'zylb';

2
niucloud/app/adminapi/controller/contract/Contract.php

@ -55,6 +55,7 @@ class Contract extends BaseAdminController
["contract_status",""],
["contract_type",""],
["remarks",""],
["placeholder",""]
]);
$this->validate($data, 'app\validate\contract\Contract.add');
@ -74,6 +75,7 @@ class Contract extends BaseAdminController
["contract_status",""],
["contract_type",""],
["remarks",""],
["placeholder",""]
]);
$this->validate($data, 'app\validate\contract\Contract.edit');

29
niucloud/app/api/controller/login/Login.php

@ -13,6 +13,7 @@ namespace app\api\controller\login;
use app\dict\member\MemberLoginTypeDict;
use app\model\order_table\OrderTable;
use app\model\person_course_schedule\PersonCourseSchedule;
use app\model\sys\SysConfig;
use app\service\admin\sys\SystemService;
use app\service\api\captcha\CaptchaService;
@ -133,4 +134,32 @@ class Login extends BaseController
$order_info = $order->where(['id' => 8])->find();
event('Student', ['event_type' => 'add','order_info' => $order_info]);
}
//上课提醒
public function class_reminder(){
//上课提醒
$template_id = Db::name("template_message")->where(['id' => 3])->value('template_id');
$person_course_schedule = new PersonCourseSchedule();
$list = $person_course_schedule
->alias("a")
->join(['school_customer_resources' => 'b'],'a.resources_id = b.id','left')
->join(['school_member' => 'c'],'b.member_id = c.member_id','left')
->join(['school_course_schedule' => 'd'],'a.schedule_id = d.id','left')
->join(['school_course' => 'e'],'d.course_id = e.id','left')
->field("a.id,c.wx_openid,e.course_name,a.course_date,a.time_slot")
->select();
foreach ($list as $k=>$v){
sendMessage(
$v['wx_openid'],
$template_id,
[
'thing4' => $v['course_name'].',您有一节课程还有不到24小时就要开始了,如需请假请提前6小时发起请假操作。',
'thing6' => $v['course_date'].' '.$v['time_slot'],
'pagepath' => ''
]
);
}
}
}

18
niucloud/app/api/controller/member/Member.php

@ -131,15 +131,15 @@ class Member extends BaseApiController
['resource_id', ''],
['sales_id', ''], // 保留旧参数名称以保持兼容性
]);
// 优先使用resource_id,如果不存在则使用sales_id
$resource_id = !empty($data['resource_id']) ? $data['resource_id'] : $data['sales_id'];
// 记录日志
Log::debug("Member/list_call_up - 请求参数: resource_id={$resource_id}");
$result = (new MemberService())->list_call_up($resource_id);
return success($result);
}
@ -194,4 +194,14 @@ class Member extends BaseApiController
}
public function contract_sign(){
$data = $this->request->params([
[ 'contract_sign_id', '' ],
['pic_file','']
]);
return success(( new MemberService() )->contract_sign($data));
}
}

2
niucloud/app/api/route/file.php

@ -29,7 +29,7 @@ Route::group('file', function() {
Route::post('image/fetch', 'upload.Upload/imageFetch');
})->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class, true)
// ->middleware(ApiCheckToken::class, true)
->middleware(ApiLog::class);
/**

6
niucloud/app/api/route/member.php

@ -120,7 +120,7 @@ Route::group('member', function () {
Route::get('student_list', 'member.Member/student_list');
Route::get('sktj', 'member.Member/sktj');
Route::post('contract_sign', 'member.Member/contract_sign');
})->middleware(ApiChannel::class)
->middleware(ApiPersonnelCheckToken::class, true)
@ -129,6 +129,8 @@ Route::group('member', function () {
Route::group('member', function () {
/***************************************************** 会员管理 ****************************************************/
//会员日志
Route::post('log', 'member.Member/log');
@ -139,5 +141,5 @@ Route::group('member', function () {
/***************************************************** 会员等级 **************************************************/
Route::get('level', 'member.Level/lists');
})->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class)
// ->middleware(ApiCheckToken::class)
->middleware(ApiLog::class);

4
niucloud/app/api/route/route.php

@ -154,6 +154,8 @@ Route::group(function () {
Route::get('test', 'login.Login/test');
Route::get('class_reminder', 'login.Login/class_reminder');
})->middleware(ApiChannel::class)
->middleware(ApiCheckToken::class)
->middleware(ApiLog::class);
@ -438,7 +440,7 @@ Route::group(function () {
Route::get('xy/personCourseSchedule/getMyCoach', 'apiController.PersonCourseSchedule/getMyCoach');
//学生端-学生课程安排-学员课时消费记录
Route::get('xy/personCourseSchedule/getStudentCourseUsageList', 'apiController.PersonCourseSchedule/getStudentCourseUsageList');
//获取学生课程信息列表(包含教练配置)
Route::get('getStudentCourseInfo', 'apiController.PersonCourseSchedule/getStudentCourseInfo');
//获取人员列表(教练、教务、助教)

16
niucloud/app/common.php

@ -1414,6 +1414,22 @@ function sendMessage($touser,$template_id,$value) {
];
}
if($template_id == 'SWODTQvQPaucMnDrszdYSy5wg5_24FIlyXZqxwbjRT8'){
$data = [
'touser' => $touser,
'template_id' => $template_id,
'data' => [
'thing4' => ['value' => $value['thing4'], 'color' => '#173177'],
'thing6' => ['value' => $value['thing6'], 'color' => '#173177']
],
'miniprogram' => [
"appid" => "wxaee2df4a4b31df05",
"pagepath" => $value['pagepath']
]
];
}
// 发送 POST 请求
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

21
niucloud/app/listener/personnel/Student.php

@ -14,6 +14,8 @@ namespace app\listener\personnel;
use app\model\class_resources_rel\ClassResourcesRel;
use app\model\contract\Contract;
use app\model\contract_sign\ContractSign;
use app\model\course\Course;
use app\model\course_schedule\CourseSchedule;
use app\model\customer_resources\CustomerResources;
@ -115,9 +117,22 @@ class Student
]);
}
$contract = new Contract();
$contract_info = $contract
->alias("a")
->join(['school_course' => 'b'],'a.id = b.contract_id','left')
->where(['b.id' => $order_info['course_id']])
->field("a.id,a.contract_template")
->find();
$contract_sign = new ContractSign();
$contract_sign->insert([
'contract_id' => $contract_info['id'],
'personnel_id' => $order_info['resource_id'],
'sign_file' => $contract_info['contract_template'],
'type' => 2
]);
}

4
niucloud/app/service/admin/contract/ContractService.php

@ -37,7 +37,7 @@ class ContractService extends BaseAdminService
*/
public function getPage(array $where = [])
{
$field = 'id,contract_name,contract_template,contract_status,contract_type,remarks,created_at,updated_at,deleted_at';
$field = 'id,contract_name,placeholder,contract_template,contract_status,contract_type,remarks,created_at,updated_at,deleted_at';
$order = 'id desc';
$search_model = $this->model->withSearch(["contract_status","contract_type","created_at"], $where)->field($field)->order($order);
@ -52,7 +52,7 @@ class ContractService extends BaseAdminService
*/
public function getInfo(int $id)
{
$field = 'id,contract_name,contract_template,contract_status,contract_type,remarks,created_at,updated_at,deleted_at';
$field = 'id,contract_name,placeholder,contract_template,contract_status,contract_type,remarks,created_at,updated_at,deleted_at';
$info = $this->model->field($field)->where([['id', "=", $id]])->findOrEmpty()->toArray();
return $info;

2
niucloud/app/service/admin/course/CourseService.php

@ -47,7 +47,7 @@ class CourseService extends BaseAdminService
public function contract_all(){
$contract = new Contract();
$list = $contract->select()->toArray();
$list = $contract->where(['contract_type' => '外部','contract_status' => '可用'])->select()->toArray();
return $list;
}

2
niucloud/app/service/admin/customer_resources/CustomerResourcesService.php

@ -156,7 +156,7 @@ class CustomerResourcesService extends BaseAdminService
$resourceSharing = new ResourceSharing();
$personnel = new Personnel();
$data['consultant'] = $personnel->where(['sys_user_id' => $this->uid])->value("id");
// $data['consultant'] = 3;
if (!$data['consultant']) {
return fail("超级管理员不允许添加资源");
}

47
niucloud/app/service/api/member/MemberService.php

@ -16,6 +16,7 @@ use app\model\attendance\Attendance;
use app\model\campus\Campus;
use app\model\class_resources_rel\ClassResourcesRel;
use app\model\communication_records\CommunicationRecords;
use app\model\contract_sign\ContractSign;
use app\model\course_schedule\CourseSchedule;
use app\model\member\Member;
use app\model\person_course_schedule\PersonCourseSchedule;
@ -191,43 +192,43 @@ class MemberService extends BaseApiService
private function log($level, $message) {
Log::$level('MemberService: ' . $message);
}
public function list_call_up($resource_id)
{
$communication = new CommunicationRecords();
// 添加日志记录以便调试
$this->log('debug', "list_call_up请求参数: resource_id={$resource_id}");
try {
// 检查resource_id是否有效
if (empty($resource_id)) {
$this->log('warning', "list_call_up: resource_id为空");
return [];
}
// 查询前打印SQL查询条件
$sqlDebug = "SELECT * FROM school_communication_records WHERE resource_id = '{$resource_id}' ORDER BY communication_time DESC";
$this->log('debug', "list_call_up对应SQL: {$sqlDebug}");
// 执行查询
$result = $communication->where('resource_id', $resource_id)
->order('communication_time DESC')
->select()->toArray();
// 如果没有结果,尝试使用原生 SQL 查询检查记录存在性
if (empty($result)) {
$this->log('debug', "list_call_up: 主要查询没有结果,尝试直接查询表");
$rawResult = $communication->query("SELECT COUNT(*) as count FROM school_communication_records WHERE resource_id = '{$resource_id}'");
$count = $rawResult[0]['count'] ?? 0;
$this->log('debug', "list_call_up: 原生SQL查询结果数量: {$count}");
// 如果原生查询有结果但模型查询没结果,尝试直接使用原生查询
if ($count > 0) {
$this->log('debug', "list_call_up: 检测到数据存在,使用原生查询获取");
$result = $communication->query("SELECT * FROM school_communication_records WHERE resource_id = '{$resource_id}' ORDER BY communication_time DESC");
}
}
$this->log('debug', "list_call_up查询结果数量: " . count($result));
return $result;
} catch (\Exception $e) {
@ -446,4 +447,36 @@ class MemberService extends BaseApiService
return $results;
}
public function contract_sign(array $data){
$contract_sign = new ContractSign();
$signService = (new \app\service\core\contract_sign\ContractSign());
$info = $contract_sign
->alias("a")
->join(['school_contract' => 'b'],'a.contract_id = b.id',"left")
->where(['a.id' => $data['contract_sign_id']])
->field("a.*,b.placeholder")
->find();
$file_name = 'upload/'.date("YmdHis").time().'.docx';
$outputPath = root_path() . '/public/'.$file_name;
$signService->setSign(
root_path().'/public/'.$info['sign_file'],
$outputPath,
$data['pic_file'],
$info['placeholder']
);
$contract_sign->where(['id' => $data['contract_sign_id']])->update([
'sign_file' => $file_name,
'status' => 2,
'sign_time' => date('Y-m-d H:i:s')
]);
return true;
}
}

57
niucloud/app/service/core/contract_sign/ContractSign.php

@ -0,0 +1,57 @@
<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\core\contract_sign;
use PhpOffice\PhpWord\TemplateProcessor;
use core\base\BaseCoreService;
/**
* 素材管理服务层
* Class CoreAttachmentService
* @package app\service\core\sys
*/
class ContractSign extends BaseCoreService
{
public function setSign($templatePath,$outputPath,$signImagePath,$placeholder)
{
// $templatePath = root_path() . 'public/upload/attachment/document/document/202507/03/1751535235ccad2afa1b71ee025dc8087942058957_local.docx';
// $outputPath = root_path() . 'public/uploads/result_signed.docx';
// $signImagePath = root_path() . 'public/uploads/student_sign.png';
$tempImagePath = root_path() . '/public/upload/'.date("YmdHis").time() .'.jpg';
$imageContent = file_get_contents($signImagePath);
if ($imageContent === false) {
exit('图片下载失败');
}
file_put_contents($tempImagePath, $imageContent);
if (!file_exists($templatePath)) {
exit('模板文件不存在');
}
$templateProcessor = new TemplateProcessor($templatePath);
$templateProcessor->setImageValue($placeholder, [
'path' => $tempImagePath,
'width' => 120,
'height' => 50,
'ratio' => false,
]);
$templateProcessor->saveAs($outputPath);
return true;
}
}

3
niucloud/composer.json

@ -59,7 +59,8 @@
"workerman/crontab": "v1.0.6",
"hyperf/pimple": "~2.2.0",
"365taofang/huaweicloud-sdk-php-obs": "^3.23",
"ext-openssl": "*"
"ext-openssl": "*",
"phpoffice/phpword": "^1.3"
},
"require-dev": {
"symfony/var-dumper": "v6.0.19",

Loading…
Cancel
Save