param('page', 1); $limit = $request->param('limit', 10); $where = [ 'personnel_id' => $this->member_id, 'page' => $page, 'limit' => $limit ]; try { $service = new ContractService(); $res = $service->getMyContracts($where); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('获取合同列表失败:' . $e->getMessage()); } } /** * 获取合同详情 * @param Request $request * @return mixed */ public function detail(Request $request) { $contract_id = $request->param('id', 0); if (empty($contract_id)) { return fail('合同ID不能为空'); } $where = [ 'id' => $contract_id ]; try { $service = new ContractService(); $res = $service->getContractDetail($where); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('获取合同详情失败:' . $e->getMessage()); } } /** * 签订合同 * @param Request $request * @return mixed */ public function sign(Request $request) { $contract_id = $request->param('contract_id', 0); $sign_file = $request->param('sign_file', ''); if (empty($contract_id)) { return fail('合同ID不能为空'); } if (empty($sign_file)) { return fail('签名文件不能为空'); } $data = [ 'contract_id' => $contract_id, 'personnel_id' => $this->member_id, 'sign_file' => $sign_file ]; try { $service = new ContractService(); $res = $service->signContract($data); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('签订合同失败:' . $e->getMessage()); } } /** * 获取合同签订状态 * @param Request $request * @return mixed */ public function signStatus(Request $request) { $contract_id = $request->param('contract_id', 0); if (empty($contract_id)) { return fail('合同ID不能为空'); } $where = [ 'contract_id' => $contract_id, 'personnel_id' => $this->member_id ]; try { $service = new ContractService(); $res = $service->getSignStatus($where); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('获取签订状态失败:' . $e->getMessage()); } } /** * 获取员工合同签署表单配置 * @param Request $request * @return mixed */ public function getSignForm(Request $request) { $contract_id = $request->param('contract_id', 0); if (empty($contract_id)) { return fail('合同ID不能为空'); } $where = [ 'contract_id' => $contract_id, 'personnel_id' => $this->member_id ]; try { $service = new ContractService(); $res = $service->getStaffContractSignForm($where); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('获取签署表单失败:' . $e->getMessage()); } } /** * 获取合同签署表单(根据contract_id获取完整数据) * @param Request $request * @return mixed */ public function signForm(Request $request) { $contract_id = $request->param('contract_id', 0); Log::info('signForm方法被调用', [ 'contract_id' => $contract_id, 'member_id' => $this->member_id ]); if (empty($contract_id)) { return fail('合同ID不能为空'); } try { $service = new ContractSignFormService(); $res = $service->getContractSignFormByContractId($contract_id); Log::info('signForm服务调用结果', [ 'contract_id' => $contract_id, 'result_code' => $res['code'], 'result_msg' => $res['msg'] ?? '' ]); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { Log::error('signForm异常', [ 'contract_id' => $contract_id, 'error' => $e->getMessage() ]); return fail('获取签署表单失败:' . $e->getMessage()); } } /** * 下载合同文件 * @param Request $request * @return mixed */ public function download(Request $request) { $contract_id = $request->param('contract_id', 0); if (empty($contract_id)) { return fail('合同ID不能为空'); } $where = [ 'contract_id' => $contract_id, 'personnel_id' => $this->member_id ]; try { $service = new ContractService(); $res = $service->downloadContract($where); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('下载合同失败:' . $e->getMessage()); } } /** * 获取学生合同签署表单配置 * @param Request $request * @return mixed */ public function getStudentContractSignForm(Request $request) { $contract_id = $request->param('contract_id', 0); $student_id = $request->param('student_id', 0); if (empty($contract_id)) { return fail('合同ID不能为空'); } if (empty($student_id)) { return fail('学生ID不能为空'); } $params = [ 'contract_id' => $contract_id, 'student_id' => $student_id ]; try { $service = new ContractSignFormService(); $res = $service->getStudentContractSignForm($params); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('获取签署表单失败:' . $e->getMessage()); } } /** * 根据签署记录ID获取学生合同签署表单配置(新方法) * 支持按签署关系区分不同订单的签署字段 * @param Request $request * @return mixed */ public function getStudentContractSignFormBySignId(Request $request) { $contract_sign_id = $request->param('contract_sign_id', 0); $student_id = $request->param('student_id', 0); if (empty($contract_sign_id)) { return fail('合同签署记录ID不能为空'); } if (empty($student_id)) { return fail('学生ID不能为空'); } $params = [ 'contract_sign_id' => $contract_sign_id, 'student_id' => $student_id ]; try { $service = new ContractSignFormService(); $res = $service->getStudentContractSignFormBySignId($params); if (!$res['code']) { return fail($res['msg']); } return success($res['data']); } catch (\Exception $e) { return fail('获取签署表单失败:' . $e->getMessage()); } } /** * 提交学生合同签署 * @param Request $request * @return mixed */ public function submitStudentContractSign(Request $request) { $contract_id = $request->param('contract_id', 0); $student_id = $request->param('student_id', 0); $form_data = $request->param('form_data', []); $signature_data = $request->param('signature_data', ''); if (empty($contract_id)) { return fail('合同ID不能为空'); } if (empty($student_id)) { return fail('学生ID不能为空'); } if (empty($form_data)) { return fail('表单数据不能为空'); } $params = [ 'contract_id' => $contract_id, 'student_id' => $student_id, 'form_data' => $form_data, 'signature_data' => $signature_data ]; try { $service = new ContractSignFormService(); $res = $service->submitStudentContractSign($params); if (!$res['code']) { return fail($res['msg']); } return success($res['data'], '合同签署成功'); } catch (\Exception $e) { return fail('合同签署失败:' . $e->getMessage()); } } /** * 员工端合同签署 * @param Request $request * @return mixed */ public function signStaffContract(Request $request) { $contract_id = $request->param('contract_id', 0); $contract_sign_id = $request->param('contract_sign_id', 0); $form_data = $request->param('form_data', []); $signature_image = $request->param('signature_image', ''); if (empty($contract_id)) { return fail('合同ID不能为空'); } if (empty($contract_sign_id)) { return fail('合同签署记录ID不能为空'); } $params = [ 'contract_id' => $contract_id, 'contract_sign_id' => $contract_sign_id, 'personnel_id' => $this->member_id, 'form_data' => $form_data, 'signature_image' => $signature_image ]; try { $service = new ContractSignFormService(); $res = $service->submitStaffContractSign($params); if (!$res['code']) { return fail($res['msg']); } return success($res['data'], '合同签署成功'); } catch (\Exception $e) { return fail('合同签署失败:' . $e->getMessage()); } } /** * 学员端合同签署 * @param Request $request * @return mixed */ public function signStudentContract(Request $request) { $contract_id = $request->param('contract_id', 0); $contract_sign_id = $request->param('contract_sign_id', 0); $student_id = $request->param('student_id', 0); $form_data = $request->param('form_data', []); $signature_image = $request->param('signature_image', ''); if (empty($contract_id)) { return fail('合同ID不能为空'); } if (empty($contract_sign_id)) { return fail('合同签署记录ID不能为空'); } if (empty($student_id)) { return fail('学生ID不能为空'); } $params = [ 'contract_id' => $contract_id, 'contract_sign_id' => $contract_sign_id, 'student_id' => $student_id, 'form_data' => $form_data, 'signature_image' => $signature_image ]; try { $service = new ContractSignFormService(); $res = $service->submitStudentContractSign($params); if (!$res['code']) { return fail($res['msg']); } return success($res['data'], '合同签署成功'); } catch (\Exception $e) { return fail('合同签署失败:' . $e->getMessage()); } } /** * 确认生成合同文档 * @param Request $request * @return mixed */ public function confirmGenerateContract(Request $request) { $contract_sign_id = $request->param('contract_sign_id', 0); if (empty($contract_sign_id)) { return fail('合同签署记录ID不能为空'); } try { // 获取合同签署记录信息 $contractSign = Db::table('school_contract_sign') ->where('id', $contract_sign_id) ->where('deleted_at', 0) ->find(); if (!$contractSign) { return fail('合同签署记录不存在'); } // 检查状态是否允许生成文档 if ($contractSign['status'] == 3) { return fail('合同文档已生成,无需重复生成'); } // 获取合同模板信息 $contract = Db::table('school_contract') ->where('id', $contractSign['contract_id']) ->where('deleted_at', 0) ->find(); if (!$contract) { return fail('合同模板不存在'); } // 使用ContractSignFormService的公共方法获取完整的表单数据(包括处理后的default_value) $contractSignFormService = new ContractSignFormService(); $signFormResult = $contractSignFormService->getStudentContractSignFormBySignId([ 'contract_sign_id' => $contract_sign_id, 'student_id' => $contractSign['student_id'] ]); if (!$signFormResult['code'] || empty($signFormResult['data']) || empty($signFormResult['data']['form_fields'])) { return fail($signFormResult['msg'] ?? '未找到合同字段配置数据'); } $signFormData = $signFormResult['data']; // 准备填充数据 - 使用处理后的default_value $fillData = []; foreach ($signFormData['form_fields'] as $field) { $placeholder = $field['placeholder']; $defaultValue = $field['default_value'] ?? ''; $fillData[$placeholder] = $defaultValue; } // 调试信息:记录填充数据 Log::info('准备的填充数据', [ 'contract_sign_id' => $contract_sign_id, 'fill_data_count' => count($fillData), 'fill_data' => $fillData ]); // 调用DocumentTemplateService的新XML字符串方法生成Word文档 $documentService = new \app\service\admin\document\DocumentTemplateService(); $generateData = [ 'template_id' => $contractSign['contract_id'], 'fill_data' => $fillData, 'output_filename' => $contract['contract_name'] . '_' . $contractSign['student_id'] . '_' . date('YmdHis') . '.docx', 'use_direct_values' => true // 直接使用已处理的值,不进行二次处理 ]; $result = $documentService->generateDocumentByXmlString($generateData); // 更新school_contract_sign表的sign_file字段和status字段 $updateResult = Db::table('school_contract_sign') ->where('id', $contract_sign_id) ->update([ 'sign_file' => '/upload/'.$result['file_path'], 'status' => 3, 'updated_at' => date('Y-m-d H:i:s') ]); if (!$updateResult) { return fail('更新合同签署记录失败'); } // 记录日志 Log::info('合同文档生成成功', [ 'contract_sign_id' => $contract_sign_id, 'contract_id' => $contractSign['contract_id'], 'student_id' => $contractSign['student_id'], 'file_path' => $result['file_path'] ]); return success([ 'file_path' => $result['file_path'], 'file_name' => $result['file_name'], 'download_url' => $result['download_url'] ], '合同文档生成成功'); } catch (\Exception $e) { // 记录错误日志 Log::error('合同文档生成失败', [ 'contract_sign_id' => $contract_sign_id, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return fail('合同文档生成失败:' . $e->getMessage()); } } }