1、分堆打包封包、保存分堆抽象和复杂度优化,删除配件优化;2、分堆打包部分接口入参提示优化;

This commit is contained in:
gaoqr
2026-04-03 11:59:36 +08:00
parent c3295f66e9
commit 807082cf0a
29 changed files with 662 additions and 688 deletions
@@ -196,9 +196,9 @@ public class ErrorCodeConstants {
public static final ErrorCode ORDER_COMPONENT_NOT_PROCESS = new ErrorCode(1_003_010_006, "order.component.not.process"); public static final ErrorCode ORDER_COMPONENT_NOT_PROCESS = new ErrorCode(1_003_010_006, "order.component.not.process");
public static final ErrorCode ORDER_COMPONENT_RESTORE_REPEAT = new ErrorCode(1_003_010_007, "order.component.restore.repeat"); public static final ErrorCode ORDER_COMPONENT_RESTORE_REPEAT = new ErrorCode(1_003_010_007, "order.component.restore.repeat");
//=========== 部件管理 1-003-011-000 ============ //=========== 分堆打包 1-003-011-000 ============
public static final ErrorCode HEAP_SPLIT_TASK_NOT_EXIST = new ErrorCode(1_003_011_000, "heap.split.task.not.exist"); public static final ErrorCode PARTS_PACK_NUM_NOT_ENOUGH = new ErrorCode(1_003_010_000, "parts.pack.num.not.enough");
public static final ErrorCode HEAP_SPLIT_TASK_NAME_EXIST = new ErrorCode(1_003_011_001, "heap.split.task.name.exist"); public static final ErrorCode PARTS_PACK_ITEM_SOURCE_NOT_EXISTS = new ErrorCode(1_003_010_001, "parts.pack.item.source.not.exist");
public static final ErrorCode HEAP_SPLIT_NO_NEED_RESTART = new ErrorCode(1_003_011_002, "heap.split.no.need.restart"); public static final ErrorCode PARTS_HEAPSPLIT_NUM_NOT_ENOUGH = new ErrorCode(1_003_010_002, "parts.heapsplit.num.not.enough");
public static final ErrorCode HEAP_SPLIT_NEED_RESTART = new ErrorCode(1_003_011_003, "heap.split.need.restart"); public static final ErrorCode PARTS_HEAPSPLIT_ITEM_SOURCE_NOT_EXISTS = new ErrorCode(1_003_010_003, "parts.heapsplit.item.source.not.exist");
} }
@@ -0,0 +1,30 @@
package com.cf.imes.module.executor.enums;
import com.cf.imes.framework.common.core.IntArrayValuable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 打包配置 - 打包方式枚举
*
* @author Gqr
* @since 2026/4/1 10:50
*/
@AllArgsConstructor
@Getter
public enum OrderPackageMethodEnum implements IntArrayValuable {
ROOM_NAME(0),
BODY_NAME(1),
ORDER(2);
private final int method;
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(OrderPackageMethodEnum::getMethod).toArray();
@Override
public int[] array() {
return ARRAYS;
}
}
@@ -7,7 +7,6 @@ import com.cf.imes.module.executor.controller.admin.manage.pack.vo.*;
import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO;
import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.PackageDetailsRespVO; import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.PackageDetailsRespVO;
import com.cf.imes.module.executor.service.manage.pack.PackService; import com.cf.imes.module.executor.service.manage.pack.PackService;
import com.cf.imes.module.executor.service.manage.query.ProductionStatusService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@@ -33,9 +32,6 @@ public class PackController {
@Resource @Resource
private PackService packService; private PackService packService;
@Resource
private ProductionStatusService productionStatusService;
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "打包分页查询") @Operation(summary = "打包分页查询")
@PreAuthorize("@ss.hasPermission('manage:pack:query')") @PreAuthorize("@ss.hasPermission('manage:pack:query')")
@@ -65,27 +61,35 @@ public class PackController {
@PostMapping("/getOrderPack") @PostMapping("/getOrderPack")
@Operation(summary = "查看生产订单对应的包裹信息-未分页") @Operation(summary = "查看订单列表对应的包裹列表")
@PreAuthorize("@ss.hasAnyPermissions('manage:pack:export-pack-num','manage:pack:pack')") @PreAuthorize("@ss.hasAnyPermissions('manage:pack:export-pack-num','manage:pack:pack')")
public CommonResult<List<OrderPackageVO>> getOrderPack(@Valid @RequestBody PackageDetailsReqVO reqVO) { public CommonResult<List<OrderPackageVO>> getOrderPack(@Valid @RequestBody PackageDetailsReqVO reqVO) {
return success(packService.getOrderPack(reqVO)); return success(packService.getOrderPack(reqVO));
} }
@GetMapping("/packageDetails/{packageNo}") @GetMapping("/packageDetails/{packageNo}")
@Operation(summary = "查询包裹的详细信息") @Operation(summary = "查询包裹编号对应的包裹中的明细")
@Parameter(name = "packageNo", description = "包裹编号", required = true)
@PreAuthorize("@ss.hasAnyPermissions('manage:pack:pack-details','manage:pack:query')") @PreAuthorize("@ss.hasAnyPermissions('manage:pack:pack-details','manage:pack:query')")
public CommonResult<List<PackageDetailsRespVO>> queryPackageDetails(@PathVariable String packageNo){ public CommonResult<List<PackageDetailsRespVO>> queryOrdersPackageDetails(@PathVariable String packageNo){
return success(packService.getPackageDetails(packageNo)); return success(packService.getOrdersPackageDetails(packageNo));
}
@GetMapping("/packageDetails/{orderId}/{packageNo}")
@Operation(summary = "查询订单编号下对应包裹编号的包裹中的明细")
@Parameter(name = "orderId", description = "订单编号", required = true)
@Parameter(name = "packageNo", description = "包裹编号", required = true)
@PreAuthorize("@ss.hasAnyPermissions('manage:pack:pack-details','manage:pack:query')")
public CommonResult<List<PackageDetailsRespVO>> queryOrderPackageDetails(@PathVariable Long orderId, @PathVariable String packageNo) {
return success(packService.getOrderPackageDetails(orderId, packageNo));
} }
@GetMapping("/getPageOrderPack") @PostMapping("/getPageOrderPack")
@Operation(summary = "查看生产订单对应的包裹信息-分页") @Operation(summary = "查看生产订单对应的包裹信息-分页")
@PreAuthorize("@ss.hasPermission('manage:pack:pack-details')") @PreAuthorize("@ss.hasPermission('manage:pack:pack-details')")
public CommonResult<PageResult<OrderPackageVO>> getPageOrderPack(@Valid PackageDetailsReqVO reqVO) { public CommonResult<PageResult<OrderPackageVO>> getPageOrderPack(@Valid PackageDetailsReqVO reqVO) {
return success(packService.getPageOrderPack(reqVO)); return success(packService.getPageOrderPack(reqVO));
} }
@PutMapping("/updatePack") @PutMapping("/updatePack")
@@ -1,7 +1,10 @@
package com.cf.imes.module.executor.controller.admin.manage.pack.heapsplit; package com.cf.imes.module.executor.controller.admin.manage.pack.heapsplit;
import com.cf.imes.framework.common.validation.InEnum;
import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackagePartsSaveReqVO; import com.cf.imes.module.executor.controller.admin.manage.pack.vo.PackagePartsSaveReqVO;
import com.cf.imes.module.executor.enums.OrderPackageMethodEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;
import lombok.Data; import lombok.Data;
import java.util.ArrayList; import java.util.ArrayList;
@@ -29,5 +32,10 @@ public class HeapSplitSaveReqVO {
private List<PackagePartsSaveReqVO> delParts = new ArrayList<>(); private List<PackagePartsSaveReqVO> delParts = new ArrayList<>();
@Schema(description = "订单id列表") @Schema(description = "订单id列表")
@Size(min = 1, max = 100, message = "订单号列表不能为空且长度不能超过100")
private List<Long> orderIds = new ArrayList<>(); private List<Long> orderIds = new ArrayList<>();
@Schema(description = "打包方式:0柜名、1房名、2订单")
@InEnum(OrderPackageMethodEnum.class)
private Integer packMethod;
} }
@@ -1,11 +1,12 @@
package com.cf.imes.module.executor.controller.admin.manage.pack.vo; package com.cf.imes.module.executor.controller.admin.manage.pack.vo;
import com.cf.imes.framework.common.validation.InEnum;
import com.cf.imes.module.executor.enums.OrderPackageMethodEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
import jakarta.validation.constraints.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -14,8 +15,8 @@ import java.util.List;
@ToString(callSuper = true) @ToString(callSuper = true)
public class OrderPackReqVO { public class OrderPackReqVO {
@Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单号列表", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "订单号为空") @Size(min = 1, max = 100, message = "订单号列表不能为空且长度不能超过100")
private List<Long> orderIds; private List<Long> orderIds;
@Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED)
@@ -31,7 +32,8 @@ public class OrderPackReqVO {
private List<Long> deletePlateIdList = new ArrayList<>(); private List<Long> deletePlateIdList = new ArrayList<>();
@Schema(description = "打包方式:0柜名、1房名、2订单") @Schema(description = "打包方式:0柜名、1房名、2订单")
private Integer packMethod = 1; @InEnum(OrderPackageMethodEnum.class)
private Integer packMethod;
@Schema(description = "新增打包的配件列表") @Schema(description = "新增打包的配件列表")
private List<PackagePartsSaveReqVO> addPartsList = new ArrayList<>(); private List<PackagePartsSaveReqVO> addPartsList = new ArrayList<>();
@@ -1,6 +1,5 @@
package com.cf.imes.module.executor.controller.admin.manage.pack.vo; package com.cf.imes.module.executor.controller.admin.manage.pack.vo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -12,10 +11,6 @@ import java.util.List;
@Data @Data
@Builder @Builder
public class OrderPackRespVO { public class OrderPackRespVO {
@Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long id;
@Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED)
private Long orderId; private Long orderId;
@@ -25,9 +20,6 @@ public class OrderPackRespVO {
@Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED)
private String packageNo; private String packageNo;
@Schema(description = "包裹类型,-1未定义,0板材,1配件,2其他配件", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer packageType;
@Schema(description = "包裹名", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹名", requiredMode = Schema.RequiredMode.REQUIRED)
private String name; private String name;
@@ -1,42 +0,0 @@
package com.cf.imes.module.executor.controller.admin.manage.pack.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.ToString;
import jakarta.validation.constraints.NotNull;
import java.util.List;
@Schema(description = "管理后台 - 订单模块表 Request VO")
@Data
//@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class OrderPartsReqVO /*extends PageParam*/ {
@Schema(description = "订单号", requiredMode = Schema.RequiredMode.REQUIRED)
// @NotNull(message = "订单号为空")
private Long orderId;
private List<Long> orderIds;
@Schema(description = "更新配件时传-包裹ID")
private Long packId;
@Schema(description = "新增的配件ID")
private List<Long> addPartsIdList;
@Schema(description = "更新配件时传-删除的配件ID")
private List<Long> deletePartsIdList;
@Schema(description = "新增的板件ID")
private List<Long> addPlateIdList;
}
@@ -2,6 +2,7 @@ package com.cf.imes.module.executor.controller.admin.manage.pack.vo;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -10,84 +11,85 @@ import java.util.List;
@Schema(description = "管理后台 - 配件列表详情 Response VO") @Schema(description = "管理后台 - 配件列表详情 Response VO")
@Data @Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderPartsRespVO { public class OrderPartsRespVO {
@Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹ID")
private Long packageId; private Long packageId;
@Schema(description = "订单ID") @Schema(description = "订单ID")
private Long orderId; private Long orderId;
@Schema(description = "包裹号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹号")
private String packageNo; private String packageNo;
@Schema(description = "房间名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "房间名称")
@ExcelProperty("房间名称") @ExcelProperty("房间名称")
private String roomName; private String roomName;
@Schema(description = "柜体名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "柜体名称")
@ExcelProperty("柜体名称") @ExcelProperty("柜体名称")
private String cabinetName; private String cabinetName;
@Schema(description = "房间ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "房间ID")
private String roomId; private String roomId;
@Schema(description = "柜体ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "柜体ID")
private String bodyId; private String bodyId;
@Schema(description = "配件ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件ID")
private Long partsId; private Long partsId;
@Schema(description = "配件名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件名称")
private String name; private String name;
@Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "型号")
private String model; private String model;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "规格")
private String spec; private String spec;
@Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "数量")
private BigDecimal num; private BigDecimal num;
@Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "单位")
private String unit; private String unit;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "品牌")
private String brand; private String brand;
@Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "厂家")
private String factory; private String factory;
@Schema(description = "配件类型", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件类型")
private String type; private String type;
@Schema(description = "是否复合配件", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否复合配件")
private Boolean isComposite; private Boolean isComposite;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "备注")
private String remark; private String remark;
@Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件颜色")
private String partsColor; private String partsColor;
@Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件宽度")
private Double partsWidth; private Double partsWidth;
@Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件长度")
private Double partsLength; private Double partsLength;
@Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件厚度")
private Double partsThickness; private Double partsThickness;
@Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件主类:1封边2五金3组件")
private String category; private String category;
@Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔")
private String subparts; private String subparts;
@Schema(description = "数量-用于计算,不显示") @Schema(description = "数量-用于计算,不显示")
@@ -98,7 +100,7 @@ public class OrderPartsRespVO {
private List<GroupNameList> processGroupNameList; private List<GroupNameList> processGroupNameList;
@Schema(description = "加工组", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "加工组")
private String processGroup; private String processGroup;
@Schema(description = "分堆状态,true:已分堆") @Schema(description = "分堆状态,true:已分堆")
@@ -2,6 +2,7 @@ package com.cf.imes.module.executor.controller.admin.manage.pack.vo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
@@ -15,5 +16,6 @@ public class PackReqVO {
private List<Long> orderIds; private List<Long> orderIds;
@Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "包裹编号不能为空")
private Long packageNo; private Long packageNo;
} }
@@ -4,6 +4,8 @@ import com.cf.imes.framework.common.validation.InEnum;
import com.cf.imes.module.executor.enums.OrderItemTypeEnum; import com.cf.imes.module.executor.enums.OrderItemTypeEnum;
import com.cf.imes.module.executor.enums.pack.PackScanComponentCorrelationTypeEnum; import com.cf.imes.module.executor.enums.pack.PackScanComponentCorrelationTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@@ -20,16 +22,20 @@ public class PackScanComponentCorrelationReqVO {
@InEnum(PackScanComponentCorrelationTypeEnum.class) @InEnum(PackScanComponentCorrelationTypeEnum.class)
@Schema(description = "扫描类型,0本身、1部件父级、2部件顶级") @Schema(description = "扫描类型,0本身、1部件父级、2部件顶级")
@NotNull(message = "扫描类型不能为空")
private Integer type; private Integer type;
@Schema(description = "扫描本体编号") @Schema(description = "扫描本体编号")
@NotNull(message = "扫描本体编号不能为空")
private Long id; private Long id;
@InEnum(OrderItemTypeEnum.class) @InEnum(OrderItemTypeEnum.class)
@Schema(description = "扫描本体类型") @Schema(description = "扫描本体类型")
@NotNull(message = "扫描本体类型不能为空")
private Integer itemType; private Integer itemType;
@Schema(description = "订单ID列表") @Schema(description = "订单ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 100, message = "订单ID列表最大长度为100")
private List<Long> orderIds; private List<Long> orderIds;
@Schema(description = "是否关联加工组") @Schema(description = "是否关联加工组")
@@ -3,6 +3,7 @@ package com.cf.imes.module.executor.controller.admin.manage.pack.vo;
import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;
import lombok.Data; import lombok.Data;
import lombok.ToString; import lombok.ToString;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
@@ -23,6 +24,8 @@ public class PackageDetailsReqVO extends PageParam {
@Length(max = 19,message = "订单号长度不能超过 19 位") @Length(max = 19,message = "订单号长度不能超过 19 位")
private String orderId; private String orderId;
@Schema(description = "订单号列表", requiredMode = Schema.RequiredMode.REQUIRED)
@Size(max = 100, message = "订单号列表长度不能超过 100 个")
private List<Long> orderIds; private List<Long> orderIds;
@@ -14,7 +14,7 @@ public class PackingReqVO {
@Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "包裹异常,请查看是否封包") @NotNull(message = "包裹编号不能为空,请查看是否封包")
private Long packageNo; private Long packageNo;
@@ -17,88 +17,88 @@ import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class PlateDetailsRespVO { public class PlateDetailsRespVO {
@Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹ID")
private Long packageId; private Long packageId;
@Schema(description = "包裹号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹号")
private String packageNo; private String packageNo;
@Schema(description = "房间名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "房间名称")
@ExcelProperty("房间名称") @ExcelProperty("房间名称")
private String roomName; private String roomName;
@Schema(description = "柜体名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "柜体名称")
@ExcelProperty("柜体名称") @ExcelProperty("柜体名称")
private String cabinetName; private String cabinetName;
@Schema(description = "房间ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "房间ID")
private String roomId; private String roomId;
@Schema(description = "柜体ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "柜体ID")
private String bodyId; private String bodyId;
@Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单ID")
private String orderId; private String orderId;
@Schema(description = "板材ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "板材ID")
private String plateId; private String plateId;
@Schema(description = "自定义板编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "自定义板编号")
private String customPlateNo; private String customPlateNo;
@Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "板编号")
@ExcelProperty("板编号") @ExcelProperty("板编号")
private String plateNo; private String plateNo;
@Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "板名称")
@ExcelProperty("板名称") @ExcelProperty("板名称")
private String plateName; private String plateName;
@Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "材料")
@ExcelProperty("材料") @ExcelProperty("材料")
private String material; private String material;
@Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "颜色")
@ExcelProperty("颜色") @ExcelProperty("颜色")
private String color; private String color;
@Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "宽度")
@ExcelProperty("宽度") @ExcelProperty("宽度")
private Double width; private Double width;
@Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "长度")
@ExcelProperty("长度") @ExcelProperty("长度")
private Double height; private Double height;
@Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "厚度")
@ExcelProperty("厚度") @ExcelProperty("厚度")
private Double thickness; private Double thickness;
@Schema(description = "面积", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "面积")
@ExcelProperty("面积") @ExcelProperty("面积")
private Double area; private Double area;
@Schema(description = "纹路", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "纹路")
@ExcelProperty("纹路") @ExcelProperty("纹路")
private Integer texture; private Integer texture;
@Schema(description = "异形", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "异形")
@ExcelProperty("异形") @ExcelProperty("异形")
private Boolean specialShaped; private Boolean specialShaped;
@Schema(description = "正反面造型", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "正反面造型")
@ExcelProperty("正反面造型") @ExcelProperty("正反面造型")
private Boolean profiling; private Boolean profiling;
@Schema(description = "排孔", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "排孔")
@ExcelProperty("排孔") @ExcelProperty("排孔")
private Boolean rowHole; private Boolean rowHole;
@Schema(description = "加工组", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "加工组")
@ExcelProperty("加工组") @ExcelProperty("加工组")
private String processGroup; private String processGroup;
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "备注")
@ExcelProperty("备注") @ExcelProperty("备注")
private String remark; private String remark;
@@ -1,6 +1,7 @@
package com.cf.imes.module.executor.controller.admin.manage.query.vo.pack; package com.cf.imes.module.executor.controller.admin.manage.query.vo.pack;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -8,6 +9,7 @@ import java.time.LocalDateTime;
@Schema(description = "管理后台 - 订单包裹表 Response VO") @Schema(description = "管理后台 - 订单包裹表 Response VO")
@Data @Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderPackageVO { public class OrderPackageVO {
@@ -13,112 +13,112 @@ import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class PackageDetailsRespVO { public class PackageDetailsRespVO {
@Schema(description = "包裹ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "包裹ID")
private Long packageNo; private Long packageNo;
@Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "订单ID")
private Long orderId; private Long orderId;
@Schema(description = "房间名称-板材类型显示", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "房间名称-板材类型显示")
private String roomName; private String roomName;
@Schema(description = "柜体名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "柜体名称")
private String cabinetName; private String cabinetName;
@Schema(description = "板材ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "板材ID")
private Long plateId; private Long plateId;
@Schema(description = "板编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "板编号")
private String plateNo; private String plateNo;
@Schema(description = "自定义板编号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "自定义板编号")
private String customPlateNo; private String customPlateNo;
@Schema(description = "板名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "板名称")
private String plateName; private String plateName;
@Schema(description = "材料", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "材料")
private String material; private String material;
@Schema(description = "颜色", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "颜色")
private String color; private String color;
@Schema(description = "宽度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "宽度")
private Double width; private Double width;
@Schema(description = "长度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "长度")
private Double height; private Double height;
@Schema(description = "厚度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "厚度")
private Double thickness; private Double thickness;
@Schema(description = "面积", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "面积")
private Double area; private Double area;
@Schema(description = "纹路", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "纹路")
private String texture; private String texture;
@Schema(description = "是否异型", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否异型")
private Boolean specialShaped; private Boolean specialShaped;
@Schema(description = "是否造型", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否造型")
private Boolean profiling; private Boolean profiling;
@Schema(description = "是否有孔", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否有孔")
private Boolean rowHole; private Boolean rowHole;
@Schema(description = "加工组", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "加工组")
private String processGroup; private String processGroup;
@Schema(description = "备注(板材和配件都要传递)", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "备注(板材和配件都要传递)")
private String remark; private String remark;
@Schema(description = "配件名称-配件类型显示", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件名称-配件类型显示")
private String partsName; private String partsName;
@Schema(description = "配件ID", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件ID")
private Long partsId; private Long partsId;
@Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "型号")
private String model; private String model;
@Schema(description = "规格", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "规格")
private String spec; private String spec;
@Schema(description = "明细配件类型, 2 五金/配件 3 其他 4 报价配件", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "明细配件类型, 2 五金/配件 3 其他 4 报价配件")
private String type; private String type;
@Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "数量")
private BigDecimal num; private BigDecimal packNum;
@Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "单位")
private String unit; private String unit;
@Schema(description = "是否复合部件:0 否 1 是", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "是否复合部件:0 否 1 是")
private Boolean isComposite; private Boolean isComposite;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "品牌")
private String brand; private String brand;
@Schema(description = "厂家", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "厂家")
private String factory; private String factory;
@Schema(description = "配件颜色", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件颜色")
private String partsColor; private String partsColor;
@Schema(description = "配件宽度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件宽度")
private Double partsWidth; private Double partsWidth;
@Schema(description = "配件长度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件长度")
private Double partsLength; private Double partsLength;
@Schema(description = "配件厚度", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件厚度")
private Double partsThickness; private Double partsThickness;
@Schema(description = "配件主类:1封边2五金3组件", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "配件主类:1封边2五金3组件")
private String category; private String category;
@Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "子配件ID列表,复合部件时记录子配件ID,半角逗号分隔")
private String subparts; private String subparts;
@@ -35,7 +35,6 @@ import java.time.LocalTime;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 订单表 order_{N} Mapper * 订单表 order_{N} Mapper
@@ -320,11 +319,4 @@ public interface OrderMapper extends BaseMapperX<OrderDO> {
* @return * @return
*/ */
OrderPlateNumAndAreaDO selectPlateNumAndArea(@Param("orderId") Long orderId); OrderPlateNumAndAreaDO selectPlateNumAndArea(@Param("orderId") Long orderId);
/**
* 更新订单打包状态
*
* @param orderIds
*/
void updateOrdersPackageStatus(@Param("orderIds") List<Long> orderIds);
} }
@@ -134,7 +134,7 @@ public interface OrderPartsMapper extends BaseMapperX<OrderPartsDO> {
List<OrderPartsRespVO> selectOrdersPartsList(@Param("orderIds") List<Long> orderIds); List<OrderPartsRespVO> selectOrdersPartsList(@Param("orderIds") List<Long> orderIds);
/** /**
* 查询订单列表未打包配件 * 查询订单列表分堆配件
* *
* @param orderIds * @param orderIds
* @return * @return
@@ -4,23 +4,23 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
/** /**
* 分堆任务状态枚举 * 分堆状态枚举
* *
* @author Gqr * @author Gqr
* @since 2026/3/11 10:35 * @since 2026/3/11 10:35
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@Getter @Getter
public enum HeapSplitTaskStatusEnum { public enum HeapSplitStatusEnum {
/** /**
* 完成 * 分堆
*/ */
UNFINISHED(0), NO(0),
/** /**
* 完成 * 分堆
*/ */
FINISHED(1); YES(1);
private final int status; private final int status;
} }
@@ -19,6 +19,7 @@ public enum PackScanComponentCorrelationTypeEnum implements IntArrayValuable {
* 本身 * 本身
*/ */
SELF(0), SELF(0),
/** /**
* 部件父级 * 部件父级
*/ */
@@ -1,5 +1,6 @@
package com.cf.imes.module.executor.service.heapsplit; package com.cf.imes.module.executor.service.heapsplit;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -13,6 +14,8 @@ import com.cf.imes.module.executor.dal.dataobject.orderItem.OrderItemDO;
import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper; import com.cf.imes.module.executor.dal.mysql.orderItem.OrderItemMapper;
import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper; import com.cf.imes.module.executor.dal.mysql.orderParts.OrderPartsMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.enums.OrderPackageMethodEnum;
import com.cf.imes.module.executor.enums.heapsplit.HeapSplitStatusEnum;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -22,9 +25,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PARTS_HEAPSPLIT_NUM_NOT_ENOUGH;
/** /**
* 分堆 ServiceImpl 接口实现类 * 分堆 ServiceImpl 接口实现类
* *
@@ -46,16 +50,18 @@ public class HeapSplitServiceImpl implements HeapSplitService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveHeapsplit(HeapSplitSaveReqVO reqVO) { public void saveHeapsplit(HeapSplitSaveReqVO reqVO) {
Integer packMethod = reqVO.getPackMethod();
List<Long> orderIds = reqVO.getOrderIds();
// 更新板件分堆状态 // 更新板件分堆状态
List<Long> plateIds = reqVO.getPlateIds(); List<Long> plateIds = reqVO.getPlateIds();
if (CollUtil.isNotEmpty(plateIds)) { if (CollUtil.isNotEmpty(plateIds)) {
List<List<Long>> platePartitions = CollUtil.split(plateIds, 1000); List<List<Long>> platePartitions = CollUtil.split(plateIds, 1000);
for (List<Long> batch : platePartitions) { for (List<Long> batch : platePartitions) {
orderItemMapper.update(new LambdaUpdateWrapper<OrderItemDO>() orderItemMapper.update(new LambdaUpdateWrapper<OrderItemDO>()
.in(OrderItemDO::getOrderId, reqVO.getOrderIds()) .in(OrderItemDO::getOrderId, orderIds)
.in(OrderItemDO::getPlateId, batch) .in(OrderItemDO::getPlateId, batch)
.eq(OrderItemDO::getHeapSplitStatus, 0) .eq(OrderItemDO::getHeapSplitStatus, HeapSplitStatusEnum.NO.getStatus())
.set(OrderItemDO::getHeapSplitStatus, 1)); .set(OrderItemDO::getHeapSplitStatus, HeapSplitStatusEnum.YES.getStatus()));
} }
} }
@@ -65,60 +71,122 @@ public class HeapSplitServiceImpl implements HeapSplitService {
List<List<Long>> delPlatePartitions = CollUtil.split(delPlateIds, 1000); List<List<Long>> delPlatePartitions = CollUtil.split(delPlateIds, 1000);
for (List<Long> batch : delPlatePartitions) { for (List<Long> batch : delPlatePartitions) {
orderItemMapper.update(new LambdaUpdateWrapper<OrderItemDO>() orderItemMapper.update(new LambdaUpdateWrapper<OrderItemDO>()
.in(OrderItemDO::getOrderId, reqVO.getOrderIds()) .in(OrderItemDO::getOrderId, orderIds)
.in(OrderItemDO::getPlateId, batch) .in(OrderItemDO::getPlateId, batch)
.eq(OrderItemDO::getHeapSplitStatus, 1) .eq(OrderItemDO::getHeapSplitStatus, HeapSplitStatusEnum.YES.getStatus())
.set(OrderItemDO::getHeapSplitStatus, 0)); .set(OrderItemDO::getHeapSplitStatus, HeapSplitStatusEnum.NO.getStatus()));
}
}
// 更新配件分堆状态
List<PackagePartsSaveReqVO> parts = reqVO.getParts();
Map<Long, List<PackagePartsSaveReqVO>> groupMap =
parts.stream().collect(Collectors.groupingBy(PackagePartsSaveReqVO::getBodyId));
for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : groupMap.entrySet()) {
Long bodyId = entry.getKey();
List<PackagePartsSaveReqVO> partsList = entry.getValue();
for (PackagePartsSaveReqVO partsSaveReqVO : partsList) {
Long partsId = partsSaveReqVO.getPartsId();
Integer num = partsSaveReqVO.getNum();
// partsId下的所有明细,基于num正序,优先分堆数量小的
List<OrderItemDO> orderItemDOS = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItemDO>()
.eq(OrderItemDO::getPartsId, partsId)
.in(OrderItemDO::getOrderId, reqVO.getOrderIds())
.eq(OrderItemDO::getBodyId, bodyId)
.eq(OrderItemDO::getHeapSplitStatus, false)
.orderByAsc(OrderItemDO::getNum));
allocateSingleGroup(orderItemDOS, num);
} }
} }
// 删除配件分堆状态 // 删除配件分堆状态
List<PackagePartsSaveReqVO> delParts = reqVO.getDelParts(); processParts(reqVO.getDelParts(), packMethod, orderIds, false);
Map<Long, List<PackagePartsSaveReqVO>> delGroupMap = // 更新配件分堆状态
delParts.stream().collect(Collectors.groupingBy(PackagePartsSaveReqVO::getBodyId)); processParts(reqVO.getParts(), packMethod, orderIds, true);
for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : delGroupMap.entrySet()) { }
Long bodyId = entry.getKey();
List<PackagePartsSaveReqVO> partsList = entry.getValue();
for (PackagePartsSaveReqVO partsSaveReqVO : partsList) { /**
Long partsId = partsSaveReqVO.getPartsId(); * 配件分堆状态和数量处理
Integer num = partsSaveReqVO.getNum(); *
// partsId下的所有明细,基于num正序,优先分堆数量小的 * @param list
List<OrderItemDO> orderItemDOS = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItemDO>() * @param packMethod
.eq(OrderItemDO::getPartsId, partsId) * @param orderIds
.in(OrderItemDO::getOrderId, reqVO.getOrderIds()) * @param isAdd
.eq(OrderItemDO::getBodyId, bodyId) */
.orderByAsc(OrderItemDO::getNum)); private void processParts(
List<PackagePartsSaveReqVO> list,
Integer packMethod,
List<Long> orderIds,
boolean isAdd) {
restoreGroup(orderItemDOS, num); if (CollUtil.isEmpty(list)) {
return;
}
Map<Long, List<PackagePartsSaveReqVO>> groupMap =
list.stream().collect(Collectors.groupingBy(item -> getGroupKey(item, packMethod)));
for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : groupMap.entrySet()) {
Long groupKey = entry.getKey();
for (PackagePartsSaveReqVO vo : entry.getValue()) {
LambdaQueryWrapper<OrderItemDO> wrapper = buildWrapper(
groupKey,
vo.getPartsId(),
packMethod,
orderIds,
isAdd // add才需要heapSplit过滤
);
List<OrderItemDO> orderItemDOS = orderItemMapper.selectList(wrapper);
if (isAdd) {
allocateGroup(orderItemDOS, vo.getNum());
} else {
restoreGroup(orderItemDOS);
}
} }
} }
} }
/**
* 分组规则
* @param item
* @param packMethod
* @return
*/
private Long getGroupKey(PackagePartsSaveReqVO item, Integer packMethod) {
if (ObjectUtil.equals(OrderPackageMethodEnum.ROOM_NAME.getMethod(), packMethod)) {
return item.getRoomId();
} else if (ObjectUtil.equals(OrderPackageMethodEnum.BODY_NAME.getMethod(), packMethod)) {
return item.getBodyId();
} else if (ObjectUtil.equals(OrderPackageMethodEnum.ORDER.getMethod(), packMethod)) {
return item.getOrderId();
}
return 0L;
}
/**
* 动态构建查询wrapper
*
* @param groupKey
* @param partsId
* @param packMethod
* @param orderIds
* @param filterHeapSplit
* @return
*/
private LambdaQueryWrapper<OrderItemDO> buildWrapper(
Long groupKey,
Long partsId,
Integer packMethod,
List<Long> orderIds,
boolean filterHeapSplit) {
LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderItemDO::getPartsId, partsId);
if (filterHeapSplit) {
wrapper.eq(OrderItemDO::getHeapSplitStatus, false);
}
if (ObjectUtil.equals(OrderPackageMethodEnum.ROOM_NAME.getMethod(), packMethod)) {
wrapper.eq(OrderItemDO::getRoomId, groupKey)
.in(OrderItemDO::getOrderId, orderIds);
} else if (ObjectUtil.equals(OrderPackageMethodEnum.BODY_NAME.getMethod(), packMethod)) {
wrapper.eq(OrderItemDO::getBodyId, groupKey)
.in(OrderItemDO::getOrderId, orderIds);
} else if (ObjectUtil.equals(OrderPackageMethodEnum.ORDER.getMethod(), packMethod)) {
wrapper.eq(OrderItemDO::getOrderId, groupKey);
}
wrapper.orderByAsc(OrderItemDO::getNum);
return wrapper;
}
@Override @Override
public OrdersHeapSplitDetailRespVO getOrdersHeapSplitedDetail(List<Long> orderIds) { public OrdersHeapSplitDetailRespVO getOrdersHeapSplitedDetail(List<Long> orderIds) {
OrdersHeapSplitDetailRespVO respVO = new OrdersHeapSplitDetailRespVO(); OrdersHeapSplitDetailRespVO respVO = new OrdersHeapSplitDetailRespVO();
@@ -127,7 +195,13 @@ public class HeapSplitServiceImpl implements HeapSplitService {
return respVO; return respVO;
} }
private void allocateSingleGroup(List<OrderItemDO> list, int targetNum) { /**
* 分堆打包数量
*
* @param list 同一查询范围的order_parts id相同的orderitem列表
* @param targetNum 分配目标数
*/
private void allocateGroup(List<OrderItemDO> list, int targetNum) {
int remain = targetNum; int remain = targetNum;
@@ -137,7 +211,7 @@ public class HeapSplitServiceImpl implements HeapSplitService {
break; break;
} }
double current = Optional.ofNullable(item.getNum()).orElse(0.0); double current = item.getNum() - item.getHeapNum();
if (current <= 0) { if (current <= 0) {
continue; continue;
} }
@@ -146,7 +220,7 @@ public class HeapSplitServiceImpl implements HeapSplitService {
if (current <= remain) { if (current <= remain) {
// 标记分堆 // 标记分堆
item.setHeapSplitStatus(1); item.setHeapSplitStatus(HeapSplitStatusEnum.YES.getStatus());
// 更新分堆数量 // 更新分堆数量
item.setHeapNum(current); item.setHeapNum(current);
@@ -159,11 +233,11 @@ public class HeapSplitServiceImpl implements HeapSplitService {
// 情况2> 需要拆分 // 情况2> 需要拆分
else { else {
// 1️⃣ 原记录扣减 // 1、原记录累加分堆数量
item.setHeapNum(current - remain); item.setHeapNum(item.getHeapNum() + remain);
orderItemMapper.updateById(item); orderItemMapper.updateById(item);
// 2️⃣ 新建分堆记录 // 2 新建分堆记录
OrderItemDO newItem = buildHeapItem(item, remain); OrderItemDO newItem = buildHeapItem(item, remain);
orderItemMapper.insert(newItem); orderItemMapper.insert(newItem);
@@ -173,115 +247,113 @@ public class HeapSplitServiceImpl implements HeapSplitService {
} }
if (remain > 0) { if (remain > 0) {
throw new ServiceException(new ErrorCode(10001, "数量不足,剩余未分配:" + remain)); throw new ServiceException(PARTS_HEAPSPLIT_NUM_NOT_ENOUGH);
} }
} }
/**
* 分堆未全覆盖创建item副本
*
* @param source
* @param heapNum
* @return
*/
private OrderItemDO buildHeapItem(OrderItemDO source, double heapNum) { private OrderItemDO buildHeapItem(OrderItemDO source, double heapNum) {
OrderItemDO newItem = new OrderItemDO(); OrderItemDO newItem = new OrderItemDO();
// 基础字段复制(建议用BeanUtils // 字段复制
BeanUtils.copyProperties(source, newItem); BeanUtils.copyProperties(source, newItem);
newItem.setId(null); // 新ID newItem.setId(null); // 新ID
newItem.setHeapNum(heapNum); newItem.setHeapNum(heapNum);
// 标记为“已分堆” // 标记为“已分堆”
newItem.setHeapSplitStatus(1); newItem.setHeapSplitStatus(HeapSplitStatusEnum.YES.getStatus());
newItem.setSourceId(source.getId()); newItem.setSourceId(source.getId());
return newItem; return newItem;
} }
private void restoreGroup(List<OrderItemDO> list, int targetNum) { /**
int remain = targetNum; * 还原配件分堆数量
*
Map<Long, OrderItemDO> originMap = list.stream() * @param list 同一查询范围的order_parts id相同的orderitem列表
.filter(i -> ObjectUtil.equals(0L, i.getSourceId())) */
.collect(Collectors.toMap(OrderItemDO::getId, Function.identity())); private void restoreGroup(List<OrderItemDO> list) {
List<Long> deleteIds = new ArrayList<>(); List<Long> deleteIds = new ArrayList<>();
List<OrderItemDO> updateList = new ArrayList<>(); List<OrderItemDO> updateList = new ArrayList<>();
List<OrderItemDO> insertList = new ArrayList<>();
// 1️⃣ 先处理子 itemsourceId != 0 Map<Long, List<OrderItemDO>> groupMap = list.stream()
List<OrderItemDO> subItems = list.stream() .collect(Collectors.groupingBy(i ->
.filter(i -> ObjectUtil.notEqual(0L, i.getSourceId()) ObjectUtil.equals(0L, i.getSourceId()) ? i.getId() : i.getSourceId()
&& i.getHeapSplitStatus() == 1) ));
.toList();
for (OrderItemDO item : subItems) {
if (remain <= 0) break; for (Map.Entry<Long, List<OrderItemDO>> entry : groupMap.entrySet()) {
double heap = Optional.ofNullable(item.getHeapNum()).orElse(0.0); List<OrderItemDO> items = entry.getValue();
if (heap <= 0) continue;
double toRestore = Math.min(heap, remain); // 找父
OrderItemDO parent = items.stream()
.filter(i -> ObjectUtil.equals(0L, i.getSourceId()))
.findFirst()
.orElseThrow(() -> new ServiceException(new ErrorCode(10001, "未找到父节点")));
OrderItemDO origin = originMap.get(item.getSourceId()); // 找子
if (origin == null) { List<OrderItemDO> subItems = items.stream()
throw new ServiceException(new ErrorCode(10002, "找不到来源原 item")); .filter(i -> !ObjectUtil.equals(0L, i.getSourceId()))
} .toList();
// 🔥 从 origin.heapNum 扣减 double parentHeap = Optional.ofNullable(parent.getHeapNum()).orElse(0.0);
double originHeap = Optional.ofNullable(origin.getHeapNum()).orElse(0.0); double subTotal = subItems.stream()
origin.setHeapNum(originHeap - toRestore); .mapToDouble(i -> Optional.ofNullable(i.getHeapNum()).orElse(0.0))
.sum();
if (origin.getHeapNum() <= 0) {
origin.setHeapNum(0.0);
origin.setHeapSplitStatus(0);
}
updateList.add(origin); if (CollUtil.isNotEmpty(subItems)) {
// 有子
if (ObjectUtil.equals(parent.getHeapSplitStatus(), HeapSplitStatusEnum.YES.getStatus())) {
// 父本身已分堆,则降级成子
parent.setSourceId(parent.getId());
updateList.add(parent);
// 增加一个父,数量是 num-原来的父的已分堆heapNum=现在
OrderItemDO newBase = new OrderItemDO();
BeanUtil.copyProperties(parent, newBase);
newBase.setId(null);
newBase.setSourceId(0L);
newBase.setHeapNum(parent.getNum() - subTotal);
newBase.setHeapSplitStatus(HeapSplitStatusEnum.NO.getStatus());
insertList.add(newBase);
} else {
// 本身没分堆,把父的子heapNum扣掉
parent.setHeapNum(parentHeap - subTotal);
updateList.add(parent);
}
// 删除原来的子
deleteIds.addAll(subItems.stream().map(OrderItemDO::getId).toList());
// 子 item处理
if (toRestore == heap) {
// 全扣 → 删除
deleteIds.add(item.getId());
} else { } else {
// 部分扣 → 更新剩余 // 没有子,分堆了就还原数
item.setHeapNum(heap - toRestore); if (ObjectUtil.equals(parent.getHeapSplitStatus(), HeapSplitStatusEnum.YES.getStatus())) {
updateList.add(item); parent.setHeapNum(0.0);
parent.setHeapSplitStatus(HeapSplitStatusEnum.NO.getStatus());
updateList.add(parent);
}
} }
remain -= toRestore;
} }
// 2️⃣ 再处理原 item(剩余的 heapNum // 执行数据库操作
List<OrderItemDO> originItems = originMap.values().stream()
.filter(i -> i.getHeapSplitStatus() == 1)
.toList();
for (OrderItemDO item : originItems) {
if (remain <= 0) break;
double heap = Optional.ofNullable(item.getHeapNum()).orElse(0.0);
if (heap <= 0) continue;
double toRestore = Math.min(heap, remain);
item.setHeapNum(heap - toRestore);
if (item.getHeapNum() <= 0) {
item.setHeapNum(0.0);
item.setHeapSplitStatus(0);
}
updateList.add(item);
remain -= toRestore;
}
// 3️⃣ 校验
if (remain > 0) {
throw new ServiceException(new ErrorCode(10003, "还原失败,数量不足,剩余:" + remain));
}
// 4️⃣ 批量执行
if (!updateList.isEmpty()) { if (!updateList.isEmpty()) {
orderItemMapper.updateBatch(updateList); orderItemMapper.updateBatch(updateList);
} }
if (!insertList.isEmpty()) {
orderItemMapper.insertBatch(insertList);
}
if (!deleteIds.isEmpty()) { if (!deleteIds.isEmpty()) {
orderItemMapper.deleteByIds(deleteIds); orderItemMapper.deleteByIds(deleteIds);
} }
@@ -30,24 +30,6 @@ public interface PackService {
// 查看生产订单对应的板材信息 // 查看生产订单对应的板材信息
List<PlateDetailsRespVO> getOrderPlateList(Long orderId); List<PlateDetailsRespVO> getOrderPlateList(Long orderId);
/**
* 查询订单列表中未打包的板件
*
* @param orderIds
* @return
*/
List<PlateDetailsRespVO> getOrdersPackPlateList(List<Long> orderIds);
/**
* 查询订单列表中未打包的配件
*
* @param orderIds
* @return
*/
List<OrderPartsRespVO> getOrdersPackPartsList(List<Long> orderIds);
/** /**
* 拆包 * 拆包
* *
@@ -70,8 +52,11 @@ public interface PackService {
List<OrderPackRespVO> selectPack(Long orderId); List<OrderPackRespVO> selectPack(Long orderId);
/**
// 删除包裹及其关联的包裹信息(删除全部) * 删除包裹
*
* @param reqVO
*/
void deleteOrderPack(PackReqVO reqVO); void deleteOrderPack(PackReqVO reqVO);
@@ -94,12 +79,6 @@ public interface PackService {
// 查询预打包优化信息 // 查询预打包优化信息
String getPrePackInfo(Long orderId); String getPrePackInfo(Long orderId);
/**
* 校验打包状态:已打包的不允许扫描关联
* @param orderId
*/
void validOrderPackageStatus(Long orderId);
/** /**
* 获取部件关联板件和配件id * 获取部件关联板件和配件id
* *
@@ -122,5 +101,13 @@ public interface PackService {
* @param packageNo * @param packageNo
* @return * @return
*/ */
List<PackageDetailsRespVO> getPackageDetails(String packageNo); List<PackageDetailsRespVO> getOrdersPackageDetails(String packageNo);
/**
* 获取包裹板件、配件详情
*
* @param packageNo
* @return
*/
List<PackageDetailsRespVO> getOrderPackageDetails(Long orderId, String packageNo);
} }
@@ -2,8 +2,8 @@ package com.cf.imes.module.executor.service.manage.pack;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -16,7 +16,7 @@ import com.cf.imes.framework.common.util.Assert.AssertUtils;
import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd; import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.mybatis.core.query.QueryWrapperX; import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.cf.imes.module.executor.api.plan.OrderPlanApi; import com.cf.imes.module.executor.api.plan.OrderPlanApi;
import com.cf.imes.module.executor.controller.admin.manage.pack.vo.*; import com.cf.imes.module.executor.controller.admin.manage.pack.vo.*;
import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO; import com.cf.imes.module.executor.controller.admin.manage.query.vo.pack.OrderPackageVO;
@@ -35,6 +35,7 @@ import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageMapper;
import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageNewMapper; import com.cf.imes.module.executor.dal.mysql.pack.OrderPackageNewMapper;
import com.cf.imes.module.executor.dal.mysql.pack.OrderPrepackagedMapper; import com.cf.imes.module.executor.dal.mysql.pack.OrderPrepackagedMapper;
import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper; import com.cf.imes.module.executor.dal.mysql.plate.PlateMapper;
import com.cf.imes.module.executor.enums.OrderPackageMethodEnum;
import com.cf.imes.module.executor.enums.pack.PackScanComponentCorrelationTypeEnum; import com.cf.imes.module.executor.enums.pack.PackScanComponentCorrelationTypeEnum;
import com.cf.imes.module.executor.service.order.OrderService; import com.cf.imes.module.executor.service.order.OrderService;
import com.cf.imes.module.executor.service.orderParts.OrderPartsService; import com.cf.imes.module.executor.service.orderParts.OrderPartsService;
@@ -57,7 +58,6 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator; import static com.cf.imes.framework.common.util.string.SearchUtil.insertSeparator;
@@ -65,12 +65,12 @@ import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.ge
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.NO_PRODUCTION_ORDER_INFORMATION_AVAILABLE;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_ALREADY_PACKAGED; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_ALREADY_PACKAGED;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_DATE_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_DATE_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NOT_EXISTS;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_NO_DATA_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PACK_DATA_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PACK_DATA_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PACK_DATA_NULL_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PACK_DATA_NULL_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PACK_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PACK_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PARTS_NOT_EXISTS; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.ORDER_PARTS_NOT_EXISTS;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PARTS_PACK_ITEM_SOURCE_NOT_EXISTS;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PARTS_PACK_NUM_NOT_ENOUGH;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PART_PACK_DATA_ERROR; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PART_PACK_DATA_ERROR;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLATE_NOT_EXISTS; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.PLATE_NOT_EXISTS;
import static com.cf.imes.module.executor.enums.ErrorCodeConstants.THE_CURRENT_PACKAGE_TYPE_IS_INCORRECT; import static com.cf.imes.module.executor.enums.ErrorCodeConstants.THE_CURRENT_PACKAGE_TYPE_IS_INCORRECT;
@@ -176,35 +176,6 @@ public class PackServiceImpl implements PackService {
} }
@Override
public List<PlateDetailsRespVO> getOrdersPackPlateList(List<Long> orderIds) {
List<PlateDetailsRespVO> plateDetailsRespVOS = orderPlateMapper.selectOrdersPackPlateList(orderIds);
if (plateDetailsRespVOS.isEmpty()) {
return new ArrayList<>();
}
return plateDetailsRespVOS;
}
@Override
public List<OrderPartsRespVO> getOrdersPackPartsList(List<Long> orderIds) {
List<OrderPartsRespVO> orderPartsRespVOS = orderPartsMapper.selectOrdersPartsList(orderIds);
if (orderPartsRespVOS.isEmpty()) {
return new ArrayList<>();
}
return orderPartsRespVOS;
}
@Override @Override
public List<OrderPackageVO> getOrderPack(PackageDetailsReqVO reqVO) { public List<OrderPackageVO> getOrderPack(PackageDetailsReqVO reqVO) {
@@ -229,13 +200,14 @@ public class PackServiceImpl implements PackService {
@Override @Override
public PageResult<OrderPackageVO> getPageOrderPack(PackageDetailsReqVO reqVO) { public PageResult<OrderPackageVO> getPageOrderPack(PackageDetailsReqVO reqVO) {
PageDTO<OrderPackageVO> page = new PageDTO<>(reqVO.getPageNo(), reqVO.getPageSize()); PageDTO<OrderPackagDONew> page = new PageDTO<>(reqVO.getPageNo(), reqVO.getPageSize());
List<Long> packId = null; List<Long> packId = null;
Long orderId = Long.valueOf(reqVO.getOrderId()); Long orderId = Long.valueOf(reqVO.getOrderId());
if (reqVO.getPlateNo() != null) { String packageNo = reqVO.getPackageNo();
if (CharSequenceUtil.isNotEmpty(packageNo)) {
List<Long> plateId = orderPlateMapper.selectplateByPlateNoList(reqVO.getPlateNo(), orderId, getUserOrganId()) List<Long> plateId = orderPlateMapper.selectplateByPlateNoList(reqVO.getPlateNo(), orderId, getUserOrganId())
.stream().map(PlateDO::getId).toList(); .stream().map(PlateDO::getId).toList();
@@ -244,32 +216,25 @@ public class PackServiceImpl implements PackService {
return null; return null;
} }
packId = orderItemMapper.selectPackByPlateId(plateId,orderId ,getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList(); packId = orderItemMapper.selectPackByPlateId(plateId, orderId, getUserOrganId()).stream().map(OrderItemDO::getPackageId).distinct().toList();
} }
IPage<OrderPackagDONew> orderPackagDONews = orderPackageNewMapper.selectPage(page, new LambdaQueryWrapperX<OrderPackagDONew>()
.eq(OrderPackagDONew::getOrderId, orderId)
.likeIfPresent(OrderPackagDONew::getPackageNo, packageNo)
.eqIfPresent(OrderPackagDONew::getPackageNo, packId)
.eqIfPresent(OrderPackagDONew::getStatus, reqVO.getPackStatus())
.orderByDesc(OrderPackagDONew::getCreateTime)
);
QueryWrapperX<OrderPackageDO> queryWrapperX = new QueryWrapperX<>(); List<OrderPackagDONew> records = orderPackagDONews.getRecords();
queryWrapperX if (CollUtil.isEmpty(records)) {
.eq("o.organ_id", getUserOrganId())
.eq("o.deleted", false)
.eq("o.id", reqVO.getOrderId())
.eq("op.deleted", false)
.likeIfPresent("op.package_no", reqVO.getPackageNo())
.inIfPresent("op.id", packId)
.eqIfPresent("op.status", reqVO.getPackStatus())
.orderByDesc("op.create_time");
IPage<OrderPackageVO> orderPackageDOIPage = orderPackageMapper.selectByOrderNo(page, queryWrapperX);
if (CollUtil.isEmpty(orderPackageDOIPage.getRecords())) {
return new PageResult<>(); return new PageResult<>();
} }
return new PageResult<>(orderPackageDOIPage.getRecords(), orderPackageDOIPage.getTotal()); return new PageResult<>(BeanUtil.copyToList(records, OrderPackageVO.class), orderPackagDONews.getTotal());
} }
@@ -305,30 +270,7 @@ public class PackServiceImpl implements PackService {
} }
ordersMapper.updateById(orderDO); ordersMapper.updateById(orderDO);
} }
// OrderPackageDO packageDO = orderPackageMapper.selectById(packageID);
//
// AssertUtils.notEmpty(packageDO, ORDER_PACK_DATA_NULL_ERROR);
//
// Long orderId = packageDO.getOrderId();
//
// OrderDO orderDO = ordersMapper.selectById(orderId);
//
// AssertUtils.notEmpty(orderDO, ORDER_NO_DATA_ERROR);
//
// orderDO.setPackaged(OrderPackageStatusEnum.UNPACKED.getStatus());
//
// if(orderDO.getStatus().equals(OrderStatusEnum.FINISH_PRODUCTION.getStatus())){
// orderDO.setStatus(OrderStatusEnum.IN_PRODUCTION.getStatus());
// orderDO.setFinishTime(null);
// }
//
// ordersMapper.updateById(orderDO);
//
// packageDO.setStatus(OrderPackageStatusEnum.UNPACKED.getStatus());
// orderPackageMapper.updateById(packageDO);
return typeConversion(orderPackagDONews.get(0), orderIds); return typeConversion(orderPackagDONews.get(0), orderIds);
} }
@@ -368,54 +310,7 @@ public class PackServiceImpl implements PackService {
} }
// 配件明细新增包裹 ID // 配件明细新增包裹 ID
if (CollUtil.isNotEmpty(addPartsList)) { processParts(addPartsList, packMethod, orderIds, packageNo, true);
// 1️⃣ 根据 packMethod 决定分组 key
Map<Long, List<PackagePartsSaveReqVO>> groupMap =
addPartsList.stream().collect(Collectors.groupingBy(item -> {
if (packMethod == 1) {
return item.getBodyId();
} else if (packMethod == 0) {
return item.getRoomId();
} else if (packMethod == 2) {
return item.getOrderId();
}
return 0L;
}));
// 2️⃣ 分组处理
for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : groupMap.entrySet()) {
Long groupKey = entry.getKey();
List<PackagePartsSaveReqVO> partsList = entry.getValue();
for (PackagePartsSaveReqVO partsSaveReqVO : partsList) {
Long partsId = partsSaveReqVO.getPartsId();
Integer num = partsSaveReqVO.getNum();
LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderItemDO::getPartsId, partsId)
.eq(OrderItemDO::getPackageId, 0);
// 3️⃣ 根据 packMethod 动态加条件
if (packMethod == 0) {
wrapper.eq(OrderItemDO::getRoomId, groupKey).in(OrderItemDO::getOrderId, orderIds);
} else if (packMethod == 1) {
wrapper.eq(OrderItemDO::getBodyId, groupKey).in(OrderItemDO::getOrderId, orderIds);
} else if (packMethod == 2) {
wrapper.eq(OrderItemDO::getOrderId, groupKey);
}
wrapper.orderByAsc(OrderItemDO::getNum);
List<OrderItemDO> orderItemDOS = orderItemMapper.selectList(wrapper);
allocateSingleGroup(orderItemDOS, packageNo, num);
}
}
}
// 更新订单打包状态 // 更新订单打包状态
for (Long orderId : orderIds) { for (Long orderId : orderIds) {
@@ -444,31 +339,6 @@ public class PackServiceImpl implements PackService {
} }
} }
// 配件明细新增包裹 ID
if (CollUtil.isNotEmpty(addPartsList)) {
Map<Long, List<PackagePartsSaveReqVO>> groupMap =
addPartsList.stream().collect(Collectors.groupingBy(PackagePartsSaveReqVO::getBodyId));
for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : groupMap.entrySet()) {
Long bodyId = entry.getKey();
List<PackagePartsSaveReqVO> partsList = entry.getValue();
for (PackagePartsSaveReqVO partsSaveReqVO : partsList) {
Long partsId = partsSaveReqVO.getPartsId();
Integer num = partsSaveReqVO.getNum();
// partsId下的所有明细,基于num正序,优先打包数量小的
List<OrderItemDO> orderItemDOS = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItemDO>()
.eq(OrderItemDO::getPartsId, partsId)
.in(OrderItemDO::getOrderId, orderIds)
.eq(OrderItemDO::getBodyId, bodyId)
.eq(OrderItemDO::getPackageId, 0)
.orderByAsc(OrderItemDO::getNum));
allocateSingleGroup(orderItemDOS, existPackageNo, num);
}
}
}
// 板件明细移除包裹 ID // 板件明细移除包裹 ID
List<List<Long>> split3 = CollUtil.split(deletePlateIdList, 1000); List<List<Long>> split3 = CollUtil.split(deletePlateIdList, 1000);
if (CollUtil.isNotEmpty(split3)) { if (CollUtil.isNotEmpty(split3)) {
@@ -478,55 +348,10 @@ public class PackServiceImpl implements PackService {
} }
// 配件明细移除包裹 ID // 配件明细移除包裹 ID
if (CollUtil.isNotEmpty(delPartsList)) { processParts(delPartsList, packMethod, orderIds, existPackageNo, false);
// 1️⃣ 按 packMethod 分组 // 配件明细新增包裹 ID
Map<Long, List<PackagePartsSaveReqVO>> groupMap = processParts(addPartsList, packMethod, orderIds, existPackageNo, true);
delPartsList.stream().collect(Collectors.groupingBy(item -> {
if (packMethod == 1) {
return item.getBodyId();
} else if (packMethod == 0) {
return item.getRoomId();
} else if (packMethod == 2) {
return item.getOrderId();
}
return 0L;
}));
// 2️⃣ 分组处理
for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : groupMap.entrySet()) {
Long groupKey = entry.getKey();
List<PackagePartsSaveReqVO> partsList = entry.getValue();
for (PackagePartsSaveReqVO partsSaveReqVO : partsList) {
Long partsId = partsSaveReqVO.getPartsId();
Integer num = partsSaveReqVO.getNum();
LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(OrderItemDO::getPartsId, partsId)
.eq(OrderItemDO::getPackageId, existPackageNo);
// 3️⃣ 根据 packMethod 加条件
if (packMethod == 0) {
wrapper.eq(OrderItemDO::getRoomId, groupKey).in(OrderItemDO::getOrderId, orderIds);
} else if (packMethod == 1) {
wrapper.eq(OrderItemDO::getBodyId, groupKey).in(OrderItemDO::getOrderId, orderIds);
} else if (packMethod == 2) {
wrapper.eq(OrderItemDO::getOrderId, groupKey);
}
// 4️⃣ 排序(小的先还原 ✔)
wrapper.orderByAsc(OrderItemDO::getNum);
List<OrderItemDO> orderItemDOS = orderItemMapper.selectList(wrapper);
restoreGroup(orderItemDOS, num);
}
}
}
// 更新封包状态 // 更新封包状态
orderPackageNewMapper.update(new LambdaUpdateWrapper<OrderPackagDONew>() orderPackageNewMapper.update(new LambdaUpdateWrapper<OrderPackagDONew>()
@@ -550,101 +375,203 @@ public class PackServiceImpl implements PackService {
} }
private void restoreGroup(List<OrderItemDO> list, int targetNum) { /**
int remain = targetNum; * 分组规则
* @param item
* @param packMethod
* @return
*/
private Long getGroupKey(PackagePartsSaveReqVO item, Integer packMethod) {
if (ObjectUtil.equals(OrderPackageMethodEnum.ROOM_NAME.getMethod(), packMethod)) {
return item.getRoomId();
} else if (ObjectUtil.equals(OrderPackageMethodEnum.BODY_NAME.getMethod(), packMethod)) {
return item.getBodyId();
} else if (ObjectUtil.equals(OrderPackageMethodEnum.ORDER.getMethod(), packMethod)) {
return item.getOrderId();
}
return 0L;
}
Map<Long, OrderItemDO> originMap = list.stream() /**
.filter(i -> ObjectUtil.equals(0L, i.getSourceId())) * 动态构建查询wrapper
.collect(Collectors.toMap(OrderItemDO::getId, Function.identity())); *
* @param groupKey
* @param partsId
* @param packMethod
* @param orderIds
* @param packageNo
* @param isAdd
* @return
*/
private LambdaQueryWrapper<OrderItemDO> buildWrapper(
Long groupKey,
Long partsId,
Integer packMethod,
List<Long> orderIds,
String packageNo,
boolean isAdd) {
List<Long> deleteIds = new ArrayList<>(); LambdaQueryWrapper<OrderItemDO> wrapper = new LambdaQueryWrapper<>();
List<OrderItemDO> updateList = new ArrayList<>();
// 1️⃣ 先处理子 itemsourceId != 0 wrapper.eq(OrderItemDO::getPartsId, partsId);
List<OrderItemDO> subItems = list.stream()
.filter(i -> ObjectUtil.notEqual(0L, i.getSourceId())
&& i.getPackageId() != 0L)
.collect(Collectors.toList());
for (OrderItemDO item : subItems) {
if (remain <= 0) break; if (isAdd) {
// 新增要查的是没打包的
double pack = Optional.ofNullable(item.getPackNum()).orElse(0.0); wrapper.eq(OrderItemDO::getPackageId, 0L);
if (pack <= 0) continue; } else {
// 删除看的是已打包的
double toRestore = Math.min(pack, remain); wrapper.eq(OrderItemDO::getPackageId, packageNo);
OrderItemDO origin = originMap.get(item.getSourceId());
if (origin == null) {
throw new ServiceException(new ErrorCode(10002, "找不到来源原 item"));
}
// 🔥 从 origin.packNum 扣减
double originPack = Optional.ofNullable(origin.getPackNum()).orElse(0.0);
origin.setPackNum(originPack - toRestore);
if (origin.getPackNum() <= 0) {
origin.setPackNum(0.0);
origin.setPackageId(0L);
}
updateList.add(origin);
// 子 item处理
if (toRestore == pack) {
// 全扣 → 删除
deleteIds.add(item.getId());
} else {
// 部分扣 → 更新剩余
item.setPackNum(pack - toRestore);
updateList.add(item);
}
remain -= toRestore;
} }
// 2️⃣ 再处理原 item(剩余的 packNum if (ObjectUtil.equals(OrderPackageMethodEnum.ROOM_NAME.getMethod(), packMethod)) {
List<OrderItemDO> originItems = originMap.values().stream() wrapper.eq(OrderItemDO::getRoomId, groupKey)
.filter(i -> i.getPackageId() != 0L) .in(OrderItemDO::getOrderId, orderIds);
.collect(Collectors.toList()); } else if (ObjectUtil.equals(OrderPackageMethodEnum.BODY_NAME.getMethod(), packMethod)) {
wrapper.eq(OrderItemDO::getBodyId, groupKey)
.in(OrderItemDO::getOrderId, orderIds);
} else if (ObjectUtil.equals(OrderPackageMethodEnum.ORDER.getMethod(), packMethod)) {
wrapper.eq(OrderItemDO::getOrderId, groupKey);
}
for (OrderItemDO item : originItems) { wrapper.orderByAsc(OrderItemDO::getNum);
if (remain <= 0) break; return wrapper;
}
double pack = Optional.ofNullable(item.getPackNum()).orElse(0.0); /**
if (pack <= 0) continue; * 配件打包数量处理
*
* @param partsList
* @param packMethod
* @param orderIds
* @param packageId
* @param isAdd
*/
private void processParts(List<PackagePartsSaveReqVO> partsList,
Integer packMethod,
List<Long> orderIds,
String packageId,
boolean isAdd) {
double toRestore = Math.min(pack, remain); if (CollUtil.isEmpty(partsList)) return;
item.setPackNum(pack - toRestore); // 分组
Map<Long, List<PackagePartsSaveReqVO>> groupMap =
partsList.stream().collect(Collectors.groupingBy(item -> getGroupKey(item, packMethod)));
if (item.getPackNum() <= 0) { for (Map.Entry<Long, List<PackagePartsSaveReqVO>> entry : groupMap.entrySet()) {
item.setPackNum(0.0);
item.setPackageId(0L); Long groupKey = entry.getKey();
for (PackagePartsSaveReqVO vo : entry.getValue()) {
LambdaQueryWrapper<OrderItemDO> wrapper =
buildWrapper(groupKey, vo.getPartsId(), packMethod, orderIds, packageId, isAdd);
List<OrderItemDO> list = orderItemMapper.selectList(wrapper);
if (isAdd) {
// 分配打包数量
allocateGroup(list, packageId, vo.getNum());
} else {
// 还原打包数量
restoreGroup(list);
}
} }
updateList.add(item);
remain -= toRestore;
}
// 3️⃣ 校验
if (remain > 0) {
throw new ServiceException(new ErrorCode(10003, "还原失败,数量不足,剩余:" + remain));
}
// 4️⃣ 批量执行
if (!updateList.isEmpty()) {
orderItemMapper.updateBatch(updateList);
}
if (!deleteIds.isEmpty()) {
orderItemMapper.deleteBatchIds(deleteIds);
} }
} }
private void allocateSingleGroup(List<OrderItemDO> list, String packNo, int targetNum) { /**
* 还原配件打包数量
*
* @param list 同一查询范围的order_parts id相同的orderitem列表
*/
private void restoreGroup(List<OrderItemDO> list) {
List<Long> deleteIds = new ArrayList<>();
List<OrderItemDO> updateList = new ArrayList<>();
List<OrderItemDO> insertList = new ArrayList<>();
Map<Long, List<OrderItemDO>> groupMap = list.stream()
.collect(Collectors.groupingBy(i ->
ObjectUtil.equals(0L, i.getSourceId()) ? i.getId() : i.getSourceId()
));
for (Map.Entry<Long, List<OrderItemDO>> entry : groupMap.entrySet()) {
List<OrderItemDO> items = entry.getValue();
// 找父
OrderItemDO parent = items.stream()
.filter(i -> ObjectUtil.equals(0L, i.getSourceId()))
.findFirst()
.orElseThrow(() -> new ServiceException(PARTS_PACK_ITEM_SOURCE_NOT_EXISTS));
// 找子
List<OrderItemDO> subItems = items.stream()
.filter(i -> !ObjectUtil.equals(0L, i.getSourceId()))
.toList();
double parentPack = Optional.ofNullable(parent.getPackNum()).orElse(0.0);
double subTotal = subItems.stream()
.mapToDouble(i -> Optional.ofNullable(i.getPackNum()).orElse(0.0))
.sum();
if (CollUtil.isNotEmpty(subItems)) {
// 有子
if (ObjectUtil.notEqual(parent.getPackageId(), 0L)) {
// 父本身已打包,则降级成子
parent.setSourceId(parent.getId());
updateList.add(parent);
// 增加一个父,数量是 num-原来的父的已打包packNum=现在
OrderItemDO newBase = new OrderItemDO();
BeanUtil.copyProperties(parent, newBase);
newBase.setId(null);
newBase.setSourceId(0L);
newBase.setPackNum(parent.getNum() - subTotal);
newBase.setPackageId(0L);
insertList.add(newBase);
} else {
// 本身没打包,把父-子packNum扣掉
parent.setPackNum(parentPack - subTotal);
updateList.add(parent);
}
// 删除原来的子
deleteIds.addAll(subItems.stream().map(OrderItemDO::getId).toList());
} else {
// 没有子,打包了就还原数
if (ObjectUtil.notEqual(parent.getPackageId(), 0L)) {
parent.setPackNum(0.0);
parent.setPackageId(0L);
updateList.add(parent);
}
}
}
// 执行数据库操作
if (!updateList.isEmpty()) {
orderItemMapper.updateBatch(updateList);
}
if (!insertList.isEmpty()) {
orderItemMapper.insertBatch(insertList);
}
if (!deleteIds.isEmpty()) {
orderItemMapper.deleteByIds(deleteIds);
}
}
/**
* 分配打包数量
*
* @param list 同一查询范围的order_parts id相同的orderitem列表
* @param packNo 包裹编号
* @param targetNum 分配目标数
*/
private void allocateGroup(List<OrderItemDO> list, String packNo, int targetNum) {
int remain = targetNum; int remain = targetNum;
@@ -654,9 +581,7 @@ public class PackServiceImpl implements PackService {
break; break;
} }
double current = Optional.ofNullable(item.getPackNum()) double current = item.getNum() - item.getPackNum();
.filter(v -> v > 0)
.orElse(Optional.ofNullable(item.getNum()).orElse(0.0));
if (current <= 0) { if (current <= 0) {
continue; continue;
} }
@@ -678,8 +603,8 @@ public class PackServiceImpl implements PackService {
// 情况2> 需要拆分 // 情况2> 需要拆分
else { else {
// 原记录扣减 // 原记录累加打包数量
item.setPackNum(current - remain); item.setPackNum(item.getPackNum() + remain);
orderItemMapper.updateById(item); orderItemMapper.updateById(item);
// 新建分堆记录 // 新建分堆记录
@@ -692,10 +617,18 @@ public class PackServiceImpl implements PackService {
} }
if (remain > 0) { if (remain > 0) {
throw new ServiceException(new ErrorCode(10001, "数量不足,剩余未分配:" + remain)); throw new ServiceException(PARTS_PACK_NUM_NOT_ENOUGH);
} }
} }
/**
* 打包未全覆盖创建item副本
*
* @param source
* @param packNo
* @param packNum
* @return
*/
private OrderItemDO buildPackItem(OrderItemDO source, String packNo, double packNum) { private OrderItemDO buildPackItem(OrderItemDO source, String packNo, double packNum) {
OrderItemDO newItem = new OrderItemDO(); OrderItemDO newItem = new OrderItemDO();
@@ -767,8 +700,6 @@ public class PackServiceImpl implements PackService {
// 删除包裹及其关联的包裹信息(删除全部)
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteOrderPack(PackReqVO reqVO) { public void deleteOrderPack(PackReqVO reqVO) {
@@ -784,9 +715,8 @@ public class PackServiceImpl implements PackService {
} }
// 如果有未拆包的提示先拆包 // 如果有未拆包的提示先拆包
if (orderPackagDOS.stream().anyMatch(o -> o.getStatus() == OrderPackageStatusEnum.PACKAGED.getStatus())) { if (orderPackagDOS.stream().anyMatch(o -> ObjectUtil.equals(OrderPackageStatusEnum.PACKAGED.getStatus(), o.getStatus()))) {
// todo 异常提示 throw new ServiceException(ORDER_ALREADY_PACKAGED);
throw new ServiceException(new ErrorCode(10001, "请先拆包"));
} }
// 整理出该包裹对应的订单id列表 // 整理出该包裹对应的订单id列表
List<Long> packOrderIds = orderPackagDOS.stream() List<Long> packOrderIds = orderPackagDOS.stream()
@@ -834,7 +764,7 @@ public class PackServiceImpl implements PackService {
continue; continue;
} }
// 1️⃣ 找基准 itemsource = true // 1找基准 itemsource = true
OrderItemDO baseItem = partItemDOS.stream() OrderItemDO baseItem = partItemDOS.stream()
.filter(i -> ObjectUtil.equals(entry.getKey(), i.getId())) .filter(i -> ObjectUtil.equals(entry.getKey(), i.getId()))
.findFirst() .findFirst()
@@ -846,7 +776,7 @@ public class PackServiceImpl implements PackService {
double basePack = Optional.ofNullable(baseItem.getPackNum()).orElse(0.0); double basePack = Optional.ofNullable(baseItem.getPackNum()).orElse(0.0);
double sumOthers = 0.0; double sumOthers = 0.0;
// 2️⃣ 累加其他 item // 2累加其他 item
for (OrderItemDO item : list) { for (OrderItemDO item : list) {
if (item.getId().equals(baseItem.getId())) continue; if (item.getId().equals(baseItem.getId())) continue;
@@ -855,12 +785,12 @@ public class PackServiceImpl implements PackService {
deleteIds.add(item.getId()); deleteIds.add(item.getId());
} }
// 情况1:未打包 → 正常合并 // 情况1:未打包 → 正常合并
if (!basePacked) { if (!basePacked) {
baseItem.setPackNum(basePack + sumOthers); baseItem.setPackNum(basePack - sumOthers);
updateList.add(baseItem); updateList.add(baseItem);
} }
// 情况2:已打包 → 拆分新基准 // 情况2:已打包 → 拆分新基准
else { else {
// ① 原基准降级 // ① 原基准降级
baseItem.setSourceId(baseItem.getId()); baseItem.setSourceId(baseItem.getId());
@@ -872,8 +802,8 @@ public class PackServiceImpl implements PackService {
newBase.setId(null); newBase.setId(null);
newBase.setSourceId(0L); newBase.setSourceId(0L);
newBase.setPackageId(0L); // 新基准一定是未打包 newBase.setPackageId(0L); // 新基准一定是未打包
newBase.setPackNum(sumOthers); newBase.setPackNum(baseItem.getNum() - sumOthers);
insertList.add(newBase); insertList.add(newBase);
} }
@@ -889,7 +819,7 @@ public class PackServiceImpl implements PackService {
} }
if (!deleteIds.isEmpty()) { if (!deleteIds.isEmpty()) {
orderItemMapper.deleteBatchIds(deleteIds); orderItemMapper.deleteByIds(deleteIds);
} }
} }
// 移除配件的打包状态 // 移除配件的打包状态
@@ -1064,7 +994,7 @@ public class PackServiceImpl implements PackService {
List<OrderDO> orderDO = ordersMapper.selectByIds(orderIds); List<OrderDO> orderDO = ordersMapper.selectByIds(orderIds);
AssertUtils.notEmpty(orderDO, ORDER_PACK_ERROR); AssertUtils.notEmpty(orderDO, ORDER_PACK_ERROR);
if (StrUtil.isNotEmpty(packNo)) { if (CharSequenceUtil.isNotEmpty(packNo)) {
List<OrderPackagDONew> orderPackageDOS = orderPackageNewMapper.selectList(new LambdaQueryWrapper<OrderPackagDONew>() List<OrderPackagDONew> orderPackageDOS = orderPackageNewMapper.selectList(new LambdaQueryWrapper<OrderPackagDONew>()
.eq(OrderPackagDONew::getPackageNo, packNo)); .eq(OrderPackagDONew::getPackageNo, packNo));
AssertUtils.notEmpty(orderPackageDOS, ORDER_PACK_DATA_ERROR); AssertUtils.notEmpty(orderPackageDOS, ORDER_PACK_DATA_ERROR);
@@ -1077,11 +1007,9 @@ public class PackServiceImpl implements PackService {
// 类型转换 // 类型转换
private OrderPackRespVO typeConversion(OrderPackageDO orderPackageDO) { private OrderPackRespVO typeConversion(OrderPackageDO orderPackageDO) {
return OrderPackRespVO.builder() return OrderPackRespVO.builder()
// .id(orderPackageDO.getId())
.orderId(orderPackageDO.getOrderId()) .orderId(orderPackageDO.getOrderId())
.organId(orderPackageDO.getOrganId()) .organId(orderPackageDO.getOrganId())
.packageNo(orderPackageDO.getPackageNo()) .packageNo(orderPackageDO.getPackageNo())
.packageType(orderPackageDO.getType())
.name(orderPackageDO.getName()) .name(orderPackageDO.getName())
.status(orderPackageDO.getStatus()) .status(orderPackageDO.getStatus())
.remark(orderPackageDO.getRemark()) .remark(orderPackageDO.getRemark())
@@ -1209,16 +1137,6 @@ public class PackServiceImpl implements PackService {
} }
@Override
public void validOrderPackageStatus(Long orderId) {
OrderDO order = orderService.getOrder(orderId);
AssertUtils.notEmpty(order, ORDER_NOT_EXISTS);
// 已经打包的提示
Integer packaged = order.getPackaged();
AssertUtils.equals(OrderPackageStatusEnum.PACKAGED.getStatus(), packaged, ORDER_ALREADY_PACKAGED);
}
@Override @Override
public List<Long> getComponentCorrelation(PackScanComponentCorrelationReqVO reqVO) { public List<Long> getComponentCorrelation(PackScanComponentCorrelationReqVO reqVO) {
Long id = reqVO.getId(); Long id = reqVO.getId();
@@ -1285,7 +1203,7 @@ public class PackServiceImpl implements PackService {
} }
@Override @Override
public List<PackageDetailsRespVO> getPackageDetails(String packageNo) { public List<PackageDetailsRespVO> getOrdersPackageDetails(String packageNo) {
List<OrderPackagDONew> orderPackagDONews = orderPackageNewMapper.selectList(new LambdaQueryWrapper<OrderPackagDONew>() List<OrderPackagDONew> orderPackagDONews = orderPackageNewMapper.selectList(new LambdaQueryWrapper<OrderPackagDONew>()
.eq(OrderPackagDONew::getPackageNo, packageNo)); .eq(OrderPackagDONew::getPackageNo, packageNo));
@@ -1298,4 +1216,21 @@ public class PackServiceImpl implements PackService {
packPlateList.addAll(packPartsList); packPlateList.addAll(packPartsList);
return packPlateList; return packPlateList;
} }
@Override
public List<PackageDetailsRespVO> getOrderPackageDetails(Long orderId, String packageNo) {
List<OrderPackagDONew> orderPackagDONews = orderPackageNewMapper.selectList(new LambdaQueryWrapper<OrderPackagDONew>()
.eq(OrderPackagDONew::getPackageNo, packageNo)
.eq(OrderPackagDONew::getOrderId, orderId)
);
if (CollUtil.isEmpty(orderPackagDONews)) {
return new ArrayList<>();
}
Set<Long> orderIds = Set.of(orderId);
List<PackageDetailsRespVO> packPartsList = orderPartsMapper.selectPackedParts(orderIds, packageNo);
List<PackageDetailsRespVO> packPlateList = orderPlateMapper.selectPackedPlateList(orderIds, packageNo);
packPlateList.addAll(packPartsList);
return packPlateList;
}
} }
@@ -182,13 +182,6 @@ public interface OrderService {
OrderAllData getOrderAllData(Long orderId, Long planId); OrderAllData getOrderAllData(Long orderId, Long planId);
/**
* 检查item是否有未打包的并更新订单打包状态
*
* @param orderIds
*/
void updateOrdersPackageStatus(List<Long> orderIds);
/** /**
* 获取订单id对应的所有父子订单id * 获取订单id对应的所有父子订单id
* *
@@ -1683,11 +1683,6 @@ public class OrderServiceImpl implements OrderService {
} }
@Override
public void updateOrdersPackageStatus(List<Long> orderIds) {
orderMapper.updateOrdersPackageStatus(orderIds);
}
@Override @Override
public List<Long> getFatherAndSonOrderIds(List<Long> orderIds) { public List<Long> getFatherAndSonOrderIds(List<Long> orderIds) {
@@ -644,35 +644,4 @@
and o.deleted = false and o.deleted = false
</select> </select>
<update id="updateOrdersPackageStatus">
UPDATE orders o
SET o.packaged =
CASE
WHEN
EXISTS (SELECT 1 FROM order_item oi
WHERE oi.order_id = o.id
AND oi.package_id = 0 and oi.plate_id != 0
AND oi.order_id IN
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
)
OR EXISTS (SELECT 1 FROM order_item oi
JOIN order_parts op on oi.organ_id = op.organ_id and oi.order_id = op.order_id and oi.parts_id = op.id
WHERE oi.order_id = o.id
AND oi.package_id = 0 and oi.parts_id != 0 and op.type != '封边条'
AND oi.order_id IN
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
)
THEN '${@com.cf.imes.framework.common.enums.OrderPackageStatusEnum@UNPACKED.status}'
ELSE '${@com.cf.imes.framework.common.enums.OrderPackageStatusEnum@PACKAGED.status}'
END
WHERE o.id in
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
</update>
</mapper> </mapper>
@@ -288,7 +288,7 @@
<result property="category" column="category"/> <result property="category" column="category"/>
<result property="subparts" column="subparts"/> <result property="subparts" column="subparts"/>
<result property="componentName" column="componentName"/> <result property="componentName" column="componentName"/>
<result property="num" column="num"/> <result property="packNum" column="packNum"/>
</resultMap> </resultMap>
<select id="selectPackedParts" <select id="selectPackedParts"
@@ -301,7 +301,7 @@
t.body_id AS bodyId, t.body_id AS bodyId,
t.group_names AS groupName, t.group_names AS groupName,
t.component_names AS componentName, t.component_names AS componentName,
t.num AS num, t.pack_num AS packNum,
t.package_id AS packageId, t.package_id AS packageId,
op.id AS partsId, op.id AS partsId,
op.order_id AS orderId, op.order_id AS orderId,
@@ -330,7 +330,7 @@
MIN(oc.name) AS component_names, MIN(oc.name) AS component_names,
MIN(ob.room_name) AS room_name, MIN(ob.room_name) AS room_name,
MIN(ob.name) AS body_name, MIN(ob.name) AS body_name,
SUM(oi.pack_num) AS num SUM(oi.pack_num) AS pack_num
FROM order_item oi FROM order_item oi
LEFT JOIN order_group og LEFT JOIN order_group og
ON oi.organ_id = og.organ_id ON oi.organ_id = og.organ_id
@@ -398,7 +398,6 @@
t.group_names AS groupName, t.group_names AS groupName,
t.component_names AS componentName, t.component_names AS componentName,
t.num AS num, t.num AS num,
t.pack_num AS packNum,
op.id AS partsId, op.id AS partsId,
op.order_id AS orderId, op.order_id AS orderId,
op.name, op.name,
@@ -425,8 +424,7 @@
MIN(oc.name) AS component_names, MIN(oc.name) AS component_names,
MIN(ob.room_name) AS room_name, MIN(ob.room_name) AS room_name,
MIN(ob.name) AS body_name, MIN(ob.name) AS body_name,
SUM(oi.num) AS num, SUM(oi.num - oi.pack_num) AS num
SUM(oi.pack_num) AS pack_num
FROM order_item oi FROM order_item oi
LEFT JOIN order_group og LEFT JOIN order_group og
ON oi.organ_id = og.organ_id ON oi.organ_id = og.organ_id
@@ -443,6 +441,7 @@
WHERE WHERE
oi.parts_id != 0 oi.parts_id != 0
AND oi.package_id = 0 AND oi.package_id = 0
AND oi.source_id = 0
GROUP BY oi.room_id, oi.body_id, oi.parts_id GROUP BY oi.room_id, oi.body_id, oi.parts_id
) t ON t.parts_id = op.id ) t ON t.parts_id = op.id
WHERE op.deleted = false WHERE op.deleted = false
@@ -468,6 +467,7 @@
t.num AS num, t.num AS num,
t.heap_num AS heapNum, t.heap_num AS heapNum,
op.id AS partsId, op.id AS partsId,
op.order_id AS orderId,
op.name, op.name,
op.model, op.model,
op.spec, op.spec,
@@ -493,7 +493,7 @@
MIN(oc.name) AS component_names, MIN(oc.name) AS component_names,
MIN(ob.room_name) AS room_name, MIN(ob.room_name) AS room_name,
MIN(ob.name) AS body_name, MIN(ob.name) AS body_name,
SUM(oi.num) AS num, SUM(oi.num - oi.heap_num) AS num,
SUM(oi.heap_num) AS heap_num SUM(oi.heap_num) AS heap_num
FROM order_item oi FROM order_item oi
LEFT JOIN order_group og LEFT JOIN order_group og
@@ -510,6 +510,12 @@
AND oc.id = oi.comp_id AND oc.id = oi.comp_id
WHERE WHERE
oi.parts_id != 0 oi.parts_id != 0
AND
(
source_id = 0
OR
(source_id != 0 AND oi.heap_split_status = 1)
)
GROUP BY oi.room_id, oi.body_id, oi.parts_id, oi.heap_split_status GROUP BY oi.room_id, oi.body_id, oi.parts_id, oi.heap_split_status
) t ON t.parts_id = op.id ) t ON t.parts_id = op.id
WHERE op.deleted = false WHERE op.deleted = false
@@ -40,4 +40,9 @@ heap.split.task.name.exist=分堆任务名已存在,请重新命名
heap.split.no.need.restart=该分堆任务无需重启,请刷新列表后检查状态 heap.split.no.need.restart=该分堆任务无需重启,请刷新列表后检查状态
heap.split.need.restart=该分堆任务已完成,请重启该任务后再次查看 heap.split.need.restart=该分堆任务已完成,请重启该任务后再次查看
order.already.packaged=该订单已打包完成,无法操作 order.already.packaged=该订单已打包完成,无法操作
parts.pack.num.not.enough=配件可打包数量不足,请刷新后再次打包
parts.pack.item.source.not.exist=配件打包数据异常,请刷新后再次打包
parts.heapsplit.num.not.enough=配件可分堆数量不足,请刷新后再次分堆
parts.heapsplit.item.source.not.exist=配件分堆数据异常,请刷新后再次分堆
@@ -40,4 +40,9 @@ heap.split.task.name.exist=分堆任務名已存在,請重新命名
heap.split.no.need.restart=該分堆任務無需重啓,請重繪清單後檢查狀態 heap.split.no.need.restart=該分堆任務無需重啓,請重繪清單後檢查狀態
heap.split.need.restart=該分堆任務已完成,請重啓該任務後再次查看 heap.split.need.restart=該分堆任務已完成,請重啓該任務後再次查看
order.already.packaged=該訂單已打包完成,無法操作 order.already.packaged=該訂單已打包完成,無法操作
parts.pack.num.not.enough=配件可打包數量不足,請重繪後再次打包
parts.pack.item.source.not.exist=配件打包數據异常,請重繪後再次打包
parts.heapsplit.num.not.enough=配件可分堆數量不足,請重繪後再次分堆
parts.heapsplit.item.source.not.exist=配件分堆數據异常,請重繪後再次分堆
@@ -40,4 +40,9 @@ heap.split.task.name.exist=The task name for heap splitting already exists, plea
heap.split.no.need.restart=This heap splitting task does not require a restart. Please refresh the list and check the status heap.split.no.need.restart=This heap splitting task does not require a restart. Please refresh the list and check the status
heap.split.need.restart=The heap splitting task has been completed. Please restart the task and check again heap.split.need.restart=The heap splitting task has been completed. Please restart the task and check again
order.already.packaged=The order has been packaged and cannot be processed order.already.packaged=The order has been packaged and cannot be processed
parts.pack.num.not.enough=The number of accessories that can be packaged is insufficient. Please refresh and pack again
parts.pack.item.source.not.exist=Abnormal accessory packaging data, please refresh and package again
parts.heapsplit.num.not.enough=The number of accessories that can be stacked is insufficient. Please refresh and stack again
parts.heapsplit.item.source.not.exist=Abnormal accessory stacking data, please refresh and stack again