package com.consum.base.core;
|
|
import cn.hutool.core.convert.Convert;
|
import com.consum.base.core.service.LWhWarningCoreServiceImpl;
|
import com.consum.base.core.utils.IdUtil;
|
import com.consum.base.core.utils.LockManage;
|
import com.consum.base.service.GoodsBaseServiceImpl;
|
import com.consum.base.service.LWarehouseFlowService;
|
import com.consum.base.service.LWhGoodsRecordService;
|
import com.consum.base.service.LWhGoodsService;
|
import com.consum.base.service.impl.LWhGoodsRecordDetailsService;
|
import com.consum.model.po.BaseWarehouse;
|
import com.consum.model.po.LWarehouseFlow;
|
import com.consum.model.po.LWhGoodsRecord;
|
import com.consum.model.po.UsingFormBack;
|
import com.iplatform.model.po.S_user_core;
|
import com.walker.infrastructure.utils.CollectionUtils;
|
import com.walker.web.ResponseValue;
|
import java.util.Arrays;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
import javax.annotation.Resource;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* @ClassName DepFormScrappedCoreServiceImpl
|
* @Author cy
|
* @Date 2023/12/2
|
* @Description
|
* @Version 1.0
|
**/
|
@Service
|
@Slf4j
|
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
|
public class DepUsingFormBackCoreServiceImpl {
|
@Resource
|
private GoodsBaseServiceImpl goodsBaseService;
|
@Resource
|
private LWhGoodsService lWhGoodsService;
|
@Resource
|
private LWhGoodsRecordDetailsService lWhGoodsRecordDetailsService;
|
@Resource
|
private LWhGoodsRecordService lWhGoodsRecordServiceImpl;
|
@Resource
|
private LWarehouseFlowService lWarehouseFlowService;
|
@Resource
|
private LWhWarningCoreServiceImpl lWhWarningCoreService;
|
|
/**
|
* 根据报废单报废:修改调拨单中可退回数量;仓库中物品状态设置为报废;生成一个保费流水;更新报废型号表中,物品价值
|
* <p>
|
* 1.找到需要退回的型号, 按同一个
|
*
|
* @param lWhFormBackId
|
*/
|
public ResponseValue updateBack(Long lWhFormBackId, S_user_core currentUser, Long dealTime) {
|
// 查询报废单状态
|
UsingFormBack depFormScrapped = new UsingFormBack(lWhFormBackId);
|
depFormScrapped = goodsBaseService.get(depFormScrapped);
|
//状态 1=待报废;2=已报废
|
if (depFormScrapped == null || depFormScrapped.getStates() != 1) {
|
return ResponseValue.error("请检查报废单");
|
}
|
|
Long userId = currentUser.getId();
|
String nickName = currentUser.getNick_name();
|
|
// 根据报废单 查询需要报废的型号数量
|
List<Map<String, Object>> bfModelList = goodsBaseService.select("SELECT scrGoods.TRANS_OUT_WAREHOUSE_TYPE,scrGoods.TRANS_OUT_WAREHOUSE_ID,scrGoods.TRANS_BUSINESS_ID,scrGoods.BUSINESS_FORM_CODE,scrGoods.TRANS_OUT_WAREHOUSE_TYPE,scrGoods.TRANS_OUT_WAREHOUSE_ID,scrGoods.BASE_GOODS_TEMPLATE_ID,scrGoods.BASE_GOODS_TEMPLATE_NAME,goodsModel.id formScrappedModelId,goodsModel.BASE_GOODS_TEMPLATE_ID,goodsModel.BASE_GOODS_MODELS_ID,goodsModel.COUNTS,goodsModel.PROCURE_MODEL_USER_ID,goodsModel.GOODS_USER_NAME,goodsModel.BASE_GOODS_MODELS_NAME FROM USING_FORM_BACK_GOODS scrGoods LEFT JOIN USING_FORM_BACK_MODEL goodsModel ON scrgoods.id=goodsModel.USING_FORM_BACK_GOODS_ID WHERE scrGoods.USING_FORM_BACK_ID=?", new Object[]{lWhFormBackId});
|
Map<Object, List<Map<String, Object>>> groupByModelIdMap = bfModelList.stream()
|
.collect(Collectors.groupingBy(map -> map.get("BASE_GOODS_MODELS_ID")));
|
Integer warehouseType = depFormScrapped.getOutWarehouseType();
|
Long warehouseId = depFormScrapped.getOutWarehouseId();
|
String warehouseName = depFormScrapped.getOutWarehouseName();
|
|
// 流水记录总表ID
|
long lWarehouseFlowId = IdUtil.generateId();
|
|
// 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中价格的list
|
Map<Long, Long> modelTotalPriceMap = new HashMap<>();
|
|
ArrayList<LWhGoodsRecord> lWhGoodsRecordList = new ArrayList<>();
|
|
//采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量
|
Map<String, Integer> procureModelMap = new HashMap<>();
|
|
for (Object key : groupByModelIdMap.keySet()) {
|
Long modelTotalPrice = 0L;
|
//要报废的总数量
|
int modelTotalNum = 0;
|
|
Long baseGoodsModelsId = (Long) key;
|
List<Map<String, Object>> eachFfModelList = groupByModelIdMap.get(key);
|
Map<String, Object> eachFfModelBase = eachFfModelList.get(0);
|
Long tempGoodsId = Convert.toLong(eachFfModelBase.get("BASE_GOODS_TEMPLATE_ID"));
|
String goodsName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_TEMPLATE_NAME"));
|
String modelName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_MODELS_NAME"));
|
|
// 插入 各规格物品的进出库记录 L_WH_GOODS_RECORD
|
long whGoodsRecordId = IdUtil.generateId();
|
LWhGoodsRecord whGoodsRecord = new LWhGoodsRecord();
|
whGoodsRecord.setId(whGoodsRecordId);
|
whGoodsRecord.setWarehouseType(warehouseType);
|
whGoodsRecord.setWarehouseId(warehouseId);
|
whGoodsRecord.setWarehouseFlowId(lWarehouseFlowId);
|
whGoodsRecord.setBaseGoodsTemplateId(tempGoodsId);
|
whGoodsRecord.setGoodsTemplateName(goodsName);
|
whGoodsRecord.setBaseGoodsModelsId(baseGoodsModelsId);
|
whGoodsRecord.setBaseGoodsModelsName(modelName);
|
whGoodsRecord.setDealTime(dealTime);
|
//本次调整类型 1=调增;2=调减
|
whGoodsRecord.setThisType(2);
|
|
//通过LockManage获得锁
|
Object warehouseModelLockObj = LockManage.acquireLock(warehouseType, warehouseId, baseGoodsModelsId);
|
int goodsModelNum = 0;
|
synchronized (warehouseModelLockObj) {
|
List<Long> warehouseIds = new ArrayList<>(Arrays.asList(warehouseId));
|
goodsModelNum = lWhGoodsService.queryGoodsModelNum(warehouseType, warehouseIds, baseGoodsModelsId, 2, null);
|
for (Map<String, Object> depFormScrappedModel : eachFfModelList) {
|
// 调拨单信息
|
Long transBusinessId = (Long) depFormScrappedModel.get("TRANS_BUSINESS_ID");
|
String nowUserName = Convert.toStr(depFormScrappedModel.get("GOODS_USER_NAME"));
|
Integer counts = Convert.toInt(depFormScrappedModel.get("COUNTS"));
|
Long formScrappedModelId = Convert.toLong(depFormScrappedModel.get("formScrappedModelId"));
|
|
modelTotalNum += counts;
|
|
// 根据分发单、型号、使用人信息查询物品信息
|
List<Map<String, Object>> scrappedGoodsList = lWhGoodsService.queryScrappedGoods(warehouseType, warehouseId, transBusinessId, nowUserName, baseGoodsModelsId, (short) 2, counts);
|
if (CollectionUtils.isEmpty(scrappedGoodsList) || scrappedGoodsList.size() < counts) {
|
log.error("要退回的物品数量不足!");
|
// 手动回滚
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
throw new RuntimeException("报废失败!型号数量不足");
|
}
|
// 放入物品ID等信息
|
depFormScrappedModel.put("scrappedGoodsList", scrappedGoodsList);
|
|
Long formScrappedModelPrice = scrappedGoodsList.stream().mapToLong(map -> (long) map.get("price")).sum();
|
modelTotalPrice += formScrappedModelPrice;
|
// 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中 价格
|
modelTotalPriceMap.put(formScrappedModelId, formScrappedModelPrice);
|
//采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 在用数量
|
Integer procureModelNum = Convert.toInt(procureModelMap.get(transBusinessId + "_" + baseGoodsModelsId), 0);
|
procureModelMap.put(transBusinessId + "_" + baseGoodsModelsId, counts + procureModelNum);
|
|
// 汇总出需要修改状态的物品id
|
List<Long> srappedGoodsIds = scrappedGoodsList.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList());
|
|
// 设置物品为报废状态
|
// lWhGoodsService.modGoodsTransfering(srappedGoodsIds, null, null, null, 3);
|
// 批量插入 进出库流水明细[L_WH_GOODS_RECORD_DETAILS]
|
lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short) 2);
|
}
|
}
|
|
whGoodsRecord.setInitialCount(goodsModelNum);
|
whGoodsRecord.setEndCount(goodsModelNum - modelTotalNum);
|
whGoodsRecord.setThisCount(modelTotalNum);
|
whGoodsRecord.setTotalPrice(modelTotalPrice);
|
// lWhGoodsRecordService.insert(whGoodsRecord);
|
lWhGoodsRecordList.add(whGoodsRecord);
|
}
|
|
// 插入总流水
|
LWarehouseFlow warehouseFlow = new LWarehouseFlow();
|
warehouseFlow.setId(lWarehouseFlowId);
|
warehouseFlow.setWarehouseType(warehouseType);
|
warehouseFlow.setWarehouseId(warehouseId);
|
warehouseFlow.setWarehouseName(warehouseName);
|
warehouseFlow.setThisType(2);
|
warehouseFlow.setBusinessType(WhBusinessEnum.BUMENTUIHUI.getValue() + 0);
|
warehouseFlow.setBusinessFormId(lWhFormBackId);
|
warehouseFlow.setOperatorId(userId);
|
warehouseFlow.setOperatorName(nickName);
|
warehouseFlow.setDealTime(dealTime);
|
// 插入流水总表
|
int flowInsertFlag = lWarehouseFlowService.insert(warehouseFlow);
|
if (flowInsertFlag == 0) {
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
return null;
|
}
|
// 批量插入 各规格物品的进出库【L_WH_GOODS_RECORD】
|
lWhGoodsRecordServiceImpl.insertBatch(lWhGoodsRecordList);
|
|
// 更新报废单
|
depFormScrapped = new UsingFormBack(lWhFormBackId);
|
depFormScrapped.setStates(2);
|
goodsBaseService.update(depFormScrapped);
|
|
// 更新 报废单物品【DEP_FORM_SCRAPPED_MODEL】中价格的list
|
List<Object[]> parameterList = new ArrayList<>();
|
for (Map.Entry<Long, Long> entry : modelTotalPriceMap.entrySet()) {
|
Long key = entry.getKey();
|
Long value = entry.getValue();
|
Object[] one = new Object[2];
|
one[0] = value;
|
one[1] = key;
|
parameterList.add(one);
|
}
|
goodsBaseService.execBatchUpdate("update DEP_FORM_SCRAPPED_MODEL set TOTAL_AMOUNT=? where id=?", parameterList);
|
|
//如果是A类物品,则更新 分发物品使用人【L_WH_PROCURE_MODEL_USER】 中 根据id 更新 在用数量(USE_COUNT)
|
List<Object[]> procureModelUserIdList = new ArrayList<>();
|
for (Map<String, Object> itemMap : bfModelList) {
|
Long procureModelUserId = Convert.toLong(itemMap.get("PROCURE_MODEL_USER_ID"));
|
if (procureModelUserId==null){
|
continue;
|
}
|
Integer counts = Convert.toInt(itemMap.get("COUNTS"));
|
|
// StringBuilder sb = new StringBuilder("update L_WH_PROCURE_MODEL_USER set USE_COUNT=USE_COUNT-").append(counts);
|
// sb.append(" where id=").append(procureModelUserId);
|
// sb.append(" and USE_COUNT-").append(counts).append(" >=0");
|
// goodsBaseService.update(sb.toString());
|
|
Object[] one = new Object[3];
|
one[0] = counts;
|
one[1] = procureModelUserId;
|
one[2] = counts;
|
procureModelUserIdList.add(one);
|
}
|
if (!CollectionUtils.isEmpty(procureModelUserIdList)) {
|
goodsBaseService.execBatchUpdate("update L_WH_PROCURE_MODEL_USER set USE_COUNT=USE_COUNT- ? where id= ? and USE_COUNT- ? >=0", procureModelUserIdList);
|
}
|
|
|
//采购、调拨、出库等的物品型号【L_WH_PROCURE_MODEL】中 根据调拨单+型号 更新 在用数量
|
List<Object[]> procureModelParameterList = new ArrayList<>();
|
for (Map.Entry<String, Integer> entry : procureModelMap.entrySet()) {
|
String key = entry.getKey();
|
Integer modelUseingNum = entry.getValue();
|
String[] strings = key.split("_");
|
String transBusinessId = strings[0];
|
String baseGoodsModelsId = strings[1];
|
Object[] one = new Object[4];
|
one[0] = modelUseingNum;
|
one[1] = transBusinessId;
|
one[2] = baseGoodsModelsId;
|
one[3] = modelUseingNum;
|
procureModelParameterList.add(one);
|
StringBuilder sb = new StringBuilder("update L_WH_PROCURE_MODEL set USE_COUNT=USE_COUNT-");
|
sb.append(modelUseingNum).append(" where BUSINESS_TYPE=4 and BUSINESS_ID=");
|
sb.append(transBusinessId).append(" and BASE_GOODS_MODELS_ID=");
|
sb.append(baseGoodsModelsId).append(" and USE_COUNT-");
|
sb.append(modelUseingNum).append(" >=0");
|
goodsBaseService.update(sb.toString());
|
}
|
// goodsBaseService.execBatchUpdate("update L_WH_PROCURE_MODEL set USE_COUNT=USE_COUNT-? where BUSINESS_TYPE=4 and BUSINESS_ID=? and BASE_GOODS_MODELS_ID=? and USE_COUNT=USE_COUNT-? >0", parameterList);
|
|
|
// 操作入库,此时要按物品所属仓库 生成不同仓库入库的流水
|
Map<String, List<Map<String, Object>>> groupByOutWarehouseIdMap = bfModelList.stream()
|
.collect(Collectors.groupingBy(map -> map.get("TRANS_OUT_WAREHOUSE_TYPE") + "_" + map.get("TRANS_OUT_WAREHOUSE_ID")));
|
//每个仓库一个流水表
|
ArrayList<LWarehouseFlow> flowArrayList = new ArrayList<>();
|
ArrayList<LWhGoodsRecord> flowRecordArrayList = new ArrayList<>();
|
|
for (String outWarehouseTypeAndId : groupByOutWarehouseIdMap.keySet()) {
|
List<Map<String, Object>> eachWareHouseList = groupByOutWarehouseIdMap.get(outWarehouseTypeAndId);
|
Map<String, Object> eachWarehouseModelMap = eachWareHouseList.get(0);
|
|
// Integer inWareHouseType = Convert.toInt(eachWarehouseModelMap.get("TRANS_OUT_WAREHOUSE_TYPE"));
|
Long inWarehouseId = Convert.toLong(eachWarehouseModelMap.get("TRANS_OUT_WAREHOUSE_ID"));
|
String inWarehouseName = null;
|
BaseWarehouse baseWarehouse = goodsBaseService.get(new BaseWarehouse(inWarehouseId));
|
if (baseWarehouse != null) {
|
inWarehouseName = baseWarehouse.getWarehouseName();
|
}
|
|
// 每个仓库一个流水表
|
LWarehouseFlow inWarehouseFlow = new LWarehouseFlow();
|
// 流水记录总表ID
|
long inWarehouseFlowId = IdUtil.generateId();
|
inWarehouseFlow.setId(inWarehouseFlowId);
|
inWarehouseFlow.setWarehouseType(0);
|
inWarehouseFlow.setWarehouseId(inWarehouseId);
|
inWarehouseFlow.setWarehouseName(inWarehouseName);
|
inWarehouseFlow.setThisType(1);
|
inWarehouseFlow.setBusinessType(WhBusinessEnum.BUMENTUIHUI.getValue() + 0);
|
inWarehouseFlow.setBusinessFormId(lWhFormBackId);
|
inWarehouseFlow.setOperatorId(userId);
|
inWarehouseFlow.setOperatorName(nickName);
|
inWarehouseFlow.setDealTime(dealTime);
|
flowArrayList.add(inWarehouseFlow);
|
|
//按型号分 每个型号一个 L_WH_GOODS_RECORD
|
Map<Object, List<Map<String, Object>>> eachWareHouseModelMap = eachWareHouseList.stream()
|
.collect(Collectors.groupingBy(map -> map.get("BASE_GOODS_MODELS_ID")));
|
for (Object key : eachWareHouseModelMap.keySet()) {
|
Long baseGoodsModelsId = (Long) key;
|
|
List<Map<String, Object>> eachFfModelList = eachWareHouseModelMap.get(baseGoodsModelsId);
|
Map<String, Object> eachFfModelBase = eachFfModelList.get(0);
|
Long tempGoodsId = Convert.toLong(eachFfModelBase.get("BASE_GOODS_TEMPLATE_ID"));
|
String goodsName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_TEMPLATE_NAME"));
|
String modelName = Convert.toStr(eachFfModelBase.get("BASE_GOODS_MODELS_NAME"));
|
|
// 插入 各规格物品的进出库记录 L_WH_GOODS_RECORD
|
long whGoodsRecordId = IdUtil.generateId();
|
LWhGoodsRecord whGoodsRecord = new LWhGoodsRecord();
|
whGoodsRecord.setId(whGoodsRecordId);
|
whGoodsRecord.setWarehouseType(0);
|
whGoodsRecord.setWarehouseId(inWarehouseId);
|
whGoodsRecord.setWarehouseFlowId(inWarehouseFlowId);
|
whGoodsRecord.setBaseGoodsTemplateId(tempGoodsId);
|
whGoodsRecord.setGoodsTemplateName(goodsName);
|
whGoodsRecord.setBaseGoodsModelsId(baseGoodsModelsId);
|
whGoodsRecord.setBaseGoodsModelsName(modelName);
|
whGoodsRecord.setDealTime(dealTime);
|
//本次调整类型 1=调增;2=调减
|
whGoodsRecord.setThisType(1);
|
//通过LockManage获得锁
|
Object warehouseModelLockObj = LockManage.acquireLock(0, inWarehouseId, baseGoodsModelsId);
|
int goodsModelNum = 0;
|
// 存放所有的物品id 价格等信息
|
List<Map<String, Object>> scrappedAllGoodsList = new ArrayList<>();
|
synchronized (warehouseModelLockObj) {
|
//查询期初数量
|
List<Long> warehouseIds = new ArrayList<>(Arrays.asList(inWarehouseId));
|
goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null);
|
for (Map<String, Object> depFormScrappedModel : eachFfModelList) {
|
scrappedAllGoodsList.addAll((List<Map<String, Object>>) depFormScrappedModel.get("scrappedGoodsList"));
|
}
|
// 汇总出需要修改状态的物品id
|
List<Long> srappedGoodsIds = scrappedAllGoodsList.stream().map(map -> (Long) map.get("id")).collect(Collectors.toList());
|
|
// 设置物品为入库未分发, 并设置所属仓库
|
lWhGoodsService.modGoodsTransfering(srappedGoodsIds, 0, inWarehouseId, warehouseName, 1);
|
// 使用人信息
|
|
// 批量插入 进出库流水明细[L_WH_GOODS_RECORD_DETAILS]
|
lWhGoodsRecordDetailsService.sameGoodsInsertMore(srappedGoodsIds, whGoodsRecordId, (short) 1);
|
}
|
// 上方物品的价格
|
Long formScrappedModelPrice = scrappedAllGoodsList.stream().mapToLong(map -> (long) map.get("price")).sum();
|
whGoodsRecord.setInitialCount(goodsModelNum);
|
whGoodsRecord.setEndCount(goodsModelNum + scrappedAllGoodsList.size());
|
whGoodsRecord.setThisCount(scrappedAllGoodsList.size());
|
whGoodsRecord.setTotalPrice(formScrappedModelPrice);
|
//lWhGoodsRecordService.insert(whGoodsRecord);
|
flowRecordArrayList.add(whGoodsRecord);
|
}
|
|
// 提取baseGoodsModelsId并放入新的List中
|
List<Long> allChangModelList = eachWareHouseList.stream()
|
.map(map -> Convert.toLong(map.get("BASE_GOODS_MODELS_ID")))
|
.distinct()
|
.collect(Collectors.toList());
|
//当库存变动时调用该方法
|
lWhWarningCoreService.updateKuCun((short) 0, inWarehouseId, allChangModelList, null, dealTime);
|
}
|
// 插入流水总表
|
flowInsertFlag = lWarehouseFlowService.insertBatch(flowArrayList);
|
if (flowInsertFlag == 0) {
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
return null;
|
}
|
// 批量插入 各规格物品的进出库【L_WH_GOODS_RECORD】
|
lWhGoodsRecordServiceImpl.insertBatch(flowRecordArrayList);
|
|
return null;
|
}
|
}
|