You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
539 lines
17 KiB
539 lines
17 KiB
<?php
|
|
// +----------------------------------------------------------------------
|
|
// | Niucloud-admin 企业快速开发的多应用管理平台
|
|
// +----------------------------------------------------------------------
|
|
// | 官方网址:https://www.niucloud.com
|
|
// +----------------------------------------------------------------------
|
|
// | niucloud团队 版权所有 开源版本可自由商用
|
|
// +----------------------------------------------------------------------
|
|
// | Author: Niucloud Team
|
|
// +----------------------------------------------------------------------
|
|
|
|
namespace app\api\controller\apiController;
|
|
|
|
use app\Request;
|
|
use app\service\api\apiService\ContractService;
|
|
use app\service\api\apiService\ContractSignFormService;
|
|
use core\base\BaseApiService;
|
|
use think\facade\Db;
|
|
use think\facade\Log;
|
|
|
|
/**
|
|
* 合同管理控制器
|
|
* Class Contract
|
|
* @package app\api\controller\apiController
|
|
*/
|
|
class Contract extends BaseApiService
|
|
{
|
|
/**
|
|
* 获取我的合同列表
|
|
* @param Request $request
|
|
* @return mixed
|
|
*/
|
|
public function myContracts(Request $request)
|
|
{
|
|
$page = $request->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());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 下载合同文件
|
|
* @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;
|
|
}
|
|
|
|
// 调用DocumentTemplateService生成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'
|
|
];
|
|
|
|
$result = $documentService->generateDocument($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());
|
|
}
|
|
}
|
|
}
|