Commit 27b24b48759b63f3a30e87aa19e6eb619783df73
1 parent
55f86d4e
feat(mes): implement stock management by adding increaseStock method and composi…
…te key selection for material stock
Showing
5 changed files
with
93 additions
and
0 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
| @@ -46,4 +46,14 @@ public interface MesWmMaterialStockMapper extends BaseMapperX<MesWmMaterialStock | @@ -46,4 +46,14 @@ public interface MesWmMaterialStockMapper extends BaseMapperX<MesWmMaterialStock | ||
| 46 | return selectByIds(ids); | 46 | return selectByIds(ids); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | + default MesWmMaterialStockDO selectByCompositeKey(Long itemId, Long warehouseId, Long locationId, | ||
| 50 | + Long areaId, Long batchId) { | ||
| 51 | + return selectOne(new LambdaQueryWrapperX<MesWmMaterialStockDO>() | ||
| 52 | + .eqIfPresent(MesWmMaterialStockDO::getItemId, itemId) | ||
| 53 | + .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseId) | ||
| 54 | + .eqIfPresent(MesWmMaterialStockDO::getLocationId, locationId) | ||
| 55 | + .eqIfPresent(MesWmMaterialStockDO::getAreaId, areaId) | ||
| 56 | + .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId)); | ||
| 57 | + } | ||
| 58 | + | ||
| 49 | } | 59 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
| @@ -44,5 +44,7 @@ public interface DictTypeConstants { | @@ -44,5 +44,7 @@ public interface DictTypeConstants { | ||
| 44 | String MES_PRO_FEEDBACK_STATUS = "mes_pro_feedback_status"; // MES 生产报工状态 | 44 | String MES_PRO_FEEDBACK_STATUS = "mes_pro_feedback_status"; // MES 生产报工状态 |
| 45 | String MES_PRO_FEEDBACK_TYPE = "mes_pro_feedback_type"; // MES 生产报工类型 | 45 | String MES_PRO_FEEDBACK_TYPE = "mes_pro_feedback_type"; // MES 生产报工类型 |
| 46 | String MES_PRO_FEEDBACK_CHANNEL = "mes_pro_feedback_channel"; // MES 生产报工途径 | 46 | String MES_PRO_FEEDBACK_CHANNEL = "mes_pro_feedback_channel"; // MES 生产报工途径 |
| 47 | + String MES_WM_ARRIVAL_NOTICE_STATUS = "mes_wm_arrival_notice_status"; // MES 到货通知单状态 | ||
| 48 | + String MES_WM_ITEM_RECEIPT_STATUS = "mes_wm_item_receipt_status"; // MES 采购入库单状态 | ||
| 47 | 49 | ||
| 48 | } | 50 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
| @@ -318,4 +318,26 @@ public interface ErrorCodeConstants { | @@ -318,4 +318,26 @@ public interface ErrorCodeConstants { | ||
| 318 | // ========== MES 仓库管理-库存(1-040-703-000) ========== | 318 | // ========== MES 仓库管理-库存(1-040-703-000) ========== |
| 319 | ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); | 319 | ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); |
| 320 | 320 | ||
| 321 | + // ========== MES 仓库管理-到货通知单(1-040-704-000) ========== | ||
| 322 | + ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "到货通知单不存在"); | ||
| 323 | + ErrorCode WM_ARRIVAL_NOTICE_CODE_DUPLICATE = new ErrorCode(1_040_704_001, "到货通知单编码已存在"); | ||
| 324 | + ErrorCode WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE = new ErrorCode(1_040_704_002, "只有草稿状态才允许此操作"); | ||
| 325 | + ErrorCode WM_ARRIVAL_NOTICE_IQC_PENDING = new ErrorCode(1_040_704_003, "存在待检验行,无法审批通过"); | ||
| 326 | + ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_704_100, "到货通知单行不存在"); | ||
| 327 | + | ||
| 328 | + // ========== MES 仓库管理-采购入库单(1-040-705-000) ========== | ||
| 329 | + ErrorCode WM_ITEM_RECEIPT_NOT_EXISTS = new ErrorCode(1_040_705_000, "采购入库单不存在"); | ||
| 330 | + ErrorCode WM_ITEM_RECEIPT_CODE_DUPLICATE = new ErrorCode(1_040_705_001, "采购入库单编码已存在"); | ||
| 331 | + ErrorCode WM_ITEM_RECEIPT_STATUS_NOT_PREPARE = new ErrorCode(1_040_705_002, "只有草稿状态才允许此操作"); | ||
| 332 | + ErrorCode WM_ITEM_RECEIPT_NO_LINE = new ErrorCode(1_040_705_003, "至少需要一条行项目"); | ||
| 333 | + ErrorCode WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_705_004, "明细上架总数与行入库数量不匹配"); | ||
| 334 | + ErrorCode WM_ITEM_RECEIPT_STATUS_ERROR = new ErrorCode(1_040_705_005, "入库单状态不正确"); | ||
| 335 | + ErrorCode WM_ITEM_RECEIPT_LINE_NOT_EXISTS = new ErrorCode(1_040_705_100, "采购入库单行不存在"); | ||
| 336 | + ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "采购入库明细不存在"); | ||
| 337 | + | ||
| 338 | + // ========== MES 仓库管理-领料申请单(1-040-706-000) ========== | ||
| 339 | + ErrorCode WM_MATERIAL_REQUEST_NOT_EXISTS = new ErrorCode(1_040_706_000, "领料申请单不存在"); | ||
| 340 | + ErrorCode WM_MATERIAL_REQUEST_STATUS_INVALID = new ErrorCode(1_040_706_001, "领料申请单状态不正确,无法执行该操作"); | ||
| 341 | + ErrorCode WM_MATERIAL_REQUEST_LINE_NOT_EXISTS = new ErrorCode(1_040_706_100, "领料申请单行不存在"); | ||
| 342 | + | ||
| 321 | } | 343 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java
| @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMat | @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMat | ||
| 6 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; | 6 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| 7 | import jakarta.validation.Valid; | 7 | import jakarta.validation.Valid; |
| 8 | 8 | ||
| 9 | +import java.math.BigDecimal; | ||
| 10 | +import java.time.LocalDateTime; | ||
| 9 | import java.util.Collection; | 11 | import java.util.Collection; |
| 10 | import java.util.List; | 12 | import java.util.List; |
| 11 | import java.util.Map; | 13 | import java.util.Map; |
| @@ -84,4 +86,24 @@ public interface MesWmMaterialStockService { | @@ -84,4 +86,24 @@ public interface MesWmMaterialStockService { | ||
| 84 | return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId); | 86 | return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId); |
| 85 | } | 87 | } |
| 86 | 88 | ||
| 89 | + /** | ||
| 90 | + * 增加库存 | ||
| 91 | + * | ||
| 92 | + * 按 itemId + warehouseId + locationId + areaId + batchId 查找已有库存, | ||
| 93 | + * 存在则增加 quantityOnhand;不存在则新建记录。 | ||
| 94 | + * | ||
| 95 | + * @param itemId 物料编号 | ||
| 96 | + * @param warehouseId 仓库编号 | ||
| 97 | + * @param locationId 库区编号 | ||
| 98 | + * @param areaId 库位编号 | ||
| 99 | + * @param batchId 批次编号 | ||
| 100 | + * @param quantity 增加数量 | ||
| 101 | + * @param vendorId 供应商编号 | ||
| 102 | + * @param productionDate 生产日期 | ||
| 103 | + * @param expireDate 过期日期 | ||
| 104 | + */ | ||
| 105 | + void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, | ||
| 106 | + Long batchId, BigDecimal quantity, Long vendorId, | ||
| 107 | + LocalDateTime productionDate, LocalDateTime expireDate); | ||
| 108 | + | ||
| 87 | } | 109 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java
| @@ -5,14 +5,18 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -5,14 +5,18 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; | 5 | import cn.iocoder.yudao.framework.common.util.collection.SetUtils; |
| 6 | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; | 6 | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; |
| 7 | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockSaveReqVO; | 7 | import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockSaveReqVO; |
| 8 | +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | ||
| 8 | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; | 9 | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; |
| 9 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; | 10 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; |
| 10 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; | 11 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; |
| 12 | +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | ||
| 11 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; | 13 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; |
| 12 | import jakarta.annotation.Resource; | 14 | import jakarta.annotation.Resource; |
| 13 | import org.springframework.stereotype.Service; | 15 | import org.springframework.stereotype.Service; |
| 14 | import org.springframework.validation.annotation.Validated; | 16 | import org.springframework.validation.annotation.Validated; |
| 15 | 17 | ||
| 18 | +import java.math.BigDecimal; | ||
| 19 | +import java.time.LocalDateTime; | ||
| 16 | import java.util.*; | 20 | import java.util.*; |
| 17 | 21 | ||
| 18 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 22 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| @@ -30,6 +34,9 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService | @@ -30,6 +34,9 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService | ||
| 30 | private MesWmMaterialStockMapper materialStockMapper; | 34 | private MesWmMaterialStockMapper materialStockMapper; |
| 31 | 35 | ||
| 32 | @Resource | 36 | @Resource |
| 37 | + private MesMdItemService itemService; | ||
| 38 | + | ||
| 39 | + @Resource | ||
| 33 | private MesMdItemTypeService itemTypeService; | 40 | private MesMdItemTypeService itemTypeService; |
| 34 | 41 | ||
| 35 | @Override | 42 | @Override |
| @@ -100,4 +107,34 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService | @@ -100,4 +107,34 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService | ||
| 100 | return materialStockMapper.selectListByIds(ids); | 107 | return materialStockMapper.selectListByIds(ids); |
| 101 | } | 108 | } |
| 102 | 109 | ||
| 110 | + // TODO @AI:MaterialStock | ||
| 111 | + @Override | ||
| 112 | + public void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, | ||
| 113 | + Long batchId, BigDecimal quantity, Long vendorId, | ||
| 114 | + LocalDateTime productionDate, LocalDateTime expireDate) { | ||
| 115 | + // 1. 查找已有库存记录 | ||
| 116 | + MesWmMaterialStockDO stock = materialStockMapper.selectByCompositeKey( | ||
| 117 | + itemId, warehouseId, locationId, areaId, batchId); | ||
| 118 | + | ||
| 119 | + // 2a. 存在则增加数量 | ||
| 120 | + if (stock != null) { | ||
| 121 | + // TODO @AI:mapper 里,增加一个 incr 方法; | ||
| 122 | + MesWmMaterialStockDO updateObj = new MesWmMaterialStockDO(); | ||
| 123 | + updateObj.setId(stock.getId()); | ||
| 124 | + updateObj.setQuantityOnhand(stock.getQuantityOnhand().add(quantity)); | ||
| 125 | + materialStockMapper.updateById(updateObj); | ||
| 126 | + return; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + // 2. 不存在则新建 | ||
| 130 | + MesMdItemDO item = itemService.validateItemExists(itemId); | ||
| 131 | + MesWmMaterialStockDO newStock = MesWmMaterialStockDO.builder() | ||
| 132 | + .itemId(itemId).itemTypeId(item.getItemTypeId()).unitMeasureId(item.getUnitMeasureId()) | ||
| 133 | + .warehouseId(warehouseId).locationId(locationId).areaId(areaId) | ||
| 134 | + .batchId(batchId).vendorId(vendorId).quantityOnhand(quantity) | ||
| 135 | + .recptDate(LocalDateTime.now()).productionDate(productionDate).expireDate(expireDate).frozen(false) | ||
| 136 | + .build(); | ||
| 137 | + materialStockMapper.insert(newStock); | ||
| 138 | + } | ||
| 139 | + | ||
| 103 | } | 140 | } |