From bc7b9d245477cfeb727a0f3624fbfbab4ed388eb Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 29 Jun 2026 17:08:24 +0800 Subject: [PATCH 01/17] =?UTF-8?q?feat(crm):=20=E8=AE=A2=E5=8D=95=E9=A1=B9?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E6=B7=BB=E5=8A=A0=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=B9=B6=E6=96=B0=E5=A2=9E=E9=94=80=E5=94=AE?= =?UTF-8?q?=E5=91=98=E5=92=8C=E5=90=88=E5=90=8C=E6=9F=A5=E8=AF=A2=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将getCoilsByOrderId方法改为分页查询,返回TableDataInfo格式 - 新增getCoilsBySalesman接口,支持按销售员查询生产成果钢卷列表 - 新增getCoilsByContractIdPaginated接口,支持按合同ID分页查询生产成果 - 更新前端API调用适配分页参数传递 - 修改listOrderPackaging接口支持分页查询 - 更新相关Vue组件适配新的分页数据结构返回格式 --- .../controller/CrmOrderItemController.java | 24 +++++- .../klp/crm/service/ICrmOrderItemService.java | 14 +++- .../service/impl/CrmOrderItemServiceImpl.java | 81 ++++++++++++++++++- klp-ui/src/api/crm/order.js | 5 +- klp-ui/src/api/wms/deliveryWaybillDetail.js | 8 +- .../views/crm/components/OrderObjection.vue | 4 +- klp-ui/src/views/crm/contract/index.vue | 4 +- klp-ui/src/views/crm/objection/index.vue | 4 +- klp-ui/src/views/crm/order/index.vue | 4 +- klp-ui/src/views/crm/saleman/index.vue | 4 +- .../WmsDeliveryWaybillDetailController.java | 11 +-- 11 files changed, 131 insertions(+), 32 deletions(-) diff --git a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java index 69e43426c..026147661 100644 --- a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java +++ b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java @@ -105,11 +105,12 @@ public class CrmOrderItemController extends BaseController { @PathVariable Long contractId) { return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByContractId(contractId)); } - // 根据订单id查询发货单据中的配卷。 + // 根据订单id查询发货单据中的配卷(分页)。 @GetMapping("/coils/order/{orderId}") - public R> getCoilsByOrderId(@NotNull(message = "订单ID不能为空") - @PathVariable Long orderId) { - return R.ok(iCrmOrderItemService.queryCoilsByOrderId(orderId)); + public TableDataInfo getCoilsByOrderId(@NotNull(message = "订单ID不能为空") + @PathVariable Long orderId, + PageQuery pageQuery) { + return iCrmOrderItemService.queryCoilsByOrderId(orderId, pageQuery); } // 根据合同id查询发货单据中的配卷。 @@ -132,4 +133,19 @@ public class CrmOrderItemController extends BaseController { @PathVariable String customerId) { return R.ok(iCrmOrderItemService.queryCoilsByCustomerId(customerId)); } + + // 根据销售员查询生产成果(钢卷列表),分页 + @GetMapping("/coils/bySalesman") + public TableDataInfo getCoilsBySalesman(@RequestParam String salesman, + PageQuery pageQuery) { + return iCrmOrderItemService.queryCoilsBySalesman(salesman, pageQuery); + } + + // 根据合同ID查询生产成果(钢卷列表),分页 + @GetMapping("/coils/byContract/{contractId}") + public TableDataInfo getCoilsByContractIdPaginated(@NotNull(message = "合同ID不能为空") + @PathVariable Long contractId, + PageQuery pageQuery) { + return iCrmOrderItemService.queryCoilsByContractIdPaginated(contractId, pageQuery); + } } diff --git a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java index ae9a299c7..544d0283a 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java +++ b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java @@ -57,9 +57,9 @@ public interface ICrmOrderItemService { CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId); /** - * 根据订单ID查询发货单配卷 + * 根据订单ID查询发货单配卷(分页) */ - List queryCoilsByOrderId(Long orderId); + TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery); /** * 根据合同ID查询发货单配卷 @@ -75,4 +75,14 @@ public interface ICrmOrderItemService { * 根据客户ID查询发货单配卷 */ List queryCoilsByCustomerId(String customerId); + + /** + * 根据销售员查询生产成果(钢卷列表)分页 + */ + TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery); + + /** + * 根据合同ID查询生产成果(钢卷列表)分页 + */ + TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery); } diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java index 7d7510549..6f1e473e3 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java @@ -35,6 +35,8 @@ import com.klp.crm.service.ICrmOrderItemService; import com.klp.mapper.WmsReceivableMapper; import com.klp.mapper.WmsDeliveryWaybillMapper; import com.klp.mapper.WmsDeliveryWaybillDetailMapper; +import com.klp.mapper.WmsCoilContractRelMapper; +import com.klp.domain.WmsCoilContractRel; import com.klp.service.IWmsMaterialCoilService; import java.util.*; @@ -57,6 +59,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { private final WmsReceivableMapper wmsReceivableMapper; private final WmsDeliveryWaybillMapper wmsDeliveryWaybillMapper; private final WmsDeliveryWaybillDetailMapper wmsDeliveryWaybillDetailMapper; + private final WmsCoilContractRelMapper coilContractRelMapper; private final IWmsMaterialCoilService iWmsMaterialCoilService; /** @@ -288,13 +291,13 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { } @Override - public List queryCoilsByOrderId(Long orderId) { + public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery) { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); if (waybills == null || waybills.isEmpty()) { - return Collections.emptyList(); + return new TableDataInfo<>(); } List waybillIds = waybills.stream() @@ -306,7 +309,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); if (details == null || details.isEmpty()) { - return Collections.emptyList(); + return new TableDataInfo<>(); } String coilIds = details.stream() @@ -316,7 +319,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); coilBo.setCoilIds(coilIds); - return iWmsMaterialCoilService.queryList(coilBo); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } @Override @@ -440,4 +443,74 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.queryList(coilBo); } + + @Override + public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery) { + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(CrmOrder::getSalesman, salesman); + orderWrapper.eq(CrmOrder::getDelFlag, 0); + List orders = crmOrderMapper.selectList(orderWrapper); + + if (orders == null || orders.isEmpty()) { + return new TableDataInfo<>(); + } + + List orderIds = orders.stream() + .map(CrmOrder::getOrderId) + .collect(Collectors.toList()); + + LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); + relWrapper.in(WmsCoilContractRel::getContractId, orderIds); + relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); + List rels = coilContractRelMapper.selectList(relWrapper); + + if (rels == null || rels.isEmpty()) { + return new TableDataInfo<>(); + } + + String coilIds = rels.stream() + .map(WmsCoilContractRel::getCoilId) + .distinct() + .map(String::valueOf) + .collect(Collectors.joining(",")); + + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + } + + @Override + public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) { + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(CrmOrder::getContractId, contractId); + orderWrapper.eq(CrmOrder::getDelFlag, 0); + List orders = crmOrderMapper.selectList(orderWrapper); + + if (orders == null || orders.isEmpty()) { + return new TableDataInfo<>(); + } + + List orderIds = orders.stream() + .map(CrmOrder::getOrderId) + .collect(Collectors.toList()); + + LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); + relWrapper.in(WmsCoilContractRel::getContractId, orderIds); + relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); + List rels = coilContractRelMapper.selectList(relWrapper); + + if (rels == null || rels.isEmpty()) { + return new TableDataInfo<>(); + } + + String coilIds = rels.stream() + .map(WmsCoilContractRel::getCoilId) + .distinct() + .map(String::valueOf) + .collect(Collectors.joining(",")); + + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + } } diff --git a/klp-ui/src/api/crm/order.js b/klp-ui/src/api/crm/order.js index 5e80b519a..6f151bae5 100644 --- a/klp-ui/src/api/crm/order.js +++ b/klp-ui/src/api/crm/order.js @@ -44,12 +44,13 @@ export function delOrder(orderId) { } /** - * 查询该订单下的所有配卷 + * 查询该订单下的配卷(分页) */ -export function listOrderPackaging(orderId) { +export function listOrderPackaging(orderId, query) { return request({ url: `/crm/orderItem/coils/order/${orderId}`, method: 'get', + params: query }) } diff --git a/klp-ui/src/api/wms/deliveryWaybillDetail.js b/klp-ui/src/api/wms/deliveryWaybillDetail.js index a951d8695..f90b521b0 100644 --- a/klp-ui/src/api/wms/deliveryWaybillDetail.js +++ b/klp-ui/src/api/wms/deliveryWaybillDetail.js @@ -69,13 +69,11 @@ export function getBoundCoilStatisticsList(query) { }) } -// 按销售员查询订单明细的卷 -export function listDeliveryWaybillDetailBySaleman(principal) { +// 按销售员查询订单明细的卷(分页) +export function listDeliveryWaybillDetailBySaleman(query) { return request({ url: '/wms/deliveryWaybillDetail/coilListByPrincipal', method: 'get', - params: { - principal: principal - } + params: query }) } \ No newline at end of file diff --git a/klp-ui/src/views/crm/components/OrderObjection.vue b/klp-ui/src/views/crm/components/OrderObjection.vue index 869153a81..fd02ad0bf 100644 --- a/klp-ui/src/views/crm/components/OrderObjection.vue +++ b/klp-ui/src/views/crm/components/OrderObjection.vue @@ -371,8 +371,8 @@ export default { // 获取订单已发货的钢卷 getShippedCoils() { if (this.orderId) { - listOrderPackaging(this.orderId).then(response => { - this.shippedCoils = response.data || []; + listOrderPackaging(this.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + this.shippedCoils = response.rows || []; }).catch(() => { this.shippedCoils = []; }); diff --git a/klp-ui/src/views/crm/contract/index.vue b/klp-ui/src/views/crm/contract/index.vue index cab3c1a2d..82ee8078b 100644 --- a/klp-ui/src/views/crm/contract/index.vue +++ b/klp-ui/src/views/crm/contract/index.vue @@ -504,8 +504,8 @@ export default { }, /** 查询合同配卷列表 */ getCoilList() { - listOrderPackaging(this.form.orderId).then(response => { - this.coilList = response.data || []; + listOrderPackaging(this.form.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + this.coilList = response.rows || []; }) }, /** 刷新生产成果列表(批量转单后调用) */ diff --git a/klp-ui/src/views/crm/objection/index.vue b/klp-ui/src/views/crm/objection/index.vue index 0cb0f4fe1..961acfdfa 100644 --- a/klp-ui/src/views/crm/objection/index.vue +++ b/klp-ui/src/views/crm/objection/index.vue @@ -469,8 +469,8 @@ export default { // 获取订单已发货的钢卷 getShippedCoils() { if (this.form.orderId) { - listOrderPackaging(this.form.orderId).then(response => { - this.shippedCoils = response.data || []; + listOrderPackaging(this.form.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + this.shippedCoils = response.rows || []; }).catch(() => { this.shippedCoils = []; }); diff --git a/klp-ui/src/views/crm/order/index.vue b/klp-ui/src/views/crm/order/index.vue index 2506c99cb..44aae12d1 100644 --- a/klp-ui/src/views/crm/order/index.vue +++ b/klp-ui/src/views/crm/order/index.vue @@ -259,8 +259,8 @@ export default { }, /** 查询发货配卷列表 */ getCoilList() { - listOrderPackaging(this.currentOrder.orderId).then(response => { - this.coilList = response.data || []; + listOrderPackaging(this.currentOrder.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + this.coilList = response.rows || []; }); }, /** 合同号改变事件 */ diff --git a/klp-ui/src/views/crm/saleman/index.vue b/klp-ui/src/views/crm/saleman/index.vue index a2ea8cca5..25ee729bb 100644 --- a/klp-ui/src/views/crm/saleman/index.vue +++ b/klp-ui/src/views/crm/saleman/index.vue @@ -310,8 +310,8 @@ export default { }); } case 'planDelivery': - return listDeliveryWaybillDetailBySaleman(dictValue).then(response => { - this.deliveryList = response; + return listDeliveryWaybillDetailBySaleman({ principal: dictValue, pageNum: 1, pageSize: 10000 }).then(response => { + this.deliveryList = response.rows || []; this.loadedTabs.planDelivery = true; this.rightLoading = false; }).catch(() => { diff --git a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java index c8dbb96da..510c2d1bc 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java @@ -188,18 +188,19 @@ public class WmsDeliveryWaybillDetailController extends BaseController { /** - * 根据负责人(principal)查询已发货绑定的钢卷列表 + * 根据负责人(principal)查询已发货绑定的钢卷列表(分页) */ @GetMapping("/coilListByPrincipal") - public List coilListByPrincipal( - @RequestParam(required = false) String principal) { + public TableDataInfo coilListByPrincipal( + @RequestParam(required = false) String principal, + PageQuery pageQuery) { List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(principal); if (boundCoilIds == null || boundCoilIds.isEmpty()) { - return Collections.emptyList(); + return new TableDataInfo<>(); } WmsMaterialCoilBo wmsMaterialCoilBo = new WmsMaterialCoilBo(); wmsMaterialCoilBo.setCoilIds(boundCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); - return iWmsMaterialCoilService.queryList(wmsMaterialCoilBo); + return iWmsMaterialCoilService.queryPageList(wmsMaterialCoilBo, pageQuery); } } From 70ade4632e927032caf7b7fabdaa19e98942e352 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 29 Jun 2026 17:19:28 +0800 Subject: [PATCH 02/17] =?UTF-8?q?feat(crm):=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=A1=B9=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在CrmOrderItemController中新增三个统计接口:按订单ID、销售员、合同ID统计配卷汇总 - 实现resolveCoilIdsByOrderId、resolveCoilIdsBySalesman、resolveCoilIdsByContractId辅助方法 - 重构queryCoilsByOrderId、queryCoilsBySalesman、queryCoilsByContractIdPaginated方法逻辑 - 新增queryCoilsByOrderIdStatistics、queryCoilsBySalesmanStatistics、queryCoilsByContractIdStatistics统计方法 - 添加emptyStatistics私有方法返回默认统计值 - 在WmsDeliveryWaybillDetailController中新增按负责人统计已发货钢卷汇总接口 --- .../controller/CrmOrderItemController.java | 20 ++ .../klp/crm/service/ICrmOrderItemService.java | 15 ++ .../service/impl/CrmOrderItemServiceImpl.java | 235 +++++++++++------- .../WmsDeliveryWaybillDetailController.java | 15 ++ 4 files changed, 194 insertions(+), 91 deletions(-) diff --git a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java index 026147661..e18d2f75b 100644 --- a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java +++ b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java @@ -148,4 +148,24 @@ public class CrmOrderItemController extends BaseController { PageQuery pageQuery) { return iCrmOrderItemService.queryCoilsByContractIdPaginated(contractId, pageQuery); } + + // 根据订单ID统计配卷汇总 + @GetMapping("/coils/order/{orderId}/statistics") + public R> getCoilsByOrderIdStatistics(@NotNull(message = "订单ID不能为空") + @PathVariable Long orderId) { + return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(orderId)); + } + + // 根据销售员统计生产成果汇总 + @GetMapping("/coils/bySalesman/statistics") + public R> getCoilsBySalesmanStatistics(@RequestParam String salesman) { + return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(salesman)); + } + + // 根据合同ID统计生产成果汇总 + @GetMapping("/coils/byContract/{contractId}/statistics") + public R> getCoilsByContractIdStatistics(@NotNull(message = "合同ID不能为空") + @PathVariable Long contractId) { + return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(contractId)); + } } diff --git a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java index 544d0283a..29d312fb1 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java +++ b/klp-crm/src/main/java/com/klp/crm/service/ICrmOrderItemService.java @@ -85,4 +85,19 @@ public interface ICrmOrderItemService { * 根据合同ID查询生产成果(钢卷列表)分页 */ TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery); + + /** + * 根据订单ID统计配卷汇总数据(数量、毛重、净重) + */ + java.util.Map queryCoilsByOrderIdStatistics(Long orderId); + + /** + * 根据销售员统计生产成果汇总数据(数量、毛重、净重) + */ + java.util.Map queryCoilsBySalesmanStatistics(String salesman); + + /** + * 根据合同ID统计生产成果汇总数据(数量、毛重、净重) + */ + java.util.Map queryCoilsByContractIdStatistics(Long contractId); } diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java index 6f1e473e3..fc5a2fa9a 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java @@ -290,16 +290,19 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { return result; } - @Override - public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery) { + // ==================== 线圈ID解析辅助方法 ==================== + + /** + * 根据订单ID解析关联的线圈ID串(通过发货单→发货单明细) + * @return 逗号分隔的coilId字符串,无数据返回null + */ + private String resolveCoilIdsByOrderId(Long orderId) { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); - if (waybills == null || waybills.isEmpty()) { - return new TableDataInfo<>(); + return null; } - List waybillIds = waybills.stream() .map(WmsDeliveryWaybill::getWaybillId) .collect(Collectors.toList()); @@ -307,31 +310,155 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); - if (details == null || details.isEmpty()) { - return new TableDataInfo<>(); + return null; } - - String coilIds = details.stream() + return details.stream() .map(WmsDeliveryWaybillDetail::getCoilId) .map(String::valueOf) .collect(Collectors.joining(",")); + } + /** + * 根据销售员解析关联的线圈ID串(通过crm_order→wms_coil_contract_rel) + * @return 逗号分隔的coilId字符串,无数据返回null + */ + private String resolveCoilIdsBySalesman(String salesman) { + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(CrmOrder::getSalesman, salesman); + orderWrapper.eq(CrmOrder::getDelFlag, 0); + List orders = crmOrderMapper.selectList(orderWrapper); + if (orders == null || orders.isEmpty()) { + return null; + } + List orderIds = orders.stream() + .map(CrmOrder::getOrderId) + .collect(Collectors.toList()); + + LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); + relWrapper.in(WmsCoilContractRel::getContractId, orderIds); + relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); + List rels = coilContractRelMapper.selectList(relWrapper); + if (rels == null || rels.isEmpty()) { + return null; + } + return rels.stream() + .map(WmsCoilContractRel::getCoilId) + .distinct() + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + + /** + * 根据合同ID解析关联的线圈ID串(通过crm_order→wms_coil_contract_rel) + * @return 逗号分隔的coilId字符串,无数据返回null + */ + private String resolveCoilIdsByContractId(Long contractId) { + LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); + orderWrapper.eq(CrmOrder::getContractId, contractId); + orderWrapper.eq(CrmOrder::getDelFlag, 0); + List orders = crmOrderMapper.selectList(orderWrapper); + if (orders == null || orders.isEmpty()) { + return null; + } + List orderIds = orders.stream() + .map(CrmOrder::getOrderId) + .collect(Collectors.toList()); + + LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); + relWrapper.in(WmsCoilContractRel::getContractId, orderIds); + relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); + List rels = coilContractRelMapper.selectList(relWrapper); + if (rels == null || rels.isEmpty()) { + return null; + } + return rels.stream() + .map(WmsCoilContractRel::getCoilId) + .distinct() + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + + // ==================== 分页列表查询 ==================== + + @Override + public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery) { + String coilIds = resolveCoilIdsByOrderId(orderId); + if (coilIds == null) { + return new TableDataInfo<>(); + } WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } + @Override + public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery) { + String coilIds = resolveCoilIdsBySalesman(salesman); + if (coilIds == null) { + return new TableDataInfo<>(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + } + + @Override + public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) { + String coilIds = resolveCoilIdsByContractId(contractId); + if (coilIds == null) { + return new TableDataInfo<>(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + } + + // ==================== 统计汇总查询 ==================== + + @Override + public Map queryCoilsByOrderIdStatistics(Long orderId) { + String coilIds = resolveCoilIdsByOrderId(orderId); + if (coilIds == null) { + return emptyStatistics(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.getStatistics(coilBo); + } + + @Override + public Map queryCoilsBySalesmanStatistics(String salesman) { + String coilIds = resolveCoilIdsBySalesman(salesman); + if (coilIds == null) { + return emptyStatistics(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.getStatistics(coilBo); + } + + @Override + public Map queryCoilsByContractIdStatistics(Long contractId) { + String coilIds = resolveCoilIdsByContractId(contractId); + if (coilIds == null) { + return emptyStatistics(); + } + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(coilIds); + return iWmsMaterialCoilService.getStatistics(coilBo); + } + + // ==================== 已有方法(非分页) ==================== + @Override public List queryCoilsByContractId(Long contractId) { LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); orderWrapper.eq(CrmOrder::getContractId, contractId); List orders = crmOrderMapper.selectList(orderWrapper); - if (orders == null || orders.isEmpty()) { return Collections.emptyList(); } - List orderIds = orders.stream() .map(CrmOrder::getOrderId) .collect(Collectors.toList()); @@ -339,11 +466,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); - if (waybills == null || waybills.isEmpty()) { return Collections.emptyList(); } - List waybillIds = waybills.stream() .map(WmsDeliveryWaybill::getWaybillId) .collect(Collectors.toList()); @@ -351,11 +476,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); - if (details == null || details.isEmpty()) { return Collections.emptyList(); } - String coilIds = details.stream() .map(WmsDeliveryWaybillDetail::getCoilId) .map(String::valueOf) @@ -373,11 +496,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); orderWrapper.eq(CrmOrder::getCustomerId, customerId); List orders = crmOrderMapper.selectList(orderWrapper); - if (orders == null || orders.isEmpty()) { return result; } - List orderIds = orders.stream() .map(CrmOrder::getOrderId) .collect(Collectors.toList()); @@ -405,11 +526,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); orderWrapper.eq(CrmOrder::getCustomerId, customerId); List orders = crmOrderMapper.selectList(orderWrapper); - if (orders == null || orders.isEmpty()) { return Collections.emptyList(); } - List orderIds = orders.stream() .map(CrmOrder::getOrderId) .collect(Collectors.toList()); @@ -417,11 +536,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); - if (waybills == null || waybills.isEmpty()) { return Collections.emptyList(); } - List waybillIds = waybills.stream() .map(WmsDeliveryWaybill::getWaybillId) .collect(Collectors.toList()); @@ -429,11 +546,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds); List details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper); - if (details == null || details.isEmpty()) { return Collections.emptyList(); } - String coilIds = details.stream() .map(WmsDeliveryWaybillDetail::getCoilId) .map(String::valueOf) @@ -444,73 +559,11 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { return iWmsMaterialCoilService.queryList(coilBo); } - @Override - public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery) { - LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); - orderWrapper.eq(CrmOrder::getSalesman, salesman); - orderWrapper.eq(CrmOrder::getDelFlag, 0); - List orders = crmOrderMapper.selectList(orderWrapper); - - if (orders == null || orders.isEmpty()) { - return new TableDataInfo<>(); - } - - List orderIds = orders.stream() - .map(CrmOrder::getOrderId) - .collect(Collectors.toList()); - - LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); - relWrapper.in(WmsCoilContractRel::getContractId, orderIds); - relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); - List rels = coilContractRelMapper.selectList(relWrapper); - - if (rels == null || rels.isEmpty()) { - return new TableDataInfo<>(); - } - - String coilIds = rels.stream() - .map(WmsCoilContractRel::getCoilId) - .distinct() - .map(String::valueOf) - .collect(Collectors.joining(",")); - - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); - coilBo.setCoilIds(coilIds); - return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); - } - - @Override - public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) { - LambdaQueryWrapper orderWrapper = new LambdaQueryWrapper<>(); - orderWrapper.eq(CrmOrder::getContractId, contractId); - orderWrapper.eq(CrmOrder::getDelFlag, 0); - List orders = crmOrderMapper.selectList(orderWrapper); - - if (orders == null || orders.isEmpty()) { - return new TableDataInfo<>(); - } - - List orderIds = orders.stream() - .map(CrmOrder::getOrderId) - .collect(Collectors.toList()); - - LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); - relWrapper.in(WmsCoilContractRel::getContractId, orderIds); - relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); - List rels = coilContractRelMapper.selectList(relWrapper); - - if (rels == null || rels.isEmpty()) { - return new TableDataInfo<>(); - } - - String coilIds = rels.stream() - .map(WmsCoilContractRel::getCoilId) - .distinct() - .map(String::valueOf) - .collect(Collectors.joining(",")); - - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); - coilBo.setCoilIds(coilIds); - return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); + private Map emptyStatistics() { + Map empty = new HashMap<>(); + empty.put("total_count", java.math.BigDecimal.ZERO); + empty.put("total_gross_weight", java.math.BigDecimal.ZERO); + empty.put("total_net_weight", java.math.BigDecimal.ZERO); + return empty; } } diff --git a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java index 510c2d1bc..8d7c2969d 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java @@ -203,4 +203,19 @@ public class WmsDeliveryWaybillDetailController extends BaseController { return iWmsMaterialCoilService.queryPageList(wmsMaterialCoilBo, pageQuery); } + /** + * 根据负责人(principal)统计已发货绑定钢卷的汇总数据(数量、毛重、净重) + */ + @GetMapping("/coilListByPrincipal/statistics") + public R> getCoilListByPrincipalStatistics( + @RequestParam(required = false) String principal) { + List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(principal); + if (boundCoilIds == null || boundCoilIds.isEmpty()) { + return R.ok(); + } + WmsMaterialCoilBo wmsMaterialCoilBo = new WmsMaterialCoilBo(); + wmsMaterialCoilBo.setCoilIds(boundCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + return R.ok(iWmsMaterialCoilService.getStatistics(wmsMaterialCoilBo)); + } + } From 4a9d811592217ef9c5093f279cf3aa5bf78ed5b6 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 30 Jun 2026 09:16:52 +0800 Subject: [PATCH 03/17] =?UTF-8?q?feat(wms):=20=E5=9C=A8=E6=8E=92=E4=BA=A7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=AD=E6=96=B0=E5=A2=9E=E5=B7=A5=E5=BA=8F?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在排产单表格中添加工序类型列显示 - 在编辑表单中增加工序类型输入字段 - 在合并表单中添加工序类型字段配置 - 在后端实体类SchProdScheduleItem中新增actionType属性 - 在业务对象SchProdScheduleItemBo中添加actionType字段 - 在查询条件中加入工序类型过滤功能 - 在视图对象SchProdScheduleItemVo中添加工序类型映射 - 更新表单初始化时工序类型数据的处理逻辑 --- .../klp/flow/domain/SchProdScheduleItem.java | 4 ++ .../flow/domain/bo/SchProdScheduleItemBo.java | 5 +++ .../flow/domain/vo/SchProdScheduleItemVo.java | 6 +++ .../impl/SchProdScheduleItemServiceImpl.java | 2 + klp-ui/src/views/wms/post/aps/schedule.vue | 43 ++++++++++++------- 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java index f888ece07..ef0cf17e2 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java @@ -131,6 +131,10 @@ public class SchProdScheduleItem extends BaseEntity { * 排产明细关联主表ID(逗号分隔,未合并存单值,合并后存多个) */ private String scheduleDetailIds; + /** + * 工序类型 + */ + private String actionType; /** * 规格 例:1.0X1250 */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java index c2fbd5f3f..64a8d0799 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java @@ -158,6 +158,11 @@ public class SchProdScheduleItemBo extends BaseEntity { */ private String scheduleDetailIds; + /** + * 工序类型 + */ + private String actionType; + /** * 规格 例:1.0X1250 */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java index 6adfeb3a5..1dc7f0001 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java @@ -189,6 +189,12 @@ public class SchProdScheduleItemVo { @ExcelProperty(value = "排产明细关联主表ID") private String scheduleDetailIds; + /** + * 工序类型 + */ + @ExcelProperty(value = "工序类型") + private String actionType; + /** * 规格 例:1.0X1250 */ diff --git a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleItemServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleItemServiceImpl.java index dee39cfb3..1254fffeb 100644 --- a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleItemServiceImpl.java +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleItemServiceImpl.java @@ -108,6 +108,8 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi lqw.eq(bo.getScheduleWeight() != null, SchProdScheduleItem::getScheduleWeight, bo.getScheduleWeight()); lqw.eq(StringUtils.isNotBlank(bo.getProductItem()), SchProdScheduleItem::getProductItem, bo.getProductItem()); lqw.eq(StringUtils.isNotBlank(bo.getRowRemark()), SchProdScheduleItem::getRowRemark, bo.getRowRemark()); + // actionType + lqw.eq(StringUtils.isNotBlank(bo.getActionType()), SchProdScheduleItem::getActionType, bo.getActionType()); return lqw; } diff --git a/klp-ui/src/views/wms/post/aps/schedule.vue b/klp-ui/src/views/wms/post/aps/schedule.vue index 726abd298..6ff6398ec 100644 --- a/klp-ui/src/views/wms/post/aps/schedule.vue +++ b/klp-ui/src/views/wms/post/aps/schedule.vue @@ -205,6 +205,7 @@ + @@ -179,6 +179,10 @@ export default { handleReleaseWarehouse(warehouse) { this.$emit('release-warehouse', warehouse); }, + + handleCoilSelected(coil) { + this.$emit('coil-selected', coil); + }, /** * 解析第三级库位编码 * 新规则: diff --git a/klp-ui/src/views/wms/warehouse/components/WarehouseInterlaced.vue b/klp-ui/src/views/wms/warehouse/components/WarehouseInterlaced.vue index 0755ecb0d..b26010291 100644 --- a/klp-ui/src/views/wms/warehouse/components/WarehouseInterlaced.vue +++ b/klp-ui/src/views/wms/warehouse/components/WarehouseInterlaced.vue @@ -41,7 +41,8 @@ }">
+ :class="{ disabled: warehouse.isEnabled === 0, error: warehouse.isEnabled === 0 && warehouse.currentCoilNo == null }" @click.stop="handleCellClick(warehouse)" + @contextmenu.prevent.stop="handleCellContextMenu(warehouse)">
{{ warehouse.actualWarehouseName || '-' }}
{{ warehouse.currentCoilNo || '-' }}
@@ -61,7 +62,8 @@ :class="{ disabled: warehouse.isEnabled === 0, error: warehouse.isEnabled === 0 && warehouse.currentCoilNo == null }" :style="{ transform: `translateY(var(--offset-value))`, position: 'relative' - }" @click.stop="handleCellClick(warehouse)"> + }" @click.stop="handleCellClick(warehouse)" + @contextmenu.prevent.stop="handleCellContextMenu(warehouse)">
{{ warehouse.actualWarehouseName || '-' }}
{{ warehouse.currentCoilNo || '-' }}
@@ -433,6 +435,16 @@ export default { this.currentWarehouse = { ...warehouse }; this.dialogOpen = true; }, + + handleCellContextMenu(warehouse) { + if (!warehouse.coilId) return; + this.$emit('coil-selected', { + coilId: warehouse.coilId, + currentCoilNo: warehouse.currentCoilNo, + warehouseId: warehouse.actualWarehouseId, + warehouseName: warehouse.actualWarehouseName || warehouse.actualWarehouseCode, + }); + }, handleSplitWarehouse(payload) { this.$emit('split-warehouse', payload); }, diff --git a/klp-ui/src/views/wms/warehouse/overview.vue b/klp-ui/src/views/wms/warehouse/overview.vue index f0f1f9592..09d305a43 100644 --- a/klp-ui/src/views/wms/warehouse/overview.vue +++ b/klp-ui/src/views/wms/warehouse/overview.vue @@ -13,7 +13,7 @@
- + - +
@@ -36,6 +38,29 @@
+ + +
+ +
暂无钢卷数据
+
+ + + + + + + + + + +
+ @@ -71,6 +96,9 @@ + + From 89773b273b954fb75c8032dda026548471120b81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com> Date: Tue, 30 Jun 2026 11:33:39 +0800 Subject: [PATCH 10/17] =?UTF-8?q?refactor(wms/coil/label):=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=B4=A8=E9=87=8F=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将三个标签页组件的质量状态展示逻辑抽离为复用的计算属性,把原始状态码转换为易读的中文描述,A/A+/A-/B/B+/B-统一显示为合格品,其他情况保留原始值 --- klp-ui/src/views/wms/coil/panels/LabelRender/DuGeTag.vue | 9 ++++++++- .../views/wms/coil/panels/LabelRender/GalvanizedTag.vue | 9 ++++++++- .../wms/coil/panels/LabelRender/OuterTagPreview.vue | 9 ++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/klp-ui/src/views/wms/coil/panels/LabelRender/DuGeTag.vue b/klp-ui/src/views/wms/coil/panels/LabelRender/DuGeTag.vue index 6fd6716d4..ce4428253 100644 --- a/klp-ui/src/views/wms/coil/panels/LabelRender/DuGeTag.vue +++ b/klp-ui/src/views/wms/coil/panels/LabelRender/DuGeTag.vue @@ -66,7 +66,7 @@
产品等级
-
{{ content.qualityStatus || '' }}
+
{{ qualityStatusDisplay }}
@@ -181,6 +181,13 @@ export default { materialWithManufacturer() { return this.content.material }, + qualityStatusDisplay() { + const status = (this.content.qualityStatus || '').trim() + if (['A', 'A+', 'A-', 'B', 'B+', 'B-'].includes(status)) { + return '合格品' + } + return status + }, orderUnitDisplay() { return (this.content.orderUnit || '').replace(/有限公司/g, '') }, diff --git a/klp-ui/src/views/wms/coil/panels/LabelRender/GalvanizedTag.vue b/klp-ui/src/views/wms/coil/panels/LabelRender/GalvanizedTag.vue index c3211c698..ac1d1cc1e 100644 --- a/klp-ui/src/views/wms/coil/panels/LabelRender/GalvanizedTag.vue +++ b/klp-ui/src/views/wms/coil/panels/LabelRender/GalvanizedTag.vue @@ -66,7 +66,7 @@
质量状态
-
{{ content.qualityStatus || '' }}
+
{{ qualityStatusDisplay }}
@@ -182,6 +182,13 @@ export default { materialWithManufacturer() { return this.content.material }, + qualityStatusDisplay() { + const status = (this.content.qualityStatus || '').trim() + if (['A', 'A+', 'A-', 'B', 'B+', 'B-'].includes(status)) { + return '合格品' + } + return status + }, orderUnitDisplay() { return (this.content.orderUnit || '').replace(/有限公司/g, '') }, diff --git a/klp-ui/src/views/wms/coil/panels/LabelRender/OuterTagPreview.vue b/klp-ui/src/views/wms/coil/panels/LabelRender/OuterTagPreview.vue index f93651794..41c576c98 100644 --- a/klp-ui/src/views/wms/coil/panels/LabelRender/OuterTagPreview.vue +++ b/klp-ui/src/views/wms/coil/panels/LabelRender/OuterTagPreview.vue @@ -65,7 +65,7 @@
质量要求
-
{{ content.qualityStatus || '' }}
+
{{ qualityStatusDisplay }}
@@ -188,6 +188,13 @@ export default { materialWithManufacturer() { return this.content.material }, + qualityStatusDisplay() { + const status = (this.content.qualityStatus || '').trim() + if (['A', 'A+', 'A-', 'B', 'B+', 'B-'].includes(status)) { + return '合格品' + } + return status + }, orderUnitDisplay() { return (this.content.orderUnit || '').replace(/有限公司/g, '') }, From 81dec034b380ac1d34bad0c68a52aa3a157e65c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com> Date: Tue, 30 Jun 2026 11:42:03 +0800 Subject: [PATCH 11/17] =?UTF-8?q?feat:=20=E5=A4=9A=E4=B8=AA=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=E4=B8=8E=E6=96=B0?= =?UTF-8?q?=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 异议页面:新增状态为4时的导出PDF按钮,替换原有注释的打印按钮 2. 流程图页面:重构流程图组件,支持多流程切换、节点点击事件,优化主题配置和渲染逻辑 3. 钢卷待领页面:新增钢卷数据修正功能,新增操作列按钮和对应弹窗表单,注释绑定组件 4. 导出PDF弹窗:优化多钢卷数据展示,拆分合并附件排版,优化导出样式和分页逻辑 --- klp-ui/src/views/wms/coil/panels/do.vue | 415 ++++++++++++++- klp-ui/src/views/wms/post/flow.vue | 294 +++++++---- .../objection/components/ExportPdfDialog.vue | 490 ++++++++++-------- klp-ui/src/views/wms/post/objection/index.vue | 4 +- 4 files changed, 873 insertions(+), 330 deletions(-) diff --git a/klp-ui/src/views/wms/coil/panels/do.vue b/klp-ui/src/views/wms/coil/panels/do.vue index dc0652cde..4446891e6 100644 --- a/klp-ui/src/views/wms/coil/panels/do.vue +++ b/klp-ui/src/views/wms/coil/panels/do.vue @@ -11,7 +11,7 @@ :name="tab.value">

待领物料列表

- + 刷新 @@ -44,12 +44,13 @@ - + @@ -297,15 +299,206 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
请先选择材料类型
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 保存合同 +
+
+
+
+
+ +
diff --git a/klp-ui/src/views/wms/post/flow.vue b/klp-ui/src/views/wms/post/flow.vue index 3498884b8..eac1bf431 100644 --- a/klp-ui/src/views/wms/post/flow.vue +++ b/klp-ui/src/views/wms/post/flow.vue @@ -27,7 +27,7 @@
-
+
@@ -35,7 +35,7 @@ \ 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 05fd8ee43..973c9d71b 100644 --- a/klp-ui/src/views/crm/contract/components/ContractTabs.vue +++ b/klp-ui/src/views/crm/contract/components/ContractTabs.vue @@ -2,12 +2,6 @@
-
@@ -22,10 +16,12 @@
-
+
- + \ No newline at end of file diff --git a/klp-ui/src/views/crm/contract/index.vue b/klp-ui/src/views/crm/contract/index.vue index 82ee8078b..4981333c6 100644 --- a/klp-ui/src/views/crm/contract/index.vue +++ b/klp-ui/src/views/crm/contract/index.vue @@ -26,9 +26,9 @@
- +
@@ -229,7 +229,7 @@ + + diff --git a/klp-wms/src/main/java/com/klp/controller/WmsCoilContractRelController.java b/klp-wms/src/main/java/com/klp/controller/WmsCoilContractRelController.java index f93ead442..b52a5a266 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsCoilContractRelController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsCoilContractRelController.java @@ -18,7 +18,9 @@ import com.klp.common.core.validate.EditGroup; import com.klp.common.enums.BusinessType; import com.klp.common.utils.poi.ExcelUtil; import com.klp.domain.vo.WmsCoilContractRelVo; +import com.klp.domain.vo.ContractCoilStatisticsVo; import com.klp.domain.bo.WmsCoilContractRelBo; +import com.klp.domain.bo.ContractCoilStatisticsBo; import com.klp.service.IWmsCoilContractRelService; import com.klp.common.core.page.TableDataInfo; @@ -97,6 +99,25 @@ public class WmsCoilContractRelController extends BaseController { return R.ok(updated); } + /** + * 查询合同挂接情况统计 + */ + @GetMapping("/statistics") + public R> statistics(ContractCoilStatisticsBo bo) { + List list = iWmsCoilContractRelService.queryContractCoilStatistics(bo); + return R.ok(list); + } + + /** + * 导出合同挂接情况统计 + */ + @Log(title = "合同挂接情况统计", businessType = BusinessType.EXPORT) + @PostMapping("/statistics/export") + public void statisticsExport(ContractCoilStatisticsBo bo, HttpServletResponse response) { + List list = iWmsCoilContractRelService.queryContractCoilStatistics(bo); + ExcelUtil.exportExcel(list, "合同挂接情况统计", ContractCoilStatisticsVo.class, response); + } + /** * 删除钢卷与合同关联关系 * diff --git a/klp-wms/src/main/java/com/klp/domain/bo/ContractCoilStatisticsBo.java b/klp-wms/src/main/java/com/klp/domain/bo/ContractCoilStatisticsBo.java new file mode 100644 index 000000000..2aa941225 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/ContractCoilStatisticsBo.java @@ -0,0 +1,36 @@ +package com.klp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 合同挂接情况统计查询对象 + * + * @author klp + * @date 2026-06-30 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ContractCoilStatisticsBo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** 合同号 */ + private String contractCode; + + /** 合同名称 */ + private String contractName; + + /** 需方(客户) */ + private String customer; + + /** 销售员 */ + private String salesman; + + /** 合同状态 0=草稿 1=生效 2=作废 3=已完成 */ + private Long status; + + /** 订单编号 */ + private String orderCode; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/ContractCoilStatisticsVo.java b/klp-wms/src/main/java/com/klp/domain/vo/ContractCoilStatisticsVo.java new file mode 100644 index 000000000..e51ad2762 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/ContractCoilStatisticsVo.java @@ -0,0 +1,85 @@ +package com.klp.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 合同挂接情况统计视图对象 + * 基于 crm_order + wms_coil_contract_rel + wms_material_coil 三表联合统计 + * + * @author klp + * @date 2026-06-30 + */ +@Data +@ExcelIgnoreUnannotated +public class ContractCoilStatisticsVo { + + private static final long serialVersionUID = 1L; + + // ========== 合同信息(来自 crm_order)========== + + /** 订单ID */ + @ExcelProperty(value = "订单ID") + private Long orderId; + + /** 订单编号 */ + @ExcelProperty(value = "订单编号") + private String orderCode; + + /** 合同号 */ + @ExcelProperty(value = "合同号") + private String contractCode; + + /** 合同名称 */ + @ExcelProperty(value = "合同名称") + private String contractName; + + /** 需方(客户) */ + @ExcelProperty(value = "需方") + private String customer; + + /** 供方 */ + @ExcelProperty(value = "供方") + private String supplier; + + /** 销售员 */ + @ExcelProperty(value = "销售员") + private String salesman; + + /** 合同状态 0=草稿 1=生效 2=作废 3=已完成 */ + @ExcelProperty(value = "合同状态") + private Long status; + + /** 订单总额 */ + @ExcelProperty(value = "订单总额") + private BigDecimal orderAmount; + + /** 签订时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "签订时间") + private Date signTime; + + /** 交货日期 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "交货日期") + private Date deliveryDate; + + // ========== 统计字段 ========== + + /** 挂接钢卷数量 */ + @ExcelProperty(value = "挂接钢卷数") + private Long coilCount; + + /** 钢卷总净重(kg) */ + @ExcelProperty(value = "钢卷总净重(kg)") + private BigDecimal totalNetWeight; + + /** 钢卷总毛重(kg) */ + @ExcelProperty(value = "钢卷总毛重(kg)") + private BigDecimal totalGrossWeight; +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsCoilContractRelMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsCoilContractRelMapper.java index 9fd53fbc9..e568052a7 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsCoilContractRelMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsCoilContractRelMapper.java @@ -2,6 +2,8 @@ package com.klp.mapper; import com.klp.domain.WmsCoilContractRel; import com.klp.domain.vo.WmsCoilContractRelVo; +import com.klp.domain.vo.ContractCoilStatisticsVo; +import com.klp.domain.bo.ContractCoilStatisticsBo; import com.klp.common.core.mapper.BaseMapperPlus; import org.apache.ibatis.annotations.Param; @@ -34,4 +36,9 @@ public interface WmsCoilContractRelMapper extends BaseMapperPlus selectContractInfoByOrderId(@Param("orderId") Long orderId); + + /** + * 查询合同挂接钢卷统计(按合同分组统计钢卷数量和重量) + */ + List selectContractCoilStatistics(@Param("bo") ContractCoilStatisticsBo bo); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsCoilContractRelService.java b/klp-wms/src/main/java/com/klp/service/IWmsCoilContractRelService.java index 95d8eb468..3ec95104f 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsCoilContractRelService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsCoilContractRelService.java @@ -2,7 +2,9 @@ package com.klp.service; import com.klp.domain.WmsCoilContractRel; import com.klp.domain.vo.WmsCoilContractRelVo; +import com.klp.domain.vo.ContractCoilStatisticsVo; import com.klp.domain.bo.WmsCoilContractRelBo; +import com.klp.domain.bo.ContractCoilStatisticsBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; @@ -55,4 +57,12 @@ public interface IWmsCoilContractRelService { * @return 实际更新的记录数 */ int batchUpdateContractId(Long contractId, List coilIds); + + /** + * 查询合同挂接钢卷统计 + * + * @param bo 查询参数 + * @return 统计列表 + */ + List queryContractCoilStatistics(ContractCoilStatisticsBo bo); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java index c481f7295..d1c336a0d 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java @@ -11,7 +11,9 @@ import com.klp.common.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsCoilContractRelBo; +import com.klp.domain.bo.ContractCoilStatisticsBo; import com.klp.domain.vo.WmsCoilContractRelVo; +import com.klp.domain.vo.ContractCoilStatisticsVo; import com.klp.domain.WmsCoilContractRel; import com.klp.domain.WmsMaterialCoil; import com.klp.mapper.WmsCoilContractRelMapper; @@ -195,4 +197,12 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService } return updated; } + + /** + * 查询合同挂接钢卷统计 + */ + @Override + public List queryContractCoilStatistics(ContractCoilStatisticsBo bo) { + return baseMapper.selectContractCoilStatistics(bo); + } } diff --git a/klp-wms/src/main/resources/mapper/klp/WmsCoilContractRelMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsCoilContractRelMapper.xml index 630331bc8..64df9823a 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsCoilContractRelMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsCoilContractRelMapper.xml @@ -154,4 +154,49 @@ LIMIT 1 + + + From f4c870aa23462ee219f658c3a383e3d02a97d0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com> Date: Tue, 30 Jun 2026 16:43:03 +0800 Subject: [PATCH 14/17] =?UTF-8?q?feat(aps):=20=E4=BC=98=E5=8C=96=E6=8E=92?= =?UTF-8?q?=E4=BA=A7=E9=A1=B5=E9=9D=A2=E4=B8=8E=E5=AF=B9=E6=AF=94=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E5=B7=A5=E5=BA=8F=E7=B1=BB=E5=9E=8B=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E5=92=8C=E7=AD=9B=E9=80=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 为待审核、已排产卡片添加自定义加载提示文本 2. 替换工序类型输入框为下拉选择器,使用全局工序枚举数据 3. 为排产表格添加工序类型名称转换显示 4. 重构对比页面的工序筛选逻辑,改为顶部单选按钮组筛选 5. 优化钢卷数据查询逻辑,关联选中的工序类型进行查询 6. 修复编辑和合并表单的字段类型转换问题 --- klp-ui/src/views/wms/post/aps/compare.vue | 123 +++++++++++++-------- klp-ui/src/views/wms/post/aps/schedule.vue | 52 +++++++-- 2 files changed, 119 insertions(+), 56 deletions(-) diff --git a/klp-ui/src/views/wms/post/aps/compare.vue b/klp-ui/src/views/wms/post/aps/compare.vue index dca25f3c5..2aad31614 100644 --- a/klp-ui/src/views/wms/post/aps/compare.vue +++ b/klp-ui/src/views/wms/post/aps/compare.vue @@ -18,6 +18,17 @@
+ +
+ + {{ p.name }} + +
+ @@ -28,17 +39,6 @@ 共 {{ scheduleList.length }} 条
- -
- {{ at || '(空)' }} - 全部 -
-
+
import { listScheduleItem } from '@/api/aps/schedule' import { listMaterialCoil } from '@/api/aps/materialCoil' +import { listLightPendingAction } from '@/api/wms/pendingAction' +import { PROCESSES } from '@/utils/meta' export default { name: 'ApsCompare', @@ -121,10 +123,12 @@ export default { // 左侧排产明细 schLoading: false, scheduleList: [], - actionTypes: [], - selectedActionType: '', coilStatusMap: { 0: '在库', 1: '在途', 2: '已出库' }, + // 工序筛选(顶部 radio tab) + processOptions: PROCESSES, + selectedProcessActionType: null, + // 右侧钢卷 coilLoading: false, coilList: [], @@ -134,11 +138,15 @@ export default { }, computed: { filteredScheduleList() { - if (!this.selectedActionType) return this.scheduleList - return this.scheduleList.filter(item => (item.actionType || '') === this.selectedActionType) + if (!this.selectedProcessActionType) return this.scheduleList + return this.scheduleList.filter(item => String(item.actionType) === String(this.selectedProcessActionType)) } }, created() { + // 默认选中第一个工序 + if (this.processOptions.length > 0) { + this.selectedProcessActionType = this.processOptions[0].actionType + } this.handleQuery() }, methods: { @@ -156,44 +164,55 @@ export default { queryScheduleItems() { this.schLoading = true this.scheduleList = [] - this.actionTypes = [] - this.selectedActionType = '' listScheduleItem({ prodDate: this.queryDate, pageNum: 1, pageSize: 9999 }).then(res => { this.scheduleList = (res.rows || []).sort((a, b) => (a.scheduleNo || '').localeCompare(b.scheduleNo || '')) - // 提取所有不同的 actionType - const types = new Set() - this.scheduleList.forEach(item => { - if (item.actionType) types.add(item.actionType) - }) - this.actionTypes = [...types].sort() this.updateSummary() }).catch(() => { this.scheduleList = [] - this.actionTypes = [] }).finally(() => { this.schLoading = false }) }, - filterByActionType(type) { - this.selectedActionType = type - }, - - // ====== 右侧:钢卷 ====== + // ====== 右侧:钢卷(先查 pendingAction 获取 coilIds,再查实际钢卷) ====== queryCoils() { + if (!this.selectedProcessActionType) { + this.coilList = [] + this.coilTotal = 0 + this.coilTotalWeight = 0 + return + } this.coilLoading = true this.coilList = [] - listMaterialCoil({ - pageNum: 1, - pageSize: 9999 - // 可根据需要加上日期和 dataType 过滤 + const startTime = `${this.queryDate} 00:00:00` + const endTime = `${this.queryDate} 23:59:59` + + listLightPendingAction({ + actionType: this.selectedProcessActionType, + startTime, + endTime }).then(res => { - this.coilList = res.rows || [] - this.coilTotal = res.total || this.coilList.length - this.coilTotalWeight = this.coilList.reduce((sum, c) => sum + (parseFloat(c.netWeight) || 0) / 1000, 0).toFixed(3) - this.updateSummary() + const rows = res.rows || (Array.isArray(res) ? res : []) + const coilIds = rows.map(r => r.processedCoilId).filter(Boolean) + if (coilIds.length === 0) { + this.coilList = [] + this.coilTotal = 0 + this.coilTotalWeight = 0 + this.updateSummary() + return + } + return listMaterialCoil({ + coilIds: coilIds.join(','), + pageNum: 1, + pageSize: 1000 + }).then(coilRes => { + this.coilList = coilRes.rows || [] + this.coilTotal = coilRes.total || this.coilList.length + this.coilTotalWeight = this.coilList.reduce((sum, c) => sum + (parseFloat(c.netWeight) || 0) / 1000, 0).toFixed(3) + this.updateSummary() + }) }).catch(() => { this.coilList = [] this.coilTotal = 0 @@ -203,6 +222,10 @@ export default { }) }, + onProcessChange() { + this.queryCoils() + }, + updateSummary() { this.summaryText = `排产 ${this.scheduleList.length} 条 | 钢卷 ${this.coilTotal} 条 ${this.coilTotalWeight} 吨` } @@ -251,6 +274,21 @@ export default { border: 1px solid $aps-border; } +.process-tab-bar { + flex-shrink: 0; + padding: 6px 0; + ::v-deep .el-radio-button__inner { + padding: 6px 14px; + font-size: 12px; + } + ::v-deep .el-radio-button:first-child .el-radio-button__inner { + border-radius: $aps-radius 0 0 $aps-radius; + } + ::v-deep .el-radio-button:last-child .el-radio-button__inner { + border-radius: 0 $aps-radius $aps-radius 0; + } +} + .aps-compare-card { height: 100%; display: flex; @@ -259,15 +297,6 @@ export default { overflow: hidden; } -.action-filter-bar { - padding: 8px 12px; - border-bottom: 1px solid $aps-border; - display: flex; - flex-wrap: wrap; - gap: 6px; - flex-shrink: 0; -} - .aps-btn-red { @include aps-btn-red; } diff --git a/klp-ui/src/views/wms/post/aps/schedule.vue b/klp-ui/src/views/wms/post/aps/schedule.vue index 6ff6398ec..50afa27bc 100644 --- a/klp-ui/src/views/wms/post/aps/schedule.vue +++ b/klp-ui/src/views/wms/post/aps/schedule.vue @@ -23,14 +23,14 @@
-
+
待审核产需单明细 共 {{ pendingScheduleList.length }} 个产需单
-
+
@@ -162,7 +162,7 @@
-
+
已排产明细
@@ -191,7 +191,7 @@
-
+
- + + +