Commit b660fe452d3ca98454a0fcb7bcbe755bd659a88f

Authored by YunaiV
1 parent 75c1a638

✨ feat(mes): 修改库存冻结标识字段名称为 'frozen'

将库存相关的冻结标识字段从 'frozenFlag' 修改为 'frozen',以提高代码一致性和可读性。涉及多个数据对象和请求/响应对象的更新。
Showing 25 changed files with 144 additions and 21 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockFreezeReqVO.java
@@ -14,7 +14,7 @@ public class MesWmMaterialStockFreezeReqVO { @@ -14,7 +14,7 @@ public class MesWmMaterialStockFreezeReqVO {
14 14
15 @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") 15 @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
16 @NotNull(message = "冻结状态不能为空") 16 @NotNull(message = "冻结状态不能为空")
17 - private Boolean frozenFlag; 17 + private Boolean frozen;
18 18
19 } 19 }
20 20
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockRespVO.java
@@ -84,7 +84,7 @@ public class MesWmMaterialStockRespVO { @@ -84,7 +84,7 @@ public class MesWmMaterialStockRespVO {
84 84
85 @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") 85 @Schema(description = "是否冻结", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
86 @ExcelProperty("是否冻结") 86 @ExcelProperty("是否冻结")
87 - private Boolean frozenFlag; 87 + private Boolean frozen;
88 88
89 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 89 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
90 @ExcelProperty("创建时间") 90 @ExcelProperty("创建时间")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanRespVO.java
@@ -42,7 +42,7 @@ public class MesWmStockTakingPlanRespVO { @@ -42,7 +42,7 @@ public class MesWmStockTakingPlanRespVO {
42 42
43 @Schema(description = "是否冻结库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") 43 @Schema(description = "是否冻结库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
44 @ExcelProperty("是否冻结库存") 44 @ExcelProperty("是否冻结库存")
45 - private Boolean frozenFlag; 45 + private Boolean frozen;
46 46
47 @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") 47 @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
48 @ExcelProperty("状态") 48 @ExcelProperty("状态")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/plan/vo/MesWmStockTakingPlanSaveReqVO.java
@@ -38,7 +38,7 @@ public class MesWmStockTakingPlanSaveReqVO { @@ -38,7 +38,7 @@ public class MesWmStockTakingPlanSaveReqVO {
38 38
39 @Schema(description = "是否冻结库存", example = "false") 39 @Schema(description = "是否冻结库存", example = "false")
40 @NotNull(message = "是否冻结库存不能为空") 40 @NotNull(message = "是否冻结库存不能为空")
41 - private Boolean frozenFlag; 41 + private Boolean frozen;
42 42
43 @Schema(description = "备注", example = "备注") 43 @Schema(description = "备注", example = "备注")
44 private String remark; 44 private String remark;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskRespVO.java
@@ -56,7 +56,7 @@ public class MesWmStockTakingTaskRespVO { @@ -56,7 +56,7 @@ public class MesWmStockTakingTaskRespVO {
56 56
57 @Schema(description = "是否冻结库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") 57 @Schema(description = "是否冻结库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
58 @ExcelProperty("是否冻结库存") 58 @ExcelProperty("是否冻结库存")
59 - private Boolean frozenFlag; 59 + private Boolean frozen;
60 60
61 @Schema(description = "开始时间") 61 @Schema(description = "开始时间")
62 @ExcelProperty("开始时间") 62 @ExcelProperty("开始时间")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/stocktaking/task/vo/MesWmStockTakingTaskSaveReqVO.java
@@ -49,7 +49,7 @@ public class MesWmStockTakingTaskSaveReqVO { @@ -49,7 +49,7 @@ public class MesWmStockTakingTaskSaveReqVO {
49 49
50 @Schema(description = "是否冻结库存", example = "false") 50 @Schema(description = "是否冻结库存", example = "false")
51 @NotNull(message = "是否冻结库存不能为空") 51 @NotNull(message = "是否冻结库存不能为空")
52 - private Boolean frozenFlag; 52 + private Boolean frozen;
53 53
54 @Schema(description = "备注", example = "备注") 54 @Schema(description = "备注", example = "备注")
55 private String remark; 55 private String remark;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java
@@ -104,6 +104,6 @@ public class MesWmMaterialStockDO extends BaseDO { @@ -104,6 +104,6 @@ public class MesWmMaterialStockDO extends BaseDO {
104 /** 104 /**
105 * 是否冻结 105 * 是否冻结
106 */ 106 */
107 - private Boolean frozenFlag; 107 + private Boolean frozen;
108 108
109 } 109 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/plan/MesWmStockTakingPlanDO.java
@@ -63,7 +63,7 @@ public class MesWmStockTakingPlanDO extends BaseDO { @@ -63,7 +63,7 @@ public class MesWmStockTakingPlanDO extends BaseDO {
63 /** 63 /**
64 * 是否冻结库存 64 * 是否冻结库存
65 */ 65 */
66 - private Boolean frozenFlag; 66 + private Boolean frozen;
67 67
68 /** 68 /**
69 * 状态 69 * 状态
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/stocktaking/task/MesWmStockTakingTaskDO.java
@@ -71,7 +71,7 @@ public class MesWmStockTakingTaskDO extends BaseDO { @@ -71,7 +71,7 @@ public class MesWmStockTakingTaskDO extends BaseDO {
71 /** 71 /**
72 * 是否冻结库存 72 * 是否冻结库存
73 */ 73 */
74 - private Boolean frozenFlag; 74 + private Boolean frozen;
75 75
76 /** 76 /**
77 * 开始时间 77 * 开始时间
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseAreaDO.java
@@ -22,6 +22,11 @@ import java.math.BigDecimal; @@ -22,6 +22,11 @@ import java.math.BigDecimal;
22 public class MesWmWarehouseAreaDO extends BaseDO { 22 public class MesWmWarehouseAreaDO extends BaseDO {
23 23
24 /** 24 /**
  25 + * 虚拟线边库位编码(配合 {@link MesWmWarehouseDO#WIP_VIRTUAL_WAREHOUSE} 使用)
  26 + */
  27 + public static final String WIP_VIRTUAL_AREA = "WIP_VIRTUAL_AREA";
  28 +
  29 + /**
25 * 编号 30 * 编号
26 */ 31 */
27 @TableId 32 @TableId
@@ -66,6 +71,7 @@ public class MesWmWarehouseAreaDO extends BaseDO { @@ -66,6 +71,7 @@ public class MesWmWarehouseAreaDO extends BaseDO {
66 * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} 71 * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
67 */ 72 */
68 private Integer status; 73 private Integer status;
  74 +
69 /** 75 /**
70 * 是否冻结 76 * 是否冻结
71 */ 77 */
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseDO.java
@@ -22,6 +22,15 @@ import java.math.BigDecimal; @@ -22,6 +22,15 @@ import java.math.BigDecimal;
22 public class MesWmWarehouseDO extends BaseDO { 22 public class MesWmWarehouseDO extends BaseDO {
23 23
24 /** 24 /**
  25 + * 虚拟线边库编码
  26 + *
  27 + * 业务背景:在线边库模式下,物料从总仓库发放到车间,但未被工序消耗前,这部分物料属于在制品(WIP)。
  28 + * 为了在系统中实现“发料与实际消耗”的解耦,并在不增加物理库位管理复杂度的前提下防止生产报工被负库存阻塞,
  29 + * 系统默认提供一个虚拟的线边库统管这些在制品。
  30 + */
  31 + public static final String WIP_VIRTUAL_WAREHOUSE = "WIP_VIRTUAL_WAREHOUSE";
  32 +
  33 + /**
25 * 编号 34 * 编号
26 */ 35 */
27 @TableId 36 @TableId
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/warehouse/MesWmWarehouseLocationDO.java
@@ -22,6 +22,11 @@ import java.math.BigDecimal; @@ -22,6 +22,11 @@ import java.math.BigDecimal;
22 public class MesWmWarehouseLocationDO extends BaseDO { 22 public class MesWmWarehouseLocationDO extends BaseDO {
23 23
24 /** 24 /**
  25 + * 虚拟线边库区编码(配合 {@link MesWmWarehouseDO#WIP_VIRTUAL_WAREHOUSE} 使用)
  26 + */
  27 + public static final String WIP_VIRTUAL_LOCATION = "WIP_VIRTUAL_LOCATION";
  28 +
  29 + /**
25 * 编号 30 * 编号
26 */ 31 */
27 @TableId 32 @TableId
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
@@ -27,7 +27,7 @@ public interface MesWmMaterialStockMapper extends BaseMapperX<MesWmMaterialStock @@ -27,7 +27,7 @@ public interface MesWmMaterialStockMapper extends BaseMapperX<MesWmMaterialStock
27 .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds) 27 .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds)
28 .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId()) 28 .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId())
29 .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId()) 29 .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId())
30 - .eqIfPresent(MesWmMaterialStockDO::getFrozenFlag, reqVO.getFrozen()) 30 + .eqIfPresent(MesWmMaterialStockDO::getFrozen, reqVO.getFrozen())
31 .ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO) 31 .ne(MesWmMaterialStockDO::getQuantity, BigDecimal.ZERO)
32 .orderByAsc(MesWmMaterialStockDO::getReceiptTime)); 32 .orderByAsc(MesWmMaterialStockDO::getReceiptTime));
33 } 33 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseAreaMapper.java
@@ -27,9 +27,8 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea @@ -27,9 +27,8 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea
27 .orderByDesc(MesWmWarehouseAreaDO::getId)); 27 .orderByDesc(MesWmWarehouseAreaDO::getId));
28 } 28 }
29 29
30 - default MesWmWarehouseAreaDO selectByCode(Long locationId, String code) { 30 + default MesWmWarehouseAreaDO selectByCode(String code) {
31 return selectOne(new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() 31 return selectOne(new LambdaQueryWrapperX<MesWmWarehouseAreaDO>()
32 - .eq(MesWmWarehouseAreaDO::getLocationId, locationId)  
33 .eq(MesWmWarehouseAreaDO::getCode, code)); 32 .eq(MesWmWarehouseAreaDO::getCode, code));
34 } 33 }
35 34
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseLocationMapper.java
@@ -30,6 +30,11 @@ public interface MesWmWarehouseLocationMapper extends BaseMapperX&lt;MesWmWarehouse @@ -30,6 +30,11 @@ public interface MesWmWarehouseLocationMapper extends BaseMapperX&lt;MesWmWarehouse
30 .eq(MesWmWarehouseLocationDO::getCode, code)); 30 .eq(MesWmWarehouseLocationDO::getCode, code));
31 } 31 }
32 32
  33 + default MesWmWarehouseLocationDO selectByCode(String code) {
  34 + return selectOne(new LambdaQueryWrapperX<MesWmWarehouseLocationDO>()
  35 + .eq(MesWmWarehouseLocationDO::getCode, code));
  36 + }
  37 +
33 default MesWmWarehouseLocationDO selectByName(Long warehouseId, String name) { 38 default MesWmWarehouseLocationDO selectByName(Long warehouseId, String name) {
34 return selectOne(new LambdaQueryWrapperX<MesWmWarehouseLocationDO>() 39 return selectOne(new LambdaQueryWrapperX<MesWmWarehouseLocationDO>()
35 .eq(MesWmWarehouseLocationDO::getWarehouseId, warehouseId) 40 .eq(MesWmWarehouseLocationDO::getWarehouseId, warehouseId)
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
@@ -95,7 +95,7 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService @@ -95,7 +95,7 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService
95 95
96 // 更新冻结状态 96 // 更新冻结状态
97 materialStockMapper.updateById(new MesWmMaterialStockDO() 97 materialStockMapper.updateById(new MesWmMaterialStockDO()
98 - .setId(updateReqVO.getId()).setFrozenFlag(updateReqVO.getFrozenFlag())); 98 + .setId(updateReqVO.getId()).setFrozen(updateReqVO.getFrozen()));
99 } 99 }
100 100
101 @Override 101 @Override
@@ -144,7 +144,7 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService @@ -144,7 +144,7 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService
144 .batchId(batchId).vendorId(vendorId) 144 .batchId(batchId).vendorId(vendorId)
145 .quantity(BigDecimal.ZERO) // 初始数量为 0,由 updateMaterialStockQuantity 更新 145 .quantity(BigDecimal.ZERO) // 初始数量为 0,由 updateMaterialStockQuantity 更新
146 .receiptTime(receiptTime != null ? receiptTime : LocalDateTime.now()) 146 .receiptTime(receiptTime != null ? receiptTime : LocalDateTime.now())
147 - .frozenFlag(false) 147 + .frozen(false)
148 .build(); 148 .build();
149 materialStockMapper.insert(newStock); 149 materialStockMapper.insert(newStock);
150 return newStock; 150 return newStock;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
@@ -129,7 +129,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -129,7 +129,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
129 129
130 // 3. 根据冻结标识,对物资进行冻结 130 // 3. 根据冻结标识,对物资进行冻结
131 // TODO @芋艿:后续跟进下! 131 // TODO @芋艿:后续跟进下!
132 - if (Boolean.TRUE.equals(task.getFrozenFlag())) { 132 + if (Boolean.TRUE.equals(task.getFrozen())) {
133 for (MesWmStockTakingTaskLineDO line : lines) { 133 for (MesWmStockTakingTaskLineDO line : lines) {
134 if (line.getMaterialStockId() != null) { 134 if (line.getMaterialStockId() != null) {
135 updateMaterialStockFrozen(line.getMaterialStockId(), true); 135 updateMaterialStockFrozen(line.getMaterialStockId(), true);
@@ -150,7 +150,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -150,7 +150,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
150 150
151 // 3. 解冻库存 151 // 3. 解冻库存
152 // TODO @芋艿:后续跟进下! 152 // TODO @芋艿:后续跟进下!
153 - if (Boolean.TRUE.equals(task.getFrozenFlag())) { 153 + if (Boolean.TRUE.equals(task.getFrozen())) {
154 List<MesWmStockTakingTaskLineDO> lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id); 154 List<MesWmStockTakingTaskLineDO> lines = stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id);
155 unfreezeStockTakingTaskStocks(lines); 155 unfreezeStockTakingTaskStocks(lines);
156 } 156 }
@@ -166,7 +166,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -166,7 +166,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
166 } 166 }
167 task.setStatus(MesWmStockTakingTaskStatusEnum.CANCELED.getStatus()); 167 task.setStatus(MesWmStockTakingTaskStatusEnum.CANCELED.getStatus());
168 stockTakingTaskMapper.updateById(task); 168 stockTakingTaskMapper.updateById(task);
169 - if (Boolean.TRUE.equals(task.getFrozenFlag())) { 169 + if (Boolean.TRUE.equals(task.getFrozen())) {
170 unfreezeStockTakingTaskStocks(stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id)); 170 unfreezeStockTakingTaskStocks(stockTakingTaskLineService.getStockTakingTaskLineListByTaskId(id));
171 } 171 }
172 } 172 }
@@ -211,7 +211,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ @@ -211,7 +211,7 @@ public class MesWmStockTakingTaskServiceImpl implements MesWmStockTakingTaskServ
211 private void updateMaterialStockFrozen(Long materialStockId, boolean frozen) { 211 private void updateMaterialStockFrozen(Long materialStockId, boolean frozen) {
212 MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO(); 212 MesWmMaterialStockFreezeReqVO reqVO = new MesWmMaterialStockFreezeReqVO();
213 reqVO.setId(materialStockId); 213 reqVO.setId(materialStockId);
214 - reqVO.setFrozenFlag(frozen); 214 + reqVO.setFrozen(frozen);
215 materialStockService.updateMaterialStockFrozen(reqVO); 215 materialStockService.updateMaterialStockFrozen(reqVO);
216 } 216 }
217 217
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
@@ -166,7 +166,7 @@ public class MesWmTransactionServiceImpl implements MesWmTransactionService { @@ -166,7 +166,7 @@ public class MesWmTransactionServiceImpl implements MesWmTransactionService {
166 } 166 }
167 167
168 // 2. 检查库存记录冻结 168 // 2. 检查库存记录冻结
169 - if (Boolean.TRUE.equals(materialStock.getFrozenFlag())) { 169 + if (Boolean.TRUE.equals(materialStock.getFrozen())) {
170 throw exception(WM_TRANSACTION_STOCK_FROZEN, 170 throw exception(WM_TRANSACTION_STOCK_FROZEN,
171 warehouse.getName(), location.getName(), area.getName()); 171 warehouse.getName(), location.getName(), area.getName());
172 } 172 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferServiceImpl.java
@@ -316,7 +316,7 @@ public class MesWmTransferServiceImpl implements MesWmTransferService { @@ -316,7 +316,7 @@ public class MesWmTransferServiceImpl implements MesWmTransferService {
316 } 316 }
317 MesWmMaterialStockFreezeReqVO freezeReqVO = new MesWmMaterialStockFreezeReqVO(); 317 MesWmMaterialStockFreezeReqVO freezeReqVO = new MesWmMaterialStockFreezeReqVO();
318 freezeReqVO.setId(line.getMaterialStockId()); 318 freezeReqVO.setId(line.getMaterialStockId());
319 - freezeReqVO.setFrozenFlag(frozen); 319 + freezeReqVO.setFrozen(frozen);
320 materialStockService.updateMaterialStockFrozen(freezeReqVO); 320 materialStockService.updateMaterialStockFrozen(freezeReqVO);
321 } 321 }
322 } 322 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java
@@ -100,4 +100,12 @@ public interface MesWmWarehouseAreaService { @@ -100,4 +100,12 @@ public interface MesWmWarehouseAreaService {
100 */ 100 */
101 void validateWarehouseAreaExists(Long warehouseId, Long locationId, Long areaId); 101 void validateWarehouseAreaExists(Long warehouseId, Long locationId, Long areaId);
102 102
  103 + /**
  104 + * 按编码获得库位(如果是虚拟线边库位编码且不存在,会自动插入)
  105 + *
  106 + * @param code 编码
  107 + * @return 库位
  108 + */
  109 + MesWmWarehouseAreaDO getWarehouseAreaByCode(String code);
  110 +
103 } 111 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java
1 package cn.iocoder.yudao.module.mes.service.wm.warehouse; 1 package cn.iocoder.yudao.module.mes.service.wm.warehouse;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
4 import cn.hutool.core.util.ObjUtil; 5 import cn.hutool.core.util.ObjUtil;
  6 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO; 9 import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO;
@@ -109,7 +111,7 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService @@ -109,7 +111,7 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService
109 } 111 }
110 112
111 private void validateWarehouseAreaCodeUnique(Long id, Long locationId, String code) { 113 private void validateWarehouseAreaCodeUnique(Long id, Long locationId, String code) {
112 - MesWmWarehouseAreaDO area = areaMapper.selectByCode(locationId, code); 114 + MesWmWarehouseAreaDO area = areaMapper.selectByCode(code);
113 if (area == null) { 115 if (area == null) {
114 return; 116 return;
115 } 117 }
@@ -180,4 +182,31 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService @@ -180,4 +182,31 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService
180 } 182 }
181 } 183 }
182 184
  185 + @Override
  186 + public MesWmWarehouseAreaDO getWarehouseAreaByCode(String code) {
  187 + // 1. 查询库位,存在则直接返回
  188 + MesWmWarehouseAreaDO area = areaMapper.selectByCode(code);
  189 + if (area != null) {
  190 + return area;
  191 + }
  192 +
  193 + // 2. 如果是虚拟线边库位编码,则自动初始化
  194 + if (MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA.equals(code)) {
  195 + // 2.1 先确保虚拟库区存在(getWarehouseLocationByCode 会级联创建仓库 + 库区)
  196 + MesWmWarehouseLocationDO location = locationService.getWarehouseLocationByCode(
  197 + MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION);
  198 + Assert.notNull(location, "虚拟库区必须存在");
  199 + // 2.2 自动初始化
  200 + MesWmWarehouseAreaDO newArea = MesWmWarehouseAreaDO.builder()
  201 + .locationId(location.getId()).code(code).name("虚拟线边库位")
  202 + .status(CommonStatusEnum.ENABLE.getStatus()).frozen(false)
  203 + .allowItemMixing(true).allowBatchMixing(true)
  204 + .remark("系统自动初始化的虚拟线边库位")
  205 + .build();
  206 + areaMapper.insert(newArea);
  207 + return newArea;
  208 + }
  209 + return null;
  210 + }
  211 +
