10 天以前 d5cd948848595b0cffe098ba542a9c879b0f9165
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/stocktaking/task/MesWmStockTakingTaskServiceImpl.java
@@ -8,10 +8,15 @@
import cn.iocoder.yudao.module.mes.controller.admin.wm.stocktaking.task.vo.MesWmStockTakingTaskSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockTakingTaskStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
import cn.iocoder.yudao.module.mes.service.wm.stocktaking.plan.MesWmStockTakingPlanService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
@@ -19,6 +24,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -47,6 +53,9 @@
    @Lazy
    @Resource
    private MesWmStockTakingTaskResultService stockTakingTaskResultService;
    @Resource
    private MesWmTransactionService wmTransactionService;
    @Resource
    private AdminUserApi adminUserApi;
@@ -220,4 +229,63 @@
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void processStockTakingDifference(Long id) {
        // 1. 校验任务存在且已完成
        MesWmStockTakingTaskDO task = validateStockTakingTaskExists(id);
        if (!MesWmStockTakingTaskStatusEnum.FINISHED.getStatus().equals(task.getStatus())) {
            throw exception(WM_STOCK_TAKING_TASK_NOT_FINISHED);
        }
        // 2. 获取盘点结果列表
        List<MesWmStockTakingTaskResultDO> results = stockTakingTaskResultService.getStockTakingTaskResultListByTaskId(id);
        if (CollUtil.isEmpty(results)) {
            return; // 无盘点结果,无需处理
        }
        // 3. 遍历结果,处理差异
        for (MesWmStockTakingTaskResultDO result : results) {
            BigDecimal bookQuantity = result.getQuantity();          // 账面数量
            BigDecimal takingQuantity = result.getTakingQuantity(); // 盘点数量
            if (takingQuantity == null || bookQuantity == null) {
                continue;
            }
            // 计算差异:盘点数量 - 账面数量
            BigDecimal difference = takingQuantity.subtract(bookQuantity);
            if (difference.compareTo(BigDecimal.ZERO) == 0) {
                continue; // 无差异,跳过
            }
            // 4. 创建库存调整事务
            MesWmTransactionSaveReqDTO transaction = new MesWmTransactionSaveReqDTO()
                    .setItemId(result.getItemId())
                    .setBatchId(result.getBatchId())
                    .setBatchCode(result.getBatchCode())
                    .setWarehouseId(result.getWarehouseId())
                    .setLocationId(result.getLocationId())
                    .setAreaId(result.getAreaId())
                    .setBizId(task.getId())
                    .setBizCode(task.getCode())
                    .setBizLineId(result.getLineId());
            if (difference.compareTo(BigDecimal.ZERO) > 0) {
                // 盘盈:库存增加
                transaction.setType(MesWmTransactionTypeEnum.IN.getType())
                        .setQuantity(difference)
                        .setBizType(MesBizTypeConstants.WM_STOCK_TAKING);
            } else {
                // 盘亏:库存减少
                transaction.setType(MesWmTransactionTypeEnum.OUT.getType())
                        .setQuantity(difference.negate()) // 出库数量传正数,但内部会转为负数
                        .setBizType(MesBizTypeConstants.WM_STOCK_TAKING);
            }
            wmTransactionService.createTransaction(transaction);
        }
    }
}