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-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/SchProdScheduleDetail.java b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleDetail.java index 16f13dc41..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 @@ -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 */ @@ -57,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 692f13a57..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 @@ -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 */ @@ -63,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/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/domain/vo/SchProdScheduleDetailVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleDetailVo.java index 99ba8ad13..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 @@ -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 */ @@ -76,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/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/SchProdScheduleDetailServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleDetailServiceImpl.java index a83f5ecbf..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 @@ -100,10 +100,13 @@ 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()); 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/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 字段是否一致 */ diff --git a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml index 1bc3c7135..5b2a537b7 100644 --- a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml +++ b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleDetailMapper.xml @@ -9,11 +9,13 @@ + + 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/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/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/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..bf337eb52 100644 --- a/klp-ui/src/views/crm/contract/components/ContractTabs.vue +++ b/klp-ui/src/views/crm/contract/components/ContractTabs.vue @@ -59,6 +59,50 @@
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + @@ -132,6 +220,9 @@ import { batchUpdateContractCoil } from "@/api/wms/coil"; import FileList from "@/components/FileList"; import DeliveryTable from "../../components/DeliveryTable.vue"; import ContractPreview from "./ContractPreview.vue"; +import WarehouseSelect from "@/components/KLPService/WarehouseSelect"; +import MemoInput from "@/components/MemoInput"; +import MutiSelect from "@/components/MutiSelect"; // 导入可能需要的组件 import OrderDetail from "../../components/OrderDetail.vue"; @@ -154,8 +245,12 @@ export default { OrderEdit, ReceiveTable, OrderObjection, - OrderRecord + OrderRecord, + WarehouseSelect, + MemoInput, + MutiSelect }, + dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status'], props: { orderId: { type: [Number, String], @@ -205,10 +300,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 +399,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 +413,11 @@ export default { }, fetchProductCoils() { this.productCoilLoading = true; - listProductCoilsByContract(this.orderId, { + listProductCoilsByContract({ + orderId: this.orderId, pageNum: this.productPagination.currentPage, - pageSize: this.productPagination.pageSize + pageSize: this.productPagination.pageSize, + ...this.productCoilBo }).then(res => { this.productCoilList = res.rows || []; this.productPagination.total = res.total || 0; @@ -325,15 +426,35 @@ 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({ ...this.productCoilBo, orderId: this.orderId }).then(res => { this.productCoilStatistics = res.data || {}; }); }, + handleProductFilter() { + this.productCoilBo.selectType = this.productCoilBo.itemType || ''; + this.productPagination.currentPage = 1; + this.fetchProductCoils(); + this.fetchProductCoilStatistics(); + }, + resetProductFilter() { + this.productCoilBo = {}; + this.handleProductFilter(); + }, + handleDeliveryFilter() { + this.deliveryCoilBo.selectType = this.deliveryCoilBo.itemType || ''; + 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..7b8cc4738 100644 --- a/klp-ui/src/views/crm/saleman/index.vue +++ b/klp-ui/src/views/crm/saleman/index.vue @@ -77,14 +77,96 @@
- + + + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + +
- + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + + +
@@ -127,6 +209,9 @@ import { listData, getData, delData, addData, updateData } from "@/api/system/di import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"; import CoilTable from "../components/CoilTable.vue"; import DeliveryTable from "../components/DeliveryTable.vue"; +import WarehouseSelect from "@/components/KLPService/WarehouseSelect"; +import MemoInput from "@/components/MemoInput"; +import MutiSelect from "@/components/MutiSelect"; import { listDeliveryWaybill } from "@/api/wms/deliveryWaybill"; import { listCustomer } from "@/api/crm/customer"; @@ -135,8 +220,8 @@ import { listProductCoilsBySalesman, getProductCoilsStatisticsBySalesman, listDe export default { name: "Data", - components: { DragResizePanel, CoilTable, DeliveryTable }, - dicts: ['sys_normal_disable'], + components: { DragResizePanel, CoilTable, DeliveryTable, WarehouseSelect, MemoInput, MutiSelect }, + dicts: ['sys_normal_disable', 'coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status'], data() { return { // 遮罩层 @@ -181,6 +266,8 @@ export default { productPagination: { total: 0, currentPage: 1, pageSize: 20 }, // 生产成果统计 productCoilStatistics: {}, + // 生产成果筛选 + productCoilBo: {}, // 生产成果加载 productCoilLoading: false, // 计划发货列表 @@ -189,6 +276,8 @@ export default { deliveryPagination: { total: 0, currentPage: 1, pageSize: 20 }, // 计划发货统计 deliveryCoilStatistics: {}, + // 计划发货筛选 + deliveryCoilBo: {}, // 计划发货加载 deliveryCoilLoading: false, // 发货单据列表 @@ -292,7 +381,7 @@ export default { return Promise.resolve(); } this.rightLoading = true; - + switch (tabName) { case 'customer': return listCustomer({ @@ -349,9 +438,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 +454,29 @@ export default { }); }, fetchProductCoilStatistics(salesman) { - getProductCoilsStatisticsBySalesman(salesman).then(res => { + getProductCoilsStatisticsBySalesman({ salesman, coilBo: this.productCoilBo }).then(res => { this.productCoilStatistics = res.data || {}; }); }, + handleProductFilter() { + this.productCoilBo.selectType = this.productCoilBo.itemType || ''; + 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 +489,22 @@ export default { }); }, fetchDeliveryCoilStatistics(principal) { - getDeliveryCoilsStatisticsByPrincipal(principal).then(res => { + getDeliveryCoilsStatisticsByPrincipal({ principal, coilBo: this.deliveryCoilBo }).then(res => { this.deliveryCoilStatistics = res.data || {}; }); }, + handleDeliveryFilter() { + this.deliveryCoilBo.selectType = this.deliveryCoilBo.itemType || ''; + 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/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/file/all.vue b/klp-ui/src/views/system/file/all.vue index 09e3762e0..ef58f8f8b 100644 --- a/klp-ui/src/views/system/file/all.vue +++ b/klp-ui/src/views/system/file/all.vue @@ -1,98 +1,78 @@