diff --git a/src/api/business/contract-change.js b/src/api/business/contract-change.js
new file mode 100644
index 0000000..4f407ec
--- /dev/null
+++ b/src/api/business/contract-change.js
@@ -0,0 +1,61 @@
+import { createCrudApi } from './common';
+import request from '@/axios';
+
+const baseUrl = '/blade-transport/contract-change';
+const api = createCrudApi(baseUrl);
+
+export const getList = api.getList;
+export const getDetail = api.getDetail;
+export const submit = api.submit;
+export const remove = api.remove;
+
+export const createFromContract = (contractId, changeType) =>
+ request({
+ url: `${baseUrl}/create-from-contract`,
+ method: 'post',
+ params: { contractId, changeType },
+ });
+
+export const saveDraft = row =>
+ request({
+ url: `${baseUrl}/save-draft`,
+ method: 'post',
+ data: row,
+ });
+
+export const submitApproval = id =>
+ request({
+ url: `${baseUrl}/submit-approval`,
+ method: 'post',
+ params: { id },
+ });
+
+export const approve = id =>
+ request({
+ url: `${baseUrl}/approve`,
+ method: 'post',
+ params: { id },
+ // 审批通过后同步推送合规(附件转传可达 20s+),覆盖全局 10s 超时
+ timeout: 120000,
+ });
+
+export const reject = id =>
+ request({
+ url: `${baseUrl}/reject`,
+ method: 'post',
+ params: { id },
+ });
+
+export const withdraw = id =>
+ request({
+ url: `${baseUrl}/withdraw`,
+ method: 'post',
+ params: { id },
+ });
+
+export const markSyncStatus = (ids, syncStatus) =>
+ request({
+ url: `${baseUrl}/mark-sync-status`,
+ method: 'post',
+ params: { ids, syncStatus },
+ });
diff --git a/src/option/business/contract-change.js b/src/option/business/contract-change.js
new file mode 100644
index 0000000..19c9cf7
--- /dev/null
+++ b/src/option/business/contract-change.js
@@ -0,0 +1,221 @@
+import {
+ approvalStatusOptions,
+ contractCategoryOptions,
+ createCrudOption,
+ hcsSyncStatusOptions,
+ signTypeOptions,
+} from './common';
+
+const listDicFormatter = res => {
+ const data = res?.data || res;
+ if (Array.isArray(data)) return data;
+ if (Array.isArray(data?.records)) return data.records;
+ if (Array.isArray(data?.data)) return data.data;
+ if (Array.isArray(data?.data?.records)) return data.data.records;
+ return [];
+};
+
+const projectNameDicFormatter = res => {
+ const list = listDicFormatter(res);
+ return list.filter(item => item && item.projectName && String(item.projectName).trim());
+};
+
+export const changeTypeOptions = [
+ { label: '合同信息变更', value: '合同信息变更' },
+ { label: '结算规则变更', value: '结算规则变更' },
+];
+
+export const config = {
+ title: '合同变更',
+ permission: 'contract_change',
+ statusProp: 'approvalStatus',
+ statusTextProp: 'approvalStatusName',
+ deleteStatus: ['draft', 'withdrawn', 'rejected'],
+ editStatus: ['draft', 'withdrawn', 'rejected'],
+ viewStatus: ['approved'],
+ operations: [
+ {
+ action: 'submitApproval',
+ label: '提交',
+ statusProp: 'approvalStatus',
+ status: ['draft'],
+ permission: 'contract_change_submit',
+ },
+ {
+ action: 'withdraw',
+ label: '撤回',
+ statusProp: 'approvalStatus',
+ status: ['reviewing'],
+ permission: 'contract_change_withdraw',
+ },
+ {
+ action: 'mkAudit',
+ label: '流程',
+ statusProp: 'approvalStatus',
+ status: ['reviewing', 'rejected', 'approved'],
+ permission: 'contract_change_approve',
+ mkOnly: true,
+ },
+ {
+ action: 'approve',
+ label: '通过',
+ type: 'success',
+ statusProp: 'approvalStatus',
+ status: ['reviewing'],
+ permission: 'contract_change_approve',
+ localOnly: true,
+ },
+ {
+ action: 'reject',
+ label: '驳回',
+ type: 'warning',
+ statusProp: 'approvalStatus',
+ status: ['reviewing'],
+ permission: 'contract_change_reject',
+ localOnly: true,
+ },
+ ],
+};
+
+export const option = createCrudOption([
+ {
+ label: '合同编号',
+ prop: 'contractNo',
+ search: true,
+ searchPlaceholder: '请输入',
+ searchOrder: 20,
+ minWidth: 160,
+ },
+ {
+ label: '合同名称',
+ prop: 'contractName',
+ search: true,
+ searchPlaceholder: '请输入',
+ searchOrder: 30,
+ minWidth: 180,
+ },
+ {
+ label: '所属项目',
+ prop: 'projectName',
+ search: true,
+ searchType: 'select',
+ searchPlaceholder: '请选择',
+ searchOrder: 60,
+ dicUrl: '/blade-transport/project-apply/list?current=1&size=9999&contractSelectable=true',
+ dicFormatter: projectNameDicFormatter,
+ props: {
+ label: 'projectName',
+ value: 'projectName',
+ },
+ filterable: true,
+ minWidth: 160,
+ },
+ {
+ label: '所属组织',
+ prop: 'organizationName',
+ search: true,
+ searchPlaceholder: '请输入',
+ searchOrder: 10,
+ minWidth: 150,
+ },
+ {
+ label: '合同类别',
+ prop: 'contractCategory',
+ type: 'select',
+ search: true,
+ searchPlaceholder: '请选择',
+ searchOrder: 70,
+ dicData: contractCategoryOptions,
+ minWidth: 130,
+ },
+ {
+ label: '签约类型',
+ prop: 'signType',
+ type: 'select',
+ search: true,
+ searchPlaceholder: '请选择',
+ searchOrder: 50,
+ dicData: signTypeOptions,
+ minWidth: 120,
+ },
+ {
+ label: '甲方',
+ prop: 'partyA',
+ minWidth: 160,
+ },
+ {
+ label: '乙方',
+ prop: 'partyB',
+ minWidth: 160,
+ },
+ {
+ label: '开始日期',
+ prop: 'startDate',
+ type: 'date',
+ format: 'YYYY-MM-DD',
+ valueFormat: 'YYYY-MM-DD',
+ minWidth: 130,
+ },
+ {
+ label: '结束日期',
+ prop: 'endDate',
+ type: 'date',
+ format: 'YYYY-MM-DD',
+ valueFormat: 'YYYY-MM-DD',
+ minWidth: 130,
+ },
+ {
+ label: '临时效力起',
+ prop: 'temporaryStartDate',
+ type: 'date',
+ format: 'YYYY-MM-DD',
+ valueFormat: 'YYYY-MM-DD',
+ minWidth: 130,
+ },
+ {
+ label: '临时效力止',
+ prop: 'temporaryEndDate',
+ type: 'date',
+ format: 'YYYY-MM-DD',
+ valueFormat: 'YYYY-MM-DD',
+ minWidth: 130,
+ },
+ {
+ label: '经办人',
+ prop: 'handlerUserName',
+ minWidth: 120,
+ },
+ {
+ label: '创建时间',
+ prop: 'createTime',
+ type: 'datetime',
+ minWidth: 170,
+ },
+ {
+ label: '审核状态',
+ prop: 'approvalStatus',
+ type: 'select',
+ search: true,
+ searchPlaceholder: '请选择',
+ searchOrder: 40,
+ dicData: approvalStatusOptions,
+ minWidth: 110,
+ },
+ {
+ label: '当前节点',
+ prop: 'currentNode',
+ minWidth: 120,
+ },
+ {
+ label: '当前处理人',
+ prop: 'currentProcessor',
+ minWidth: 120,
+ },
+ {
+ label: '同步状态',
+ prop: 'syncStatus',
+ type: 'select',
+ dicData: hcsSyncStatusOptions,
+ minWidth: 110,
+ },
+]);
diff --git a/src/router/page/index.js b/src/router/page/index.js
index b009065..2c126f6 100644
--- a/src/router/page/index.js
+++ b/src/router/page/index.js
@@ -117,6 +117,17 @@ export default [
bizType: 'contract-manage',
},
},
+ {
+ path: '/business/contract-change/public-view',
+ name: '查看合同变更信息',
+ component: () => import('@/views/business/contract-change-public-view.vue'),
+ meta: {
+ keepAlive: false,
+ isTab: false,
+ isAuth: false,
+ bizType: 'contract-change',
+ },
+ },
{
path: '/settlement/pre-settlement/public-view',
name: '查看预付结算单信息',
diff --git a/src/router/views/index.js b/src/router/views/index.js
index 6d4db1d..be1a05d 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -354,6 +354,18 @@ export default [
},
],
},
+ {
+ path: '/business/contract-change/form',
+ component: Layout,
+ children: [
+ {
+ path: '',
+ name: '合同变更表单',
+ meta: { keepAlive: false, activeMenu: '/business/contract-change' },
+ component: loadView(() => import('@/views/business/contract-manage-change.vue')),
+ },
+ ],
+ },
{
path: '/wel',
component: () =>
diff --git a/src/utils/mk-approval.js b/src/utils/mk-approval.js
index 51fd02d..ee1b0ff 100644
--- a/src/utils/mk-approval.js
+++ b/src/utils/mk-approval.js
@@ -27,6 +27,12 @@ export const MK_BIZ = {
rejected: ['rejected', 'change_rejected', 'withdrawn'],
approved: ['approved', 'change_approved'],
},
+ 'contract-change': {
+ dictName: '提交合同变更审核流',
+ subjectPrefix: '合同变更审批',
+ rejected: ['rejected', 'withdrawn'],
+ approved: ['approved'],
+ },
'pre-settlement': {
dictName: '提交预结算审核流',
subjectPrefix: '预付结算审批',
diff --git a/src/views/business/contract-change-public-view.vue b/src/views/business/contract-change-public-view.vue
new file mode 100644
index 0000000..5e5aa90
--- /dev/null
+++ b/src/views/business/contract-change-public-view.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/views/business/contract-change.vue b/src/views/business/contract-change.vue
new file mode 100644
index 0000000..16a1673
--- /dev/null
+++ b/src/views/business/contract-change.vue
@@ -0,0 +1,407 @@
+
+
+
+
+
+ 批量同步
+
+
+ 批量删除
+
+
+
+
+ {{ row.approvalStatusName || statusLabel(row.approvalStatus) }}
+
+
+
+
+ {{ syncLabel(row.syncStatus) }}
+
+ -
+
+
+
+ 查看
+ 编辑
+ 删除
+
+ {{ operation.label }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/business/contract-manage-change.vue b/src/views/business/contract-manage-change.vue
index e8eb666..ba63590 100644
--- a/src/views/business/contract-manage-change.vue
+++ b/src/views/business/contract-manage-change.vue
@@ -1,12 +1,20 @@
{{ pageTitle }}
-
+
基本信息
-
+
@@ -280,7 +288,7 @@
计费信息
- 添加
添加添加
@@ -461,7 +470,7 @@
:disabled="isSettlementRuleChange"
/>
- 删除
-