futian.liu
2023-12-07 be96b79932aaaf0bd6a1c143e6f1d045c6a8935a
consum-base/src/main/java/com/consum/base/service/LWhGoodsService.java
@@ -1,246 +1,51 @@
package com.consum.base.service;
import com.walker.infrastructure.utils.CollectionUtils;
import com.walker.jdbc.service.BaseServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.consum.base.pojo.dto.GoodsModelCountDTO;
import com.walker.jdbc.service.BaseService;
/**
 * @ClassName LWhGoodsService
 * @Date 2023/10/24
 * @Description
 * @Version 1.0
 * LWhGoodsService
 *
 * @author asus
 * @version 2023/12/05 13:52
 **/
@Service
public class LWhGoodsService extends BaseServiceImpl {
public interface LWhGoodsService extends BaseService {
    int queryGoodsModelNum(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Integer states,
        Integer buyType);
    List<Map<String, Object>> queryOutGoods(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId,
        Integer states, Integer buyType, Integer goodsModelNum);
    List<Long> queryOutGoodsId(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Integer states,
        Integer buyType, Integer goodsModelNum);
    long queryGoodsPriceById(List<Long> goodsIds);
    List<Map<String, Object>> queryScrappedGoods(Integer warehouseType, Long warehouseId, Long transBusinessId,
        String nowUserName, Long baseGoodsModelsId, Short states, Integer goodsModelNum);
    List<Long> queryScrappedGoodsIds(Integer warehouseType, Long warehouseId, Long transBusinessId, String nowUserName,
        Long baseGoodsModelsId, Short states, Integer goodsModelNum);
    int modGoodsTransfering(List<Long> whGoods, Integer warehouseType, Long toWarehouseId, String toWarehouseName,
        Integer states);
    // 按机构统计物品价值、数量/金额等
    List<Map<String, Object>> getGoodsNumPrice(Long agencyId);
    // 按机构统计物品价值、数量/金额等
    List<Map<String, Object>> getGoodsNumByMonth(Long agencyId);
    /**
     * @param warehouseType       仓库类型0机构1部门
     * @param warehouseId       所属仓库仓库编号
     * @param baseGoodsModelsId 规格型号编号
     * @param states            (0=在途调拨;1=入库未分发;2=已下发;3=报废)
     * @param buyType 采购方式(1:集采;2=自采)
     * @return 查询某个型号在仓库中的数量
     */
    private static String query_Goods_Model_Num = "SELECT COUNT(1) from L_WH_GOODS where 1=1";
    public int queryGoodsModelNum(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Short states, Short buyType) {
        StringBuilder sql = new StringBuilder(query_Goods_Model_Num);
        Map<String, Object> paramts = new HashMap<>();
        if (warehouseType != null) {
            sql.append(" and WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" and WAREHOUSE_ID=:warehouseId");
            paramts.put("warehouseId", warehouseId);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" and BASE_GOODS_MODELS_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" and STATES=:states");
            paramts.put("states", states);
        }
        if (buyType != null) {
            sql.append(" and BUY_TYPE=:buyType");
            paramts.put("buyType", buyType);
        }
        return queryForInt(sql.toString(), paramts);
    }
    /**
     * 出库时候,先入库的先出库,同时入库的,按价格高的先出库
     *
     * @param warehouseId       所属仓库仓库编号
     * @param baseGoodsModelsId 规格型号编号
     * @param states            状态(0=在途调拨;1=入库未分发;2=已下发;3=报废)
     * @param buyType           采购方式(1:集采;2=自采)
     * @param goodsModelNum 取出的数量
     * 根据型号查询商品总价
     *
     * @param baseGoodsModelsId
     * @param type <br>
     *            状态(0=在途调拨;1=入库未分发;2=已下发;3=报废 4 零星出库
     * @return
     */
    private static String QUERY_OUT_GOODS_ID = "SELECT*FROM L_WH_GOODS WHERE 1=1";
    public List<Map<String, Object>> queryOutGoods(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Short states, Short buyType, Integer goodsModelNum) {
        StringBuilder sql = new StringBuilder(QUERY_OUT_GOODS_ID);
        Map<String, Object> paramts = new HashMap<>();
        if (warehouseType != null) {
            sql.append(" and WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" and WAREHOUSE_ID=:warehouseId");
            paramts.put("warehouseId", warehouseId);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" and BASE_GOODS_TEMPLATE_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" and STATES=:states");
            paramts.put("states", states);
        }
        if (buyType != null) {
            sql.append(" and BUY_TYPE=:buyType");
            paramts.put("buyType", buyType);
        }
        return select(sql.append(" limit").append(goodsModelNum).toString(), paramts);
    }
    /**
     * 出库时候,先入库的先出库,同时入库的,按价格高的先出库
     *
     * @param warehouseId       所属仓库仓库编号
     * @param baseGoodsModelsId 规格型号编号
     * @param states            状态(0=在途调拨;1=入库未分发;2=已下发;3=报废)
     * @param buyType           采购方式(1:集采;2=自采)
     * @param goodsModelNum     取出的数量
     * @return
     */
    public List<Long> queryOutGoodsId(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Short states, Short buyType, Integer goodsModelNum) {
        List<Map<String, Object>> outGoods = queryOutGoods(warehouseType, warehouseId, baseGoodsModelsId, states, buyType, goodsModelNum);
        if (CollectionUtils.isEmpty(outGoods)) {
            return null;
        }
        List<Long> whGoodsIds = outGoods.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList());
        return whGoodsIds;
    }
    /**
     * 查询报废物品
     * 默认优先报废最高价的物品
     *
     * @param warehouseType
     * @param warehouseId
     * @param transBusinessId 调拨单号
     * @param nowUserName 使用人姓名
     * @param baseGoodsModelsId 物品型号
     * @param states 状态(0=在途调拨;1=入库未分发;2=已下发;3=报废 4 零星出库)
     * @param goodsModelNum     取出的数量
     * @return
     */
    private static String QUERY_SCRAPPED_GOODS_PREFIX_1 = "SELECT goods.id FROM L_WH_GOODS goods LEFT JOIN L_GOODS_USER_RECORD useRecord ON goods.id=useRecord.WH_GOODS_ID AND useRecord.LAST_RECORD=1 WHERE 1=1 ";
    private static String QUERY_SCRAPPED_GOODS_PREFIX_2 = " AND goods.id IN (SELECT lwgrd.WH_GOODS_ID FROM L_WAREHOUSE_FLOW flow LEFT JOIN L_WH_GOODS_RECORD lwgr ON lwgr.WAREHOUSE_FLOW_ID=flow.id LEFT JOIN L_WH_GOODS_RECORD_DETAILS lwgrd ON lwgrd.WH_GOODS_RECORD_ID=lwgr.id WHERE flow.THIS_TYPE=4 AND flow.BUSINESS_FORM_ID=:transBusinessId)";
    private static String QUERY_SCRAPPED_GOODS_END = " ORDER BY goods.PRICE DESC,goods.PROCURE_DATE ASC,goods.id";
    public List<Map<String, Object>> queryScrappedGoods(Integer warehouseType,
                                                        Long warehouseId,
                                                        Long transBusinessId,
                                                        String nowUserName,
                                                        Long baseGoodsModelsId,
                                                        Short states,
                                                        Integer goodsModelNum) {
        if (warehouseType == null) {
            warehouseType = 0;
        }
        StringBuilder sql = new StringBuilder(QUERY_SCRAPPED_GOODS_PREFIX_1);
        Map<String, Object> paramts = new HashMap<>();
        if (warehouseType != null) {
            sql.append(" AND goods.WAREHOUSE_TYPE=:warehouseType");
            paramts.put("warehouseType", warehouseType);
        }
        if (warehouseId != null) {
            sql.append(" AND goods.WAREHOUSE_ID=:warehouseId");
            paramts.put("warehouseId", warehouseId);
        }
        if (StringUtils.isNotEmpty(nowUserName)) {
            sql.append(" AND useRecord.NOW_USER_NAME=:nowUserName");
            paramts.put("nowUserName", nowUserName);
        }
        if (baseGoodsModelsId != null) {
            sql.append(" AND goods.BASE_GOODS_MODELS_ID=:baseGoodsModelsId");
            paramts.put("baseGoodsModelsId", baseGoodsModelsId);
        }
        if (states != null) {
            sql.append(" AND goods.STATES=:states");
            paramts.put("states", states);
        }
        if (transBusinessId != null) {
            sql.append(QUERY_SCRAPPED_GOODS_PREFIX_2);
            paramts.put("transBusinessId", transBusinessId);
        }
        sql.append(QUERY_SCRAPPED_GOODS_END);
        if (goodsModelNum != null) {
            sql.append(" limit").append(goodsModelNum);
        }
        return select(sql.toString(), paramts);
    }
    /**
     * 查询报废物品
     * 默认优先报废最高价的物品
     *
     * @param warehouseType
     * @param warehouseId
     * @param transBusinessId   调拨单号
     * @param nowUserName       使用人姓名
     * @param baseGoodsModelsId 物品型号
     * @param states            状态(0=在途调拨;1=入库未分发;2=已下发;3=报废 4 零星出库)
     * @param goodsModelNum     取出的数量
     * @return
     */
    public List<Long> queryScrappedGoodsIds(Integer warehouseType,
                                            Long warehouseId,
                                            Long transBusinessId,
                                            String nowUserName,
                                            Long baseGoodsModelsId,
                                            Short states,
                                            Integer goodsModelNum) {
        List<Map<String, Object>> outGoods = queryScrappedGoods(warehouseType, warehouseId, transBusinessId, nowUserName, baseGoodsModelsId, states, goodsModelNum);
        if (CollectionUtils.isEmpty(outGoods)) {
            return null;
        }
        List<Long> whGoodsIds = outGoods.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList());
        return whGoodsIds;
    }
    /**
     * 设置物品状态为调拨中
     *
     * @param whGoods
     * @param toWarehouseId
     * @param toWarehouseName
     * @return
     */
    private static String MOD_GOODS_TRANSFERING_PREFIX = "update L_WH_GOODS set";
    public int modGoodsTransfering(List<Long> whGoods, Integer warehouseType, Long toWarehouseId, String toWarehouseName, Short states) {
        StringBuilder sql = new StringBuilder(MOD_GOODS_TRANSFERING_PREFIX);
        ArrayList<Object> params = new ArrayList<>();
        if (toWarehouseId != null) {
            sql.append(", WAREHOUSE_TYPE=?");
            params.add(warehouseType);
        }
        if (toWarehouseId != null) {
            sql.append(", WAREHOUSE_ID=?");
            params.add(toWarehouseId);
        }
        if (toWarehouseName != null) {
            sql.append(", WAREHOUSE_NAME=?");
            params.add(toWarehouseName);
        }
        if (states != null) {
            sql.append(", STATES=?");
            params.add(states);
        }
        sql.deleteCharAt(22);
        sql.append(" where id in(?)");
        params.add(whGoods);
        return update(sql.toString(), params.toArray());
    }
    GoodsModelCountDTO queryGoodsAmount(Long baseGoodsModelsId, Integer type);
}