futian.liu
2023-12-02 8e41786892a4bd7cff2d63bde8cb0636cdb0650c
consum-base/src/main/java/com/consum/base/core/WarehouseCoreService.java
@@ -1,13 +1,17 @@
package com.consum.base.core;
import com.consum.base.core.tools.SqlParameter;
import com.consum.base.core.util.DateUtil;
import com.consum.base.core.param.BaseWarehouseParam;
import com.consum.base.core.utils.DateUtil;
import com.consum.base.core.utils.IdUtil;
import com.consum.base.core.utils.SqlParameter;
import com.consum.model.po.*;
import com.walker.infrastructure.utils.NumberGenerator;
import com.walker.jdbc.service.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.util.ArrayList;
@@ -19,6 +23,7 @@
 */
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public class WarehouseCoreService extends BaseServiceImpl {
    public static void main(String[] args) {
@@ -32,10 +37,42 @@
        System.out.println(mapper.getInsertSql_().getSql());
    }
    /**
     * 统一出入库
     */
    public List<CheckWarehouseResult> unifyCheck(CheckWarehouseParam param) {
    public List<CheckUsingResult> unifyUsingCheck(CheckUsingParam param) {
        // TODO: 10/10/2023 此处加了唯一锁,会影响性能,思考是否有更合适的办法
        try {
            List<CheckUsingResult> results;
            String key = param.getLending_id().toString();
            /**
             * 此处将同一个仓库下的同一个型号上锁,不同仓库、不同型号不受影响。
             */
            synchronized (key) {
                if (param.getIsCheckIn()) {
                    results = checkUsingIn(param);
                } else {
                    results = checkUsingOut(param);
                }
            }
            return results;
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }
    /**
     * 统一出入库
     */
    public List<CheckWarehouseResult> unifyCheck(BaseWarehouseParam param) {
        // TODO: 10/10/2023 此处加了唯一锁,会影响性能,思考是否有更合适的办法
        try {
            Assert.notNull(param, "wareHouse param can not null !");
@@ -64,9 +101,130 @@
    }
    /**
     * 在用物品出库
     * @param param
     * @return
     */
    private List<CheckUsingResult> checkUsingOut(CheckUsingParam param){
        String sql = "SELECT\n" +
                "   * \n" +
                "FROM\n" +
                "   DEP_FORM_LENDING_MODEL a \n" +
                "WHERE\n" +
                "   a.BASE_GOODS_MODELS_ID =:MODEL_ID \n" +
                "   AND DEP_FORM_LENDING_ID =:LENDING_ID \n" +
                "   AND USING_COUNT > 0\n" +
                "ORDER BY\n" +
                "   PROCURE_DATE ASC PRICE DESC";
        List<DepFormLendingModel>  modelsList = this.select(sql,new SqlParameter("MODEL_ID", param.getModel_id())
                .put("LENDING_ID",param.getLending_id()),new DepFormLendingModel());
        List<CheckUsingResult> resultList = new ArrayList<>();
        int shengyu = param.getOutputCount();
        for (DepFormLendingModel model : modelsList) {
            CheckUsingResult result = new CheckUsingResult();
            DepFormLendingGoods goods = get(new DepFormLendingGoods(),"id=?",new Object[]{model.getDepFormLendingGoodsId()});
            //如果是A类物品,则需要与持有人等同
            if (goods.getClassification() == "A" && (goods.getGoodsUserName().equals(param.getUser_name()))) {
                continue;
            }
            //如果当前持有人持有物品数量大于出库数量,则直接减掉数量即可。
            if (model.getUsingCount() > shengyu){
                result.setInitial_count(model.getUsingCount());
                result.setLendingModel(model);
                model.setUsingCount(model.getCounts() - param.getOutputCount());
                result.setEnd_count(model.getUsingCount());
                update(model);
                resultList.add(result);
                goods.setUsingCount(goods.getUsingCount() - param.getOutputCount());
                update(goods);
                return resultList;
            }
            shengyu = shengyu - model.getUsingCount();
            goods.setUsingCount(goods.getUsingCount() - model.getUsingCount());
            result.setInitial_count(model.getUsingCount());
            result.setLendingModel(model);
            model.setUsingCount(0);
            result.setEnd_count(0);
            update(model);
            resultList.add(result);
            update(goods);
        }
        return resultList;
    }
    /**
     * 在用物品入
     * @param param
     * @return
     */
    private List<CheckUsingResult> checkUsingIn(CheckUsingParam param){
        DepFormLending lending = get(new DepFormLending(),"id=?",new Object[]{param.getLending_id()});
        String sql = "SELECT\n" +
                "   * \n" +
                "FROM\n" +
                "   DEP_FORM_LENDING_GOODS A \n" +
                "WHERE\n" +
                "   A.DEP_FORM_LENDING_ID = :LENDING_ID";
        List<DepFormLendingGoods>  goodsList = this.select(sql,new SqlParameter()
                .put("LENDING_ID",lending.getId()),new DepFormLendingGoods());
        List<CheckUsingResult> resultList = new ArrayList<>();
        for (DepFormLendingGoods goods : goodsList) {
            for (CheckWarehouseResult output : param.getOutputList()) {
                //如果出库的型号与分发单里的型号相同
                if (goods.getBaseGoodsModelsId().longValue() == output.getWhGoods().getBaseGoodsModelsId().longValue()){
                    DepFormLendingModel model = new DepFormLendingModel();
                    model.setId(IdUtil.generateId());
                    model.setCounts(goods.getCounts());
                    model.setDepFormLendingGoodsId(goods.getId());
                    model.setDepFormLendingId(goods.getDepFormLendingId());
                    model.setWhGoodsDetailsId(output.getWh_goods_detail_id());
                    model.setNowUserName(goods.getGoodsUserName());
                    model.setNowUserPhone(goods.getGoodsUserPhone());
                    model.setWhGoodsId(output.getWhGoods().getId());
                    //当前可使用数量
                    model.setUsingCount(model.getCounts());
                    model.setWarehouseId(output.getWhGoods().getWarehouseId());
                    model.setWarehouseName(output.getWhGoods().getWarehouseName());
                    model.setAgencyId(lending.getAgencyId());
                    model.setAgencyName(lending.getAgencyName());
                    model.setDepartmentId(lending.getDepartmentId());
                    model.setDepartmentName(lending.getDepartmentName());
                    insert(model);
                    CheckUsingResult result = new CheckUsingResult();
                    result.setLendingModel(model);
                    result.setInitial_count(0);
                    result.setEnd_count(output.getInitial_count()-output.getEnd_count());
                    resultList.add(result);
                }
            }
        }
        return resultList;
    }
    /**
     * 出库
     */
    private List<CheckWarehouseResult> checkout(CheckWarehouseParam param) {
    private List<CheckWarehouseResult> checkout(BaseWarehouseParam param) {
        //查询出指定仓库、指定型号,状态为正常的的库存物品,按照采购时间倒叙、价格倒叙排列
       String sql = "SELECT\n" +
                "   * \n" +
@@ -113,7 +271,7 @@
                    //变更状态为调拨
                    nGoods.setStates(param.getOutput_type());
                    nGoods.setWhCount(param.getCount());
                    nGoods.setId(NumberGenerator.getLongSequenceNumber());
                    nGoods.setId(IdUtil.generateId());
                    insert(nGoods);
                    CheckWarehouseResult nresult = new CheckWarehouseResult();
@@ -155,7 +313,7 @@
    /**
     * 入库
     */
    private CheckWarehouseResult checkin(CheckWarehouseParam param) throws RuntimeException {
    private CheckWarehouseResult checkin(BaseWarehouseParam param) throws RuntimeException {
        //如果是采购入库
        if (param.getFirst_input_type() ==1){
@@ -163,7 +321,7 @@
            WhFormProcure procure = get(new WhFormProcure(),"ID=?",new Object[]{procureModel.getWhFormProcureId()});
            WhGoods goods = new WhGoods();
            goods.setId(NumberGenerator.getLongSequenceNumber());
            goods.setId(IdUtil.generateId());
            goods.setBaseGoodsTemplateId(procureModel.getBaseGoodsTemplateId());
            goods.setGoodsTemplateName(procureModel.getGoodsTemplateName());
            goods.setBaseGoodsModelsId(procureModel.getBaseGoodsModelsId());