From 2fba4fbba78368e9266797f379cf1e0f13b313ae Mon Sep 17 00:00:00 2001 From: zhouxiaofeng <2946471396@qq.com> Date: Fri, 29 May 2026 15:26:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/launch.js | 148 ++++ src/views/contract/launch/api.js | 309 ------- .../ContractPartyPlaceholderModal.vue | 774 ++++++++++++++++-- .../ContractTemplateFillDemoModal.vue | 488 +++++++++-- .../launch/components/mixedSignModal.vue | 3 +- .../contract/launch/contractLaunchOptions.js | 127 +++ src/views/contract/launch/index.vue | 478 ++++++----- .../ContractTemplateManageModal.vue | 10 +- .../contract/manifest/contractTypeOptions.js | 52 ++ src/views/contract/manifest/index.vue | 51 +- src/views/seal/mixedSignModal.vue | 121 ++- vite.config.js | 4 + 12 files changed, 1829 insertions(+), 736 deletions(-) create mode 100644 src/api/launch.js delete mode 100644 src/views/contract/launch/api.js create mode 100644 src/views/contract/launch/contractLaunchOptions.js create mode 100644 src/views/contract/manifest/contractTypeOptions.js diff --git a/src/api/launch.js b/src/api/launch.js new file mode 100644 index 0000000..316d69b --- /dev/null +++ b/src/api/launch.js @@ -0,0 +1,148 @@ +import request from "@/utils/request"; + +function getResult(res) { + return res?.result; +} + +function isSuccessResponse(res) { + return String(res?.code || "") === "0000"; +} + +export function queryLaunchList(data) { + return request({ + url: "/contract/launch/list", + method: "post", + data, + }); +} + +export function getLaunchDetail(id) { + return request({ + url: `/contract/launch/${id}`, + method: "get", + }); +} + +export function createLaunchDraft(data) { + return request({ + url: "/contract/launch", + method: "post", + data, + }); +} + +export function updateLaunchDraft(data) { + return request({ + url: "/contract/launch", + method: "put", + data, + }); +} + +export function submitLaunchRecord(id) { + return request({ + url: `/contract/launch/${id}/submit`, + method: "post", + }); +} + +export function mockApproveLaunch(id, data = {}) { + return request({ + url: `/contract/launch/${id}/mock-approve`, + method: "post", + data, + }); +} + +export function mockRejectLaunch(id, data = {}) { + return request({ + url: `/contract/launch/${id}/mock-reject`, + method: "post", + data, + }); +} + +export function saveLaunchSealInfo(id, data) { + return request({ + url: `/contract/launch/${id}/seal/save`, + method: "post", + data, + }); +} + +export function finishLaunchSeal(id, data) { + return request({ + url: `/contract/launch/${id}/seal/finish`, + method: "post", + data, + }); +} + +export function queryApproveViewUrl(data) { + return request({ + url: "/contract/push/settlement/approve/view-url", + method: "post", + data, + }); +} + +export function mockCollectLaunch(id) { + return request({ + url: `/contract/launch/${id}/mock-collect`, + method: "post", + }); +} + +export function archiveLaunch(id, data = {}) { + return request({ + url: `/contract/launch/${id}/archive`, + method: "post", + data, + }); +} + +export function deleteLaunchRecord(id) { + return request({ + url: `/contract/launch/${id}`, + method: "delete", + }); +} + +export function queryPublishedTemplates() { + return request({ + url: "/manifest/manage/published", + method: "get", + }).then((res) => (isSuccessResponse(res) ? getResult(res) || [] : [])); +} + +export function queryPartnerOptions(data = {}) { + return request({ + url: "/partner/manage/list", + method: "post", + data: { + pageNo: 1, + pageSize: 200, + ...data, + }, + }).then((res) => (isSuccessResponse(res) ? getResult(res)?.data || [] : [])); +} + +export function uploadLaunchFile(formData) { + return request({ + url: "/trans/minio/file/uploadOutie", + method: "post", + data: formData, + headers: { + "Content-Type": "multipart/form-data", + }, + }); +} + +export function downloadLaunchFile(fileName) { + return request({ + url: "/trans/minio/file/download", + method: "get", + params: { fileName }, + responseType: "arraybuffer", + }); +} diff --git a/src/views/contract/launch/api.js b/src/views/contract/launch/api.js deleted file mode 100644 index 38faf48..0000000 --- a/src/views/contract/launch/api.js +++ /dev/null @@ -1,309 +0,0 @@ -/** - * 合同发起模块 - API 层 - * - * 当前使用 mock 数据模拟接口返回。 - * 【接入后端】:直接替换每个函数内部实现为 axios 请求即可,函数签名不改。 - */ - -// ========== 合同发起列表 mock 数据 ========== - -const mockLaunchRecords = [ - { - id: 'INIT-202605-001', - // 合同编码 - contractCode: 'HT-2026-0008', - // 合同名称 - contractName: '智慧园区设备采购合同', - // 合同类型 - contractType: '采购合同', - // 合同金额(元) - contractAmount: 368000, - // 有效期起 YYYY-MM-DD - effectiveStart: '2026-05-10', - // 有效期止 YYYY-MM-DD - effectiveEnd: '2027-05-09', - // 付款方式 - paymentMethod: '银行转账(30%预付款,70%验收后支付)', - // 所选模板标识 - templateKey: 'purchase', - // 所选模板名称 - templateName: '采购合同模板', - // 合同标的 - contractSubject: '园区门禁一体机、访客终端及部署实施服务', - // 业务备注 - businessRemark: '首次发起,等待业务确认后提交法务。', - // 发起人 - initiator: '张晓明', - // 所属部门 - initiatorDept: '供应链运营部', - // 发起人公司 - companyName: '浙港物流平台有限公司', - // 状态: draft/reviewing/rejected/pending_sign/signing/completed - status: 'draft', - // 查询级别: personal/company/admin - queryScope: 'personal', - // 创建时间 - createTime: '2026-05-10 09:20:00', - // 更新时间 - updateTime: '2026-05-13 14:30:00', - // 附件列表 - attachmentList: [ - { uid: 'a1', name: '技术方案V1.pdf', size: 283011, status: 'done' }, - { uid: 'a2', name: '补充协议草案.docx', size: 125880, status: 'done' }, - ], - // 合同方信息(详见下方 partyState 结构) - partyState: { - isThreePartyContract: false, - partyA: { - companyName: '浙港物流平台有限公司', - contactPhone: '', - registeredAddress: '', - bankAccount: '', - bankName: '', - contactName: '', - legalRepresentative: '', - creditCode: '', - }, - partyB: { - companyName: '宁波港船务货运代理有限公司', - companyType: '供应商', - contactPhone: '15757460062', - registeredAddress: '', - bankAccount: '', - bankName: '', - contactName: '周经理', - legalRepresentative: '', - creditCode: '', - }, - partyC: { companyName: '' }, - }, - }, - { - id: 'INIT-202605-002', - contractCode: 'XS-2026-0015', - contractName: '保税燃料油销售合同', - contractType: '销售合同', - contractAmount: 1580000, - effectiveStart: '2026-05-01', - effectiveEnd: '2026-12-31', - paymentMethod: '银行转账(按月结算)', - templateKey: 'sales', - templateName: '销售合同模板', - contractSubject: '保税燃料油销售及船舶供油服务', - businessRemark: '已提交法务,等待审批中。', - initiator: '王倩', - initiatorDept: '国际贸易事业部', - companyName: '浙港物流平台有限公司', - status: 'reviewing', - queryScope: 'company', - createTime: '2026-05-08 16:15:00', - updateTime: '2026-05-14 08:30:00', - attachmentList: [ - { uid: 'a3', name: '报价确认函.pdf', size: 90211, status: 'done' }, - ], - partyState: { - isThreePartyContract: false, - partyA: { - companyName: '宁波浙港供应链科技有限公司', - contactPhone: '13900000088', - contactName: '陈经理', - }, - partyB: { - companyName: '上海远洋能源有限公司', - companyType: '客户', - legalRepresentative: '孙先生', - contactName: '吴经理', - contactPhone: '13600000015', - contactEmail: 'sales@oceanenergy.com', - bankName: '招商银行上海分行', - bankAccount: '621483000000000015', - }, - partyC: { companyName: '' }, - }, - }, - { - id: 'INIT-202605-003', - contractCode: 'FW-2026-0021', - contractName: '数字化平台运维服务合同', - contractType: '服务合同', - contractAmount: 520000, - effectiveStart: '2026-04-15', - effectiveEnd: '2027-04-14', - paymentMethod: '银行转账(一次性结清)', - templateKey: 'purchase', - templateName: '采购合同模板', - contractSubject: '合同管理板块运维与驻场实施服务', - businessRemark: '法务要求补充服务SLA附件后重新提交。', - initiator: '李娜', - initiatorDept: '数字化办公室', - companyName: '浙港物流平台有限公司', - status: 'rejected', - queryScope: 'company', - createTime: '2026-04-15 10:25:00', - updateTime: '2026-05-07 18:05:00', - attachmentList: [ - { uid: 'a4', name: '实施范围说明.pdf', size: 70123, status: 'done' }, - ], - partyState: { - isThreePartyContract: false, - partyA: { companyName: '浙港物流平台有限公司' }, - partyB: { - companyName: '杭州智云实施服务有限公司', - companyType: '供应商', - contactName: '刘经理', - contactPhone: '13888886666', - contactEmail: 'liu@cloudservice.com', - }, - partyC: { companyName: '' }, - }, - }, - { - id: 'INIT-202605-004', - contractCode: 'KJ-2026-0011', - contractName: '港口智能设备年度框架合同', - contractType: '框架合同', - contractAmount: 980000, - effectiveStart: '2026-03-01', - effectiveEnd: '2027-02-28', - paymentMethod: '银行转账(按月结算)', - templateKey: 'purchase', - templateName: '采购合同模板', - contractSubject: '港口智能硬件、集成服务及年度维保合作', - businessRemark: '审批完成,待发起线上签署。', - initiator: '周立', - initiatorDept: '装备采购中心', - companyName: '浙港物流平台有限公司', - status: 'pending_sign', - queryScope: 'admin', - createTime: '2026-03-01 11:12:00', - updateTime: '2026-05-11 09:45:00', - attachmentList: [ - { uid: 'a5', name: '年度采购清单.xlsx', size: 154933, status: 'done' }, - ], - partyState: { - isThreePartyContract: true, - partyA: { companyName: '浙港物流平台有限公司' }, - partyB: { - companyName: '宁波保税区港航设备有限公司', - companyType: '合作伙伴', - contactName: '赵主管', - contactPhone: '13500000021', - }, - partyC: { - companyName: '浙江临港数智科技有限公司', - companyType: '合作伙伴', - creditCode: '91330000MAABCDE123', - legalRepresentative: '钱先生', - registeredAddress: '浙江省杭州市滨江区江南大道2888号', - contactName: '何经理', - contactPhone: '13700000078', - contactAddress: '浙江省杭州市滨江区江南大道2888号', - contactEmail: 'hz@example.com', - }, - }, - }, - { - id: 'INIT-202605-005', - contractCode: 'XS-2026-0022', - contractName: '沿海航线供应服务合同', - contractType: '销售合同', - contractAmount: 760000, - effectiveStart: '2026-02-18', - effectiveEnd: '2026-11-30', - paymentMethod: '银行转账(按月结算)', - templateKey: 'sales', - templateName: '销售合同模板', - contractSubject: '沿海航线供应链服务与结算支持', - businessRemark: '甲方已签章,等待乙方签署。', - initiator: '徐晨', - initiatorDept: '客户服务中心', - companyName: '浙港物流平台有限公司', - status: 'signing', - queryScope: 'personal', - createTime: '2026-02-18 13:40:00', - updateTime: '2026-05-12 17:16:00', - attachmentList: [], - partyState: { - isThreePartyContract: false, - partyA: { - companyName: '宁波浙港供应链科技有限公司', - contactPhone: '13900000088', - contactName: '陈经理', - }, - partyB: { - companyName: '上海远洋能源有限公司', - companyType: '客户', - legalRepresentative: '孙先生', - contactName: '吴经理', - contactPhone: '13600000015', - contactEmail: 'sales@oceanenergy.com', - bankName: '招商银行上海分行', - bankAccount: '621483000000000015', - }, - partyC: { companyName: '' }, - }, - }, - { - id: 'INIT-202605-006', - contractCode: 'CG-2026-0033', - contractName: '港区安防升级采购合同', - contractType: '采购合同', - contractAmount: 2860000, - effectiveStart: '2026-01-10', - effectiveEnd: '2026-12-31', - paymentMethod: '银行转账(30%预付款,70%验收后支付)', - templateKey: 'purchase', - templateName: '采购合同模板', - contractSubject: '港区安防摄像头、门禁和施工实施采购', - businessRemark: '合同已签署完毕并推送法务归档。', - initiator: '高翔', - initiatorDept: '工程保障部', - companyName: '浙港物流平台有限公司', - status: 'completed', - queryScope: 'admin', - createTime: '2026-01-10 08:45:00', - updateTime: '2026-05-09 16:28:00', - attachmentList: [ - { uid: 'a6', name: '验收报告.pdf', size: 188221, status: 'done' }, - ], - partyState: { - isThreePartyContract: false, - partyA: { companyName: '浙港物流平台有限公司' }, - partyB: { - companyName: '宁波港船务货运代理有限公司', - companyType: '供应商', - contactPhone: '15757460062', - contactName: '周经理', - }, - partyC: { companyName: '' }, - }, - }, -] - -// ========== API 函数(接入后端时替换内部实现) ========== - -/** 查询合同发起列表 */ -export function queryLaunchList() { - return Promise.resolve(mockLaunchRecords) -} - -/** 查询合同发起详情 */ -export function getLaunchDetail(id) { - const record = mockLaunchRecords.find((item) => item.id === id) || null - return Promise.resolve(record) -} - -/** 保存合同发起 */ -export function saveLaunchRecord(record) { - return Promise.resolve(record) -} - -/** 提交合同到法务 */ -export function submitLaunchRecord(record) { - return Promise.resolve(record) -} - -/** 删除合同发起记录 */ -export function deleteLaunchRecord(idList) { - return Promise.resolve(idList) -} diff --git a/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue b/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue index efe5c72..fa16f6d 100644 --- a/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue +++ b/src/views/contract/launch/components/ContractPartyPlaceholderModal.vue @@ -118,7 +118,8 @@ :options="contractCompanyOptions" show-search :placeholder="`请选择${party.displayName}`" - @change="handleCompanySelect(party.roleKey, $event)" + :filter-option="filterPartnerOption" + @change="(value, option) => handleCompanySelect(party.roleKey, value, option)" /> @@ -276,6 +278,20 @@ placeholder="请选择付款方式" /> + + + + + + @@ -326,6 +342,20 @@ +
+
签订依据附件
+ +
签订依据文件,对应法务 contractGistFile
+
+
+
其他附件
+ + + +
合同属性 @@ -398,6 +436,20 @@ readonly /> + + + + + + + + + + + + + + + + + + + + + + + +
@@ -512,6 +604,7 @@
+ + + + + +