|
|
|
@ -581,79 +581,6 @@ class ContractSignFormService extends BaseApiService |
|
|
|
return (string)$value; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 提交学员合同签署数据 |
|
|
|
* 处理移动端提交的合同签署表单数据 |
|
|
|
* 验证数据完整性并保存到数据库 |
|
|
|
* |
|
|
|
* @param array $params 提交参数 |
|
|
|
* - contract_id: 合同模板ID |
|
|
|
* - student_id: 学员ID |
|
|
|
* - form_data: 表单数据数组 |
|
|
|
* @return array 提交结果 |
|
|
|
*/ |
|
|
|
public function submitStudentContractSign(array $params) |
|
|
|
{ |
|
|
|
try { |
|
|
|
// 验证必要参数 |
|
|
|
if (empty($params['contract_id']) || empty($params['student_id']) || empty($params['form_data'])) { |
|
|
|
throw new \Exception('缺少必要参数'); |
|
|
|
} |
|
|
|
|
|
|
|
$contract_id = (int)$params['contract_id']; |
|
|
|
$student_id = (int)$params['student_id']; |
|
|
|
$form_data = $params['form_data']; |
|
|
|
|
|
|
|
Log::info('开始处理学员合同签署提交', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'student_id' => $student_id, |
|
|
|
'form_data_keys' => array_keys($form_data) |
|
|
|
]); |
|
|
|
|
|
|
|
// 验证合同和学员是否存在 |
|
|
|
$contract = $this->getContractInfo($contract_id); |
|
|
|
if (!$contract) { |
|
|
|
throw new \Exception('合同模板不存在'); |
|
|
|
} |
|
|
|
|
|
|
|
$student = $this->getStudentInfo($student_id); |
|
|
|
if (!$student) { |
|
|
|
throw new \Exception('学员信息不存在'); |
|
|
|
} |
|
|
|
|
|
|
|
// 保存签署记录 |
|
|
|
$sign_id = $this->saveContractSignRecord($contract_id, $student_id, $form_data); |
|
|
|
|
|
|
|
if ($sign_id) { |
|
|
|
Log::info('学员合同签署成功', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'student_id' => $student_id, |
|
|
|
'sign_id' => $sign_id |
|
|
|
]); |
|
|
|
|
|
|
|
return [ |
|
|
|
'code' => 1, |
|
|
|
'msg' => '合同签署成功', |
|
|
|
'data' => ['sign_id' => $sign_id] |
|
|
|
]; |
|
|
|
} else { |
|
|
|
throw new \Exception('保存签署记录失败'); |
|
|
|
} |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Log::error('学员合同签署失败', [ |
|
|
|
'params' => $params, |
|
|
|
'error' => $e->getMessage(), |
|
|
|
'trace' => $e->getTraceAsString() |
|
|
|
]); |
|
|
|
|
|
|
|
return [ |
|
|
|
'code' => 0, |
|
|
|
'msg' => $e->getMessage(), |
|
|
|
'data' => [] |
|
|
|
]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存合同签署记录 |
|
|
|
@ -895,4 +822,455 @@ class ContractSignFormService extends BaseApiService |
|
|
|
return ''; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 员工端合同签署提交 |
|
|
|
* 处理员工端提交的合同签署表单数据,员工可以填写甲乙双方所有字段 |
|
|
|
* |
|
|
|
* @param array $params 提交参数 |
|
|
|
* - contract_id: 合同模板ID |
|
|
|
* - contract_sign_id: 合同签署记录ID |
|
|
|
* - personnel_id: 员工ID |
|
|
|
* - form_data: 表单数据数组 |
|
|
|
* - signature_image: 签名图片数据 |
|
|
|
* @return array 提交结果 |
|
|
|
*/ |
|
|
|
public function submitStaffContractSign(array $params) |
|
|
|
{ |
|
|
|
try { |
|
|
|
// 验证必要参数 |
|
|
|
if (empty($params['contract_id']) || empty($params['contract_sign_id']) || empty($params['personnel_id'])) { |
|
|
|
throw new \Exception('缺少必要参数:contract_id、contract_sign_id、personnel_id'); |
|
|
|
} |
|
|
|
|
|
|
|
$contract_id = (int)$params['contract_id']; |
|
|
|
$contract_sign_id = (int)$params['contract_sign_id']; |
|
|
|
$personnel_id = (int)$params['personnel_id']; |
|
|
|
$form_data = $params['form_data'] ?? []; |
|
|
|
$signature_image = $params['signature_image'] ?? ''; |
|
|
|
|
|
|
|
Log::info('开始处理员工端合同签署提交', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'personnel_id' => $personnel_id, |
|
|
|
'form_data_keys' => array_keys($form_data) |
|
|
|
]); |
|
|
|
|
|
|
|
// 验证合同签署记录是否存在 |
|
|
|
$sign_record = Db::table('school_contract_sign') |
|
|
|
->where('id', $contract_sign_id) |
|
|
|
->where('contract_id', $contract_id) |
|
|
|
->find(); |
|
|
|
|
|
|
|
if (!$sign_record) { |
|
|
|
throw new \Exception('合同签署记录不存在'); |
|
|
|
} |
|
|
|
|
|
|
|
// 验证员工是否存在 |
|
|
|
$personnel = Db::table('school_personnel') |
|
|
|
->where('id', $personnel_id) |
|
|
|
->where('status', 1) |
|
|
|
->find(); |
|
|
|
|
|
|
|
if (!$personnel) { |
|
|
|
throw new \Exception('员工信息不存在'); |
|
|
|
} |
|
|
|
|
|
|
|
// 事务处理 |
|
|
|
Db::startTrans(); |
|
|
|
try { |
|
|
|
// 1. 保存表单数据到 school_document_data_source_config 表 |
|
|
|
$this->saveFormDataToConfig($contract_id, $contract_sign_id, $form_data, 'staff'); |
|
|
|
|
|
|
|
// 2. 更新合同签署记录状态 |
|
|
|
$this->updateContractSignStatus($contract_sign_id, $personnel_id, $signature_image); |
|
|
|
|
|
|
|
Db::commit(); |
|
|
|
|
|
|
|
Log::info('员工端合同签署成功', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'personnel_id' => $personnel_id |
|
|
|
]); |
|
|
|
|
|
|
|
return [ |
|
|
|
'code' => 1, |
|
|
|
'msg' => '合同签署成功', |
|
|
|
'data' => ['contract_sign_id' => $contract_sign_id] |
|
|
|
]; |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Db::rollback(); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Log::error('员工端合同签署失败', [ |
|
|
|
'params' => $params, |
|
|
|
'error' => $e->getMessage(), |
|
|
|
'trace' => $e->getTraceAsString() |
|
|
|
]); |
|
|
|
|
|
|
|
return [ |
|
|
|
'code' => 0, |
|
|
|
'msg' => $e->getMessage(), |
|
|
|
'data' => [] |
|
|
|
]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 学员端合同签署提交(新版本) |
|
|
|
* 处理学员端提交的合同签署表单数据,学员只能填写乙方字段 |
|
|
|
* |
|
|
|
* @param array $params 提交参数 |
|
|
|
* - contract_id: 合同模板ID |
|
|
|
* - contract_sign_id: 合同签署记录ID |
|
|
|
* - student_id: 学员ID |
|
|
|
* - form_data: 表单数据数组 |
|
|
|
* - signature_image: 签名图片数据 |
|
|
|
* @return array 提交结果 |
|
|
|
*/ |
|
|
|
public function submitStudentContractSign(array $params) |
|
|
|
{ |
|
|
|
try { |
|
|
|
// 验证必要参数 |
|
|
|
if (empty($params['contract_id']) || empty($params['contract_sign_id']) || empty($params['student_id'])) { |
|
|
|
throw new \Exception('缺少必要参数:contract_id、contract_sign_id、student_id'); |
|
|
|
} |
|
|
|
|
|
|
|
$contract_id = (int)$params['contract_id']; |
|
|
|
$contract_sign_id = (int)$params['contract_sign_id']; |
|
|
|
$student_id = (int)$params['student_id']; |
|
|
|
$form_data = $params['form_data'] ?? []; |
|
|
|
$signature_image = $params['signature_image'] ?? ''; |
|
|
|
|
|
|
|
Log::info('开始处理学员端合同签署提交', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'student_id' => $student_id, |
|
|
|
'form_data_keys' => array_keys($form_data) |
|
|
|
]); |
|
|
|
|
|
|
|
// 验证合同签署记录是否存在 |
|
|
|
$sign_record = Db::table('school_contract_sign') |
|
|
|
->where('id', $contract_sign_id) |
|
|
|
->where('contract_id', $contract_id) |
|
|
|
->where('student_id', $student_id) |
|
|
|
->find(); |
|
|
|
|
|
|
|
if (!$sign_record) { |
|
|
|
throw new \Exception('合同签署记录不存在'); |
|
|
|
} |
|
|
|
|
|
|
|
// 验证学员是否存在 |
|
|
|
$student = Db::table('school_student') |
|
|
|
->where('id', $student_id) |
|
|
|
->where('status', 1) |
|
|
|
->find(); |
|
|
|
|
|
|
|
if (!$student) { |
|
|
|
throw new \Exception('学员信息不存在'); |
|
|
|
} |
|
|
|
|
|
|
|
// 事务处理 |
|
|
|
Db::startTrans(); |
|
|
|
try { |
|
|
|
// 1. 过滤学员端只能填写的字段(乙方字段) |
|
|
|
$filtered_form_data = $this->filterStudentFormData($contract_id, $contract_sign_id, $form_data); |
|
|
|
|
|
|
|
// 2. 保存表单数据到 school_document_data_source_config 表 |
|
|
|
$this->saveFormDataToConfig($contract_id, $contract_sign_id, $filtered_form_data, 'student'); |
|
|
|
|
|
|
|
// 3. 更新合同签署记录状态 |
|
|
|
$this->updateContractSignStatus($contract_sign_id, null, $signature_image, $student_id); |
|
|
|
|
|
|
|
Db::commit(); |
|
|
|
|
|
|
|
Log::info('学员端合同签署成功', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'student_id' => $student_id |
|
|
|
]); |
|
|
|
|
|
|
|
return [ |
|
|
|
'code' => 1, |
|
|
|
'msg' => '合同签署成功', |
|
|
|
'data' => ['contract_sign_id' => $contract_sign_id] |
|
|
|
]; |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Db::rollback(); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Log::error('学员端合同签署失败', [ |
|
|
|
'params' => $params, |
|
|
|
'error' => $e->getMessage(), |
|
|
|
'trace' => $e->getTraceAsString() |
|
|
|
]); |
|
|
|
|
|
|
|
return [ |
|
|
|
'code' => 0, |
|
|
|
'msg' => $e->getMessage(), |
|
|
|
'data' => [] |
|
|
|
]; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 保存表单数据到 school_document_data_source_config 表的 default_value 字段 |
|
|
|
* 这是核心方法,确保数据正确写入到指定表中 |
|
|
|
* |
|
|
|
* @param int $contract_id 合同模板ID |
|
|
|
* @param int $contract_sign_id 合同签署记录ID |
|
|
|
* @param array $form_data 表单数据 |
|
|
|
* @param string $user_type 用户类型(staff/student) |
|
|
|
* @return bool |
|
|
|
*/ |
|
|
|
private function saveFormDataToConfig($contract_id, $contract_sign_id, $form_data, $user_type) |
|
|
|
{ |
|
|
|
try { |
|
|
|
Log::info('开始保存表单数据到 school_document_data_source_config', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'user_type' => $user_type, |
|
|
|
'form_data_count' => count($form_data) |
|
|
|
]); |
|
|
|
|
|
|
|
$now = date('Y-m-d H:i:s'); |
|
|
|
$success_count = 0; |
|
|
|
$total_count = count($form_data); |
|
|
|
|
|
|
|
foreach ($form_data as $placeholder => $value) { |
|
|
|
// 检查该字段配置是否已存在 |
|
|
|
$existing_config = Db::table('school_document_data_source_config') |
|
|
|
->where('contract_id', $contract_id) |
|
|
|
->where('contract_sign_id', $contract_sign_id) |
|
|
|
->where('placeholder', $placeholder) |
|
|
|
->find(); |
|
|
|
|
|
|
|
if ($existing_config) { |
|
|
|
// 更新已存在的配置记录的 default_value 字段 |
|
|
|
$update_result = Db::table('school_document_data_source_config') |
|
|
|
->where('id', $existing_config['id']) |
|
|
|
->update([ |
|
|
|
'default_value' => (string)$value, |
|
|
|
'updated_at' => $now, |
|
|
|
'updated_by' => $user_type |
|
|
|
]); |
|
|
|
|
|
|
|
if ($update_result) { |
|
|
|
$success_count++; |
|
|
|
Log::info('更新字段配置成功', [ |
|
|
|
'config_id' => $existing_config['id'], |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'value' => $value |
|
|
|
]); |
|
|
|
} else { |
|
|
|
Log::warning('更新字段配置失败', [ |
|
|
|
'config_id' => $existing_config['id'], |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'value' => $value |
|
|
|
]); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 创建新的配置记录(这种情况说明配置数据可能缺失) |
|
|
|
$config_data = [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'data_type' => 'user_input', // 默认为用户输入类型 |
|
|
|
'field_type' => 'text', // 默认为文本类型 |
|
|
|
'default_value' => (string)$value, |
|
|
|
'is_required' => 0, |
|
|
|
'sign_party' => '', // 需要根据字段名推断甲乙方 |
|
|
|
'created_at' => $now, |
|
|
|
'updated_at' => $now, |
|
|
|
'created_by' => $user_type, |
|
|
|
'updated_by' => $user_type, |
|
|
|
'deleted_at' => 0 |
|
|
|
]; |
|
|
|
|
|
|
|
$insert_result = Db::table('school_document_data_source_config')->insertGetId($config_data); |
|
|
|
|
|
|
|
if ($insert_result) { |
|
|
|
$success_count++; |
|
|
|
Log::info('创建字段配置成功', [ |
|
|
|
'config_id' => $insert_result, |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'value' => $value |
|
|
|
]); |
|
|
|
} else { |
|
|
|
Log::warning('创建字段配置失败', [ |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'value' => $value |
|
|
|
]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Log::info('表单数据保存完成', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'user_type' => $user_type, |
|
|
|
'total_count' => $total_count, |
|
|
|
'success_count' => $success_count |
|
|
|
]); |
|
|
|
|
|
|
|
// 如果所有数据都保存成功,返回 true |
|
|
|
return $success_count === $total_count; |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Log::error('保存表单数据到配置表失败', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'user_type' => $user_type, |
|
|
|
'error' => $e->getMessage(), |
|
|
|
'trace' => $e->getTraceAsString() |
|
|
|
]); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 过滤学员端表单数据,只保留乙方字段 |
|
|
|
* |
|
|
|
* @param int $contract_id 合同模板ID |
|
|
|
* @param int $contract_sign_id 合同签署记录ID |
|
|
|
* @param array $form_data 原始表单数据 |
|
|
|
* @return array 过滤后的表单数据 |
|
|
|
*/ |
|
|
|
private function filterStudentFormData($contract_id, $contract_sign_id, $form_data) |
|
|
|
{ |
|
|
|
try { |
|
|
|
// 获取该签署记录的字段配置 |
|
|
|
$configs = Db::table('school_document_data_source_config') |
|
|
|
->where('contract_id', $contract_id) |
|
|
|
->where('contract_sign_id', $contract_sign_id) |
|
|
|
->select() |
|
|
|
->toArray(); |
|
|
|
|
|
|
|
$filtered_data = []; |
|
|
|
|
|
|
|
foreach ($form_data as $placeholder => $value) { |
|
|
|
// 查找对应的字段配置 |
|
|
|
$config = array_filter($configs, function($c) use ($placeholder) { |
|
|
|
return $c['placeholder'] === $placeholder; |
|
|
|
}); |
|
|
|
|
|
|
|
if (!empty($config)) { |
|
|
|
$config = array_values($config)[0]; |
|
|
|
$sign_party = $config['sign_party'] ?? ''; |
|
|
|
|
|
|
|
// 学员只能填写乙方字段 |
|
|
|
if (in_array($sign_party, ['second_party', 'party_b', '乙方', ''])) { |
|
|
|
$filtered_data[$placeholder] = $value; |
|
|
|
Log::info('学员字段通过过滤', [ |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'sign_party' => $sign_party, |
|
|
|
'value' => $value |
|
|
|
]); |
|
|
|
} else { |
|
|
|
Log::warning('学员字段被过滤', [ |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'sign_party' => $sign_party, |
|
|
|
'reason' => '学员只能填写乙方字段' |
|
|
|
]); |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 如果没有找到配置,保守处理:允许提交但记录警告 |
|
|
|
$filtered_data[$placeholder] = $value; |
|
|
|
Log::warning('未找到字段配置,默认允许', [ |
|
|
|
'placeholder' => $placeholder, |
|
|
|
'value' => $value |
|
|
|
]); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
Log::info('学员表单数据过滤完成', [ |
|
|
|
'original_count' => count($form_data), |
|
|
|
'filtered_count' => count($filtered_data) |
|
|
|
]); |
|
|
|
|
|
|
|
return $filtered_data; |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Log::error('过滤学员表单数据失败', [ |
|
|
|
'contract_id' => $contract_id, |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'error' => $e->getMessage() |
|
|
|
]); |
|
|
|
// 出现异常时返回原始数据,避免阻断流程 |
|
|
|
return $form_data; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 更新合同签署记录状态 |
|
|
|
* |
|
|
|
* @param int $contract_sign_id 合同签署记录ID |
|
|
|
* @param int|null $personnel_id 员工ID(员工签署时传入) |
|
|
|
* @param string $signature_image 签名图片 |
|
|
|
* @param int|null $student_id 学员ID(学员签署时传入) |
|
|
|
* @return bool |
|
|
|
*/ |
|
|
|
private function updateContractSignStatus($contract_sign_id, $personnel_id = null, $signature_image = '', $student_id = null) |
|
|
|
{ |
|
|
|
try { |
|
|
|
$now = date('Y-m-d H:i:s'); |
|
|
|
|
|
|
|
$update_data = [ |
|
|
|
'sign_status' => 1, // 已签署 |
|
|
|
'sign_time' => $now, |
|
|
|
'updated_at' => $now |
|
|
|
]; |
|
|
|
|
|
|
|
// 如果是员工签署,记录员工ID |
|
|
|
if ($personnel_id) { |
|
|
|
$update_data['personnel_id'] = $personnel_id; |
|
|
|
$update_data['signed_by'] = 'staff'; |
|
|
|
} |
|
|
|
|
|
|
|
// 如果是学员签署,确保学员ID正确 |
|
|
|
if ($student_id) { |
|
|
|
$update_data['signed_by'] = 'student'; |
|
|
|
} |
|
|
|
|
|
|
|
// 如果有签名图片,保存签名图片路径 |
|
|
|
if (!empty($signature_image)) { |
|
|
|
$update_data['signature_image'] = $signature_image; |
|
|
|
} |
|
|
|
|
|
|
|
$result = Db::table('school_contract_sign') |
|
|
|
->where('id', $contract_sign_id) |
|
|
|
->update($update_data); |
|
|
|
|
|
|
|
if ($result) { |
|
|
|
Log::info('合同签署记录状态更新成功', [ |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'personnel_id' => $personnel_id, |
|
|
|
'student_id' => $student_id, |
|
|
|
'signature_image_length' => strlen($signature_image) |
|
|
|
]); |
|
|
|
return true; |
|
|
|
} else { |
|
|
|
Log::warning('合同签署记录状态更新失败', [ |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'update_data' => $update_data |
|
|
|
]); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
Log::error('更新合同签署记录状态失败', [ |
|
|
|
'contract_sign_id' => $contract_sign_id, |
|
|
|
'personnel_id' => $personnel_id, |
|
|
|
'student_id' => $student_id, |
|
|
|
'error' => $e->getMessage() |
|
|
|
]); |
|
|
|
throw $e; |
|
|
|
} |
|
|
|
} |
|
|
|
} |