cy
2023-11-02 85cbeedbf3e6c7a46afb53090d0ed44a52883f46
consum-base/src/main/java/com/consum/base/service/LWhFormTransferCoreService.java
@@ -1,31 +1,56 @@
package com.consum.base.service;
import com.consum.base.core.util.LockManage;
import com.consum.model.po.LWarehouseFlow;
import com.consum.model.po.LWhFormTransfer;
import com.consum.model.po.LWhGoodsRecord;
import com.consum.model.po.LWhGoodsRecordDetails;
import com.iplatform.model.po.S_user_core;
import com.walker.infrastructure.utils.CollectionUtils;
import com.walker.infrastructure.utils.DateUtils;
import com.walker.infrastructure.utils.NumberGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @ClassName LWhFormTransferCoreService
 * @Author cy
 * @Date 2023/10/26
 * @Description
 * @Version 1.0
 **/
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class LWhFormTransferCoreService {
    @Resource
    private LWhFormTransferServiceImpl lWhFormTransferService;
    @Resource
    private LWhFormOutputCoreService lWhFormOutputCoreService;
    @Resource
    private GoodsBaseServiceImpl goodsBaseService;
    @Resource
    private LWhGoodsRecordService lWhGoodsRecordService;
    @Resource
    private LWhGoodsService lWhGoodsService;
    @Resource
    private LGoodsWhRecordServiceImpl lGoodsWhRecordService;
    @Resource
    private LWarehouseFlowService lWarehouseFlowService;
    @Resource
    private LWarehouseFlowService LWhGoodsRecordDetailsService;
    /**
     * 执行调拨出库操作
     *
     * @param whFormTransferId 调拨单id
     */
    public void doTransferOutPut(Long whFormTransferId, S_user_core currentUser) {
@@ -50,7 +75,7 @@
            return;
        }
        // 出库单 出库,返回 出库单流水Id
        Long outFormByTransId = lWhFormOutputCoreService.outFormByTransId(whFormTransferId, currentUser, dealTime);
        Long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(outWarehouseFormId, currentUser, dealTime);
        // 更新调拨单
        lWhFormTransfer = new LWhFormTransfer(whFormTransferId);
@@ -59,8 +84,8 @@
        lWhFormTransfer.setOutOperatorId(userId);
        lWhFormTransfer.setOutOperatorName(nickName);
        lWhFormTransfer.setOutputTime(dealTime);
        lWhFormTransfer.setOutWarehouseFlowId(lWarehouseFlowId);
        lWhFormTransferService.update(lWhFormTransfer);
        log.info("调拨单:{} 出库完成", whFormTransferId);
        return;
@@ -81,23 +106,98 @@
        }
        Long userId = currentUser.getId();
        String nickName = currentUser.getNick_name();
        // 出库单流水id
        Long outWarehouseFlowId = lWhFormTransfer.getOutWarehouseFlowId();
        // 入库仓库类型 0机构1部门
        Integer inWarehouseType = lWhFormTransfer.getInWarehouseType();
        Long inWarehouseId = lWhFormTransfer.getInWarehouseId();
        String inWarehouseName = lWhFormTransfer.getInWarehouseName();
        // 出库单ID
        Long outWarehouseFormId = lWhFormTransfer.getOutWarehouseFormId();
        long dealTime = DateUtils.getDateTimeNumber(System.currentTimeMillis());
        // 流水记录总表ID
        long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(outWarehouseFormId, currentUser, dealTime);
        long inWarehouseFlowId = NumberGenerator.getLongSequenceNumber();
        // 根据出库流水ID 查询 出库的物品ID
        List<Long> outGoodsIds = getGoodsidByFlowId(outWarehouseFlowId);
        // 插入 进出库流水总表[L_WAREHOUSE_FLOW]
        LWarehouseFlow inwarehouseFlow = new LWarehouseFlow();
        inwarehouseFlow.setId(inWarehouseFlowId);
        inwarehouseFlow.setWarehouseType(inWarehouseType);
        inwarehouseFlow.setWarehouseId(inWarehouseId);
        inwarehouseFlow.setWarehouseName(inWarehouseName);
        inwarehouseFlow.setThisType(1);
        inwarehouseFlow.setBusinessType(2);
        inwarehouseFlow.setBusinessFormId(whFormTransferId);
        inwarehouseFlow.setOperatorId(userId);
        inwarehouseFlow.setOperatorName(nickName);
        inwarehouseFlow.setDealTime(dealTime);
        lWarehouseFlowService.insert(inwarehouseFlow);
        LWhGoodsRecord lWhGoodsRecord = new LWhGoodsRecord();
        lWhGoodsRecord.setWarehouseFlowId(outWarehouseFlowId);
        List<LWhGoodsRecord> whGoodsRecordList = lWhGoodsRecordService.select(lWhGoodsRecord);
        for (LWhGoodsRecord whGoodsRecord : whGoodsRecordList) {
            Long oldRecordId = whGoodsRecord.getId();
            Long baseGoodsModelsId = whGoodsRecord.getBaseGoodsModelsId();
            whGoodsRecord.setId(NumberGenerator.getLongSequenceNumber());
            whGoodsRecord.setWarehouseType(inWarehouseType);
            whGoodsRecord.setWarehouseId(inWarehouseId);
            whGoodsRecord.setDealTime(dealTime);
            //通过LockManage获得锁
            Object warehouseModelLockObj = LockManage.acquireLock(inWarehouseType, inWarehouseId, baseGoodsModelsId);
            synchronized (warehouseModelLockObj) {
                // 获得锁后查询该型号的期初数量
                int goodsModelNum = lWhGoodsService.queryGoodsModelNum(inWarehouseType, inWarehouseId, baseGoodsModelsId, (short) 1, null);
                whGoodsRecord.setInitialCount(goodsModelNum);
                whGoodsRecord.setEndCount(goodsModelNum + whGoodsRecord.getThisCount());
            }
            LWhGoodsRecordDetails lWhGoodsRecordDetails = new LWhGoodsRecordDetails();
            lWhGoodsRecordDetails.setWhGoodsRecordId(oldRecordId);
            List<LWhGoodsRecordDetails> goodsRecordDetailsList = LWhGoodsRecordDetailsService.select(lWhGoodsRecordDetails);
            for (LWhGoodsRecordDetails whGoodsRecordDetails : goodsRecordDetailsList) {
                whGoodsRecordDetails.setId(NumberGenerator.getLongSequenceNumber());
                whGoodsRecordDetails.setThisType(1);
            }
            LWhGoodsRecordDetailsService.insertBatch(goodsRecordDetailsList);
        }
        lWhGoodsRecordService.insertBatch(whGoodsRecordList);
        // 库存物品详情(L_WH_GOODS)中 状态设置为1
        lWhGoodsService.modGoodsTransfering(outGoodsIds, inWarehouseType, inWarehouseId, inWarehouseName, (short) 1);
        //将保管仓库信息更新到 物品仓库保管记录【L_GOODS_WH_RECORD】
        lGoodsWhRecordService.insertNewRecord(outGoodsIds, inWarehouseFlowId, dealTime);
        // 更新调拨单
        lWhFormTransfer = new LWhFormTransfer(whFormTransferId);
        lWhFormTransfer.setInWarehouseFormId(lWarehouseFlowId);
        lWhFormTransfer.setInWarehouseFormId(inWarehouseFlowId);
        lWhFormTransfer.setStates(2);
        lWhFormTransfer.setInOperatorId(userId);
        lWhFormTransfer.setInOperatorName(nickName);
        lWhFormTransfer.setInTime(dealTime);
        lWhFormTransferService.update(lWhFormTransfer);
        log.info("调拨单:{} 入库完成", whFormTransferId);
        return;
    }
    private static String GET_GOODSID_BY_FLOWID = "SELECT goods.id FROM L_WH_GOODS_RECORD gr LEFT JOIN L_WH_GOODS_RECORD_DETAILS grd ON gr.id=grd.WH_GOODS_RECORD_ID LEFT JOIN L_WH_GOODS goods ON goods.id=grd.WH_GOODS_ID WHERE 1=1";
    /**
     * 根据出库流水ID 查询 出库的物品ID
     *
     * @param lWarehouseFlowId
     */
    private List<Long> getGoodsidByFlowId(long lWarehouseFlowId) {
        StringBuilder sql = new StringBuilder(GET_GOODSID_BY_FLOWID);
        Map<String, Object> paramts = new HashMap<>();
        sql.append(" and gr.WAREHOUSE_FLOW_ID =:lWarehouseFlowId");
        paramts.put("lWarehouseFlowId", lWarehouseFlowId);
        List<Map<String, Object>> outGoods = goodsBaseService.select(sql.toString(), paramts);
        if (CollectionUtils.isEmpty(outGoods)) {
            return null;
        }
        List<Long> whGoodsIds = outGoods.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList());
        return whGoodsIds;
    }
}