183 } 212 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationService.java
@@ -91,4 +91,12 @@ public interface MesWmWarehouseLocationService { @@ -91,4 +91,12 @@ public interface MesWmWarehouseLocationService {
91 */ 91 */
92 Long getWarehouseLocationCountByWarehouseId(Long warehouseId); 92 Long getWarehouseLocationCountByWarehouseId(Long warehouseId);
93 93
  94 + /**
  95 + * 按编码获得库区(如果是虚拟线边库区编码且不存在,会自动插入)
  96 + *
  97 + * @param code 编码
  98 + * @return 库区
  99 + */
  100 + MesWmWarehouseLocationDO getWarehouseLocationByCode(String code);
  101 +
94 } 102 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationPageReqVO; 7 import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationPageReqVO;
8 import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; 8 import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO;
9 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
10 import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseLocationMapper; 11 import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseLocationMapper;
11 import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum; 12 import cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum;
12 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; 13 import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
@@ -160,4 +161,29 @@ public class MesWmWarehouseLocationServiceImpl implements MesWmWarehouseLocation @@ -160,4 +161,29 @@ public class MesWmWarehouseLocationServiceImpl implements MesWmWarehouseLocation
160 return locationMapper.selectCountByWarehouseId(warehouseId); 161 return locationMapper.selectCountByWarehouseId(warehouseId);
161 } 162 }
162 163
  164 + @Override
  165 + public MesWmWarehouseLocationDO getWarehouseLocationByCode(String code) {
  166 + // 1. 查询库区,存在则直接返回
  167 + MesWmWarehouseLocationDO location = locationMapper.selectByCode(code);
  168 + if (location != null) {
  169 + return location;
  170 + }
  171 +
  172 + // 2. 如果是虚拟线边库区编码,则自动初始化
  173 + if (MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION.equals(code)) {
  174 + // 2.1 先确保虚拟仓库存在(getWarehouseByCode 会级联创建仓库)
  175 + MesWmWarehouseDO warehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE);
  176 + cn.hutool.core.lang.Assert.notNull(warehouse, "虚拟仓库必须存在");
  177 + // 2.2 自动初始化
  178 + MesWmWarehouseLocationDO newLocation = MesWmWarehouseLocationDO.builder()
  179 + .warehouseId(warehouse.getId()).code(code).name("虚拟线边库区")
  180 + .areaStatus(cn.iocoder.yudao.framework.common.enums.CommonStatusEnum.ENABLE.getStatus())
  181 + .frozen(false).remark("系统自动初始化的虚拟线边库区")
  182 + .build();
  183 + locationMapper.insert(newLocation);
  184 + return newLocation;
  185 + }
  186 + return null;
  187 + }
  188 +
