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<Long> warehouseId, Long baseGoodsModelsId, Integer states,
|
Integer 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 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<Long> warehouseId, Long baseGoodsModelsId,
|
Integer states, Integer 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 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<Map<String, Object>> queryOutGoods(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId,
|
Integer states, Integer 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_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<Long> queryOutGoodsId(Integer warehouseType, Long warehouseId, Long baseGoodsModelsId, Integer states,
|
Integer 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;
|
}
|
|
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<Long> goodsIds) {
|
StringBuilder sql = new StringBuilder(QUERY_GOODS_PRICE_BY_ID);
|
Map<String, Object> paramts = new HashMap<>();
|
if (!CollectionUtils.isEmpty(goodsIds)) {
|
sql.append(" and id in(:goodsIds)");
|
paramts.put("goodsIds", goodsIds);
|
}
|
List<Map<String, Object>> 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<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) {
|
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<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 ";
|
|
@Override
|
public int modGoodsTransfering(List<Long> whGoods, Integer warehouseType, Long toWarehouseId,
|
String toWarehouseName, Integer states) {
|
StringBuilder sql = new StringBuilder(MOD_GOODS_TRANSFERING_PREFIX);
|
ArrayList<Object> 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<Map<String, Object>> getGoodsNumPrice(Long agencyId) {
|
StringBuilder sql = new StringBuilder(GOODS_NUM_PRICE);
|
Map<String, Object> 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<Map<String, Object>> getGoodsNumByMonth(Long agencyId) {
|
StringBuilder sql = new StringBuilder(GET_GOODS_NUM_BY_MONTH);
|
Map<String, Object> 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<String, Object> param = new HashMap<>();
|
param.put("baseGoodsModelsId", baseGoodsModelsId);
|
param.put("type", type);
|
List<Map<String, Object>> result = this.select(sql.toString(), param);
|
if (!CollectionUtils.isEmpty(result)) {
|
List<GoodsModelCountDTO> goodsModelCount = Lists.newArrayList();
|
for (Map<String, Object> item : result) {
|
GoodsModelCountDTO goodsModelCountDTO = MapUtils.convertMapToObj(item, GoodsModelCountDTO.class);
|
goodsModelCount.add(goodsModelCountDTO);
|
}
|
return goodsModelCount.get(0);
|
}
|
|
return null;
|
}
|
|
@Override
|
public List<GoodsInfoDTO> queryGoodsInfo(Set<Long> baseModelIds, Set<Long> wareHouseIds) {
|
|
List<GoodsInfoDTO> 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 BUY_TYPE =1 and states =1 and WAREHOUSE_ID in (:wareHouseIds)");
|
Map<String, Object> param = new HashMap<>();
|
if (!CollectionUtils.isEmpty(baseModelIds)) {
|
param.put("baseGoodsModelsIds", baseModelIds);
|
}
|
param.put("wareHouseIds", wareHouseIds);
|
List<Map<String, Object>> result = this.select(sql.toString(), param, new MapperUtil());
|
result.forEach(item -> {
|
GoodsInfoDTO goodsInfoDTO = MapUtils.convertMapToObj(item, GoodsInfoDTO.class);
|
goodsInfoDTOS.add(goodsInfoDTO);
|
});
|
return goodsInfoDTOS;
|
}
|
}
|