From af002b84d3d771702750aabee4ea641a838605e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com> Date: Sat, 18 Apr 2026 16:18:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=90=88=E5=90=8C=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=92=A2=E5=8D=B7=E4=B8=8E=E5=90=88=E5=90=8C?= =?UTF-8?q?=E5=85=B3=E8=81=94=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加钢卷与合同关联的API接口 - 在合卷、分条、打字等操作中增加合同选择组件 - 创建合同选择组件ContractSelect - 在合同详情页新增生产成果展示页签 - 实现合同列表的本地存储功能 --- klp-ui/src/api/crm/order.js | 11 + klp-ui/src/api/wms/coilContractRel.js | 44 +++ .../KLPService/ContractSelect/index.vue | 269 ++++++++++++++++++ .../crm/contract/components/ContractTabs.vue | 10 + klp-ui/src/views/crm/contract/index.vue | 2 +- klp-ui/src/views/wms/coil/merge.vue | 21 +- .../src/views/wms/coil/panels/stepSplit.vue | 36 ++- klp-ui/src/views/wms/coil/split.vue | 20 +- klp-ui/src/views/wms/coil/typing.vue | 110 ++----- 9 files changed, 414 insertions(+), 109 deletions(-) create mode 100644 klp-ui/src/api/wms/coilContractRel.js create mode 100644 klp-ui/src/components/KLPService/ContractSelect/index.vue diff --git a/klp-ui/src/api/crm/order.js b/klp-ui/src/api/crm/order.js index b8a918d1..5e80b519 100644 --- a/klp-ui/src/api/crm/order.js +++ b/klp-ui/src/api/crm/order.js @@ -52,3 +52,14 @@ export function listOrderPackaging(orderId) { method: 'get', }) } + +/** + * 查询今日订单 + */ +export function listTodayOrder(query) { + return request({ + url: '/crm/order/daily', + method: 'get', + params: query + }) +} diff --git a/klp-ui/src/api/wms/coilContractRel.js b/klp-ui/src/api/wms/coilContractRel.js new file mode 100644 index 00000000..c1ddfae3 --- /dev/null +++ b/klp-ui/src/api/wms/coilContractRel.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询钢卷与合同关联关系列表 +export function listCoilContractRel(query) { + return request({ + url: '/wms/coilContractRel/list', + method: 'get', + params: query + }) +} + +// 查询钢卷与合同关联关系详细 +export function getCoilContractRel(relId) { + return request({ + url: '/wms/coilContractRel/' + relId, + method: 'get' + }) +} + +// 新增钢卷与合同关联关系 +export function addCoilContractRel(data) { + return request({ + url: '/wms/coilContractRel', + method: 'post', + data: data + }) +} + +// 修改钢卷与合同关联关系 +export function updateCoilContractRel(data) { + return request({ + url: '/wms/coilContractRel', + method: 'put', + data: data + }) +} + +// 删除钢卷与合同关联关系 +export function delCoilContractRel(relId) { + return request({ + url: '/wms/coilContractRel/' + relId, + method: 'delete' + }) +} diff --git a/klp-ui/src/components/KLPService/ContractSelect/index.vue b/klp-ui/src/components/KLPService/ContractSelect/index.vue new file mode 100644 index 00000000..ecb55918 --- /dev/null +++ b/klp-ui/src/components/KLPService/ContractSelect/index.vue @@ -0,0 +1,269 @@ + + + \ No newline at end of file diff --git a/klp-ui/src/views/crm/contract/components/ContractTabs.vue b/klp-ui/src/views/crm/contract/components/ContractTabs.vue index e0924e91..8a84247b 100644 --- a/klp-ui/src/views/crm/contract/components/ContractTabs.vue +++ b/klp-ui/src/views/crm/contract/components/ContractTabs.vue @@ -20,6 +20,12 @@ + + +
+ + +
@@ -99,6 +105,10 @@ export default { type: Array, default: () => [] }, + productList: { + type: Array, + default: () => [] + }, loading: { type: Boolean, default: false diff --git a/klp-ui/src/views/crm/contract/index.vue b/klp-ui/src/views/crm/contract/index.vue index 336ab484..66c6958c 100644 --- a/klp-ui/src/views/crm/contract/index.vue +++ b/klp-ui/src/views/crm/contract/index.vue @@ -24,7 +24,7 @@
+ :other-attachment="form.productionSchedule" :currentOrder="form" :productList="form.coilList" />
diff --git a/klp-ui/src/views/wms/coil/merge.vue b/klp-ui/src/views/wms/coil/merge.vue index a7b89ad1..41503338 100644 --- a/klp-ui/src/views/wms/coil/merge.vue +++ b/klp-ui/src/views/wms/coil/merge.vue @@ -252,6 +252,12 @@
+
+ + + +
+
@@ -301,6 +307,8 @@ import WarehouseSelect from "@/components/KLPService/WarehouseSelect"; import TimeInput from "@/components/TimeInput"; import AbnormalForm from './components/AbnormalForm'; import { generateCoilNoPrefix } from "@/utils/coil/coilNo"; +import ContractSelect from "@/components/KLPService/ContractSelect"; +import { addCoilContractRel } from "@/api/wms/coilContractRel"; export default { name: 'MergeCoil', @@ -311,7 +319,8 @@ export default { ProductSelector, WarehouseSelect, TimeInput, - AbnormalForm + AbnormalForm, + ContractSelect }, dicts: ['coil_quality_status', 'coil_abnormal_position', 'coil_abnormal_code', 'coil_abnormal_degree', 'coil_business_purpose'], data() { @@ -752,11 +761,17 @@ export default { text: '正在合卷,请稍后...', background: 'rgba(0, 0, 0, 0.7)' }); - await mergeMaterialCoil(mergeData); + const response = await mergeMaterialCoil(mergeData); + + const coilId = response.data; + + addCoilContractRel({ + coilId: coilId, + contractId: this.targetCoil.contractId, + }) this.$message.success('合卷保存成功'); - // 延迟返回,让用户看到成功提示 setTimeout(() => { this.$router.back(); diff --git a/klp-ui/src/views/wms/coil/panels/stepSplit.vue b/klp-ui/src/views/wms/coil/panels/stepSplit.vue index c53c83d3..cb9fdc68 100644 --- a/klp-ui/src/views/wms/coil/panels/stepSplit.vue +++ b/klp-ui/src/views/wms/coil/panels/stepSplit.vue @@ -187,7 +187,8 @@ - + @@ -203,6 +204,10 @@ + + + +
{{ selectedSplitItem.temperGrade || '-' }} {{ selectedSplitItem.coatingType || '-' }} - {{ selectedSplitItem.coilSurfaceTreatment || '-' }} + {{ selectedSplitItem.coilSurfaceTreatment || '-' + }} {{ selectedSplitItem.productionStartTime || '-' }} {{ selectedSplitItem.productionEndTime || '-' @@ -316,6 +322,8 @@ import AbnormalForm from '../components/AbnormalForm'; import { generateCoilNoPrefix } from "@/utils/coil/coilNo"; import ProductInfo from "@/components/KLPService/Renderer/ProductInfo"; import RawMaterialInfo from "@/components/KLPService/Renderer/RawMaterialInfo"; +import ContractSelect from "@/components/KLPService/ContractSelect"; +import { addCoilContractRel } from "@/api/wms/coilContractRel"; export default { name: 'StepSplit', @@ -346,6 +354,7 @@ export default { AbnormalForm, ProductInfo, RawMaterialInfo, + ContractSelect, }, dicts: ['coil_quality_status', 'coil_abnormal_position', 'coil_abnormal_code', 'coil_abnormal_degree', 'coil_business_purpose'], data() { @@ -406,21 +415,6 @@ export default { } }, trigger: 'blur' }, - // 仅在新增的时候校验 - // { - // validator: (rule, value, callback) => { - // // 没有coilId则为新增 触发校验 - // checkCoilNo({ currentCoilNo: value, coilId: this.splitForm.coilId }).then(res => { - // const { duplicateType } = res.data; - // if (duplicateType === 'current' || duplicateType === 'both') { - // // alert('当前钢卷号重复,请重新输入'); - // callback(new Error('当前钢卷号重复,请重新输入')); - // } else { - // callback(); - // } - // }) - // }, trigger: 'blur' - // } ], materialType: [{ required: true, message: '请选择材料类型', trigger: 'change' }], itemId: [{ required: true, message: '请选择成品/原料', trigger: 'change' }], @@ -547,7 +541,6 @@ export default { } const action = await getPendingAction(this.actionId) this.currentAction = action.data || {} - // this.$set(this.splitForm, 'productionStartTime', action.data.createTime) const coilIds = action.data.remark; console.log('coilIds', coilIds) if (!coilIds) { @@ -617,7 +610,7 @@ export default { // 材料类型变更处理 handleMaterialTypeChange(val) { - // 清空物品选择 + // 清空物品选择 this.splitForm.itemId = null; // 根据材料类型设置物品类型 @@ -681,6 +674,11 @@ export default { } else { // 新增分条:调用创建接口 res = await createSpecialChild(this.coilId, this.actionId, splitData) + // 新增分条后,需要添加分条的合同关系 + addCoilContractRel({ + coilId: res.data.coilId, + contractId: this.splitForm.contractId, + }) } this.$message.success(this.splitForm.coilId ? '编辑分条成功' : '新增分条成功') diff --git a/klp-ui/src/views/wms/coil/split.vue b/klp-ui/src/views/wms/coil/split.vue index b3a4e6f3..ae430500 100644 --- a/klp-ui/src/views/wms/coil/split.vue +++ b/klp-ui/src/views/wms/coil/split.vue @@ -249,6 +249,11 @@ + + + + +
{ + addCoilContractRel({ + coilId, + contractId: this.splitList[index].contractId + }); + })); + // 如果是从待操作列表进来的,标记操作为完成 if (this.actionId) { await completeAction(this.actionId, response.msg); diff --git a/klp-ui/src/views/wms/coil/typing.vue b/klp-ui/src/views/wms/coil/typing.vue index fca4fef8..a0a7a3a2 100644 --- a/klp-ui/src/views/wms/coil/typing.vue +++ b/klp-ui/src/views/wms/coil/typing.vue @@ -94,7 +94,7 @@
逻辑库区: - {{ currentInfo.nextWarehouseName || '—' }} + {{ currentInfo.warehouseName || '—' }}
备注: @@ -195,7 +195,7 @@ + type="number" :step="0.01"> @@ -251,6 +251,10 @@ show-word-limit /> + + + +
({ - id: item.rawMaterialId, - name: this.formatItemName(item) - })); - } else if (this.updateForm.itemType === 'product') { - return this.productList.map(item => ({ - id: item.productId, - name: this.formatItemName(item) - })); - } - return []; - } }, async created() { - // 先加载库区列表 - await this.loadWarehouses(); - // 从路由参数获取coilId和actionId const coilId = this.$route.query.coilId; const actionId = this.$route.query.actionId; @@ -645,12 +628,9 @@ export default { // 根据材料类型设置物品类型 if (value === '成品') { this.$set(this.updateForm, 'itemType', 'product'); - // 清空列表,等待用户搜索 - this.productList = []; + } else if (value === '原料') { this.$set(this.updateForm, 'itemType', 'raw_material'); - // 清空列表,等待用户搜索 - this.rawMaterialList = []; } }, @@ -675,8 +655,6 @@ export default { // 填充当前信息(左侧) this.currentInfo = { ...data, - itemName: this.getItemName(data), - nextWarehouseName: this.getWarehouseName(data.warehouseId), }; // 填充时间相关字段 @@ -698,14 +676,6 @@ export default { } }, - // 获取物料名称 - getItemName(data) { - if (data.itemName) { - return data.itemName; - } - return ''; - }, - // 获取物品类型文本 getItemTypeText(itemType) { if (itemType === 'raw_material') return '原材料'; @@ -713,13 +683,6 @@ export default { return '—'; }, - // 获取库区名称 - getWarehouseName(warehouseId) { - if (!warehouseId) return ''; - const warehouse = this.warehouseList.find(w => w.warehouseId === warehouseId); - return warehouse ? warehouse.warehouseName : ''; - }, - // 格式化物品名称(添加规格和参数信息) formatItemName(item) { if (!item) return ''; @@ -754,41 +717,7 @@ export default { return displayName; }, - - // 加载库区列表 - async loadWarehouses() { - try { - const response = await listWarehouse({ pageNum: 1, pageSize: 1000 }); - if (response.code === 200) { - this.warehouseList = response.rows || response.data || []; - } - } catch (error) { - console.error('加载库区列表失败', error); - } - }, - - // 加载变更历史 - async loadHistory() { - if (!this.currentInfo.enterCoilNo) { - return; - } - - try { - this.historyLoading = true; - const response = await getMaterialCoilTrace({ - enterCoilNo: this.currentInfo.enterCoilNo, - currentCoilNo: this.currentInfo.currentCoilNo || undefined - }); - - if (response.code === 200 && response.data) { - this.historySteps = response.data.steps || []; - } - } catch (error) { - console.error('加载变更历史失败', error); - } finally { - this.historyLoading = false; - } - }, + // 复制当前信息到更新表单 copyFromCurrent() { @@ -872,6 +801,15 @@ export default { const response = await updateMaterialCoil(updateData); + // 更新完成后如果选定了合同,需要增加与合同的绑定关系 + const coilId = response.msg; + if (this.updateForm.contractId) { + await addCoilContractRel({ + coilId: coilId, + contractId: this.updateForm.contractId, + }); + } + if (response.code === 200) { this.$message.success('钢卷信息更新成功'); @@ -880,6 +818,8 @@ export default { await completeAction(this.actionId, response.msg); } + + // 延迟返回 setTimeout(() => { this.$router.back();