diff --git a/klp-admin/src/main/resources/db/migration/V9__anneal_wip.sql b/klp-admin/src/main/resources/db/migration/V9__anneal_wip.sql index 43b88727b..fdc0f2197 100644 --- a/klp-admin/src/main/resources/db/migration/V9__anneal_wip.sql +++ b/klp-admin/src/main/resources/db/migration/V9__anneal_wip.sql @@ -36,6 +36,9 @@ CREATE TABLE IF NOT EXISTS wms_furnace_plan_coil ( plan_coil_id BIGINT AUTO_INCREMENT PRIMARY KEY, plan_id BIGINT NOT NULL COMMENT '计划ID', coil_id BIGINT NOT NULL COMMENT '钢卷ID', + logic_warehouse_id BIGINT NULL COMMENT '逻辑库区去向(钢卷退火后目标逻辑库区)', + furnace_level TINYINT(1) NULL COMMENT '炉火层级(1=一层,2=二层,3=三层)', + contract_id BIGINT NULL COMMENT '合同ID', del_flag TINYINT DEFAULT 0 COMMENT '删除标记(0正常 1删除)', create_by VARCHAR(64) NULL, update_by VARCHAR(64) NULL, diff --git a/klp-common/src/main/java/com/klp/common/core/domain/entity/SysMenu.java b/klp-common/src/main/java/com/klp/common/core/domain/entity/SysMenu.java index c72ad5b4a..c214dc446 100644 --- a/klp-common/src/main/java/com/klp/common/core/domain/entity/SysMenu.java +++ b/klp-common/src/main/java/com/klp/common/core/domain/entity/SysMenu.java @@ -96,6 +96,11 @@ public class SysMenu extends TreeEntity { */ private String icon; + /** + * 样式 + */ + private String style; + /** * 备注 */ diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java index bfef5bb9e..e6baee4c8 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java @@ -107,6 +107,12 @@ public class CrmOrderServiceImpl implements ICrmOrderService { return TableDataInfo.build(result); } + extracted(records); + + return TableDataInfo.build(result); + } + + private void extracted(List records) { Set userNames = records.stream() .flatMap(v -> java.util.stream.Stream.of(v.getCreateBy(), v.getUpdateBy())) .filter(StringUtils::isNotBlank) @@ -178,8 +184,6 @@ public class CrmOrderServiceImpl implements ICrmOrderService { } } } - - return TableDataInfo.build(result); } private QueryWrapper buildQueryWrapperPlus(CrmOrderBo bo) { @@ -262,7 +266,9 @@ public class CrmOrderServiceImpl implements ICrmOrderService { @Override public List queryList(CrmOrderBo bo) { QueryWrapper lqw = buildQueryWrapperPlus(bo); - return baseMapper.selectVoPagePlus(lqw); + List crmOrderVos = baseMapper.selectVoPagePlus(lqw); + extracted(crmOrderVos); + return crmOrderVos; } /** diff --git a/klp-flow/pom.xml b/klp-flow/pom.xml index 9ae00e637..9aab07b11 100644 --- a/klp-flow/pom.xml +++ b/klp-flow/pom.xml @@ -19,5 +19,9 @@ com.klp klp-wms + + com.klp + klp-crm + diff --git a/klp-flow/src/main/java/com/klp/flow/controller/SchDetailCoilRelController.java b/klp-flow/src/main/java/com/klp/flow/controller/SchDetailCoilRelController.java new file mode 100644 index 000000000..8256c50ab --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/controller/SchDetailCoilRelController.java @@ -0,0 +1,99 @@ +package com.klp.flow.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.flow.domain.vo.SchDetailCoilRelVo; +import com.klp.flow.domain.bo.SchDetailCoilRelBo; +import com.klp.flow.service.ISchDetailCoilRelService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 排产明细钢卷关系 + * + * @author klp + * @date 2026-06-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/flow/detailCoilRel") +public class SchDetailCoilRelController extends BaseController { + + private final ISchDetailCoilRelService iSchDetailCoilRelService; + + /** + * 查询排产明细钢卷关系列表 + */ + @GetMapping("/list") + public TableDataInfo list(SchDetailCoilRelBo bo, PageQuery pageQuery) { + return iSchDetailCoilRelService.queryPageList(bo, pageQuery); + } + + /** + * 导出排产明细钢卷关系列表 + */ + @Log(title = "排产明细钢卷关系", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SchDetailCoilRelBo bo, HttpServletResponse response) { + List list = iSchDetailCoilRelService.queryList(bo); + ExcelUtil.exportExcel(list, "排产明细钢卷关系", SchDetailCoilRelVo.class, response); + } + + /** + * 获取排产明细钢卷关系详细信息 + * + * @param relId 主键 + */ + @GetMapping("/{relId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long relId) { + return R.ok(iSchDetailCoilRelService.queryById(relId)); + } + + /** + * 新增排产明细钢卷关系 + */ + @Log(title = "排产明细钢卷关系", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SchDetailCoilRelBo bo) { + return toAjax(iSchDetailCoilRelService.insertByBo(bo)); + } + + /** + * 修改排产明细钢卷关系 + */ + @Log(title = "排产明细钢卷关系", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SchDetailCoilRelBo bo) { + return toAjax(iSchDetailCoilRelService.updateByBo(bo)); + } + + /** + * 删除排产明细钢卷关系 + * + * @param relIds 主键串 + */ + @Log(title = "排产明细钢卷关系", businessType = BusinessType.DELETE) + @DeleteMapping("/{relIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] relIds) { + return toAjax(iSchDetailCoilRelService.deleteWithValidByIds(Arrays.asList(relIds), true)); + } +} 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 new file mode 100644 index 000000000..4ea667bf7 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/controller/SchProdScheduleItemController.java @@ -0,0 +1,120 @@ +package com.klp.flow.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.flow.domain.vo.SchProdScheduleItemVo; +import com.klp.flow.domain.bo.SchProdScheduleItemBo; +import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo; +import com.klp.flow.service.ISchProdScheduleItemService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 排产单主加明细可合并 + * + * @author klp + * @date 2026-06-26 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/flow/prodScheduleItem") +public class SchProdScheduleItemController extends BaseController { + + private final ISchProdScheduleItemService iSchProdScheduleItemService; + + /** + * 查询排产单主加明细可合并列表 + */ + @GetMapping("/list") + public TableDataInfo list(SchProdScheduleItemBo bo, PageQuery pageQuery) { + return iSchProdScheduleItemService.queryPageList(bo, pageQuery); + } + + /** + * 导出排产单主加明细可合并列表 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SchProdScheduleItemBo bo, HttpServletResponse response) { + List list = iSchProdScheduleItemService.queryList(bo); + ExcelUtil.exportExcel(list, "排产单主加明细可合并", SchProdScheduleItemVo.class, response); + } + + /** + * 获取排产单主加明细可合并详细信息 + * + * @param scheduleId 主键 + */ + @GetMapping("/{scheduleId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long scheduleId) { + return R.ok(iSchProdScheduleItemService.queryById(scheduleId)); + } + + /** + * 新增排产单主加明细可合并 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SchProdScheduleItemBo bo) { + return toAjax(iSchProdScheduleItemService.insertByBo(bo)); + } + + /** + * 批量新增排产单主加明细可合并 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/batch") + public R addBatch(@Validated(AddGroup.class) @RequestBody List boList) { + return toAjax(iSchProdScheduleItemService.insertBatchByBo(boList)); + } + + /** + * 修改排产单主加明细可合并 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SchProdScheduleItemBo bo) { + return toAjax(iSchProdScheduleItemService.updateByBo(bo)); + } + + /** + * 删除排产单主加明细可合并 + * + * @param scheduleIds 主键串 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.DELETE) + @DeleteMapping("/{scheduleIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] scheduleIds) { + return toAjax(iSchProdScheduleItemService.deleteWithValidByIds(Arrays.asList(scheduleIds), true)); + } + + /** + * 合并排产单主加明细可合并:先删除被合并的记录,再插入合并后的新记录 + */ + @Log(title = "排产单主加明细可合并", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/merge") + public R merge(@Validated @RequestBody SchProdScheduleItemMergeBo mergeBo) { + return toAjax(iSchProdScheduleItemService.mergeByBo(mergeBo)); + } +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/InvCountPlanWarehouse.java b/klp-flow/src/main/java/com/klp/flow/domain/InvCountPlanWarehouse.java index df24e352e..1210a7bdb 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/InvCountPlanWarehouse.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/InvCountPlanWarehouse.java @@ -32,17 +32,17 @@ public class InvCountPlanWarehouse extends BaseEntity { */ private Long planId; /** - * 逻辑库区ID + * 逻辑库区ID(逗号分隔) */ - private Long warehouseId; + private String warehouseIds; /** * 逻辑库区名称(冗余) */ private String warehouseName; /** - * 实际库区ID + * 实际库区ID(逗号分隔) */ - private Long actualWarehouseId; + private String actualWarehouseIds; /** * 实际库区名称(冗余) */ diff --git a/klp-flow/src/main/java/com/klp/flow/domain/SchDetailCoilRel.java b/klp-flow/src/main/java/com/klp/flow/domain/SchDetailCoilRel.java new file mode 100644 index 000000000..34f40e079 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/SchDetailCoilRel.java @@ -0,0 +1,45 @@ +package com.klp.flow.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 排产明细钢卷关系对象 sch_detail_coil_rel + * + * @author klp + * @date 2026-06-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sch_detail_coil_rel") +public class SchDetailCoilRel extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 主键 + */ + @TableId(value = "rel_id") + private Long relId; + /** + * 排产明细ID(关联 sch_prod_schedule_detail.schedule_detail_id) + */ + private Long scheduleDetailId; + /** + * 钢卷ID(关联 wms_material_coil.coil_id) + */ + private Long coilId; + /** + * 备注 + */ + private String remark; + /** + * 删除标志(0=正常,1=已删除) + */ + @TableLogic + private Integer delFlag; + +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java new file mode 100644 index 000000000..6a58fc1e0 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/SchProdScheduleItem.java @@ -0,0 +1,168 @@ +package com.klp.flow.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 排产单主加明细可合并对象 sch_prod_schedule_item + * + * @author klp + * @date 2026-06-26 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sch_prod_schedule_item") +public class SchProdScheduleItem extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 排产单主键ID + */ + @TableId(value = "schedule_id") + private Long scheduleId; + /** + * 排产单号(唯一标识,钢卷关联依据) + */ + private String scheduleNo; + /** + * 生产日期(和合同号组成业务关联键) + */ + private Date prodDate; + /** + * 排产状态:0草稿 1待审核 2已下达 3已退回 + */ + private Long scheduleStatus; + /** + * 排产总计划吨数 + */ + private BigDecimal totalPlanWeight; + /** + * 关联销售合同号 + */ + private String relContractNo; + /** + * 业务员 + */ + private String businessUser; + /** + * 联系电话 + */ + private String businessPhone; + /** + * 订单日期 + */ + private Date orderDate; + /** + * 订货单位 + */ + private String customerName; + /** + * 交货期(天) + */ + private Long deliveryCycle; + /** + * 产品用途 + */ + private String usePurpose; + /** + * 品名:冷硬钢卷/镀锌钢卷/冷轧钢卷/镀铬钢卷 + */ + private String productType; + /** + * 厚度公差 + */ + private String thicknessTolerance; + /** + * 宽度公差 + */ + private String widthTolerance; + /** + * 表面质量 + */ + private String surfaceQuality; + /** + * 表面处理 + */ + private String surfaceTreatment; + /** + * 内径尺寸 + */ + private String innerDiameter; + /** + * 外径要求 + */ + private String outerDiameter; + /** + * 包装要求 + */ + private String packReq; + /** + * 切边要求 + */ + private String cutEdgeReq; + /** + * 单件重量 + */ + private String singleCoilWeight; + /** + * 交货重量偏差 + */ + private String weightDeviation; + /** + * 其他技术要求 + */ + private String otherTechReq; + /** + * 付款情况说明 + */ + private String paymentDesc; + /** + * 退回原因 + */ + private String returnReason; + /** + * 排产单主表ID + */ + private String scheduleIds; + /** + * 来源销售订单明细ID(溯源原始订单规格) + */ + private String orderDetailIds; + /** + * 规格 例:1.0X1250 + */ + private String spec; + /** + * 材质 DX51D + */ + private String material; + /** + * 本次排产吨数(数量),可审核修改 + */ + private BigDecimal scheduleWeight; + /** + * 品名项 + */ + private String productItem; + /** + * 单行排产备注 + */ + private String rowRemark; + /** + * 备注 + */ + private String remark; + /** + * 删除标识 0正常 2删除 + */ + @TableLogic + private Long delFlag; + +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/InvCountPlanWarehouseBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/InvCountPlanWarehouseBo.java index ac6fbd5d6..e20d133c2 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/bo/InvCountPlanWarehouseBo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/InvCountPlanWarehouseBo.java @@ -31,9 +31,9 @@ public class InvCountPlanWarehouseBo extends BaseEntity { private Long planId; /** - * 逻辑库区ID + * 逻辑库区ID(逗号分隔) */ - private Long warehouseId; + private String warehouseIds; /** * 逻辑库区名称(冗余) @@ -41,9 +41,9 @@ public class InvCountPlanWarehouseBo extends BaseEntity { private String warehouseName; /** - * 实际库区ID + * 实际库区ID(逗号分隔) */ - private Long actualWarehouseId; + private String actualWarehouseIds; /** * 实际库区名称(冗余) diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchDetailCoilRelBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchDetailCoilRelBo.java new file mode 100644 index 000000000..204d334eb --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchDetailCoilRelBo.java @@ -0,0 +1,41 @@ +package com.klp.flow.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + + +/** + * 排产明细钢卷关系业务对象 sch_detail_coil_rel + * + * @author klp + * @date 2026-06-25 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SchDetailCoilRelBo extends BaseEntity { + + /** + * 主键 + */ + private Long relId; + + /** + * 排产明细ID(关联 sch_prod_schedule_detail.schedule_detail_id) + */ + private Long scheduleDetailId; + + /** + * 钢卷ID(关联 wms_material_coil.coil_id) + */ + private Long coilId; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java index d9bd551d5..1c6cefd97 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleBo.java @@ -8,6 +8,7 @@ import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; /** * 排产单主业务对象 sch_prod_schedule @@ -33,6 +34,8 @@ public class SchProdScheduleBo extends BaseEntity { /** * 生产日期(和合同号组成业务关联键) */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") private Date prodDate; /** diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java new file mode 100644 index 000000000..9ef0f8be2 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemBo.java @@ -0,0 +1,197 @@ +package com.klp.flow.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +/** + * 排产单主加明细可合并业务对象 sch_prod_schedule_item + * + * @author klp + * @date 2026-06-26 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class SchProdScheduleItemBo extends BaseEntity { + + /** + * 排产单主键ID + */ + private Long scheduleId; + + /** + * 排产单号(唯一标识,钢卷关联依据) + */ + private String scheduleNo; + + /** + * 生产日期(和合同号组成业务关联键) + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd") + private Date prodDate; + + /** + * 排产状态:0草稿 1待审核 2已下达 3已退回 + */ + private Long scheduleStatus; + + /** + * 排产总计划吨数 + */ + private BigDecimal totalPlanWeight; + + /** + * 关联销售合同号 + */ + private String relContractNo; + + /** + * 业务员 + */ + private String businessUser; + + /** + * 联系电话 + */ + private String businessPhone; + + /** + * 订单日期 + */ + private Date orderDate; + + /** + * 订货单位 + */ + private String customerName; + + /** + * 交货期(天) + */ + private Long deliveryCycle; + + /** + * 产品用途 + */ + private String usePurpose; + + /** + * 品名:冷硬钢卷/镀锌钢卷/冷轧钢卷/镀铬钢卷 + */ + private String productType; + + /** + * 厚度公差 + */ + private String thicknessTolerance; + + /** + * 宽度公差 + */ + private String widthTolerance; + + /** + * 表面质量 + */ + private String surfaceQuality; + + /** + * 表面处理 + */ + private String surfaceTreatment; + + /** + * 内径尺寸 + */ + private String innerDiameter; + + /** + * 外径要求 + */ + private String outerDiameter; + + /** + * 包装要求 + */ + private String packReq; + + /** + * 切边要求 + */ + private String cutEdgeReq; + + /** + * 单件重量 + */ + private String singleCoilWeight; + + /** + * 交货重量偏差 + */ + private String weightDeviation; + + /** + * 其他技术要求 + */ + private String otherTechReq; + + /** + * 付款情况说明 + */ + private String paymentDesc; + + /** + * 退回原因 + */ + private String returnReason; + + /** + * 排产单主表ID + */ + private String scheduleIds; + + /** + * 来源销售订单明细ID(溯源原始订单规格) + */ + private String orderDetailIds; + + /** + * 规格 例:1.0X1250 + */ + private String spec; + + /** + * 材质 DX51D + */ + private String material; + + /** + * 本次排产吨数(数量),可审核修改 + */ + private BigDecimal scheduleWeight; + + /** + * 品名项 + */ + private String productItem; + + /** + * 单行排产备注 + */ + private String rowRemark; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemMergeBo.java b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemMergeBo.java new file mode 100644 index 000000000..13979c275 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/bo/SchProdScheduleItemMergeBo.java @@ -0,0 +1,29 @@ +package com.klp.flow.domain.bo; + +import lombok.Data; +import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 排产单主加明细可合并 - 合并请求对象 + * + * @author klp + * @date 2026-06-26 + */ +@Data +public class SchProdScheduleItemMergeBo { + + /** + * 需要被合并删除的记录ID列表 + */ + @NotEmpty(message = "被合并记录ID不能为空") + private List ids; + + /** + * 合并后的新记录 + */ + @Valid + private SchProdScheduleItemBo mergedBo; + +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/InvCountPlanWarehouseVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/InvCountPlanWarehouseVo.java index 4c6596769..b2671b4dc 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/vo/InvCountPlanWarehouseVo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/InvCountPlanWarehouseVo.java @@ -35,10 +35,10 @@ public class InvCountPlanWarehouseVo { private Long planId; /** - * 逻辑库区ID + * 逻辑库区ID(逗号分隔) */ @ExcelProperty(value = "逻辑库区ID") - private Long warehouseId; + private String warehouseIds; /** * 逻辑库区名称(冗余) @@ -48,10 +48,10 @@ public class InvCountPlanWarehouseVo { private String warehouseName; /** - * 实际库区ID + * 实际库区ID(逗号分隔) */ @ExcelProperty(value = "实际库区ID") - private Long actualWarehouseId; + private String actualWarehouseIds; /** * 实际库区名称(冗余) diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchDetailCoilRelVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchDetailCoilRelVo.java new file mode 100644 index 000000000..b92836493 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchDetailCoilRelVo.java @@ -0,0 +1,49 @@ +package com.klp.flow.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.klp.common.annotation.ExcelDictFormat; +import com.klp.common.convert.ExcelDictConvert; +import lombok.Data; + + +/** + * 排产明细钢卷关系视图对象 sch_detail_coil_rel + * + * @author klp + * @date 2026-06-25 + */ +@Data +@ExcelIgnoreUnannotated +public class SchDetailCoilRelVo { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ExcelProperty(value = "主键") + private Long relId; + + /** + * 排产明细ID(关联 sch_prod_schedule_detail.schedule_detail_id) + */ + @ExcelProperty(value = "排产明细ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "关=联,s=ch_prod_schedule_detail.schedule_detail_id") + private Long scheduleDetailId; + + /** + * 钢卷ID(关联 wms_material_coil.coil_id) + */ + @ExcelProperty(value = "钢卷ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "关=联,w=ms_material_coil.coil_id") + private Long coilId; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} 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 c0c9a763c..b5e33912a 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 @@ -3,6 +3,7 @@ package com.klp.flow.domain.vo; import java.math.BigDecimal; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import com.klp.common.annotation.ExcelDictFormat; import com.klp.common.convert.ExcelDictConvert; import lombok.Data; @@ -69,5 +70,10 @@ public class SchProdScheduleDetailVo { @ExcelProperty(value = "单行排产备注") private String remark; + /** + * 关联的排产单主表信息 + */ + @TableField(exist = false) + private SchProdScheduleVo schedule; } diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java new file mode 100644 index 000000000..6fec3214c --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleItemVo.java @@ -0,0 +1,233 @@ +package com.klp.flow.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.klp.common.annotation.ExcelDictFormat; +import com.klp.common.convert.ExcelDictConvert; +import lombok.Data; + + +/** + * 排产单主加明细可合并视图对象 sch_prod_schedule_item + * + * @author klp + * @date 2026-06-26 + */ +@Data +@ExcelIgnoreUnannotated +public class SchProdScheduleItemVo { + + private static final long serialVersionUID = 1L; + + /** + * 排产单主键ID + */ + @ExcelProperty(value = "排产单主键ID") + private Long scheduleId; + + /** + * 排产单号(唯一标识,钢卷关联依据) + */ + @ExcelProperty(value = "排产单号", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "唯=一标识,钢卷关联依据") + private String scheduleNo; + + /** + * 生产日期(和合同号组成业务关联键) + */ + @ExcelProperty(value = "生产日期", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "和=合同号组成业务关联键") + private Date prodDate; + + /** + * 排产状态:0草稿 1待审核 2已下达 3已退回 + */ + @ExcelProperty(value = "排产状态:0草稿 1待审核 2已下达 3已退回") + private Long scheduleStatus; + + /** + * 排产总计划吨数 + */ + @ExcelProperty(value = "排产总计划吨数") + private BigDecimal totalPlanWeight; + + /** + * 关联销售合同号 + */ + @ExcelProperty(value = "关联销售合同号") + private String relContractNo; + + /** + * 业务员 + */ + @ExcelProperty(value = "业务员") + private String businessUser; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String businessPhone; + + /** + * 订单日期 + */ + @ExcelProperty(value = "订单日期") + private Date orderDate; + + /** + * 订货单位 + */ + @ExcelProperty(value = "订货单位") + private String customerName; + + /** + * 交货期(天) + */ + @ExcelProperty(value = "交货期(天)") + private Long deliveryCycle; + + /** + * 产品用途 + */ + @ExcelProperty(value = "产品用途") + private String usePurpose; + + /** + * 品名:冷硬钢卷/镀锌钢卷/冷轧钢卷/镀铬钢卷 + */ + @ExcelProperty(value = "品名:冷硬钢卷/镀锌钢卷/冷轧钢卷/镀铬钢卷") + private String productType; + + /** + * 厚度公差 + */ + @ExcelProperty(value = "厚度公差") + private String thicknessTolerance; + + /** + * 宽度公差 + */ + @ExcelProperty(value = "宽度公差") + private String widthTolerance; + + /** + * 表面质量 + */ + @ExcelProperty(value = "表面质量") + private String surfaceQuality; + + /** + * 表面处理 + */ + @ExcelProperty(value = "表面处理") + private String surfaceTreatment; + + /** + * 内径尺寸 + */ + @ExcelProperty(value = "内径尺寸") + private String innerDiameter; + + /** + * 外径要求 + */ + @ExcelProperty(value = "外径要求") + private String outerDiameter; + + /** + * 包装要求 + */ + @ExcelProperty(value = "包装要求") + private String packReq; + + /** + * 切边要求 + */ + @ExcelProperty(value = "切边要求") + private String cutEdgeReq; + + /** + * 单件重量 + */ + @ExcelProperty(value = "单件重量") + private String singleCoilWeight; + + /** + * 交货重量偏差 + */ + @ExcelProperty(value = "交货重量偏差") + private String weightDeviation; + + /** + * 其他技术要求 + */ + @ExcelProperty(value = "其他技术要求") + private String otherTechReq; + + /** + * 付款情况说明 + */ + @ExcelProperty(value = "付款情况说明") + private String paymentDesc; + + /** + * 退回原因 + */ + @ExcelProperty(value = "退回原因") + private String returnReason; + + /** + * 排产单主表ID + */ + @ExcelProperty(value = "排产单主表ID") + private String scheduleIds; + + /** + * 来源销售订单明细ID(溯源原始订单规格) + */ + @ExcelProperty(value = "来源销售订单明细ID", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "溯=源原始订单规格") + private String orderDetailIds; + + /** + * 规格 例:1.0X1250 + */ + @ExcelProperty(value = "规格 例:1.0X1250") + private String spec; + + /** + * 材质 DX51D + */ + @ExcelProperty(value = "材质 DX51D") + private String material; + + /** + * 本次排产吨数(数量),可审核修改 + */ + @ExcelProperty(value = "本次排产吨数(数量),可审核修改") + private BigDecimal scheduleWeight; + + /** + * 品名项 + */ + @ExcelProperty(value = "品名项") + private String productItem; + + /** + * 单行排产备注 + */ + @ExcelProperty(value = "单行排产备注") + private String rowRemark; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleVo.java b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleVo.java index e563dd389..9a9dab4c9 100644 --- a/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleVo.java +++ b/klp-flow/src/main/java/com/klp/flow/domain/vo/SchProdScheduleVo.java @@ -5,10 +5,14 @@ import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; +import com.baomidou.mybatisplus.annotation.TableField; import com.klp.common.annotation.ExcelDictFormat; import com.klp.common.convert.ExcelDictConvert; +import com.klp.crm.domain.vo.CrmOrderVo; import lombok.Data; +import java.util.List; + /** * 排产单主视图对象 sch_prod_schedule @@ -186,5 +190,16 @@ public class SchProdScheduleVo { @ExcelProperty(value = "备注") private String remark; + /** + * 关联的排产明细列表 + */ + @TableField(exist = false) + private List detailList; + + /** + * 关联的CRM订单列表(通过合同号 relContractNo 匹配 CrmOrder.contractCode) + */ + @TableField(exist = false) + private List orderList; } diff --git a/klp-flow/src/main/java/com/klp/flow/mapper/SchDetailCoilRelMapper.java b/klp-flow/src/main/java/com/klp/flow/mapper/SchDetailCoilRelMapper.java new file mode 100644 index 000000000..371f30b2c --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/mapper/SchDetailCoilRelMapper.java @@ -0,0 +1,15 @@ +package com.klp.flow.mapper; + +import com.klp.flow.domain.SchDetailCoilRel; +import com.klp.flow.domain.vo.SchDetailCoilRelVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 排产明细钢卷关系Mapper接口 + * + * @author klp + * @date 2026-06-25 + */ +public interface SchDetailCoilRelMapper extends BaseMapperPlus { + +} diff --git a/klp-flow/src/main/java/com/klp/flow/mapper/SchProdScheduleItemMapper.java b/klp-flow/src/main/java/com/klp/flow/mapper/SchProdScheduleItemMapper.java new file mode 100644 index 000000000..15c302a5f --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/mapper/SchProdScheduleItemMapper.java @@ -0,0 +1,15 @@ +package com.klp.flow.mapper; + +import com.klp.flow.domain.SchProdScheduleItem; +import com.klp.flow.domain.vo.SchProdScheduleItemVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 排产单主加明细可合并Mapper接口 + * + * @author klp + * @date 2026-06-26 + */ +public interface SchProdScheduleItemMapper extends BaseMapperPlus { + +} diff --git a/klp-flow/src/main/java/com/klp/flow/service/ISchDetailCoilRelService.java b/klp-flow/src/main/java/com/klp/flow/service/ISchDetailCoilRelService.java new file mode 100644 index 000000000..d5749f55f --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/service/ISchDetailCoilRelService.java @@ -0,0 +1,49 @@ +package com.klp.flow.service; + +import com.klp.flow.domain.SchDetailCoilRel; +import com.klp.flow.domain.vo.SchDetailCoilRelVo; +import com.klp.flow.domain.bo.SchDetailCoilRelBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 排产明细钢卷关系Service接口 + * + * @author klp + * @date 2026-06-25 + */ +public interface ISchDetailCoilRelService { + + /** + * 查询排产明细钢卷关系 + */ + SchDetailCoilRelVo queryById(Long relId); + + /** + * 查询排产明细钢卷关系列表 + */ + TableDataInfo queryPageList(SchDetailCoilRelBo bo, PageQuery pageQuery); + + /** + * 查询排产明细钢卷关系列表 + */ + List queryList(SchDetailCoilRelBo bo); + + /** + * 新增排产明细钢卷关系 + */ + Boolean insertByBo(SchDetailCoilRelBo bo); + + /** + * 修改排产明细钢卷关系 + */ + Boolean updateByBo(SchDetailCoilRelBo bo); + + /** + * 校验并批量删除排产明细钢卷关系信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} 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 new file mode 100644 index 000000000..cef5243bf --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/service/ISchProdScheduleItemService.java @@ -0,0 +1,60 @@ +package com.klp.flow.service; + +import com.klp.flow.domain.SchProdScheduleItem; +import com.klp.flow.domain.vo.SchProdScheduleItemVo; +import com.klp.flow.domain.bo.SchProdScheduleItemBo; +import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 排产单主加明细可合并Service接口 + * + * @author klp + * @date 2026-06-26 + */ +public interface ISchProdScheduleItemService { + + /** + * 查询排产单主加明细可合并 + */ + SchProdScheduleItemVo queryById(Long scheduleId); + + /** + * 查询排产单主加明细可合并列表 + */ + TableDataInfo queryPageList(SchProdScheduleItemBo bo, PageQuery pageQuery); + + /** + * 查询排产单主加明细可合并列表 + */ + List queryList(SchProdScheduleItemBo bo); + + /** + * 新增排产单主加明细可合并 + */ + Boolean insertByBo(SchProdScheduleItemBo bo); + + /** + * 修改排产单主加明细可合并 + */ + Boolean updateByBo(SchProdScheduleItemBo bo); + + /** + * 批量新增排产单主加明细可合并 + */ + Boolean insertBatchByBo(List boList); + + /** + * 校验并批量删除排产单主加明细可合并信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 合并多条排产单主加明细可合并记录:先删除被合并的记录,再插入合并后的新记录 + */ + Boolean mergeByBo(SchProdScheduleItemMergeBo mergeBo); +} diff --git a/klp-flow/src/main/java/com/klp/flow/service/impl/InvCountPlanWarehouseServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/InvCountPlanWarehouseServiceImpl.java index 8ee841f95..843505efc 100644 --- a/klp-flow/src/main/java/com/klp/flow/service/impl/InvCountPlanWarehouseServiceImpl.java +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/InvCountPlanWarehouseServiceImpl.java @@ -62,9 +62,9 @@ public class InvCountPlanWarehouseServiceImpl implements IInvCountPlanWarehouseS Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getPlanId() != null, InvCountPlanWarehouse::getPlanId, bo.getPlanId()); - lqw.eq(bo.getWarehouseId() != null, InvCountPlanWarehouse::getWarehouseId, bo.getWarehouseId()); + lqw.like(StringUtils.isNotBlank(bo.getWarehouseIds()), InvCountPlanWarehouse::getWarehouseIds, bo.getWarehouseIds()); lqw.like(StringUtils.isNotBlank(bo.getWarehouseName()), InvCountPlanWarehouse::getWarehouseName, bo.getWarehouseName()); - lqw.eq(bo.getActualWarehouseId() != null, InvCountPlanWarehouse::getActualWarehouseId, bo.getActualWarehouseId()); + lqw.like(StringUtils.isNotBlank(bo.getActualWarehouseIds()), InvCountPlanWarehouse::getActualWarehouseIds, bo.getActualWarehouseIds()); lqw.like(StringUtils.isNotBlank(bo.getActualWarehouseName()), InvCountPlanWarehouse::getActualWarehouseName, bo.getActualWarehouseName()); lqw.eq(bo.getSystemCoilCount() != null, InvCountPlanWarehouse::getSystemCoilCount, bo.getSystemCoilCount()); lqw.eq(bo.getSystemTotalWeight() != null, InvCountPlanWarehouse::getSystemTotalWeight, bo.getSystemTotalWeight()); diff --git a/klp-flow/src/main/java/com/klp/flow/service/impl/SchDetailCoilRelServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/SchDetailCoilRelServiceImpl.java new file mode 100644 index 000000000..87b0b9a2c --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/SchDetailCoilRelServiceImpl.java @@ -0,0 +1,109 @@ +package com.klp.flow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.flow.domain.bo.SchDetailCoilRelBo; +import com.klp.flow.domain.vo.SchDetailCoilRelVo; +import com.klp.flow.domain.SchDetailCoilRel; +import com.klp.flow.mapper.SchDetailCoilRelMapper; +import com.klp.flow.service.ISchDetailCoilRelService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 排产明细钢卷关系Service业务层处理 + * + * @author klp + * @date 2026-06-25 + */ +@RequiredArgsConstructor +@Service +public class SchDetailCoilRelServiceImpl implements ISchDetailCoilRelService { + + private final SchDetailCoilRelMapper baseMapper; + + /** + * 查询排产明细钢卷关系 + */ + @Override + public SchDetailCoilRelVo queryById(Long relId){ + return baseMapper.selectVoById(relId); + } + + /** + * 查询排产明细钢卷关系列表 + */ + @Override + public TableDataInfo queryPageList(SchDetailCoilRelBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询排产明细钢卷关系列表 + */ + @Override + public List queryList(SchDetailCoilRelBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SchDetailCoilRelBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getScheduleDetailId() != null, SchDetailCoilRel::getScheduleDetailId, bo.getScheduleDetailId()); + lqw.eq(bo.getCoilId() != null, SchDetailCoilRel::getCoilId, bo.getCoilId()); + return lqw; + } + + /** + * 新增排产明细钢卷关系 + */ + @Override + public Boolean insertByBo(SchDetailCoilRelBo bo) { + SchDetailCoilRel add = BeanUtil.toBean(bo, SchDetailCoilRel.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRelId(add.getRelId()); + } + return flag; + } + + /** + * 修改排产明细钢卷关系 + */ + @Override + public Boolean updateByBo(SchDetailCoilRelBo bo) { + SchDetailCoilRel update = BeanUtil.toBean(bo, SchDetailCoilRel.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SchDetailCoilRel entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除排产明细钢卷关系 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} 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 be3fbf2f0..1d623b884 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 @@ -12,12 +12,17 @@ import org.springframework.stereotype.Service; import com.klp.flow.domain.bo.SchProdScheduleDetailBo; import com.klp.flow.domain.vo.SchProdScheduleDetailVo; import com.klp.flow.domain.SchProdScheduleDetail; +import com.klp.flow.domain.vo.SchProdScheduleVo; import com.klp.flow.mapper.SchProdScheduleDetailMapper; +import com.klp.flow.mapper.SchProdScheduleMapper; import com.klp.flow.service.ISchProdScheduleDetailService; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; /** * 排产单明细Service业务层处理 @@ -30,13 +35,18 @@ import java.util.Collection; public class SchProdScheduleDetailServiceImpl implements ISchProdScheduleDetailService { private final SchProdScheduleDetailMapper baseMapper; + private final SchProdScheduleMapper scheduleMapper; /** * 查询排产单明细 */ @Override public SchProdScheduleDetailVo queryById(Long scheduleDetailId){ - return baseMapper.selectVoById(scheduleDetailId); + SchProdScheduleDetailVo vo = baseMapper.selectVoById(scheduleDetailId); + if (vo != null) { + fillSchedule(Collections.singletonList(vo)); + } + return vo; } /** @@ -46,6 +56,7 @@ public class SchProdScheduleDetailServiceImpl implements ISchProdScheduleDetailS public TableDataInfo queryPageList(SchProdScheduleDetailBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + fillSchedule(result.getRecords()); return TableDataInfo.build(result); } @@ -55,7 +66,32 @@ public class SchProdScheduleDetailServiceImpl implements ISchProdScheduleDetailS @Override public List queryList(SchProdScheduleDetailBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + fillSchedule(list); + return list; + } + + /** + * 批量填充主表信息 + */ + private void fillSchedule(List voList) { + if (voList == null || voList.isEmpty()) { + return; + } + Set scheduleIds = voList.stream() + .map(SchProdScheduleDetailVo::getScheduleId) + .filter(id -> id != null) + .collect(Collectors.toSet()); + if (scheduleIds.isEmpty()) { + return; + } + List schedules = scheduleMapper.selectVoBatchIds(scheduleIds); + Map scheduleMap = schedules != null + ? schedules.stream().collect(Collectors.toMap(SchProdScheduleVo::getScheduleId, s -> s, (a, b) -> a)) + : Collections.emptyMap(); + for (SchProdScheduleDetailVo vo : voList) { + vo.setSchedule(scheduleMap.get(vo.getScheduleId())); + } } private LambdaQueryWrapper buildQueryWrapper(SchProdScheduleDetailBo bo) { 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 new file mode 100644 index 000000000..1359cf513 --- /dev/null +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleItemServiceImpl.java @@ -0,0 +1,182 @@ +package com.klp.flow.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.klp.common.utils.StringUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.flow.domain.bo.SchProdScheduleItemBo; +import com.klp.flow.domain.bo.SchProdScheduleItemMergeBo; +import com.klp.flow.domain.vo.SchProdScheduleItemVo; +import com.klp.flow.domain.SchProdScheduleItem; +import com.klp.flow.mapper.SchProdScheduleItemMapper; +import com.klp.flow.service.ISchProdScheduleItemService; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 排产单主加明细可合并Service业务层处理 + * + * @author klp + * @date 2026-06-26 + */ +@RequiredArgsConstructor +@Service +public class SchProdScheduleItemServiceImpl implements ISchProdScheduleItemService { + + private final SchProdScheduleItemMapper baseMapper; + + /** + * 查询排产单主加明细可合并 + */ + @Override + public SchProdScheduleItemVo queryById(Long scheduleId){ + return baseMapper.selectVoById(scheduleId); + } + + /** + * 查询排产单主加明细可合并列表 + */ + @Override + public TableDataInfo queryPageList(SchProdScheduleItemBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询排产单主加明细可合并列表 + */ + @Override + public List queryList(SchProdScheduleItemBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SchProdScheduleItemBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getScheduleNo()), SchProdScheduleItem::getScheduleNo, bo.getScheduleNo()); + lqw.eq(bo.getProdDate() != null, SchProdScheduleItem::getProdDate, bo.getProdDate()); + lqw.eq(bo.getScheduleStatus() != null, SchProdScheduleItem::getScheduleStatus, bo.getScheduleStatus()); + lqw.eq(bo.getTotalPlanWeight() != null, SchProdScheduleItem::getTotalPlanWeight, bo.getTotalPlanWeight()); + lqw.eq(StringUtils.isNotBlank(bo.getRelContractNo()), SchProdScheduleItem::getRelContractNo, bo.getRelContractNo()); + lqw.eq(StringUtils.isNotBlank(bo.getBusinessUser()), SchProdScheduleItem::getBusinessUser, bo.getBusinessUser()); + lqw.eq(StringUtils.isNotBlank(bo.getBusinessPhone()), SchProdScheduleItem::getBusinessPhone, bo.getBusinessPhone()); + lqw.eq(bo.getOrderDate() != null, SchProdScheduleItem::getOrderDate, bo.getOrderDate()); + lqw.like(StringUtils.isNotBlank(bo.getCustomerName()), SchProdScheduleItem::getCustomerName, bo.getCustomerName()); + lqw.eq(bo.getDeliveryCycle() != null, SchProdScheduleItem::getDeliveryCycle, bo.getDeliveryCycle()); + lqw.eq(StringUtils.isNotBlank(bo.getUsePurpose()), SchProdScheduleItem::getUsePurpose, bo.getUsePurpose()); + lqw.eq(StringUtils.isNotBlank(bo.getProductType()), SchProdScheduleItem::getProductType, bo.getProductType()); + lqw.eq(StringUtils.isNotBlank(bo.getThicknessTolerance()), SchProdScheduleItem::getThicknessTolerance, bo.getThicknessTolerance()); + lqw.eq(StringUtils.isNotBlank(bo.getWidthTolerance()), SchProdScheduleItem::getWidthTolerance, bo.getWidthTolerance()); + lqw.eq(StringUtils.isNotBlank(bo.getSurfaceQuality()), SchProdScheduleItem::getSurfaceQuality, bo.getSurfaceQuality()); + lqw.eq(StringUtils.isNotBlank(bo.getSurfaceTreatment()), SchProdScheduleItem::getSurfaceTreatment, bo.getSurfaceTreatment()); + lqw.eq(StringUtils.isNotBlank(bo.getInnerDiameter()), SchProdScheduleItem::getInnerDiameter, bo.getInnerDiameter()); + lqw.eq(StringUtils.isNotBlank(bo.getOuterDiameter()), SchProdScheduleItem::getOuterDiameter, bo.getOuterDiameter()); + lqw.eq(StringUtils.isNotBlank(bo.getPackReq()), SchProdScheduleItem::getPackReq, bo.getPackReq()); + lqw.eq(StringUtils.isNotBlank(bo.getCutEdgeReq()), SchProdScheduleItem::getCutEdgeReq, bo.getCutEdgeReq()); + lqw.eq(StringUtils.isNotBlank(bo.getSingleCoilWeight()), SchProdScheduleItem::getSingleCoilWeight, bo.getSingleCoilWeight()); + lqw.eq(StringUtils.isNotBlank(bo.getWeightDeviation()), SchProdScheduleItem::getWeightDeviation, bo.getWeightDeviation()); + lqw.eq(StringUtils.isNotBlank(bo.getOtherTechReq()), SchProdScheduleItem::getOtherTechReq, bo.getOtherTechReq()); + lqw.eq(StringUtils.isNotBlank(bo.getPaymentDesc()), SchProdScheduleItem::getPaymentDesc, bo.getPaymentDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getReturnReason()), SchProdScheduleItem::getReturnReason, bo.getReturnReason()); + lqw.eq(StringUtils.isNotBlank(bo.getScheduleIds()), SchProdScheduleItem::getScheduleIds, bo.getScheduleIds()); + lqw.eq(StringUtils.isNotBlank(bo.getOrderDetailIds()), SchProdScheduleItem::getOrderDetailIds, bo.getOrderDetailIds()); + lqw.eq(StringUtils.isNotBlank(bo.getSpec()), SchProdScheduleItem::getSpec, bo.getSpec()); + lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), SchProdScheduleItem::getMaterial, bo.getMaterial()); + lqw.eq(bo.getScheduleWeight() != null, SchProdScheduleItem::getScheduleWeight, bo.getScheduleWeight()); + lqw.eq(StringUtils.isNotBlank(bo.getProductItem()), SchProdScheduleItem::getProductItem, bo.getProductItem()); + lqw.eq(StringUtils.isNotBlank(bo.getRowRemark()), SchProdScheduleItem::getRowRemark, bo.getRowRemark()); + return lqw; + } + + /** + * 新增排产单主加明细可合并 + */ + @Override + public Boolean insertByBo(SchProdScheduleItemBo bo) { + SchProdScheduleItem add = BeanUtil.toBean(bo, SchProdScheduleItem.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setScheduleId(add.getScheduleId()); + } + return flag; + } + + /** + * 批量新增排产单主加明细可合并 + */ + @Override + public Boolean insertBatchByBo(List boList) { + List addList = new ArrayList<>(boList.size()); + for (SchProdScheduleItemBo bo : boList) { + SchProdScheduleItem add = BeanUtil.toBean(bo, SchProdScheduleItem.class); + validEntityBeforeSave(add); + addList.add(add); + } + boolean flag = baseMapper.insertBatch(addList); + if (flag) { + for (int i = 0; i < boList.size(); i++) { + boList.get(i).setScheduleId(addList.get(i).getScheduleId()); + } + } + return flag; + } + + /** + * 修改排产单主加明细可合并 + */ + @Override + public Boolean updateByBo(SchProdScheduleItemBo bo) { + SchProdScheduleItem update = BeanUtil.toBean(bo, SchProdScheduleItem.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SchProdScheduleItem entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除排产单主加明细可合并 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 合并多条排产单主加明细可合并记录:先删除被合并的记录,再插入合并后的新记录 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean mergeByBo(SchProdScheduleItemMergeBo mergeBo) { + // 先删除被合并的记录 + baseMapper.deleteBatchIds(mergeBo.getIds()); + // 再插入合并后的新记录 + SchProdScheduleItemBo mergedBo = mergeBo.getMergedBo(); + SchProdScheduleItem add = BeanUtil.toBean(mergedBo, SchProdScheduleItem.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + mergedBo.setScheduleId(add.getScheduleId()); + } + return flag; + } +} diff --git a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleServiceImpl.java b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleServiceImpl.java index e97631cae..e6a105b6f 100644 --- a/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleServiceImpl.java +++ b/klp-flow/src/main/java/com/klp/flow/service/impl/SchProdScheduleServiceImpl.java @@ -12,12 +12,24 @@ import org.springframework.stereotype.Service; import com.klp.flow.domain.bo.SchProdScheduleBo; import com.klp.flow.domain.vo.SchProdScheduleVo; import com.klp.flow.domain.SchProdSchedule; +import com.klp.flow.domain.SchProdScheduleDetail; +import com.klp.flow.domain.vo.SchProdScheduleDetailVo; import com.klp.flow.mapper.SchProdScheduleMapper; +import com.klp.flow.mapper.SchProdScheduleDetailMapper; +import com.klp.flow.mapper.SchSaleScheduleRelMapper; +import com.klp.flow.domain.SchSaleScheduleRel; import com.klp.flow.service.ISchProdScheduleService; +import com.klp.crm.service.ICrmOrderService; +import com.klp.crm.domain.bo.CrmOrderBo; +import com.klp.crm.domain.vo.CrmOrderVo; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.Collection; +import java.util.Collections; +import java.util.stream.Collectors; /** * 排产单主Service业务层处理 @@ -30,13 +42,21 @@ import java.util.Collection; public class SchProdScheduleServiceImpl implements ISchProdScheduleService { private final SchProdScheduleMapper baseMapper; + private final SchProdScheduleDetailMapper detailMapper; + private final SchSaleScheduleRelMapper relMapper; + private final ICrmOrderService crmOrderService; /** * 查询排产单主 */ @Override public SchProdScheduleVo queryById(Long scheduleId){ - return baseMapper.selectVoById(scheduleId); + SchProdScheduleVo vo = baseMapper.selectVoById(scheduleId); + if (vo != null) { + fillDetailList(Collections.singletonList(vo)); + fillOrderList(Collections.singletonList(vo)); + } + return vo; } /** @@ -46,6 +66,8 @@ public class SchProdScheduleServiceImpl implements ISchProdScheduleService { public TableDataInfo queryPageList(SchProdScheduleBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + fillDetailList(result.getRecords()); + fillOrderList(result.getRecords()); return TableDataInfo.build(result); } @@ -55,7 +77,95 @@ public class SchProdScheduleServiceImpl implements ISchProdScheduleService { @Override public List queryList(SchProdScheduleBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + fillDetailList(list); + fillOrderList(list); + return list; + } + + /** + * 批量填充明细列表 + */ + private void fillDetailList(List voList) { + if (voList == null || voList.isEmpty()) { + return; + } + List scheduleIds = voList.stream() + .map(SchProdScheduleVo::getScheduleId) + .filter(id -> id != null) + .distinct() + .collect(Collectors.toList()); + if (scheduleIds.isEmpty()) { + return; + } + LambdaQueryWrapper detailQw = Wrappers.lambdaQuery(); + detailQw.in(SchProdScheduleDetail::getScheduleId, scheduleIds); + List allDetails = detailMapper.selectVoList(detailQw); + if (allDetails == null || allDetails.isEmpty()) { + return; + } + Map> detailMap = allDetails.stream() + .collect(Collectors.groupingBy(SchProdScheduleDetailVo::getScheduleId)); + for (SchProdScheduleVo vo : voList) { + vo.setDetailList(detailMap.getOrDefault(vo.getScheduleId(), Collections.emptyList())); + } + } + + /** + * 批量填充CRM订单列表(通过 sch_sale_schedule_rel 关联表) + */ + private void fillOrderList(List voList) { + if (voList == null || voList.isEmpty()) { + return; + } + // 1. 收集所有 scheduleId + List scheduleIds = voList.stream() + .map(SchProdScheduleVo::getScheduleId) + .filter(id -> id != null) + .distinct() + .collect(Collectors.toList()); + if (scheduleIds.isEmpty()) { + return; + } + // 2. 查关联表,获取 scheduleId → orderId 映射 + LambdaQueryWrapper relQw = Wrappers.lambdaQuery(); + relQw.in(SchSaleScheduleRel::getScheduleId, scheduleIds); + List rels = relMapper.selectList(relQw); + if (rels == null || rels.isEmpty()) { + return; + } + // 收集所有 orderId(去重) + Set orderIdSet = rels.stream() + .map(SchSaleScheduleRel::getOrderId) + .filter(id -> id != null) + .collect(Collectors.toSet()); + // scheduleId → 关联的 orderId 列表 + Map> scheduleOrderIdsMap = rels.stream() + .collect(Collectors.groupingBy( + SchSaleScheduleRel::getScheduleId, + Collectors.mapping(SchSaleScheduleRel::getOrderId, Collectors.toList()) + )); + if (orderIdSet.isEmpty()) { + return; + } + // 3. 批量查 CrmOrder + CrmOrderBo orderBo = new CrmOrderBo(); + orderBo.setOrderIds(new java.util.ArrayList<>(orderIdSet)); + List allOrders = crmOrderService.queryList(orderBo); + Map orderMap = allOrders != null + ? allOrders.stream().collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a)) + : Collections.emptyMap(); + // 4. 回填到 VO + for (SchProdScheduleVo vo : voList) { + List orderIds = scheduleOrderIdsMap.get(vo.getScheduleId()); + if (orderIds != null) { + List orders = orderIds.stream() + .map(orderMap::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + vo.setOrderList(orders); + } + } } private LambdaQueryWrapper buildQueryWrapper(SchProdScheduleBo bo) { diff --git a/klp-flow/src/main/resources/mapper/flow/InvCountPlanWarehouseMapper.xml b/klp-flow/src/main/resources/mapper/flow/InvCountPlanWarehouseMapper.xml index c8d06fa04..19783192b 100644 --- a/klp-flow/src/main/resources/mapper/flow/InvCountPlanWarehouseMapper.xml +++ b/klp-flow/src/main/resources/mapper/flow/InvCountPlanWarehouseMapper.xml @@ -7,9 +7,9 @@ - + - + diff --git a/klp-flow/src/main/resources/mapper/flow/SchDetailCoilRelMapper.xml b/klp-flow/src/main/resources/mapper/flow/SchDetailCoilRelMapper.xml new file mode 100644 index 000000000..4d23596d6 --- /dev/null +++ b/klp-flow/src/main/resources/mapper/flow/SchDetailCoilRelMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/klp-flow/src/main/resources/mapper/flow/SchProdScheduleItemMapper.xml b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleItemMapper.xml new file mode 100644 index 000000000..766356f0f --- /dev/null +++ b/klp-flow/src/main/resources/mapper/flow/SchProdScheduleItemMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/klp-system/src/main/java/com/klp/system/domain/vo/MetaVo.java b/klp-system/src/main/java/com/klp/system/domain/vo/MetaVo.java index 6309c3517..4b9056d9b 100644 --- a/klp-system/src/main/java/com/klp/system/domain/vo/MetaVo.java +++ b/klp-system/src/main/java/com/klp/system/domain/vo/MetaVo.java @@ -32,6 +32,11 @@ public class MetaVo { */ private String link; + /** + * 菜单样式 + */ + private String style; + public MetaVo(String title, String icon) { this.title = title; this.icon = icon; diff --git a/klp-system/src/main/java/com/klp/system/service/impl/SysMenuServiceImpl.java b/klp-system/src/main/java/com/klp/system/service/impl/SysMenuServiceImpl.java index 889849b2b..acc1e8480 100644 --- a/klp-system/src/main/java/com/klp/system/service/impl/SysMenuServiceImpl.java +++ b/klp-system/src/main/java/com/klp/system/service/impl/SysMenuServiceImpl.java @@ -161,7 +161,9 @@ public class SysMenuServiceImpl implements ISysMenuService { router.setPath(getRouterPath(menu)); router.setComponent(getComponent(menu)); router.setQuery(menu.getQueryParam()); - router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + MetaVo metaVo = new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()); + metaVo.setStyle(menu.getStyle()); + router.setMeta(metaVo); List cMenus = menu.getChildren(); if (CollUtil.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { router.setAlwaysShow(true); @@ -174,12 +176,16 @@ public class SysMenuServiceImpl implements ISysMenuService { children.setPath(menu.getPath()); children.setComponent(menu.getComponent()); children.setName(StringUtils.capitalize(menu.getPath())); - children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + MetaVo childrenMetaVo = new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath()); + childrenMetaVo.setStyle(menu.getStyle()); + children.setMeta(childrenMetaVo); children.setQuery(menu.getQueryParam()); childrenList.add(children); router.setChildren(childrenList); } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { - router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); + MetaVo innerMetaVo = new MetaVo(menu.getMenuName(), menu.getIcon()); + innerMetaVo.setStyle(menu.getStyle()); + router.setMeta(innerMetaVo); router.setPath("/"); List childrenList = new ArrayList<>(); RouterVo children = new RouterVo(); @@ -187,7 +193,9 @@ public class SysMenuServiceImpl implements ISysMenuService { children.setPath(routerPath); children.setComponent(UserConstants.INNER_LINK); children.setName(StringUtils.capitalize(routerPath)); - children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + MetaVo innerChildrenMetaVo = new MetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath()); + innerChildrenMetaVo.setStyle(menu.getStyle()); + children.setMeta(innerChildrenMetaVo); childrenList.add(children); router.setChildren(childrenList); } diff --git a/klp-system/src/main/resources/mapper/system/SysMenuMapper.xml b/klp-system/src/main/resources/mapper/system/SysMenuMapper.xml index 33ec17b8a..9bebaee34 100644 --- a/klp-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/klp-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -20,6 +20,7 @@ + @@ -29,7 +30,7 @@