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)"
/>