From 002ac3f3ab6aa7424fa10c50cad517b0ae8bf267 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Thu, 9 Jul 2026 19:01:36 +0800 Subject: [PATCH 1/9] =?UTF-8?q?refactor(crm):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E9=85=8D=E5=8D=B7=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=B9=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=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 - 将所有配卷查询接口统一为POST + Body BO方式 - 为配卷查询添加钢卷号、材料类型、质量状态、发货状态筛选条件 - 在合同详情页面为生产成果和发货配卷添加筛选表单 - 在订单页面为发货配卷添加筛选功能 - 在销售员页面为生产成果和计划发货添加筛选功能 - 更新异议管理页面的配卷查询参数结构 - 增加订单ID参数用于合同ID相关查询的兼容性处理 --- .../controller/CrmOrderItemController.java | 104 +++++++++++------- .../crm/domain/bo/ContractCoilQueryBo.java | 31 ++++++ .../klp/crm/domain/bo/OrderCoilQueryBo.java | 31 ++++++ .../crm/domain/bo/SalesmanCoilQueryBo.java | 31 ++++++ .../klp/crm/service/ICrmOrderItemService.java | 15 +-- .../service/impl/CrmOrderItemServiceImpl.java | 54 +++++---- klp-ui/src/api/crm/coil.js | 86 ++++++++------- klp-ui/src/api/crm/order.js | 11 +- klp-ui/src/api/wms/deliveryWaybillDetail.js | 8 +- .../views/crm/components/OrderObjection.vue | 4 +- .../crm/contract/components/ContractTabs.vue | 94 +++++++++++++++- klp-ui/src/views/crm/objection/index.vue | 6 +- klp-ui/src/views/crm/order/index.vue | 39 ++++++- klp-ui/src/views/crm/saleman/index.vue | 97 ++++++++++++++-- klp-ui/src/views/wms/post/aps/orderTrack.vue | 47 +++++++- .../WmsDeliveryWaybillDetailController.java | 35 +++--- .../klp/domain/bo/PrincipalCoilQueryBo.java | 28 +++++ 17 files changed, 561 insertions(+), 160 deletions(-) create mode 100644 klp-crm/src/main/java/com/klp/crm/domain/bo/ContractCoilQueryBo.java create mode 100644 klp-crm/src/main/java/com/klp/crm/domain/bo/OrderCoilQueryBo.java create mode 100644 klp-crm/src/main/java/com/klp/crm/domain/bo/SalesmanCoilQueryBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/PrincipalCoilQueryBo.java 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 610aaedbd..43fcfc6d2 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 @@ -25,8 +25,12 @@ import com.klp.crm.domain.vo.CrmOrderItemVo; import com.klp.crm.domain.vo.CrmOrderItemExportVo; import com.klp.crm.domain.vo.CrmContractOrderFinanceVo; import com.klp.crm.domain.bo.CrmOrderItemBo; +import com.klp.crm.domain.bo.OrderCoilQueryBo; +import com.klp.crm.domain.bo.SalesmanCoilQueryBo; +import com.klp.crm.domain.bo.ContractCoilQueryBo; import com.klp.crm.service.ICrmOrderItemService; import com.klp.domain.vo.WmsMaterialCoilVo; +import com.klp.domain.bo.WmsMaterialCoilBo; import com.klp.common.core.page.TableDataInfo; /** @@ -134,19 +138,63 @@ public class CrmOrderItemController extends BaseController { @PathVariable Long contractId) { return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByContractId(contractId)); } - // 根据订单id查询发货单据中的配卷(分页)。 - @GetMapping("/coils/order/{orderId}") - public TableDataInfo getCoilsByOrderId(@NotNull(message = "订单ID不能为空") - @PathVariable Long orderId, - PageQuery pageQuery) { - return iCrmOrderItemService.queryCoilsByOrderId(orderId, pageQuery); + // ==================== 钢卷查询(统一使用 POST + RequestBody BO) ==================== + + /** + * 根据订单ID分页查询发货配卷,支持钢卷信息筛选 + */ + @PostMapping("/coils/order/query") + public TableDataInfo getCoilsByOrderId(@RequestBody @Validated OrderCoilQueryBo bo) { + return iCrmOrderItemService.queryCoilsByOrderId(bo.getOrderId(), toPageQuery(bo), bo.getCoilBo()); } + /** + * 根据销售员分页查询生产成果,支持钢卷信息筛选 + */ + @PostMapping("/coils/salesman/query") + public TableDataInfo getCoilsBySalesman(@RequestBody @Validated SalesmanCoilQueryBo bo) { + return iCrmOrderItemService.queryCoilsBySalesman(bo.getSalesman(), toPageQuery(bo), bo.getCoilBo()); + } + + /** + * 根据合同ID分页查询生产成果,支持钢卷信息筛选 + */ + @PostMapping("/coils/contract/query") + public TableDataInfo getCoilsByContractIdPaginated(@RequestBody @Validated ContractCoilQueryBo bo) { + return iCrmOrderItemService.queryCoilsByContractIdPaginated(bo.getOrderId(), toPageQuery(bo), bo.getCoilBo()); + } + + /** + * 根据订单ID统计配卷汇总,支持钢卷信息筛选 + */ + @PostMapping("/coils/order/statistics") + public R> getCoilsByOrderIdStatistics(@RequestBody @Validated OrderCoilQueryBo bo) { + return R.ok(iCrmOrderItemService.queryCoilsByOrderIdStatistics(bo.getOrderId(), bo.getCoilBo())); + } + + /** + * 根据销售员统计生产成果汇总,支持钢卷信息筛选 + */ + @PostMapping("/coils/salesman/statistics") + public R> getCoilsBySalesmanStatistics(@RequestBody @Validated SalesmanCoilQueryBo bo) { + return R.ok(iCrmOrderItemService.queryCoilsBySalesmanStatistics(bo.getSalesman(), bo.getCoilBo())); + } + + /** + * 根据合同ID统计生产成果汇总,支持钢卷信息筛选 + */ + @PostMapping("/coils/contract/statistics") + public R> getCoilsByContractIdStatistics(@RequestBody @Validated ContractCoilQueryBo bo) { + return R.ok(iCrmOrderItemService.queryCoilsByContractIdStatistics(bo.getOrderId(), bo.getCoilBo())); + } + + // ==================== 已有接口 ==================== + // 根据合同id查询发货单据中的配卷。 @GetMapping("/coils/contract/{contractId}") public R> getCoilsByContractId(@NotNull(message = "合同ID不能为空") - @PathVariable Long contractId) { - return R.ok(iCrmOrderItemService.queryCoilsByContractId(contractId)); + @PathVariable Long orderId) { + return R.ok(iCrmOrderItemService.queryCoilsByContractId(orderId)); } // 根据客户id查询该客户下属订单关联的异议和财务信息。 @@ -163,38 +211,16 @@ public class CrmOrderItemController extends BaseController { 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); - } + private PageQuery toPageQuery(OrderCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); } + private PageQuery toPageQuery(SalesmanCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); } + private PageQuery toPageQuery(ContractCoilQueryBo bo) { return buildPageQuery(bo.getPageNum(), bo.getPageSize()); } - // 根据订单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)); + private PageQuery buildPageQuery(Integer pageNum, Integer pageSize) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(pageNum); + pageQuery.setPageSize(pageSize); + return pageQuery; } } diff --git a/klp-crm/src/main/java/com/klp/crm/domain/bo/ContractCoilQueryBo.java b/klp-crm/src/main/java/com/klp/crm/domain/bo/ContractCoilQueryBo.java new file mode 100644 index 000000000..63f2598c4 --- /dev/null +++ b/klp-crm/src/main/java/com/klp/crm/domain/bo/ContractCoilQueryBo.java @@ -0,0 +1,31 @@ +package com.klp.crm.domain.bo; + +import com.klp.domain.bo.WmsMaterialCoilBo; +import lombok.Data; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 合同钢卷查询请求对象 + * + * @author klp + * @date 2026-07-09 + */ +@Data +public class ContractCoilQueryBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 合同ID(必填) */ + @NotNull(message = "合同ID不能为空") + private Long orderId; + + /** 分页页码 */ + private Integer pageNum; + + /** 分页大小 */ + private Integer pageSize; + + /** 钢卷筛选条件 */ + private WmsMaterialCoilBo coilBo; +} diff --git a/klp-crm/src/main/java/com/klp/crm/domain/bo/OrderCoilQueryBo.java b/klp-crm/src/main/java/com/klp/crm/domain/bo/OrderCoilQueryBo.java new file mode 100644 index 000000000..881271161 --- /dev/null +++ b/klp-crm/src/main/java/com/klp/crm/domain/bo/OrderCoilQueryBo.java @@ -0,0 +1,31 @@ +package com.klp.crm.domain.bo; + +import com.klp.domain.bo.WmsMaterialCoilBo; +import lombok.Data; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * 订单钢卷查询请求对象 + * + * @author klp + * @date 2026-07-09 + */ +@Data +public class OrderCoilQueryBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 订单ID(必填) */ + @NotNull(message = "订单ID不能为空") + private Long orderId; + + /** 分页页码 */ + private Integer pageNum; + + /** 分页大小 */ + private Integer pageSize; + + /** 钢卷筛选条件 */ + private WmsMaterialCoilBo coilBo; +} diff --git a/klp-crm/src/main/java/com/klp/crm/domain/bo/SalesmanCoilQueryBo.java b/klp-crm/src/main/java/com/klp/crm/domain/bo/SalesmanCoilQueryBo.java new file mode 100644 index 000000000..a540551f0 --- /dev/null +++ b/klp-crm/src/main/java/com/klp/crm/domain/bo/SalesmanCoilQueryBo.java @@ -0,0 +1,31 @@ +package com.klp.crm.domain.bo; + +import com.klp.domain.bo.WmsMaterialCoilBo; +import lombok.Data; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * 销售员钢卷查询请求对象 + * + * @author klp + * @date 2026-07-09 + */ +@Data +public class SalesmanCoilQueryBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 销售员(必填) */ + @NotBlank(message = "销售员不能为空") + private String salesman; + + /** 分页页码 */ + private Integer pageNum; + + /** 分页大小 */ + private Integer pageSize; + + /** 钢卷筛选条件 */ + private WmsMaterialCoilBo coilBo; +} 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 29d312fb1..99c574640 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 @@ -11,6 +11,7 @@ import java.util.List; import com.klp.crm.domain.vo.CrmContractOrderFinanceVo; import com.klp.domain.vo.WmsMaterialCoilVo; +import com.klp.domain.bo.WmsMaterialCoilBo; import java.util.List; /** @@ -59,12 +60,12 @@ public interface ICrmOrderItemService { /** * 根据订单ID查询发货单配卷(分页) */ - TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery); + TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery, WmsMaterialCoilBo coilBo); /** * 根据合同ID查询发货单配卷 */ - List queryCoilsByContractId(Long contractId); + List queryCoilsByContractId(Long orderId); /** * 根据客户ID查询下属订单的异议和财务信息 @@ -79,25 +80,25 @@ public interface ICrmOrderItemService { /** * 根据销售员查询生产成果(钢卷列表)分页 */ - TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery); + TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery, WmsMaterialCoilBo coilBo); /** * 根据合同ID查询生产成果(钢卷列表)分页 */ - TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery); + TableDataInfo queryCoilsByContractIdPaginated(Long orderId, PageQuery pageQuery, WmsMaterialCoilBo coilBo); /** * 根据订单ID统计配卷汇总数据(数量、毛重、净重) */ - java.util.Map queryCoilsByOrderIdStatistics(Long orderId); + java.util.Map queryCoilsByOrderIdStatistics(Long orderId, WmsMaterialCoilBo coilBo); /** * 根据销售员统计生产成果汇总数据(数量、毛重、净重) */ - java.util.Map queryCoilsBySalesmanStatistics(String salesman); + java.util.Map queryCoilsBySalesmanStatistics(String salesman, WmsMaterialCoilBo coilBo); /** * 根据合同ID统计生产成果汇总数据(数量、毛重、净重) */ - java.util.Map queryCoilsByContractIdStatistics(Long contractId); + java.util.Map queryCoilsByContractIdStatistics(Long orderId, WmsMaterialCoilBo coilBo); } 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 d6a6d6346..8029bad84 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 @@ -260,21 +260,21 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { } @Override - public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId) { + public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long orderId) { CrmContractOrderFinanceVo result = new CrmContractOrderFinanceVo(); LambdaQueryWrapper objectionWrapper = new LambdaQueryWrapper<>(); - objectionWrapper.in(CrmSalesObjection::getOrderId, contractId); + objectionWrapper.in(CrmSalesObjection::getOrderId, orderId); List objectionList = crmSalesObjectionMapper.selectVoList(objectionWrapper); result.setObjectionList(objectionList); LambdaQueryWrapper receivableWrapper = new LambdaQueryWrapper<>(); - receivableWrapper.in(WmsReceivable::getOrderId, contractId); + receivableWrapper.in(WmsReceivable::getOrderId, orderId); List receivableList = wmsReceivableMapper.selectVoList(receivableWrapper); result.setReceivableList(receivableList); LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); - waybillWrapper.in(WmsDeliveryWaybill::getOrderId, contractId); + waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderId); List wmsDeliveryWaybills = wmsDeliveryWaybillMapper.selectVoList(waybillWrapper); result.setWmsDeliveryWaybills(wmsDeliveryWaybills); @@ -345,9 +345,9 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { * 根据合同ID解析关联的线圈ID串(通过crm_order→wms_coil_contract_rel) * @return 逗号分隔的coilId字符串,无数据返回null */ - private String resolveCoilIdsByContractId(Long contractId) { + private String resolveCoilIdsByContractId(Long orderId) { LambdaQueryWrapper relWrapper = new LambdaQueryWrapper<>(); - relWrapper.eq(WmsCoilContractRel::getContractId, contractId); + relWrapper.eq(WmsCoilContractRel::getContractId, orderId); relWrapper.eq(WmsCoilContractRel::getDelFlag, 0); List rels = coilContractRelMapper.selectList(relWrapper); if (rels == null || rels.isEmpty()) { @@ -363,34 +363,40 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { // ==================== 分页列表查询 ==================== @Override - public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery) { + public TableDataInfo queryCoilsByOrderId(Long orderId, PageQuery pageQuery, WmsMaterialCoilBo coilBo) { String coilIds = resolveCoilIdsByOrderId(orderId); if (coilIds == null) { return new TableDataInfo<>(); } - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + if (coilBo == null) { + coilBo = new WmsMaterialCoilBo(); + } coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } @Override - public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery) { + public TableDataInfo queryCoilsBySalesman(String salesman, PageQuery pageQuery, WmsMaterialCoilBo coilBo) { String coilIds = resolveCoilIdsBySalesman(salesman); if (coilIds == null) { return new TableDataInfo<>(); } - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + if (coilBo == null) { + coilBo = new WmsMaterialCoilBo(); + } coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } @Override - public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery) { + public TableDataInfo queryCoilsByContractIdPaginated(Long contractId, PageQuery pageQuery, WmsMaterialCoilBo coilBo) { String coilIds = resolveCoilIdsByContractId(contractId); if (coilIds == null) { return new TableDataInfo<>(); } - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + if (coilBo == null) { + coilBo = new WmsMaterialCoilBo(); + } coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } @@ -398,34 +404,40 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { // ==================== 统计汇总查询 ==================== @Override - public Map queryCoilsByOrderIdStatistics(Long orderId) { + public Map queryCoilsByOrderIdStatistics(Long orderId, WmsMaterialCoilBo coilBo) { String coilIds = resolveCoilIdsByOrderId(orderId); if (coilIds == null) { return emptyStatistics(); } - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + if (coilBo == null) { + coilBo = new WmsMaterialCoilBo(); + } coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.getStatistics(coilBo); } @Override - public Map queryCoilsBySalesmanStatistics(String salesman) { + public Map queryCoilsBySalesmanStatistics(String salesman, WmsMaterialCoilBo coilBo) { String coilIds = resolveCoilIdsBySalesman(salesman); if (coilIds == null) { return emptyStatistics(); } - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + if (coilBo == null) { + coilBo = new WmsMaterialCoilBo(); + } coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.getStatistics(coilBo); } @Override - public Map queryCoilsByContractIdStatistics(Long contractId) { - String coilIds = resolveCoilIdsByContractId(contractId); + public Map queryCoilsByContractIdStatistics(Long orderId, WmsMaterialCoilBo coilBo) { + String coilIds = resolveCoilIdsByContractId(orderId); if (coilIds == null) { return emptyStatistics(); } - WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + if (coilBo == null) { + coilBo = new WmsMaterialCoilBo(); + } coilBo.setCoilIds(coilIds); return iWmsMaterialCoilService.getStatistics(coilBo); } @@ -433,10 +445,10 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService { // ==================== 已有方法(非分页) ==================== @Override - public List queryCoilsByContractId(Long contractId) { + public List queryCoilsByContractId(Long orderId) { LambdaQueryWrapper waybillWrapper = new LambdaQueryWrapper<>(); - waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, contractId); + waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId); List waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper); if (waybills == null || waybills.isEmpty()) { return Collections.emptyList(); diff --git a/klp-ui/src/api/crm/coil.js b/klp-ui/src/api/crm/coil.js index 2763424c6..78ac5394a 100644 --- a/klp-ui/src/api/crm/coil.js +++ b/klp-ui/src/api/crm/coil.js @@ -1,6 +1,6 @@ import request from '@/utils/request' -// ==================== 配卷列表查询 ==================== +// ==================== 配卷列表查询(统一 POST + Body BO) ==================== // 指定客户的发货配卷列表 export function listDeliveryCoilsByCustomer(customerId) { @@ -10,74 +10,76 @@ export function listDeliveryCoilsByCustomer(customerId) { }) } -// 指定合同的发货配卷列表(分页) -export function listDeliveryCoilsByOrder(orderId, query) { +// 根据订单ID分页查询发货配卷 +export function listDeliveryCoilsByOrder(queryBo) { return request({ - url: `/crm/orderItem/coils/order/${orderId}`, - method: 'get', - params: query + url: '/crm/orderItem/coils/order/query', + method: 'post', + data: queryBo }) } -// 指定销售员的发货配卷列表(分页) -export function listDeliveryCoilsByPrincipal(query) { +// 根据销售员分页查询生产成果 +export function listProductCoilsBySalesman(queryBo) { + return request({ + url: '/crm/orderItem/coils/salesman/query', + method: 'post', + data: queryBo + }) +} + +// 根据合同ID分页查询生产成果 +export function listProductCoilsByContract(queryBo) { + return request({ + url: '/crm/orderItem/coils/contract/query', + method: 'post', + data: queryBo + }) +} + +// 指定负责人的计划发货配卷列表(分页) +export function listDeliveryCoilsByPrincipal(queryBo) { return request({ url: '/wms/deliveryWaybillDetail/coilListByPrincipal', - method: 'get', - params: query + method: 'post', + data: queryBo }) } -// 指定销售员的生产成果列表(分页) -export function listProductCoilsBySalesman(query) { - return request({ - url: '/crm/orderItem/coils/bySalesman', - method: 'get', - params: query - }) -} - -// 指定合同的生产成果列表(分页) -export function listProductCoilsByContract(contractId, query) { - return request({ - url: `/crm/orderItem/coils/byContract/${contractId}`, - method: 'get', - params: query - }) -} - -// ==================== 配卷统计汇总 ==================== +// ==================== 配卷统计汇总(统一 POST + Body BO) ==================== // 根据订单ID统计发货配卷汇总 -export function getDeliveryCoilsStatisticsByOrder(orderId) { +export function getDeliveryCoilsStatisticsByOrder(queryBo) { return request({ - url: `/crm/orderItem/coils/order/${orderId}/statistics`, - method: 'get' + url: '/crm/orderItem/coils/order/statistics', + method: 'post', + data: queryBo }) } // 根据销售员统计生产成果汇总 -export function getProductCoilsStatisticsBySalesman(salesman) { +export function getProductCoilsStatisticsBySalesman(queryBo) { return request({ - url: '/crm/orderItem/coils/bySalesman/statistics', - method: 'get', - params: { salesman } + url: '/crm/orderItem/coils/salesman/statistics', + method: 'post', + data: queryBo }) } // 根据合同ID统计生产成果汇总 -export function getProductCoilsStatisticsByContract(contractId) { +export function getProductCoilsStatisticsByContract(queryBo) { return request({ - url: `/crm/orderItem/coils/byContract/${contractId}/statistics`, - method: 'get' + url: '/crm/orderItem/coils/contract/statistics', + method: 'post', + data: queryBo }) } // 根据负责人统计发货配卷汇总 -export function getDeliveryCoilsStatisticsByPrincipal(principal) { +export function getDeliveryCoilsStatisticsByPrincipal(queryBo) { return request({ url: '/wms/deliveryWaybillDetail/coilListByPrincipal/statistics', - method: 'get', - params: { principal } + method: 'post', + data: queryBo }) } diff --git a/klp-ui/src/api/crm/order.js b/klp-ui/src/api/crm/order.js index 428fb2cc8..60fcdd49b 100644 --- a/klp-ui/src/api/crm/order.js +++ b/klp-ui/src/api/crm/order.js @@ -44,13 +44,14 @@ export function delOrder(orderId) { } /** - * 查询该订单下的配卷(分页) + * 查询该订单下的配卷(分页),支持钢卷信息筛选 + * @param {object} queryBo - { orderId, pageNum, pageSize, ...钢卷筛选条件 } */ -export function listOrderPackaging(orderId, query) { +export function listOrderPackaging(queryBo) { return request({ - url: `/crm/orderItem/coils/order/${orderId}`, - method: 'get', - params: query + url: '/crm/orderItem/coils/order/query', + method: 'post', + data: queryBo }) } diff --git a/klp-ui/src/api/wms/deliveryWaybillDetail.js b/klp-ui/src/api/wms/deliveryWaybillDetail.js index f90b521b0..789677bc9 100644 --- a/klp-ui/src/api/wms/deliveryWaybillDetail.js +++ b/klp-ui/src/api/wms/deliveryWaybillDetail.js @@ -70,10 +70,10 @@ export function getBoundCoilStatisticsList(query) { } // 按销售员查询订单明细的卷(分页) -export function listDeliveryWaybillDetailBySaleman(query) { +export function listDeliveryWaybillDetailBySaleman(queryBo) { return request({ url: '/wms/deliveryWaybillDetail/coilListByPrincipal', - method: 'get', - params: query + method: 'post', + data: queryBo }) -} \ 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 fd02ad0bf..bc244c2d5 100644 --- a/klp-ui/src/views/crm/components/OrderObjection.vue +++ b/klp-ui/src/views/crm/components/OrderObjection.vue @@ -371,7 +371,7 @@ export default { // 获取订单已发货的钢卷 getShippedCoils() { if (this.orderId) { - listOrderPackaging(this.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + listOrderPackaging({ orderId: this.orderId, pageNum: 1, pageSize: 10000 }).then(response => { this.shippedCoils = response.rows || []; }).catch(() => { this.shippedCoils = []; @@ -458,7 +458,7 @@ export default { ...this.form, coilIds: this.coilListToCsv(this.formCoilList) }; - + if (this.form.objectionId != null) { updateSalesObjection(formData).then(response => { this.$modal.msgSuccess("修改成功"); diff --git a/klp-ui/src/views/crm/contract/components/ContractTabs.vue b/klp-ui/src/views/crm/contract/components/ContractTabs.vue index 821c22e76..c0677dd13 100644 --- a/klp-ui/src/views/crm/contract/components/ContractTabs.vue +++ b/klp-ui/src/views/crm/contract/components/ContractTabs.vue @@ -59,6 +59,35 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + @@ -205,10 +263,12 @@ export default { productCoilStatistics: {}, productPagination: { total: 0, currentPage: 1, pageSize: 20 }, productCoilLoading: false, + productCoilBo: {}, deliveryCoilList: [], deliveryCoilStatistics: {}, deliveryPagination: { total: 0, currentPage: 1, pageSize: 20 }, deliveryCoilLoading: false, + deliveryCoilBo: {}, }; }, computed: { @@ -302,9 +362,11 @@ export default { }, fetchDeliveryCoils() { this.deliveryCoilLoading = true; - listDeliveryCoilsByOrder(this.orderId, { + listDeliveryCoilsByOrder({ + orderId: this.orderId, pageNum: this.deliveryPagination.currentPage, - pageSize: this.deliveryPagination.pageSize + pageSize: this.deliveryPagination.pageSize, + coilBo: this.deliveryCoilBo }).then(res => { this.deliveryCoilList = res.rows || []; this.deliveryPagination.total = res.total || 0; @@ -314,9 +376,11 @@ export default { }, fetchProductCoils() { this.productCoilLoading = true; - listProductCoilsByContract(this.orderId, { + listProductCoilsByContract({ + contractId: this.orderId, pageNum: this.productPagination.currentPage, - pageSize: this.productPagination.pageSize + pageSize: this.productPagination.pageSize, + coilBo: this.productCoilBo }).then(res => { this.productCoilList = res.rows || []; this.productPagination.total = res.total || 0; @@ -325,15 +389,33 @@ export default { }); }, fetchDeliveryCoilStatistics() { - getDeliveryCoilsStatisticsByOrder(this.orderId).then(res => { + getDeliveryCoilsStatisticsByOrder({ orderId: this.orderId, coilBo: this.deliveryCoilBo }).then(res => { this.deliveryCoilStatistics = res.data || {}; }); }, fetchProductCoilStatistics() { - getProductCoilsStatisticsByContract(this.orderId).then(res => { + getProductCoilsStatisticsByContract({ contractId: this.orderId, coilBo: this.productCoilBo }).then(res => { this.productCoilStatistics = res.data || {}; }); }, + handleProductFilter() { + this.productPagination.currentPage = 1; + this.fetchProductCoils(); + this.fetchProductCoilStatistics(); + }, + resetProductFilter() { + this.productCoilBo = {}; + this.handleProductFilter(); + }, + handleDeliveryFilter() { + this.deliveryPagination.currentPage = 1; + this.fetchDeliveryCoils(); + this.fetchDeliveryCoilStatistics(); + }, + resetDeliveryFilter() { + this.deliveryCoilBo = {}; + this.handleDeliveryFilter(); + }, handleProductPageChange({ currentPage, pageSize }) { this.productPagination.currentPage = currentPage; this.productPagination.pageSize = pageSize; diff --git a/klp-ui/src/views/crm/objection/index.vue b/klp-ui/src/views/crm/objection/index.vue index 961acfdfa..4373fd7d4 100644 --- a/klp-ui/src/views/crm/objection/index.vue +++ b/klp-ui/src/views/crm/objection/index.vue @@ -398,7 +398,7 @@ export default { ...this.form, coilIds: this.coilListToCsv(this.formCoilList) }; - + if (this.form.objectionId != null) { updateSalesObjection(formData).then(response => { this.$modal.msgSuccess("修改成功"); @@ -465,11 +465,11 @@ export default { path: '/wms/coil/' + coil.coilId, }); }, - + // 获取订单已发货的钢卷 getShippedCoils() { if (this.form.orderId) { - listOrderPackaging(this.form.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + listOrderPackaging({ orderId: 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 44aae12d1..9c2470d72 100644 --- a/klp-ui/src/views/crm/order/index.vue +++ b/klp-ui/src/views/crm/order/index.vue @@ -86,6 +86,28 @@
+ + + + + + + + + + + + + + + + + + + 查询 + 重置 + +
@@ -227,6 +249,7 @@ export default { customerList: [], contractList: [], coilList: [], + coilBo: {}, deliveryWaybillList: [], } }, @@ -259,10 +282,22 @@ export default { }, /** 查询发货配卷列表 */ getCoilList() { - listOrderPackaging(this.currentOrder.orderId, { pageNum: 1, pageSize: 10000 }).then(response => { + listOrderPackaging({ + orderId: this.currentOrder.orderId, + pageNum: 1, + pageSize: 10000, + coilBo: this.coilBo + }).then(response => { this.coilList = response.rows || []; }); }, + handleCoilFilter() { + this.getCoilList(); + }, + resetCoilFilter() { + this.coilBo = {}; + this.getCoilList(); + }, /** 合同号改变事件 */ handleContractChange(contractId) { const contract = this.contractList.find(item => item.contractId === contractId) @@ -398,4 +433,4 @@ export default { }, } } - \ No newline at end of file + diff --git a/klp-ui/src/views/crm/saleman/index.vue b/klp-ui/src/views/crm/saleman/index.vue index 89ae5b53a..bafe6dac1 100644 --- a/klp-ui/src/views/crm/saleman/index.vue +++ b/klp-ui/src/views/crm/saleman/index.vue @@ -77,14 +77,65 @@
- + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + +
- + + + + + + + + + + + + + + + + + + 查询 + 重置 + + +
@@ -181,6 +232,8 @@ export default { productPagination: { total: 0, currentPage: 1, pageSize: 20 }, // 生产成果统计 productCoilStatistics: {}, + // 生产成果筛选 + productCoilBo: {}, // 生产成果加载 productCoilLoading: false, // 计划发货列表 @@ -189,6 +242,8 @@ export default { deliveryPagination: { total: 0, currentPage: 1, pageSize: 20 }, // 计划发货统计 deliveryCoilStatistics: {}, + // 计划发货筛选 + deliveryCoilBo: {}, // 计划发货加载 deliveryCoilLoading: false, // 发货单据列表 @@ -292,7 +347,7 @@ export default { return Promise.resolve(); } this.rightLoading = true; - + switch (tabName) { case 'customer': return listCustomer({ @@ -349,9 +404,10 @@ export default { fetchProductCoils(salesman) { this.productCoilLoading = true; return listProductCoilsBySalesman({ - salesman: salesman, + salesman, pageNum: this.productPagination.currentPage, - pageSize: this.productPagination.pageSize + pageSize: this.productPagination.pageSize, + coilBo: this.productCoilBo }).then(res => { this.productList = res.rows || []; this.productPagination.total = res.total || 0; @@ -364,16 +420,28 @@ export default { }); }, fetchProductCoilStatistics(salesman) { - getProductCoilsStatisticsBySalesman(salesman).then(res => { + getProductCoilsStatisticsBySalesman({ salesman, coilBo: this.productCoilBo }).then(res => { this.productCoilStatistics = res.data || {}; }); }, + handleProductFilter() { + this.productPagination.currentPage = 1; + if (this.selectedItem) { + this.fetchProductCoils(this.selectedItem.dictValue); + this.fetchProductCoilStatistics(this.selectedItem.dictValue); + } + }, + resetProductFilter() { + this.productCoilBo = {}; + this.handleProductFilter(); + }, fetchDeliveryCoils(principal) { this.deliveryCoilLoading = true; return listDeliveryCoilsByPrincipal({ - principal: principal, + principal, pageNum: this.deliveryPagination.currentPage, - pageSize: this.deliveryPagination.pageSize + pageSize: this.deliveryPagination.pageSize, + coilBo: this.deliveryCoilBo }).then(res => { this.deliveryList = res.rows || []; this.deliveryPagination.total = res.total || 0; @@ -386,10 +454,21 @@ export default { }); }, fetchDeliveryCoilStatistics(principal) { - getDeliveryCoilsStatisticsByPrincipal(principal).then(res => { + getDeliveryCoilsStatisticsByPrincipal({ principal, coilBo: this.deliveryCoilBo }).then(res => { this.deliveryCoilStatistics = res.data || {}; }); }, + handleDeliveryFilter() { + this.deliveryPagination.currentPage = 1; + if (this.selectedItem) { + this.fetchDeliveryCoils(this.selectedItem.dictValue); + this.fetchDeliveryCoilStatistics(this.selectedItem.dictValue); + } + }, + resetDeliveryFilter() { + this.deliveryCoilBo = {}; + this.handleDeliveryFilter(); + }, handleProductPageChange({ currentPage, pageSize }) { this.productPagination.currentPage = currentPage; this.productPagination.pageSize = pageSize; diff --git a/klp-ui/src/views/wms/post/aps/orderTrack.vue b/klp-ui/src/views/wms/post/aps/orderTrack.vue index e9ff89e02..3defc8877 100644 --- a/klp-ui/src/views/wms/post/aps/orderTrack.vue +++ b/klp-ui/src/views/wms/post/aps/orderTrack.vue @@ -132,6 +132,35 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + @@ -221,6 +250,7 @@ export default { productCoilStatistics: {}, productPagination: { total: 0, currentPage: 1, pageSize: 20 }, productCoilLoading: false, + productCoilBo: {}, batchTransferDialogVisible: false, batchTargetContractId: '', batchTransferCoilIds: [], @@ -387,9 +417,11 @@ export default { fetchProductCoils() { if (!this.currentOrder || !this.currentOrder.orderId) return this.productCoilLoading = true - listProductCoilsByContract(this.currentOrder.orderId, { + listProductCoilsByContract({ + contractId: this.currentOrder.orderId, pageNum: this.productPagination.currentPage, - pageSize: this.productPagination.pageSize + pageSize: this.productPagination.pageSize, + coilBo: this.productCoilBo }).then(res => { this.productCoilList = res.rows || [] this.productPagination.total = res.total || 0 @@ -399,10 +431,19 @@ export default { }, fetchProductCoilStatistics() { if (!this.currentOrder || !this.currentOrder.orderId) return - getProductCoilsStatisticsByContract(this.currentOrder.orderId).then(res => { + getProductCoilsStatisticsByContract({ contractId: this.currentOrder.orderId, coilBo: this.productCoilBo }).then(res => { this.productCoilStatistics = res.data || {} }) }, + handleProductFilter() { + this.productPagination.currentPage = 1 + this.fetchProductCoils() + this.fetchProductCoilStatistics() + }, + resetProductFilter() { + this.productCoilBo = {} + this.handleProductFilter() + }, handleProductSelectionChange(selection) { this.selectedProductRows = selection }, 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 8d7c2969d..4bfde79c7 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsDeliveryWaybillDetailController.java @@ -26,6 +26,7 @@ import com.klp.domain.vo.WmsDeliveryWaybillDetailVo; import com.klp.domain.bo.WmsDeliveryWaybillDetailBo; import com.klp.service.IWmsDeliveryWaybillDetailService; import com.klp.domain.bo.WmsMaterialCoilBo; +import com.klp.domain.bo.PrincipalCoilQueryBo; import com.klp.service.IWmsMaterialCoilService; import com.klp.common.core.page.TableDataInfo; @@ -188,34 +189,34 @@ public class WmsDeliveryWaybillDetailController extends BaseController { /** - * 根据负责人(principal)查询已发货绑定的钢卷列表(分页) + * 根据负责人(principal)查询已发货绑定的钢卷列表(分页),支持钢卷信息筛选 */ - @GetMapping("/coilListByPrincipal") - public TableDataInfo coilListByPrincipal( - @RequestParam(required = false) String principal, - PageQuery pageQuery) { - List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(principal); + @PostMapping("/coilListByPrincipal") + public TableDataInfo coilListByPrincipal(@RequestBody PrincipalCoilQueryBo bo) { + List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(bo.getPrincipal()); if (boundCoilIds == null || boundCoilIds.isEmpty()) { return new TableDataInfo<>(); } - WmsMaterialCoilBo wmsMaterialCoilBo = new WmsMaterialCoilBo(); - wmsMaterialCoilBo.setCoilIds(boundCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); - return iWmsMaterialCoilService.queryPageList(wmsMaterialCoilBo, pageQuery); + WmsMaterialCoilBo coilBo = bo.getCoilBo() != null ? bo.getCoilBo() : new WmsMaterialCoilBo(); + coilBo.setCoilIds(boundCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(bo.getPageNum()); + pageQuery.setPageSize(bo.getPageSize()); + return iWmsMaterialCoilService.queryPageList(coilBo, pageQuery); } /** - * 根据负责人(principal)统计已发货绑定钢卷的汇总数据(数量、毛重、净重) + * 根据负责人(principal)统计已发货绑定钢卷的汇总数据,支持钢卷信息筛选 */ - @GetMapping("/coilListByPrincipal/statistics") - public R> getCoilListByPrincipalStatistics( - @RequestParam(required = false) String principal) { - List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(principal); + @PostMapping("/coilListByPrincipal/statistics") + public R> getCoilListByPrincipalStatistics(@RequestBody PrincipalCoilQueryBo bo) { + List boundCoilIds = iWmsDeliveryWaybillDetailService.getBoundCoilIdsByPrincipal(bo.getPrincipal()); 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)); + WmsMaterialCoilBo coilBo = bo.getCoilBo() != null ? bo.getCoilBo() : new WmsMaterialCoilBo(); + coilBo.setCoilIds(boundCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + return R.ok(iWmsMaterialCoilService.getStatistics(coilBo)); } } diff --git a/klp-wms/src/main/java/com/klp/domain/bo/PrincipalCoilQueryBo.java b/klp-wms/src/main/java/com/klp/domain/bo/PrincipalCoilQueryBo.java new file mode 100644 index 000000000..c7567920a --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/PrincipalCoilQueryBo.java @@ -0,0 +1,28 @@ +package com.klp.domain.bo; + +import lombok.Data; +import java.io.Serializable; + +/** + * 负责人钢卷查询请求对象 + * + * @author klp + * @date 2026-07-09 + */ +@Data +public class PrincipalCoilQueryBo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 负责人 */ + private String principal; + + /** 分页页码 */ + private Integer pageNum; + + /** 分页大小 */ + private Integer pageSize; + + /** 钢卷筛选条件 */ + private WmsMaterialCoilBo coilBo; +} From 444aedf55136f6fe1eb5450da390cfb6bc2fc01a Mon Sep 17 00:00:00 2001 From: jhd <1684074631@qq.com> Date: Fri, 10 Jul 2026 09:12:38 +0800 Subject: [PATCH 2/9] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E9=A1=B5=E9=9D=A2=E6=98=BE=E7=A4=BA=E5=B7=B2=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E4=BA=A7=E9=9C=80=E5=8D=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在订单详情页面新增已绑定产需单卡片组件 - 实现产需单表格展示包括单号、生产日期、重量等信息 - 添加产需单状态标签显示功能 - 实现加载已绑定产需单的业务逻辑 - 集成产需单API接口获取相关数据 - 添加空状态提示和错误处理机制 --- klp-ui/src/views/wms/post/aps/order.vue | 65 +++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/klp-ui/src/views/wms/post/aps/order.vue b/klp-ui/src/views/wms/post/aps/order.vue index 93c75bb96..957ebb91a 100644 --- a/klp-ui/src/views/wms/post/aps/order.vue +++ b/klp-ui/src/views/wms/post/aps/order.vue @@ -187,6 +187,29 @@
+ +
+
+ 已绑定的产需单({{ boundReqList.length }} 条) +
+
+ + + + + + + + + + +
+
+
@@ -225,6 +248,7 @@ - - - From ef0614f987d96bc69de7ef9221172d2179bd0112 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= Date: Fri, 10 Jul 2026 10:43:16 +0800 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=BB=A9?= =?UTF-8?q?=E6=95=88=E7=B3=BB=E7=BB=9F=E6=A0=B8=E5=BF=83=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E5=A4=8D=E8=8F=9C=E5=8D=95=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交完成多项核心功能开发与优化: 1. 修复菜单路径计算逻辑,目录节点路径拼接祖先路径 2. 为绩效相关实体类添加日期格式化注解,统一参数绑定格式 3. 新增10+个绩效系统API接口,覆盖部门、薪资、考核等模块 4. 新增绩效系统首页、部门管理、薪资明细等多个页面组件 --- .../com/klp/perf/domain/PerfDeptConfig.java | 4 + .../klp/perf/domain/PerfDeptItemConfig.java | 3 + .../klp/perf/domain/bo/PerfDeptConfigBo.java | 5 + .../perf/domain/bo/PerfDeptItemConfigBo.java | 3 + klp-ui/src/api/perf/appraisal.js | 44 ++ klp-ui/src/api/perf/appraisalDetail.js | 44 ++ klp-ui/src/api/perf/dept.js | 44 ++ klp-ui/src/api/perf/deptConfig.js | 44 ++ klp-ui/src/api/perf/deptItemConfig.js | 44 ++ klp-ui/src/api/perf/deptSummary.js | 44 ++ klp-ui/src/api/perf/employeeInfo.js | 44 ++ klp-ui/src/api/perf/positionTemplate.js | 44 ++ klp-ui/src/api/perf/salary.js | 44 ++ klp-ui/src/api/perf/templateDimension.js | 44 ++ klp-ui/src/views/perf/dept/index.vue | 580 +++++++++++++++ .../src/views/perf/index/DeptConfigPanel.vue | 226 ++++++ klp-ui/src/views/perf/index/PageHeader.vue | 142 ++++ .../src/views/perf/index/PerfConfigPanel.vue | 669 ++++++++++++++++++ klp-ui/src/views/perf/index/SalaryPanel.vue | 509 +++++++++++++ klp-ui/src/views/perf/index/SummaryPanel.vue | 240 +++++++ klp-ui/src/views/perf/index/YearMonthTabs.vue | 207 ++++++ klp-ui/src/views/perf/index/index.vue | 206 ++++++ klp-ui/src/views/system/menu/index.vue | 4 +- 23 files changed, 3236 insertions(+), 2 deletions(-) create mode 100644 klp-ui/src/api/perf/appraisal.js create mode 100644 klp-ui/src/api/perf/appraisalDetail.js create mode 100644 klp-ui/src/api/perf/dept.js create mode 100644 klp-ui/src/api/perf/deptConfig.js create mode 100644 klp-ui/src/api/perf/deptItemConfig.js create mode 100644 klp-ui/src/api/perf/deptSummary.js create mode 100644 klp-ui/src/api/perf/employeeInfo.js create mode 100644 klp-ui/src/api/perf/positionTemplate.js create mode 100644 klp-ui/src/api/perf/salary.js create mode 100644 klp-ui/src/api/perf/templateDimension.js create mode 100644 klp-ui/src/views/perf/dept/index.vue create mode 100644 klp-ui/src/views/perf/index/DeptConfigPanel.vue create mode 100644 klp-ui/src/views/perf/index/PageHeader.vue create mode 100644 klp-ui/src/views/perf/index/PerfConfigPanel.vue create mode 100644 klp-ui/src/views/perf/index/SalaryPanel.vue create mode 100644 klp-ui/src/views/perf/index/SummaryPanel.vue create mode 100644 klp-ui/src/views/perf/index/YearMonthTabs.vue create mode 100644 klp-ui/src/views/perf/index/index.vue diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java index cc772b46b..b94dea84d 100644 --- a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java +++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java @@ -7,6 +7,8 @@ import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 车间考核参数配置对象 perf_dept_config @@ -65,6 +67,8 @@ public class PerfDeptConfig extends BaseEntity { /** * 月份 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date month; /** * 备注 diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java index aa42a22f1..667730502 100644 --- a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java +++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java @@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 车间扣款/奖励项目配置对象 perf_dept_item_config @@ -45,6 +46,8 @@ public class PerfDeptItemConfig extends BaseEntity { /** * 月份 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date month; /** * diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java index 1b08d65f4..78914fb48 100644 --- a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java +++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java @@ -1,8 +1,11 @@ package com.klp.perf.domain.bo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.klp.common.core.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + import javax.validation.constraints.*; import java.math.BigDecimal; @@ -72,6 +75,8 @@ public class PerfDeptConfigBo extends BaseEntity { /** * 月份 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date month; /** diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java index 5371efa47..a18d27eaf 100644 --- a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java +++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java @@ -7,6 +7,7 @@ import javax.validation.constraints.*; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 车间扣款/奖励项目配置业务对象 perf_dept_item_config @@ -47,6 +48,8 @@ public class PerfDeptItemConfigBo extends BaseEntity { /** * 月份 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date month; /** diff --git a/klp-ui/src/api/perf/appraisal.js b/klp-ui/src/api/perf/appraisal.js new file mode 100644 index 000000000..6957e6573 --- /dev/null +++ b/klp-ui/src/api/perf/appraisal.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询月度绩效考核记录列表 +export function listPerfAppraisal(query) { + return request({ + url: '/perf/appraisal/list', + method: 'get', + params: query + }) +} + +// 查询月度绩效考核记录详细 +export function getPerfAppraisal(id) { + return request({ + url: '/perf/appraisal/' + id, + method: 'get' + }) +} + +// 新增月度绩效考核记录 +export function addPerfAppraisal(data) { + return request({ + url: '/perf/appraisal', + method: 'post', + data: data + }) +} + +// 修改月度绩效考核记录 +export function updatePerfAppraisal(data) { + return request({ + url: '/perf/appraisal', + method: 'put', + data: data + }) +} + +// 删除月度绩效考核记录 +export function delPerfAppraisal(ids) { + return request({ + url: '/perf/appraisal/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/appraisalDetail.js b/klp-ui/src/api/perf/appraisalDetail.js new file mode 100644 index 000000000..21e23fc07 --- /dev/null +++ b/klp-ui/src/api/perf/appraisalDetail.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询考核维度评分明细列表 +export function listPerfAppraisalDetail(query) { + return request({ + url: '/perf/appraisalDetail/list', + method: 'get', + params: query + }) +} + +// 查询考核维度评分明细详细 +export function getPerfAppraisalDetail(id) { + return request({ + url: '/perf/appraisalDetail/' + id, + method: 'get' + }) +} + +// 新增考核维度评分明细 +export function addPerfAppraisalDetail(data) { + return request({ + url: '/perf/appraisalDetail', + method: 'post', + data: data + }) +} + +// 修改考核维度评分明细 +export function updatePerfAppraisalDetail(data) { + return request({ + url: '/perf/appraisalDetail', + method: 'put', + data: data + }) +} + +// 删除考核维度评分明细 +export function delPerfAppraisalDetail(ids) { + return request({ + url: '/perf/appraisalDetail/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/dept.js b/klp-ui/src/api/perf/dept.js new file mode 100644 index 000000000..b1c11c434 --- /dev/null +++ b/klp-ui/src/api/perf/dept.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询绩效系统部门列表 +export function listPerfDept(query) { + return request({ + url: '/perf/dept/list', + method: 'get', + params: query + }) +} + +// 查询绩效系统部门详细 +export function getPerfDept(id) { + return request({ + url: '/perf/dept/' + id, + method: 'get' + }) +} + +// 新增绩效系统部门 +export function addPerfDept(data) { + return request({ + url: '/perf/dept', + method: 'post', + data: data + }) +} + +// 修改绩效系统部门 +export function updatePerfDept(data) { + return request({ + url: '/perf/dept', + method: 'put', + data: data + }) +} + +// 删除绩效系统部门 +export function delPerfDept(ids) { + return request({ + url: '/perf/dept/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/deptConfig.js b/klp-ui/src/api/perf/deptConfig.js new file mode 100644 index 000000000..98f165de1 --- /dev/null +++ b/klp-ui/src/api/perf/deptConfig.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询车间考核参数配置列表 +export function listPerfDeptConfig(query) { + return request({ + url: '/perf/deptConfig/list', + method: 'get', + params: query + }) +} + +// 查询车间考核参数配置详细 +export function getPerfDeptConfig(id) { + return request({ + url: '/perf/deptConfig/' + id, + method: 'get' + }) +} + +// 新增车间考核参数配置 +export function addPerfDeptConfig(data) { + return request({ + url: '/perf/deptConfig', + method: 'post', + data: data + }) +} + +// 修改车间考核参数配置 +export function updatePerfDeptConfig(data) { + return request({ + url: '/perf/deptConfig', + method: 'put', + data: data + }) +} + +// 删除车间考核参数配置 +export function delPerfDeptConfig(ids) { + return request({ + url: '/perf/deptConfig/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/deptItemConfig.js b/klp-ui/src/api/perf/deptItemConfig.js new file mode 100644 index 000000000..c4ac4ce80 --- /dev/null +++ b/klp-ui/src/api/perf/deptItemConfig.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询车间扣款/奖励项目配置列表 +export function listPerfDeptItemConfig(query) { + return request({ + url: '/perf/deptItemConfig/list', + method: 'get', + params: query + }) +} + +// 查询车间扣款/奖励项目配置详细 +export function getPerfDeptItemConfig(id) { + return request({ + url: '/perf/deptItemConfig/' + id, + method: 'get' + }) +} + +// 新增车间扣款/奖励项目配置 +export function addPerfDeptItemConfig(data) { + return request({ + url: '/perf/deptItemConfig', + method: 'post', + data: data + }) +} + +// 修改车间扣款/奖励项目配置 +export function updatePerfDeptItemConfig(data) { + return request({ + url: '/perf/deptItemConfig', + method: 'put', + data: data + }) +} + +// 删除车间扣款/奖励项目配置 +export function delPerfDeptItemConfig(ids) { + return request({ + url: '/perf/deptItemConfig/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/deptSummary.js b/klp-ui/src/api/perf/deptSummary.js new file mode 100644 index 000000000..8501ac1c0 --- /dev/null +++ b/klp-ui/src/api/perf/deptSummary.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询车间月度汇总列表 +export function listPerfDeptSummary(query) { + return request({ + url: '/perf/deptSummary/list', + method: 'get', + params: query + }) +} + +// 查询车间月度汇总详细 +export function getPerfDeptSummary(id) { + return request({ + url: '/perf/deptSummary/' + id, + method: 'get' + }) +} + +// 新增车间月度汇总 +export function addPerfDeptSummary(data) { + return request({ + url: '/perf/deptSummary', + method: 'post', + data: data + }) +} + +// 修改车间月度汇总 +export function updatePerfDeptSummary(data) { + return request({ + url: '/perf/deptSummary', + method: 'put', + data: data + }) +} + +// 删除车间月度汇总 +export function delPerfDeptSummary(ids) { + return request({ + url: '/perf/deptSummary/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/employeeInfo.js b/klp-ui/src/api/perf/employeeInfo.js new file mode 100644 index 000000000..646c9a691 --- /dev/null +++ b/klp-ui/src/api/perf/employeeInfo.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询员工绩效薪资基本信息列表 +export function listPerfEmployeeInfo(query) { + return request({ + url: '/perf/employeeInfo/list', + method: 'get', + params: query + }) +} + +// 查询员工绩效薪资基本信息详细 +export function getPerfEmployeeInfo(id) { + return request({ + url: '/perf/employeeInfo/' + id, + method: 'get' + }) +} + +// 新增员工绩效薪资基本信息 +export function addPerfEmployeeInfo(data) { + return request({ + url: '/perf/employeeInfo', + method: 'post', + data: data + }) +} + +// 修改员工绩效薪资基本信息 +export function updatePerfEmployeeInfo(data) { + return request({ + url: '/perf/employeeInfo', + method: 'put', + data: data + }) +} + +// 删除员工绩效薪资基本信息 +export function delPerfEmployeeInfo(ids) { + return request({ + url: '/perf/employeeInfo/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/positionTemplate.js b/klp-ui/src/api/perf/positionTemplate.js new file mode 100644 index 000000000..c65197dc3 --- /dev/null +++ b/klp-ui/src/api/perf/positionTemplate.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询岗位绩效考核模板列表 +export function listPerfPositionTemplate(query) { + return request({ + url: '/perf/positionTemplate/list', + method: 'get', + params: query + }) +} + +// 查询岗位绩效考核模板详细 +export function getPerfPositionTemplate(id) { + return request({ + url: '/perf/positionTemplate/' + id, + method: 'get' + }) +} + +// 新增岗位绩效考核模板 +export function addPerfPositionTemplate(data) { + return request({ + url: '/perf/positionTemplate', + method: 'post', + data: data + }) +} + +// 修改岗位绩效考核模板 +export function updatePerfPositionTemplate(data) { + return request({ + url: '/perf/positionTemplate', + method: 'put', + data: data + }) +} + +// 删除岗位绩效考核模板 +export function delPerfPositionTemplate(ids) { + return request({ + url: '/perf/positionTemplate/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/salary.js b/klp-ui/src/api/perf/salary.js new file mode 100644 index 000000000..e4136c846 --- /dev/null +++ b/klp-ui/src/api/perf/salary.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询月度薪资计算记录列表 +export function listPerfSalary(query) { + return request({ + url: '/perf/salary/list', + method: 'get', + params: query + }) +} + +// 查询月度薪资计算记录详细 +export function getPerfSalary(id) { + return request({ + url: '/perf/salary/' + id, + method: 'get' + }) +} + +// 新增月度薪资计算记录 +export function addPerfSalary(data) { + return request({ + url: '/perf/salary', + method: 'post', + data: data + }) +} + +// 修改月度薪资计算记录 +export function updatePerfSalary(data) { + return request({ + url: '/perf/salary', + method: 'put', + data: data + }) +} + +// 删除月度薪资计算记录 +export function delPerfSalary(ids) { + return request({ + url: '/perf/salary/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/perf/templateDimension.js b/klp-ui/src/api/perf/templateDimension.js new file mode 100644 index 000000000..c5a18b223 --- /dev/null +++ b/klp-ui/src/api/perf/templateDimension.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询考核维度明细列表 +export function listPerfTemplateDimension(query) { + return request({ + url: '/perf/templateDimension/list', + method: 'get', + params: query + }) +} + +// 查询考核维度明细详细 +export function getPerfTemplateDimension(id) { + return request({ + url: '/perf/templateDimension/' + id, + method: 'get' + }) +} + +// 新增考核维度明细 +export function addPerfTemplateDimension(data) { + return request({ + url: '/perf/templateDimension', + method: 'post', + data: data + }) +} + +// 修改考核维度明细 +export function updatePerfTemplateDimension(data) { + return request({ + url: '/perf/templateDimension', + method: 'put', + data: data + }) +} + +// 删除考核维度明细 +export function delPerfTemplateDimension(ids) { + return request({ + url: '/perf/templateDimension/' + ids, + method: 'delete' + }) +} diff --git a/klp-ui/src/views/perf/dept/index.vue b/klp-ui/src/views/perf/dept/index.vue new file mode 100644 index 000000000..d2d0550e7 --- /dev/null +++ b/klp-ui/src/views/perf/dept/index.vue @@ -0,0 +1,580 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/DeptConfigPanel.vue b/klp-ui/src/views/perf/index/DeptConfigPanel.vue new file mode 100644 index 000000000..223a30a2d --- /dev/null +++ b/klp-ui/src/views/perf/index/DeptConfigPanel.vue @@ -0,0 +1,226 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/PageHeader.vue b/klp-ui/src/views/perf/index/PageHeader.vue new file mode 100644 index 000000000..c32da4f1e --- /dev/null +++ b/klp-ui/src/views/perf/index/PageHeader.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/PerfConfigPanel.vue b/klp-ui/src/views/perf/index/PerfConfigPanel.vue new file mode 100644 index 000000000..e9382fe17 --- /dev/null +++ b/klp-ui/src/views/perf/index/PerfConfigPanel.vue @@ -0,0 +1,669 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/SalaryPanel.vue b/klp-ui/src/views/perf/index/SalaryPanel.vue new file mode 100644 index 000000000..06fd2bd8a --- /dev/null +++ b/klp-ui/src/views/perf/index/SalaryPanel.vue @@ -0,0 +1,509 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/SummaryPanel.vue b/klp-ui/src/views/perf/index/SummaryPanel.vue new file mode 100644 index 000000000..7042eb919 --- /dev/null +++ b/klp-ui/src/views/perf/index/SummaryPanel.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/YearMonthTabs.vue b/klp-ui/src/views/perf/index/YearMonthTabs.vue new file mode 100644 index 000000000..d506eea89 --- /dev/null +++ b/klp-ui/src/views/perf/index/YearMonthTabs.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/klp-ui/src/views/perf/index/index.vue b/klp-ui/src/views/perf/index/index.vue new file mode 100644 index 000000000..b84f9bddc --- /dev/null +++ b/klp-ui/src/views/perf/index/index.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/klp-ui/src/views/system/menu/index.vue b/klp-ui/src/views/system/menu/index.vue index 61eac578b..7698c668a 100644 --- a/klp-ui/src/views/system/menu/index.vue +++ b/klp-ui/src/views/system/menu/index.vue @@ -633,8 +633,8 @@ export default { fullPath = '/' + parent + ownPath; } } - // 目录(M)的路径作为子节点的父路径 - const currentParentPath = node.menuType === 'M' ? ownPath : parentPath; + // 目录(M)的路径拼接祖先路径后作为子节点的父路径 + const currentParentPath = node.menuType === 'M' ? (parentPath ? parentPath + '/' + ownPath : ownPath) : parentPath; result.push({ menuName: prefix + node.menuName, From df89a088ee56fa7a7b558ef0ee802984761332bd Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 10 Jul 2026 10:56:52 +0800 Subject: [PATCH 7/9] =?UTF-8?q?feat(flow):=20=E6=B7=BB=E5=8A=A0=E6=8E=92?= =?UTF-8?q?=E4=BA=A7=E6=97=A5=E6=9C=9F=E5=AD=97=E6=AE=B5=E5=88=B0=E6=8E=92?= =?UTF-8?q?=E4=BA=A7=E5=8D=95=E6=98=8E=E7=BB=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在SchProdScheduleDetail实体类中添加scheduleDate字段 - 在SchProdScheduleDetailBo业务对象中添加scheduleDate字段 - 在SchProdScheduleDetailVo视图对象中添加scheduleDate字段并配置Excel导出 - 在MyBatis映射文件中添加scheduleDate字段映射关系 - 在查询条件中添加排产日期的过滤逻辑 --- .../java/com/klp/flow/domain/SchProdScheduleDetail.java | 5 +++++ .../com/klp/flow/domain/bo/SchProdScheduleDetailBo.java | 6 ++++++ .../com/klp/flow/domain/vo/SchProdScheduleDetailVo.java | 7 +++++++ .../service/impl/SchProdScheduleDetailServiceImpl.java | 1 + .../resources/mapper/flow/SchProdScheduleDetailMapper.xml | 1 + 5 files changed, 20 insertions(+) diff --git a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java index 16f13dc41..b6fa6b5ac 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; +import java.util.Date; /** * 排产单明细对象 sch_prod_schedule_detail @@ -37,6 +38,10 @@ public class SchProdScheduleDetail extends BaseEntity { * 关联工序主表ID(sch_prod_process.process_id),表示该明细使用的工序配置 */ private Long processId; + /** + * 排产日期 + */ + private Date scheduleDate; /** * 规格 例:1.0X1250 */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java index 692f13a57..ee191b6f5 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.*; import java.math.BigDecimal; +import java.util.Date; /** * 排产单明细业务对象 sch_prod_schedule_detail @@ -38,6 +39,11 @@ public class SchProdScheduleDetailBo extends BaseEntity { */ private Long processId; + /** + * 排产日期 + */ + private Date scheduleDate; + /** * 规格 例:1.0X1250 */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java index 99ba8ad13..24a51fa89 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java @@ -1,6 +1,7 @@ package com.klp.flow.domain.vo; import java.math.BigDecimal; +import java.util.Date; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableField; @@ -46,6 +47,12 @@ public class SchProdScheduleDetailVo { @ExcelProperty(value = "关联工序主表ID") private Long processId; + /** + * 排产日期 + */ + @ExcelProperty(value = "排产日期") + private Date scheduleDate; + /** * 规格 例:1.0X1250 */ diff --git a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java index a83f5ecbf..d2e89b0e9 100644 --- a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java @@ -100,6 +100,7 @@ public class SchProdScheduleDetailServiceImpl implements ISchProdScheduleDetailS lqw.eq(bo.getScheduleId() != null, SchProdScheduleDetail::getScheduleId, bo.getScheduleId()); lqw.eq(bo.getOrderDetailId() != null, SchProdScheduleDetail::getOrderDetailId, bo.getOrderDetailId()); lqw.eq(bo.getProcessId() != null, SchProdScheduleDetail::getProcessId, bo.getProcessId()); + lqw.eq(bo.getScheduleDate() != null, SchProdScheduleDetail::getScheduleDate, bo.getScheduleDate()); lqw.eq(StringUtils.isNotBlank(bo.getSpec()), SchProdScheduleDetail::getSpec, bo.getSpec()); lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), SchProdScheduleDetail::getMaterial, bo.getMaterial()); lqw.eq(bo.getScheduleWeight() != null, SchProdScheduleDetail::getScheduleWeight, bo.getScheduleWeight()); diff --git a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml index 1bc3c7135..a2c30d7fc 100644 --- a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml +++ b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml @@ -9,6 +9,7 @@ + From c6c77294af79b6badc5f871b5cd60a27a2fec69a Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 10 Jul 2026 11:15:30 +0800 Subject: [PATCH 8/9] =?UTF-8?q?feat(schProdScheduleItem):=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=98=8E=E7=BB=86=E4=B8=8B=E5=8F=91=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=80=90=E6=9D=A1=E6=98=8E=E7=BB=86=E7=8B=AC?= =?UTF-8?q?=E7=AB=8B=E4=B8=8B=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 ISchProdScheduleItemService 中新增 receiveFromDetail 方法接口 - 在 SchProdScheduleItemController 中新增 /receiveFromDetail 接口 - 在 SchProdScheduleItemServiceImpl 中实现明细下发业务逻辑 - 新增 SchProdScheduleItemDispatchBo 数据传输对象 - 支持按明细+工序步骤维度删除重复记录后再重新插入 - 使用明细自身 scheduleDate 作为生产日期确保多天排产准确性 - 实现批量插入排产单明细项功能 --- .../SchProdScheduleItemController.java | 13 +++ .../bo/SchProdScheduleItemDispatchBo.java | 69 +++++++++++++ .../service/ISchProdScheduleItemService.java | 8 ++ .../impl/SchProdScheduleItemServiceImpl.java | 98 +++++++++++++++++++ 4 files changed, 188 insertions(+) create mode 100644 klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemDispatchBo.java diff --git a/klp-flow/src/main/java/com/klp/flow/controller/SchProdScheduleItemController.java b/klp-flow/src/main/java/com/klp/flow/controller/SchProdScheduleItemController.java index 9b87bdf57..84655b4af 100644 --- a/klp-flow/src/main/java/com/klp/flow/controller/SchProdScheduleItemController.java +++ b/klp-flow/src/main/java/com/klp/flow/controller/SchProdScheduleItemController.java @@ -24,6 +24,7 @@ import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo; import com.klp.flow.domain.bo.SchProdScheduleItemReceiveBo; import com.klp.flow.domain.bo.SchProdScheduleItemMergeValidateBo; import com.klp.flow.domain.bo.SchProdScheduleItemSortBo; +import com.klp.flow.domain.bo.SchProdScheduleItemDispatchBo; import com.klp.flow.service.ISchProdScheduleItemService; import com.klp.common.core.page.TableDataInfo; @@ -132,6 +133,18 @@ public class SchProdScheduleItemController extends BaseController { return toAjax(iSchProdScheduleItemService.receiveByBo(receiveBo)); } + /** + * 明细下发:逐条从 sch_prod_schedule_detail 下发到 sch_prod_schedule_item + * 生产日期使用明细的 scheduleDate,支持一条一条明细独立下发 + * 若已下发过(同明细+同工序),先删除旧记录再重新插入 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/receiveFromDetail") + public R receiveFromDetail(@Validated @RequestBody SchProdScheduleItemDispatchBo dispatchBo) { + return toAjax(iSchProdScheduleItemService.receiveFromDetail(dispatchBo)); + } + /** * 合并校验:检查待合并记录来源产需单的 header 字段是否一致 */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemDispatchBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemDispatchBo.java new file mode 100644 index 000000000..26c174033 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemDispatchBo.java @@ -0,0 +1,69 @@ +package com.klp.flow.domain.bo; + +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 排产明细下发请求对象 —— 从 sch_prod_schedule_detail 逐条下发到 sch_prod_schedule_item + * + * @author klp + * @date 2026-07-10 + */ +@Data +public class SchProdScheduleItemDispatchBo { + + /** + * 明细下发配置列表(每条明细独立下发,各自携带工序步骤) + */ + @NotEmpty(message = "明细下发配置不能为空") + private List detailList; + + /** + * 单条明细的下发配置 + */ + @Data + public static class DetailDispatchConfig { + /** + * 排产明细ID(sch_prod_schedule_detail.schedule_detail_id) + */ + @NotNull(message = "明细ID不能为空") + private Long scheduleDetailId; + + /** + * 工序ID(sch_prod_process.process_id),用于区分下发后按工序分组 + */ + @NotNull(message = "工序ID不能为空") + private Long processId; + + /** + * 工序步骤列表 + */ + @NotEmpty(message = "工序步骤不能为空") + private List stepList; + } + + /** + * 工序步骤配置 + */ + @Data + public static class StepConfig { + /** + * 步骤ID(sch_prod_process_step.step_id,下发后存为 actionId) + */ + @NotNull(message = "步骤ID不能为空") + private Long stepId; + + /** + * 步骤顺序号 + */ + private Long stepOrder; + + /** + * 步骤名称 + */ + private String stepName; + } +} diff --git a/klp-flow/src/main/java/com/klp/flow/service/ISchProdScheduleItemService.java b/klp-flow/src/main/java/com/klp/flow/service/ISchProdScheduleItemService.java index 4a47d5c03..54111ec84 100644 --- a/klp-flow/src/main/java/com/klp/flow/service/ISchProdScheduleItemService.java +++ b/klp-flow/src/main/java/com/klp/flow/service/ISchProdScheduleItemService.java @@ -8,6 +8,7 @@ import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo; import com.klp.flow.domain.bo.SchProdScheduleItemReceiveBo; import com.klp.flow.domain.bo.SchProdScheduleItemMergeValidateBo; import com.klp.flow.domain.bo.SchProdScheduleItemSortBo; +import com.klp.flow.domain.bo.SchProdScheduleItemDispatchBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; @@ -76,4 +77,11 @@ public interface ISchProdScheduleItemService { * 保存已排产拖拽排序 */ Boolean saveSort(SchProdScheduleItemSortBo sortBo); + + /** + * 明细下发:逐条从 sch_prod_schedule_detail 下发到 sch_prod_schedule_item + * 若已下发过(同明细+同工序),先删除再重新插入 + * 生产日期使用明细自身的 scheduleDate,而非主表的 prodDate + */ + Boolean receiveFromDetail(SchProdScheduleItemDispatchBo dispatchBo); } 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 80076d069..26bf35c2a 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 @@ -14,6 +14,7 @@ import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo; import com.klp.flow.domain.bo.SchProdScheduleItemReceiveBo; import com.klp.flow.domain.bo.SchProdScheduleItemMergeValidateBo; import com.klp.flow.domain.bo.SchProdScheduleItemSortBo; +import com.klp.flow.domain.bo.SchProdScheduleItemDispatchBo; import com.klp.flow.domain.vo.SchProdScheduleItemVo; import com.klp.flow.domain.vo.SchProdScheduleItemMergeValidateVo; import com.klp.flow.domain.SchProdScheduleItem; @@ -480,6 +481,103 @@ public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemServi return true; } + /** + * 明细下发:逐条从 sch_prod_schedule_detail 下发到 sch_prod_schedule_item + * 若已下发过(同明细+同工序步骤),先删除再重新插入,避免重复 + * 生产日期使用明细自身的 scheduleDate,保证多天排产的时间准确性 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean receiveFromDetail(SchProdScheduleItemDispatchBo dispatchBo) { + List detailList = dispatchBo.getDetailList(); + + for (SchProdScheduleItemDispatchBo.DetailDispatchConfig config : detailList) { + Long detailId = config.getScheduleDetailId(); + + // 1. 查询排产明细 + SchProdScheduleDetail detail = schProdScheduleDetailMapper.selectById(detailId); + if (detail == null) { + throw new RuntimeException("排产明细不存在,scheduleDetailId=" + detailId); + } + + // 2. 查询产需单主表 + SchProdSchedule header = schProdScheduleMapper.selectById(detail.getScheduleId()); + if (header == null) { + throw new RuntimeException("产需单不存在,scheduleId=" + detail.getScheduleId()); + } + + // 3. 收集本次下发的步骤ID列表 + List stepIds = config.getStepList().stream() + .map(SchProdScheduleItemDispatchBo.StepConfig::getStepId) + .collect(Collectors.toList()); + + // 4. 删除该明细上一次下发的内容(同明细 + 同工序步骤),区分工序避免误删 + baseMapper.delete( + Wrappers.lambdaQuery() + .eq(SchProdScheduleItem::getScheduleDetailIds, String.valueOf(detailId)) + .in(SchProdScheduleItem::getActionId, stepIds) + ); + + // 5. 根据工序步骤逐条生成新的排产单明细项 + List addList = new ArrayList<>(); + for (SchProdScheduleItemDispatchBo.StepConfig step : config.getStepList()) { + SchProdScheduleItem item = new SchProdScheduleItem(); + + // —— 从 header 复制主表字段 —— + item.setScheduleNo(header.getScheduleNo()); + item.setScheduleStatus(2L); // 已下达 + item.setTotalPlanWeight(header.getTotalPlanWeight()); + item.setRelContractNo(header.getRelContractNo()); + item.setBusinessUser(header.getBusinessUser()); + item.setBusinessPhone(header.getBusinessPhone()); + item.setOrderDate(header.getOrderDate()); + item.setCustomerName(header.getCustomerName()); + item.setDeliveryCycle(header.getDeliveryCycle()); + item.setUsePurpose(header.getUsePurpose()); + item.setProductType(header.getProductType()); + item.setThicknessTolerance(header.getThicknessTolerance()); + item.setWidthTolerance(header.getWidthTolerance()); + item.setSurfaceQuality(header.getSurfaceQuality()); + item.setSurfaceTreatment(header.getSurfaceTreatment()); + item.setInnerDiameter(header.getInnerDiameter()); + item.setOuterDiameter(header.getOuterDiameter()); + item.setPackReq(header.getPackReq()); + item.setCutEdgeReq(header.getCutEdgeReq()); + item.setSingleCoilWeight(header.getSingleCoilWeight()); + item.setWeightDeviation(header.getWeightDeviation()); + item.setOtherTechReq(header.getOtherTechReq()); + item.setPaymentDesc(header.getPaymentDesc()); + item.setRemark(header.getRemark()); + + // —— 生产日期使用明细自身的 scheduleDate,实现逐条明细独立时间 —— + item.setProdDate(detail.getScheduleDate()); + + // —— 从 detail 复制明细字段 —— + item.setSpec(detail.getSpec()); + item.setMaterial(detail.getMaterial()); + item.setScheduleWeight(detail.getScheduleWeight()); + item.setProductItem(detail.getProductType()); + item.setRowRemark(detail.getRemark()); + + // —— 工序步骤 —— + item.setActionId(step.getStepId()); + + // —— 来源追溯(未合并,存单明细ID) —— + item.setScheduleDetailIds(String.valueOf(detailId)); + + validEntityBeforeSave(item); + addList.add(item); + } + + // 6. 批量插入新记录 + if (!addList.isEmpty()) { + baseMapper.insertBatch(addList); + } + } + + return true; + } + /** * 合并校验:检查待合并记录来源产需单的 header 字段是否一致 */ From 025980e36a7f281ff1d23cce42e944682d864998 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 10 Jul 2026 11:17:04 +0800 Subject: [PATCH 9/9] =?UTF-8?q?feat(schProdScheduleDetail):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E7=94=9F=E4=BA=A7=E6=8E=92=E7=A8=8B=E6=98=8E=E7=BB=86?= =?UTF-8?q?=E4=B8=8B=E5=8F=91=E7=8A=B6=E6=80=81=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在SchProdScheduleDetail实体类中新增isIssued字段用于标识下发状态 - 在SchProdScheduleDetailBo业务对象中添加对应字段定义 - 配置MyBatis映射文件以支持isIssued字段的数据库映射 - 实现查询条件中对isIssued字段的筛选逻辑 - 在SchProdScheduleDetailVo视图对象中添加该字段并配置Excel导出转换 --- .../java/com/klp/flow/domain/SchProdScheduleDetail.java | 4 ++++ .../com/klp/flow/domain/bo/SchProdScheduleDetailBo.java | 4 ++++ .../com/klp/flow/domain/vo/SchProdScheduleDetailVo.java | 7 +++++++ .../service/impl/SchProdScheduleDetailServiceImpl.java | 2 ++ .../resources/mapper/flow/SchProdScheduleDetailMapper.xml | 1 + 5 files changed, 18 insertions(+) diff --git a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java index b6fa6b5ac..fd40eac08 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java @@ -62,6 +62,10 @@ public class SchProdScheduleDetail extends BaseEntity { * 单行排产备注 */ private String remark; + /** + * 是否下发(0=未下发, 1=已下发) + */ + private Long isIssued; /** * 删除标识 0正常 2删除 */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java index ee191b6f5..fa17f70d2 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleDetailBo.java @@ -69,5 +69,9 @@ public class SchProdScheduleDetailBo extends BaseEntity { */ private String remark; + /** + * 是否下发(0=未下发, 1=已下发) + */ + private Long isIssued; } diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java index 24a51fa89..3c73f4ff2 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java @@ -83,6 +83,13 @@ public class SchProdScheduleDetailVo { @ExcelProperty(value = "单行排产备注") private String remark; + /** + * 是否下发(0=未下发, 1=已下发) + */ + @ExcelProperty(value = "是否下发", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=未下发,1=已下发") + private Long isIssued; + /** * 关联的排产单主表信息 */ diff --git a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java index d2e89b0e9..2505cc927 100644 --- a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java @@ -105,6 +105,8 @@ public class SchProdScheduleDetailServiceImpl implements ISchProdScheduleDetailS lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), SchProdScheduleDetail::getMaterial, bo.getMaterial()); lqw.eq(bo.getScheduleWeight() != null, SchProdScheduleDetail::getScheduleWeight, bo.getScheduleWeight()); lqw.eq(StringUtils.isNotBlank(bo.getProductType()), SchProdScheduleDetail::getProductType, bo.getProductType()); + // 是否下发 + lqw.eq(bo.getIsIssued() != null, SchProdScheduleDetail::getIsIssued, bo.getIsIssued()); return lqw; } diff --git a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml index a2c30d7fc..5b2a537b7 100644 --- a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml +++ b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml @@ -15,6 +15,7 @@ +