2 天以前 1ba0dbfde5634c8bf2ec20891d6b226b996f6b59
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transaction/MesWmTransactionServiceImpl.java
@@ -14,7 +14,9 @@
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
@@ -22,6 +24,7 @@
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
import cn.iocoder.yudao.module.mes.service.wm.materialstockbag.MesWmMaterialStockBagService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -56,6 +59,9 @@
    private MesWmWarehouseLocationService locationService;
    @Resource
    private MesWmWarehouseAreaService areaService;
    @Resource
    private MesWmMaterialStockBagService materialStockBagService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -124,19 +130,69 @@
        // 2.3 更新库存数量
        boolean checkFlag = ObjUtil.defaultIfNull(reqDTO.getCheckFlag(), true);
        materialStockService.updateMaterialStockQuantity(materialStock.getId(), reqDTO.getQuantity(), checkFlag);
        MesWmMaterialStockDO updatedStock = materialStockService.getMaterialStock(materialStock.getId());
        BigDecimal newQuantity = updatedStock.getQuantity();
        // 库存状态:显式指定优先(如扫码入暂存库),否则自动判定——≤0 已出库;
        // >0 时仅目标仓库为合格库(20)才置合格态,否则保持暂存态(10),
        // 避免盘点/调整/调拨等操作把暂存仓库库存翻成合格态
        Integer stockState = reqDTO.getStockState();
        if (stockState == null) {
            if (newQuantity.signum() <= 0) {
                stockState = MesWmStockStateEnum.OUT.getState();
            } else {
                MesWmWarehouseDO warehouse = warehouseService.getWarehouse(reqDTO.getWarehouseId());
                boolean qualifiedWarehouse = warehouse != null
                        && MesWmWarehouseTypeEnum.QUALIFIED.getType().equals(warehouse.getType());
                stockState = qualifiedWarehouse
                        ? MesWmStockStateEnum.QUALIFIED.getState() : MesWmStockStateEnum.TEMP.getState();
            }
        }
        materialStockService.updateMaterialStockState(updatedStock.getId(), stockState);
        // 3. 插入事务流水
        MesWmTransactionDO transaction = MesWmTransactionDO.builder()
                .type(reqDTO.getType()).quantity(reqDTO.getQuantity()).transactionTime(LocalDateTime.now())
                .itemId(reqDTO.getItemId()).batchId(reqDTO.getBatchId()).batchCode(reqDTO.getBatchCode())
                .bagCodeId(reqDTO.getBagCodeId()).bagCode(reqDTO.getBagCode())
                .warehouseId(reqDTO.getWarehouseId()).locationId(reqDTO.getLocationId()).areaId(reqDTO.getAreaId())
                .bizType(reqDTO.getBizType()).bizId(reqDTO.getBizId()).bizCode(reqDTO.getBizCode()).bizLineId(reqDTO.getBizLineId())
                .materialStockId(materialStock.getId()).relatedTransactionId(reqDTO.getRelatedTransactionId())
                .build();
        transactionMapper.insert(transaction);
        // 4. 带袋码时,同步维护库存袋码明细(入库建立/激活、出库置已出库、移入迁移、报废)
        boolean skipBagManage = ObjUtil.defaultIfNull(reqDTO.getSkipBagManage(), false);
        if (!skipBagManage && (StrUtil.isNotBlank(reqDTO.getBagCode()) || reqDTO.getBagCodeId() != null)) {
            handleStockBag(reqDTO, materialStock, transaction.getId(), transactionType);
        }
        return transaction.getId();
    }
    /**
     * 按事务类型维护袋码明细,保证汇总库存、袋码明细、事务流水三者一致。
     */
    private void handleStockBag(MesWmTransactionSaveReqDTO reqDTO, MesWmMaterialStockDO materialStock,
                                Long transactionId, MesWmTransactionTypeEnum transactionType) {
        switch (transactionType) {
            case MOVE_IN:
                // 移入/调拨/质检迁移:更新明细位置与状态
                materialStockBagService.moveIn(reqDTO, materialStock, transactionId);
                break;
            case IN:
            case ADJUST_IN:
                // 入库/盘盈:建立或激活明细
                materialStockBagService.inbound(reqDTO, materialStock, transactionId);
                break;
            case MOVE_OUT:
            case OUT:
            case ADJUST_OUT:
                // 移出/出库/盘亏:置为已出库
                materialStockBagService.outbound(reqDTO, transactionId);
                break;
            default:
                break;
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createTransactionList(List<MesWmTransactionSaveReqDTO> reqDTOs) {