package com.consum.base.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.compress.utils.Lists; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import com.consum.base.core.utils.MapUtils; import com.consum.base.core.utils.MapperUtil; import com.consum.base.pojo.dto.GoodsInfoDTO; import com.consum.base.pojo.dto.GoodsModelCountDTO; import com.consum.base.service.LWhGoodsService; import com.walker.infrastructure.utils.CollectionUtils; import com.walker.jdbc.service.BaseServiceImpl; /** * @ClassName LWhGoodsService * @Date 2023/10/24 * @Description * @Version 1.0 **/ @Service public class LWhGoodsServiceImpl extends BaseServiceImpl implements LWhGoodsService { /** * @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"; @Override public int queryGoodsModelNum(Integer warehouseType, List warehouseId, Long baseGoodsModelsId, Integer states, Integer buyType) { StringBuilder sql = new StringBuilder(query_Goods_Model_Num); Map paramts = new HashMap<>(); if (warehouseType != null) { sql.append(" and WAREHOUSE_TYPE=:warehouseType"); paramts.put("warehouseType", warehouseType); } if (warehouseId != null) { sql.append(" and WAREHOUSE_ID in (: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); } @Override public int queryGoodsModelInWareHouseNum(Integer warehouseType, List warehouseId, Long baseGoodsModelsId, Integer states, Integer buyType) { StringBuilder sql = new StringBuilder(query_Goods_Model_Num); Map paramts = new HashMap<>(); if (warehouseType != null) { sql.append(" and WAREHOUSE_TYPE=:warehouseType"); paramts.put("warehouseType", warehouseType); } if (warehouseId != null) { sql.append(" and WAREHOUSE_ID in (: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 取出的数量 * @return */ private static String QUERY_OUT_GOODS_ID = "SELECT * FROM L_WH_GOODS WHERE 1=1"; @Override public List> queryOutGoods(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Integer states, Integer buyType, Integer goodsModelNum) { StringBuilder sql = new StringBuilder(QUERY_OUT_GOODS_ID); Map 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 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 */ @Override public List queryOutGoodsId(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Integer states, Integer buyType, Integer goodsModelNum) { List> outGoods = queryOutGoods(warehouseType, warehouseId, baseGoodsModelsId, states, buyType, goodsModelNum); if (CollectionUtils.isEmpty(outGoods)) { return null; } List whGoodsIds = outGoods.stream().map(map -> (Long)map.get("id")).collect(Collectors.toList()); return whGoodsIds; } private static String QUERY_GOODS_PRICE_BY_ID = "SELECT sum(PRICE)totalPrice from L_WH_GOODS goods where 1=1"; @Override public long queryGoodsPriceById(List goodsIds) { StringBuilder sql = new StringBuilder(QUERY_GOODS_PRICE_BY_ID); Map paramts = new HashMap<>(); if (!CollectionUtils.isEmpty(goodsIds)) { sql.append(" and id in(:goodsIds)"); paramts.put("goodsIds", goodsIds); } List> map = this.select(sql.toString(), paramts); if (CollectionUtils.isEmpty(map)) { return 0; } BigDecimal totalPrice = (BigDecimal)map.get(0).get("totalPrice"); return totalPrice.longValue(); } /** * 查询报废物品 默认优先报废最高价的物品 * * @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, goods.PRICE 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=1 AND flow.BUSINESS_FORM_ID=:transBusinessId)"; private static String QUERY_SCRAPPED_GOODS_PREFIX_2_MODEL_NOT_NULL = " 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=1 AND flow.BUSINESS_FORM_ID=:transBusinessId AND lwgr.BASE_GOODS_MODELS_ID = :lwgrGoodsModelId)"; private static String QUERY_SCRAPPED_GOODS_END = " ORDER BY goods.PRICE DESC,goods.PROCURE_DATE ASC,goods.id"; @Override public List> 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 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) { if (baseGoodsModelsId != null) { sql.append(QUERY_SCRAPPED_GOODS_PREFIX_2_MODEL_NOT_NULL); paramts.put("transBusinessId", transBusinessId); paramts.put("lwgrGoodsModelId", baseGoodsModelsId); } else { 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 */ @Override public List queryScrappedGoodsIds(Integer warehouseType, Long warehouseId, Long transBusinessId, String nowUserName, Long baseGoodsModelsId, Short states, Integer goodsModelNum) { List> outGoods = queryScrappedGoods(warehouseType, warehouseId, transBusinessId, nowUserName, baseGoodsModelsId, states, goodsModelNum); if (CollectionUtils.isEmpty(outGoods)) { return null; } List 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 "; @Override public int modGoodsTransfering(List whGoods, Integer warehouseType, Long toWarehouseId, String toWarehouseName, Integer states) { StringBuilder sql = new StringBuilder(MOD_GOODS_TRANSFERING_PREFIX); ArrayList params = new ArrayList<>(); if (warehouseType != 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(").append(StringUtils.join(whGoods, ",")).append(")"); return update(sql.toString(), params.toArray()); } private static String GOODS_NUM_PRICE = "SELECT t.tenantId,count(id) total_Num,count(CASE WHEN STATES=2 THEN 1 END) xia_fa_num,IFNULL(round(sum(PRICE)/1000000,2),0) total_price,IFNULL(ROUND(count(CASE WHEN STATES=2 THEN 1 END)/count(id),4),0)*100 AS zhan_you_percent,count(CASE COST_TYPE WHEN 1 THEN 1 END) a_total_Num,count(CASE COST_TYPE WHEN 2 THEN 1 END) b_total_Num,count(CASE COST_TYPE WHEN 3 THEN 1 END) c_total_Num,IFNULL( round( sum( CASE COST_TYPE WHEN 1 THEN PRICE END )/ 1000000, 2 ), 0 ) a_total_price,IFNULL( round( sum( CASE COST_TYPE WHEN 2 THEN PRICE END )/ 1000000, 2 ), 0 ) b_total_price,IFNULL( round( sum( CASE COST_TYPE WHEN 3 THEN PRICE END )/ 1000000, 2 ), 0 ) c_total_price FROM (SELECT tCangKu.tenantId,tKuCun.id,tKuCun.STATES,tKuCun.COST_TYPE,tKuCun.price FROM (SELECT tenant.id tenantId,tenant.NAME AS org_name,ware.*FROM fin_sys_tenant tenant RIGHT JOIN ( SELECT 0 WAREHOUSE_TYPE,id,AGENCY_ID,WAREHOUSE_NAME FROM BASE_WAREHOUSE UNION ALL SELECT 1 WAREHOUSE_TYPE,id,TENANT_ID AGENCY_ID,`NAME` WAREHOUSE_NAME FROM fin_sys_tenant_department) ware ON tenant.id=ware.AGENCY_ID WHERE 1=1 "; private static String GOODS_NUM_PRICE_END = ") tCangKu LEFT JOIN L_WH_GOODS tKuCun ON tCangKu.WAREHOUSE_TYPE=tKuCun.WAREHOUSE_TYPE AND tCangKu.id=tKuCun.WAREHOUSE_ID AND tKuCun.STATES BETWEEN 1 AND 2 where tKuCun.id is not null) t GROUP BY t.tenantId"; // 按机构统计物品价值、数量/金额等 @Override public List> getGoodsNumPrice(Long agencyId) { StringBuilder sql = new StringBuilder(GOODS_NUM_PRICE); Map paramts = new HashMap<>(); sql.append(" and tenant.id=:agencyId"); paramts.put("agencyId", agencyId); return select(sql.append(GOODS_NUM_PRICE_END).toString(), paramts, new MapperUtil()); } private static String GET_GOODS_NUM_BY_MONTH = "SELECT monthT.month_Num,IFNULL(datat.total_Num,0) total_Num,IFNULL(datat.add_total_Num,0) add_total_Num,IFNULL(datat.reduce_total_Num,0) reduce_total_Num FROM (SELECT monthT.month_Num FROM (SELECT ( SELECT 1) month_Num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) monthT) monthT LEFT JOIN ( SELECT t.tenantId,count(t.THIS_COUNT) total_Num,count(CASE t.THIS_TYPE WHEN 1 THEN t.THIS_COUNT END) add_total_Num,count(CASE t.THIS_TYPE WHEN 2 THEN t.THIS_COUNT END) reduce_total_Num,SUBSTR(DEAL_TIME,5,2) data_month FROM ( SELECT tCangKu.tenantId,tKuCun.id,tKuCun.THIS_TYPE,tKuCun.THIS_COUNT,tKuCun.DEAL_TIME FROM (SELECT tenant.id tenantId,tenant.NAME AS org_name,ware.*FROM fin_sys_tenant tenant RIGHT JOIN ( SELECT 0 WAREHOUSE_TYPE,id,AGENCY_ID,WAREHOUSE_NAME FROM BASE_WAREHOUSE UNION ALL SELECT 1 WAREHOUSE_TYPE,id,TENANT_ID AGENCY_ID,`NAME` WAREHOUSE_NAME FROM fin_sys_tenant_department) ware ON tenant.id=ware.AGENCY_ID WHERE 1=1 "; private static String GET_GOODS_NUM_BY_MONTH_END = ")tCangKu LEFT JOIN L_WH_GOODS_RECORD tKuCun ON tCangKu.WAREHOUSE_TYPE=tKuCun.WAREHOUSE_TYPE AND tCangKu.id=tKuCun.WAREHOUSE_ID and tKuCun.DEAL_TIME between cast(CONCAT(DATE_FORMAT(NOW(), '%Y'),'1231240000') as UNSIGNED) and cast(CONCAT(DATE_FORMAT(NOW(), '%Y'),'0101000000') as UNSIGNED)) t GROUP BY t.tenantId,SUBSTR(DEAL_TIME,5,2)) datat ON datat.data_month=monthT.month_Num ORDER BY monthT.month_Num ASC"; // 按机构统计物品价值、数量/金额等 @Override public List> getGoodsNumByMonth(Long agencyId) { StringBuilder sql = new StringBuilder(GET_GOODS_NUM_BY_MONTH); Map paramts = new HashMap<>(); sql.append(" and tenant.id=:agencyId"); paramts.put("agencyId", agencyId); return select(sql.append(GET_GOODS_NUM_BY_MONTH_END).toString(), paramts, new MapperUtil()); } @Override public GoodsModelCountDTO queryGoodsAmount(Long baseGoodsModelsId, Integer type) { StringBuilder sql = new StringBuilder( "SELECT sum(PRICE) amount from L_WH_GOODS where base_goods_models_id =:baseGoodsModelsId and states =:type"); Map param = new HashMap<>(); param.put("baseGoodsModelsId", baseGoodsModelsId); param.put("type", type); List> result = this.select(sql.toString(), param); if (!CollectionUtils.isEmpty(result)) { List goodsModelCount = Lists.newArrayList(); for (Map item : result) { GoodsModelCountDTO goodsModelCountDTO = MapUtils.convertMapToObj(item, GoodsModelCountDTO.class); goodsModelCount.add(goodsModelCountDTO); } return goodsModelCount.get(0); } return null; } @Override public List queryGoodsInfo(Set baseModelIds, Set wareHouseIds,Integer buyType) { List goodsInfoDTOS = Lists.newArrayList(); StringBuilder sql = new StringBuilder( "SELECT distinct WAREHOUSE_ID,WAREHOUSE_NAME from L_WH_GOODS where base_goods_models_id in (:baseGoodsModelsIds) " + "and WAREHOUSE_TYPE =0 and states =1 and WAREHOUSE_ID in (:wareHouseIds) "); Map param = new HashMap<>(); if (!CollectionUtils.isEmpty(baseModelIds)) { param.put("baseGoodsModelsIds", baseModelIds); } if (buyType != null) { sql.append("and BUY_TYPE =:buyType "); param.put("buyType", buyType); } param.put("wareHouseIds", wareHouseIds); List> result = this.select(sql.toString(), param, new MapperUtil()); result.forEach(item -> { GoodsInfoDTO goodsInfoDTO = MapUtils.convertMapToObj(item, GoodsInfoDTO.class); goodsInfoDTOS.add(goodsInfoDTO); }); return goodsInfoDTOS; } }