163 } 189 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseService.java
@@ -82,4 +82,12 @@ public interface MesWmWarehouseService { @@ -82,4 +82,12 @@ public interface MesWmWarehouseService {
82 return convertMap(getWarehouseList(ids), MesWmWarehouseDO::getId); 82 return convertMap(getWarehouseList(ids), MesWmWarehouseDO::getId);
83 } 83 }
84 84
  85 + /**
  86 + * 按编码获得仓库(如果是虚拟线边库编码且不存在,会自动插入)
  87 + *
  88 + * @param code 编码
  89 + * @return 仓库
  90 + */
  91 + MesWmWarehouseDO getWarehouseByCode(String code);
  92 +
85 } 93 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseServiceImpl.java
@@ -148,4 +148,24 @@ public class MesWmWarehouseServiceImpl implements MesWmWarehouseService { @@ -148,4 +148,24 @@ public class MesWmWarehouseServiceImpl implements MesWmWarehouseService {
148 return warehouseMapper.selectListByIds(ids); 148 return warehouseMapper.selectListByIds(ids);
149 } 149 }
150 150
  151 + @Override
  152 + public MesWmWarehouseDO getWarehouseByCode(String code) {
  153 + // 1. 查询仓库,存在则直接返回
  154 + MesWmWarehouseDO warehouse = warehouseMapper.selectByCode(code);
  155 + if (warehouse != null) {
  156 + return warehouse;
  157 + }
  158 +
  159 + // 2. 如果是虚拟线边库编码,则自动初始化
  160 + if (MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE.equals(code)) {
  161 + MesWmWarehouseDO newWarehouse = MesWmWarehouseDO.builder()
  162 + .code(code).name("虚拟线边仓库").frozen(false)
  163 + .remark("系统自动初始化的虚拟线边仓库(用于生产报工与在制品管理解耦)")
  164 + .build();
  165 + warehouseMapper.insert(newWarehouse);
  166 + return newWarehouse;
  167 + }
  168 + return null;
  169 + }
  170 +
151 } 171 }