diff --git a/src/views/oa/erp/contractInfo/edit.vue b/src/views/oa/erp/contractInfo/edit.vue index 22dc4af..a29e015 100644 --- a/src/views/oa/erp/contractInfo/edit.vue +++ b/src/views/oa/erp/contractInfo/edit.vue @@ -4,6 +4,17 @@ 合同{{ form.contractId ? ' - 修改' : ' - 新增' }} + + @@ -199,10 +210,10 @@ - + - 保 存 + submitForm('draft', false)">保 存 返 回 @@ -349,6 +360,11 @@ + + + + + @@ -360,6 +376,9 @@ import { ContractMaterialVO, ContractMaterialForm } from '@/api/oa/erp/contractM import { getBaseUnitInfoList } from '@/api/oa/base/unitInfo'; import { getRuleGenerateCode } from '@/api/system/codeRule'; import SaleMaterialSelect from '@/components/SaleMaterialSelect/index.vue'; +import SubmitVerify from '@/components/Process/submitVerify.vue'; +import ApprovalRecord from '@/components/Process/approvalRecord.vue'; +import ApprovalButton from '@/components/Process/approvalButton.vue'; import { ref } from 'vue'; import { listDept } from '@/api/system/dept'; import { getCrmCustomerInfoList } from '@/api/oa/crm/customerInfo'; @@ -367,6 +386,9 @@ import { getBasePrintTemplateList } from '@/api/oa/base/printTemplate'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; + +// 路由参数 +const routeParams = ref>({}); const { contract_category, business_direction, active_flag, contract_flag, contract_type, contract_status, plan_flag } = toRefs( proxy?.useDict('contract_category', 'business_direction', 'active_flag', 'contract_flag', 'contract_type', 'contract_status', 'plan_flag') ); @@ -374,6 +396,13 @@ const { contract_category, business_direction, active_flag, contract_flag, contr const buttonLoading = ref(false); const contractInfoFormRef = ref(); +// 审批相关组件引用 +const submitVerifyRef = ref>(); +const approvalRecordRef = ref>(); + +// 任务变量 +const taskVariables = ref>({}); + const type = ref(0); const dialog = reactive({ visible: false, @@ -565,17 +594,28 @@ const handleFile = () => { ossFileModel.value = form.value.ossId as any; }; -const submitForm = () => { +const submitForm = (status: string, mode: boolean) => { contractInfoFormRef.value?.validate(async (valid: boolean) => { if (valid) { buttonLoading.value = true; - if (form.value.contractId) { - await updateContractInfo(form.value).finally(() => (buttonLoading.value = false)); - } else { - await addContractInfo(form.value).finally(() => (buttonLoading.value = false)); + try { + if (form.value.contractId) { + await updateContractInfo(form.value).finally(() => (buttonLoading.value = false)); + } else { + await addContractInfo(form.value).finally(() => (buttonLoading.value = false)); + } + + if (status === 'draft') { + proxy?.$modal.msgSuccess('暂存成功'); + goBack(); + } else { + // 提交审批流程 + await handleStartWorkFlow(); + } + } catch (error) { + console.error('保存合同信息失败:', error); + buttonLoading.value = false; } - proxy?.$modal.msgSuccess('操作成功'); - goBack(); } }); }; @@ -743,8 +783,12 @@ const loadSelectOptions = () => { }; onMounted(async () => { + // 获取路由参数 + routeParams.value = route.query || {}; + const id = (route.query.id || route.params.id) as string | number; loadSelectOptions(); + if (id) { proxy?.$modal.loading('正在加载数据,请稍后...'); const res = await getContractInfo(id); @@ -772,6 +816,47 @@ onMounted(async () => { } }); +// 启动审批流程 +const handleStartWorkFlow = async () => { + try { + // 设置流程变量 + taskVariables.value = { + contractId: form.value.contractId, + contractName: form.value.contractName, + totalPrice: form.value.totalPrice, + contractCode: form.value.contractCode + }; + + // 这里可以根据需要调用启动流程的API + // 由于合同审批流程在index.vue中已经实现,这里主要是处理审批中的状态 + proxy?.$modal.msgSuccess('提交审批成功'); + goBack(); + } catch (error) { + console.error('启动审批流程失败:', error); + proxy?.$modal.msgError('启动审批流程失败'); + } +}; + +// 审批验证打开 +const approvalVerifyOpen = async () => { + if (submitVerifyRef.value && routeParams.value.taskId) { + submitVerifyRef.value.openDialog(routeParams.value.taskId); + } +}; + +// 查看审批记录 +const handleApprovalRecord = () => { + if (approvalRecordRef.value && form.value.contractId) { + approvalRecordRef.value.init(form.value.contractId); + } +}; + +// 提交回调 +const submitCallback = async () => { + await proxy?.$tab.closePage(route); + window.history.go(-1); +}; + // 监听上传组件返回的文件(ossId 串)并同步到表单字段 // 同步表单初值到上传模型 watch( diff --git a/src/views/oa/erp/contractInfo/index.vue b/src/views/oa/erp/contractInfo/index.vue index 78d9b9e..5e87686 100644 --- a/src/views/oa/erp/contractInfo/index.vue +++ b/src/views/oa/erp/contractInfo/index.vue @@ -154,7 +154,7 @@ {{ parseTime(scope.row.updateTime, '{y}-{m}-{d} {h}:{i}:{s}') }} - + @@ -165,6 +165,12 @@ + + + + + + @@ -186,6 +192,11 @@ + + + + + @@ -194,6 +205,10 @@ import { listContractInfo, delContractInfo } from '@/api/oa/erp/contractInfo'; import { ContractInfoVO, ContractInfoQuery } from '@/api/oa/erp/contractInfo/types'; import { updateContractInfo } from '@/api/oa/erp/contractInfo'; import download from '@/plugins/download'; +import { startWorkFlow } from '@/api/workflow/task'; +import ApprovalRecord from '@/components/Process/approvalRecord.vue'; +import SubmitVerify from '@/components/Process/submitVerify.vue'; +import { StartProcessBo } from '@/api/workflow/workflowCommon/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { contract_category, business_direction, active_flag, contract_flag, contract_type, contract_status } = toRefs( @@ -209,6 +224,11 @@ const multiple = ref(true); const total = ref(0); const queryFormRef = ref(); +const approvalRecordRef = ref>(); +const submitVerifyRef = ref>(); + +// 任务变量 +const taskVariables = ref>({}); // 列显隐信息 const columns = ref([ @@ -320,13 +340,22 @@ const handleSelectionChange = (selection: ContractInfoVO[]) => { /** 新增按钮操作 */ const handleAdd = () => { - proxy?.$tab.openPage('/oa/erp/contractInfo/edit', '添加市场销售合同'); + proxy.$tab.closePage(proxy.$route); + proxy.$router.push({ + path: '/contract/contractInfo/edit', + query: {} + }); }; /** 修改按钮操作 */ const handleUpdate = (row?: ContractInfoVO) => { const _contractId = row?.contractId || ids.value[0]; - proxy?.$tab.openPage(`/oa/erp/contractInfo/edit`, '合同信息-修改', { id: _contractId }); + proxy.$router.push({ + path: '/contract/contractInfo/edit', + query: { + id: _contractId + } + }); }; /** 删除按钮操作 */ @@ -382,4 +411,72 @@ const confirmUploadFinal = async () => { const downloadFinalContract = (ossId: string | number) => { download.oss(ossId); }; + +// 提交审批 +const handleSubmitApproval = async (row: ContractInfoVO) => { + try { + // 添加确认弹框 + await proxy?.$modal.confirm('确认提交该合同进行审批?'); + + // 启动审批流程 + const submitFormData: StartProcessBo = { + businessId: row.contractId.toString(), + flowCode: 'OAC', // 使用现有的流程定义,后续可以创建专门的合同审批流程 + variables: { + // 合同相关的流程变量 + contractId: row.contractId, + contractName: row.contractName, + totalPrice: row.totalPrice + }, + bizExt: { + businessTitle: '合同审批', + businessCode: row.contractId + } + }; + + // 设置任务变量 + taskVariables.value = { + contractId: row.contractId, + contractName: row.contractName, + totalPrice: row.totalPrice, + contractCode: row.contractCode + }; + + // 启动流程并获取任务ID + const resp = await startWorkFlow(submitFormData); + + // 更新合同状态为审批中 + await updateContractInfo({ + contractId: row.contractId, + contractStatus: '2', + flowStatus: 'waiting' + } as any); + + // 自动打开审批对话框,调用第一个审批节点 + if (submitVerifyRef.value && resp.data && resp.data.taskId) { + submitVerifyRef.value.openDialog(resp.data.taskId); + } else { + proxy?.$modal.msgSuccess('审批流程已启动'); + await getList(); + } + } catch (error) { + // 用户取消操作时不显示错误 + if (error === 'cancel') { + return; + } + console.error('提交审批失败:', error); + proxy?.$modal.msgError('提交审批失败,请重试'); + } +}; + +// 查看审批记录 +const handleApprovalRecord = (row: ContractInfoVO) => { + approvalRecordRef.value?.init(row.contractId); +}; + +// 审批提交回调 +const submitCallback = async () => { + proxy?.$modal.msgSuccess('审批操作成功'); + await getList(); +};