diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java index f13d12a..3761f12 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java +++ b/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() + .eqIfPresent(MesWmMaterialStockDO::getItemId, itemId) + .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, warehouseId) + .eqIfPresent(MesWmMaterialStockDO::getLocationId, locationId) + .eqIfPresent(MesWmMaterialStockDO::getAreaId, areaId) + .eqIfPresent(MesWmMaterialStockDO::getBatchId, batchId)); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index 6501c63..c105d8e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java @@ -44,5 +44,7 @@ public interface DictTypeConstants { String MES_PRO_FEEDBACK_STATUS = "mes_pro_feedback_status"; // MES 生产报工状态 String MES_PRO_FEEDBACK_TYPE = "mes_pro_feedback_type"; // MES 生产报工类型 String MES_PRO_FEEDBACK_CHANNEL = "mes_pro_feedback_channel"; // MES 生产报工途径 + String MES_WM_ARRIVAL_NOTICE_STATUS = "mes_wm_arrival_notice_status"; // MES 到货通知单状态 + String MES_WM_ITEM_RECEIPT_STATUS = "mes_wm_item_receipt_status"; // MES 采购入库单状态 } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 19e2f83..a30012b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -318,4 +318,26 @@ public interface ErrorCodeConstants { // ========== MES 仓库管理-库存(1-040-703-000) ========== ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); + // ========== MES 仓库管理-到货通知单(1-040-704-000) ========== + ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "到货通知单不存在"); + ErrorCode WM_ARRIVAL_NOTICE_CODE_DUPLICATE = new ErrorCode(1_040_704_001, "到货通知单编码已存在"); + ErrorCode WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE = new ErrorCode(1_040_704_002, "只有草稿状态才允许此操作"); + ErrorCode WM_ARRIVAL_NOTICE_IQC_PENDING = new ErrorCode(1_040_704_003, "存在待检验行,无法审批通过"); + ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_704_100, "到货通知单行不存在"); + + // ========== MES 仓库管理-采购入库单(1-040-705-000) ========== + ErrorCode WM_ITEM_RECEIPT_NOT_EXISTS = new ErrorCode(1_040_705_000, "采购入库单不存在"); + ErrorCode WM_ITEM_RECEIPT_CODE_DUPLICATE = new ErrorCode(1_040_705_001, "采购入库单编码已存在"); + ErrorCode WM_ITEM_RECEIPT_STATUS_NOT_PREPARE = new ErrorCode(1_040_705_002, "只有草稿状态才允许此操作"); + ErrorCode WM_ITEM_RECEIPT_NO_LINE = new ErrorCode(1_040_705_003, "至少需要一条行项目"); + ErrorCode WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_705_004, "明细上架总数与行入库数量不匹配"); + ErrorCode WM_ITEM_RECEIPT_STATUS_ERROR = new ErrorCode(1_040_705_005, "入库单状态不正确"); + ErrorCode WM_ITEM_RECEIPT_LINE_NOT_EXISTS = new ErrorCode(1_040_705_100, "采购入库单行不存在"); + ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "采购入库明细不存在"); + + // ========== MES 仓库管理-领料申请单(1-040-706-000) ========== + ErrorCode WM_MATERIAL_REQUEST_NOT_EXISTS = new ErrorCode(1_040_706_000, "领料申请单不存在"); + ErrorCode WM_MATERIAL_REQUEST_STATUS_INVALID = new ErrorCode(1_040_706_001, "领料申请单状态不正确,无法执行该操作"); + ErrorCode WM_MATERIAL_REQUEST_LINE_NOT_EXISTS = new ErrorCode(1_040_706_100, "领料申请单行不存在"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java index 0e4686d..bc80b6a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockService.java +++ b/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 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import jakarta.validation.Valid; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.Collection; import java.util.List; import java.util.Map; @@ -84,4 +86,24 @@ public interface MesWmMaterialStockService { return convertMap(getMaterialStockList(ids), MesWmMaterialStockDO::getId); } + /** + * 增加库存 + * + * 按 itemId + warehouseId + locationId + areaId + batchId 查找已有库存, + * 存在则增加 quantityOnhand;不存在则新建记录。 + * + * @param itemId 物料编号 + * @param warehouseId 仓库编号 + * @param locationId 库区编号 + * @param areaId 库位编号 + * @param batchId 批次编号 + * @param quantity 增加数量 + * @param vendorId 供应商编号 + * @param productionDate 生产日期 + * @param expireDate 过期日期 + */ + void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, + Long batchId, BigDecimal quantity, Long vendorId, + LocalDateTime productionDate, LocalDateTime expireDate); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java index 38742cb..2f835a1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialstock/MesWmMaterialStockServiceImpl.java +++ b/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; import cn.iocoder.yudao.framework.common.util.collection.SetUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.materialstock.vo.MesWmMaterialStockSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -30,6 +34,9 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService private MesWmMaterialStockMapper materialStockMapper; @Resource + private MesMdItemService itemService; + + @Resource private MesMdItemTypeService itemTypeService; @Override @@ -100,4 +107,34 @@ public class MesWmMaterialStockServiceImpl implements MesWmMaterialStockService return materialStockMapper.selectListByIds(ids); } + // TODO @AI:MaterialStock + @Override + public void increaseStock(Long itemId, Long warehouseId, Long locationId, Long areaId, + Long batchId, BigDecimal quantity, Long vendorId, + LocalDateTime productionDate, LocalDateTime expireDate) { + // 1. 查找已有库存记录 + MesWmMaterialStockDO stock = materialStockMapper.selectByCompositeKey( + itemId, warehouseId, locationId, areaId, batchId); + + // 2a. 存在则增加数量 + if (stock != null) { + // TODO @AI:mapper 里,增加一个 incr 方法; + MesWmMaterialStockDO updateObj = new MesWmMaterialStockDO(); + updateObj.setId(stock.getId()); + updateObj.setQuantityOnhand(stock.getQuantityOnhand().add(quantity)); + materialStockMapper.updateById(updateObj); + return; + } + + // 2. 不存在则新建 + MesMdItemDO item = itemService.validateItemExists(itemId); + MesWmMaterialStockDO newStock = MesWmMaterialStockDO.builder() + .itemId(itemId).itemTypeId(item.getItemTypeId()).unitMeasureId(item.getUnitMeasureId()) + .warehouseId(warehouseId).locationId(locationId).areaId(areaId) + .batchId(batchId).vendorId(vendorId).quantityOnhand(quantity) + .recptDate(LocalDateTime.now()).productionDate(productionDate).expireDate(expireDate).frozen(false) + .build(); + materialStockMapper.insert(newStock); + } + }