package com.consum.base.service.core;
|
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
import org.springframework.util.CollectionUtils;
|
|
import com.consum.base.core.CodeGeneratorEnum;
|
import com.consum.base.core.CodeGeneratorService;
|
import com.consum.base.core.WhBusinessEnum;
|
import com.consum.base.core.utils.IdUtil;
|
import com.consum.base.service.BaseGoodsTemplateService;
|
import com.consum.base.service.BaseWarehouseService;
|
import com.consum.base.service.LWhFormInventoryGoodsService;
|
import com.consum.base.service.LWhFormInventoryService;
|
import com.consum.base.service.LWhFormOutputService;
|
import com.consum.base.service.LWhFormProcureGoodsService;
|
import com.consum.base.service.LWhFormProcureService;
|
import com.consum.base.service.LWhGoodsService;
|
import com.consum.base.service.LWhProcureModelService;
|
import com.consum.model.po.BaseWarehouse;
|
import com.consum.model.po.FinSysTenantUser;
|
import com.consum.model.po.LWhFormInventory;
|
import com.consum.model.po.LWhFormInventoryGoods;
|
import com.consum.model.po.LWhFormOutput;
|
import com.consum.model.po.LWhFormProcure;
|
import com.consum.model.po.LWhFormProcureGoods;
|
import com.consum.model.po.LWhProcureModel;
|
import com.iplatform.model.po.S_user_core;
|
import com.walker.infrastructure.utils.NumberGenerator;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
/**
|
* @ClassName LWhFormInventoryCoreService
|
* @Date 2023/11/1
|
* @Description
|
* @Version 1.0
|
**/
|
@Slf4j
|
@Service
|
@Transactional(propagation = Propagation.REQUIRED)
|
public class LWhFormInventoryCoreService {
|
|
private LWhFormInventoryGoodsService lWhFormInventoryGoods;
|
private LWhFormOutputCoreService lWhFormOutputCoreService;
|
private CodeGeneratorService codeGeneratorService;
|
private LWhFormProcureService lWhFormProcureServiceImpl;
|
private BaseWarehouseService baseWarehouseService;
|
private LWhFormProcureGoodsService lWhFormProcureGoodsServiceImpl;
|
private LWhProcureModelService lWhProcureModelService;
|
private BaseGoodsTemplateService baseGoodsTemplateService;
|
private LWhGoodsService lWhGoodsService;
|
private LWhFormInventoryService lWhFormInventoryService;
|
private LWhFormProcureCoreService lWhFormProcureCoreService;
|
private LWhFormOutputService lWhFormOutputService;
|
|
@Autowired
|
public LWhFormInventoryCoreService(LWhFormInventoryGoodsService lWhFormInventoryGoods,
|
LWhFormOutputCoreService lWhFormOutputCoreService,
|
CodeGeneratorService codeGeneratorService,
|
LWhFormProcureService lWhFormProcureServiceImpl,
|
BaseWarehouseService baseWarehouseService,
|
LWhFormProcureGoodsService lWhFormProcureGoodsServiceImpl,
|
LWhProcureModelService lWhProcureModelService,
|
BaseGoodsTemplateService baseGoodsTemplateService,
|
LWhGoodsService lWhGoodsService,
|
LWhFormInventoryService lWhFormInventoryService,
|
LWhFormProcureCoreService lWhFormProcureCoreService,
|
LWhFormOutputService lWhFormOutputService
|
|
) {
|
this.lWhFormInventoryGoods = lWhFormInventoryGoods;
|
this.lWhFormOutputCoreService = lWhFormOutputCoreService;
|
this.codeGeneratorService = codeGeneratorService;
|
this.lWhFormProcureServiceImpl = lWhFormProcureServiceImpl;
|
this.baseWarehouseService = baseWarehouseService;
|
this.lWhFormProcureGoodsServiceImpl = lWhFormProcureGoodsServiceImpl;
|
this.lWhProcureModelService = lWhProcureModelService;
|
this.baseGoodsTemplateService = baseGoodsTemplateService;
|
this.lWhGoodsService = lWhGoodsService;
|
this.lWhFormInventoryService = lWhFormInventoryService;
|
this.lWhFormProcureCoreService = lWhFormProcureCoreService;
|
this.lWhFormOutputService = lWhFormOutputService;
|
}
|
|
/**
|
* 根据 盘点单 生成 出库单 和 入库单 盘点单中 盘盈物品生成入库单,盘亏生成出库单
|
*
|
* @param whformInventoryId 盘点单id
|
* @return status true/false errMsg 错误消息
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
public String createInOutFormByInventoryId(Long whformInventoryId, S_user_core currentUser, FinSysTenantUser sysInfo) {
|
LWhFormInventory lWhFormInventory = lWhFormInventoryService.get(new LWhFormInventory(whformInventoryId));
|
if (lWhFormInventory == null) {
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "没有找到盘点单");
|
return "没有找到盘点单";
|
}
|
if (lWhFormInventory.getStates() != 1) {
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "请检查盘点单状态");
|
return "请检查盘点单状态";
|
}
|
List<LWhFormInventoryGoods> lWhFormInventoryGoods = this.lWhFormInventoryGoods.getByInventoryId(whformInventoryId);
|
if (CollectionUtils.isEmpty(lWhFormInventoryGoods)) {
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "没有找到盘点单结果物品");
|
return "没有找到盘点单结果物品";
|
}
|
Map<Integer, List<LWhFormInventoryGoods>> inventoryGoodsMap = lWhFormInventoryGoods.stream()
|
.filter(goods -> goods.getInventoryResult() == 2 || goods.getInventoryResult() == 3)
|
.collect(Collectors.groupingBy(LWhFormInventoryGoods::getInventoryResult));
|
if (CollectionUtils.isEmpty(lWhFormInventoryGoods)) {
|
// rtnMap.put("status", true);
|
return null;
|
}
|
|
Long warehouseId = lWhFormInventory.getWarehouseId();
|
Long stopTime = lWhFormInventory.getStopTime();
|
Map<String, Object> inOutMap = new HashMap<>();
|
|
for (Map.Entry<Integer, List<LWhFormInventoryGoods>> entry : inventoryGoodsMap.entrySet()) {
|
//盘点结果(1=正常;2=盘盈;3=盘亏)
|
Integer inventoryResult = entry.getKey();
|
List<LWhFormInventoryGoods> inventoryGoods = entry.getValue();
|
if (inventoryResult == 2) {
|
// 创建入库单并入库
|
// 返回入库单号
|
Map<String, Object> rkMap = createInFormByInventoryId(warehouseId, stopTime, inventoryGoods, currentUser);
|
if (rkMap == null) {
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
// throw new RuntimeException("创建入库单失败");
|
log.error("创建入库单失败");
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "创建入库单失败");
|
return "创建入库单失败";
|
}
|
inOutMap.putAll(rkMap);
|
Long inFormByInventoryId = (Long) inOutMap.get("inId");
|
String errMsg = lWhFormProcureCoreService.doProcure(inFormByInventoryId, currentUser);
|
if (errMsg != null) {
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
// throw new RuntimeException(errMsg);
|
log.error("创建入库单失败");
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "创建入库单失败");
|
return "创建入库单失败";
|
}
|
} else {
|
// 创建出库单并出库
|
Map<String, Object> ckMap = createOutFormByInventoryId(warehouseId, stopTime, inventoryGoods, currentUser, sysInfo);
|
if (ckMap == null) {
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
// throw new RuntimeException("创建出库单失败");
|
log.error("创建入库单失败");
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "创建入库单失败");
|
return "创建入库单失败";
|
}
|
inOutMap.putAll(ckMap);
|
Long lWhFormOutputId = (Long) inOutMap.get("outId");
|
//2.根据出库单出库
|
Long lWarehouseFlowId = lWhFormOutputCoreService.outFormByTransId(lWhFormOutputId, WhBusinessEnum.PANDIAN, currentUser, stopTime,null);
|
if (lWarehouseFlowId == null) {
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
// throw new RuntimeException("创建出库单失败");
|
log.error("创建入库单失败");
|
// rtnMap.put("status", false);
|
// rtnMap.put("errMsg", "创建入库单失败");
|
return "创建入库单失败";
|
}
|
}
|
}
|
//
|
lWhFormInventory = new LWhFormInventory(whformInventoryId);
|
lWhFormInventory.setStates(2);
|
lWhFormInventory.setInWarehouseFormId((Long) inOutMap.get("inId"));
|
lWhFormInventory.setInBusinessFormCode((String) inOutMap.get("inCode"));
|
lWhFormInventory.setOutWarehouseFormId((Long) inOutMap.get("outId"));
|
lWhFormInventory.setOutBusinessFormCode((String) inOutMap.get("outCode"));
|
lWhFormInventoryService.update(lWhFormInventory);
|
|
return null;
|
}
|
|
/**
|
* 根据信息创建入库单
|
*
|
* @param warehouseId 仓库ID
|
* @param procureTime 采购时间
|
* @param currentUser
|
*/
|
private Map<String, Object> createInFormByInventoryId(Long warehouseId, Long procureTime, List<LWhFormInventoryGoods> inventoryGoodsList,
|
S_user_core currentUser) {
|
if (CollectionUtils.isEmpty(inventoryGoodsList)) {
|
return null;
|
}
|
Long whFormProcureId = NumberGenerator.getLongSequenceNumber();
|
BaseWarehouse baseWarehouse = baseWarehouseService.getById(warehouseId);
|
LWhFormProcure lWhFormProcure = new LWhFormProcure();
|
lWhFormProcure.setId(whFormProcureId);
|
String inCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.Procure_Warehouse);
|
lWhFormProcure.setBusinessFormCode(inCode);
|
lWhFormProcure.setWarehouseId(warehouseId);
|
lWhFormProcure.setWarehouseName(baseWarehouse.getWarehouseName());
|
lWhFormProcure.setBuyerId(currentUser.getId());
|
lWhFormProcure.setBuyerName(currentUser.getNick_name());
|
lWhFormProcure.setProcureTime(procureTime);
|
lWhFormProcure.setProcureDoc(null);
|
lWhFormProcure.setBuyType(2);
|
lWhFormProcure.setStates(1);
|
lWhFormProcure.setAgencyId(baseWarehouse.getAgencyId());
|
lWhFormProcure.setAgencyName(baseWarehouse.getAgencyName());
|
int result = lWhFormProcureServiceImpl.insert(lWhFormProcure);
|
if (result == 0) {
|
return null;
|
}
|
|
ArrayList<LWhFormProcureGoods> procureGoodList = new ArrayList<>();
|
ArrayList<LWhProcureModel> whProcureModeLlist = new ArrayList<>();
|
|
for (LWhFormInventoryGoods inventoryGoods : inventoryGoodsList) {
|
Long baseGoodsModelsId = inventoryGoods.getBaseGoodsModelsId();
|
Long baseGoodsTemplateId = inventoryGoods.getBaseGoodsTemplateId();
|
//查询型号信息
|
Map<String, Object> tempGoodsInfo = baseGoodsTemplateService.queryGoodsInfoByModelId(baseGoodsModelsId);
|
Long baseCategoryId = Long.valueOf(tempGoodsInfo.get("categoryid") + "");
|
|
LWhFormProcureGoods procureGood = new LWhFormProcureGoods();
|
long fromProcureGoodsId = NumberGenerator.getLongSequenceNumber();
|
procureGood.setId(fromProcureGoodsId);
|
procureGood.setWhFormProcureId(whFormProcureId);
|
procureGood.setBaseCategoryId(baseCategoryId);
|
procureGood.setBaseGoodsTemplateId(baseGoodsTemplateId);
|
procureGood.setGoodsTemplateName(null);
|
procureGood.setSupplier(null);
|
procureGood.setSort(null);
|
|
Integer counts = inventoryGoods.getErrorCounts();
|
if (counts == null || counts <= 0) {
|
continue;
|
}
|
// 查询型号库存
|
List<Long> warehouseIds = new ArrayList<>(Arrays.asList(warehouseId));
|
int goodsModelNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null);
|
LWhProcureModel model = new LWhProcureModel();
|
model.setId(IdUtil.generateId());
|
model.setFromProcureGoodsId(fromProcureGoodsId);
|
model.setBusinessType(WhBusinessEnum.CAIGOU.getValue() + 0);
|
model.setBusinessId(whFormProcureId);
|
model.setBaseGoodsModelsId(baseGoodsModelsId);
|
model.setPrice(0L);
|
model.setCounts(counts);
|
model.setWorehouseCount(goodsModelNum);
|
model.setSupplier(null);
|
model.setBaseGoodsModelsId(inventoryGoods.getBaseGoodsModelsId());
|
model.setBaseGoodsModelsName(inventoryGoods.getBaseGoodsModelsName());
|
|
whProcureModeLlist.add(model);
|
procureGoodList.add(procureGood);
|
}
|
lWhFormProcureGoodsServiceImpl.insertBatch(procureGoodList);
|
lWhProcureModelService.insertBatch(whProcureModeLlist);
|
|
HashMap<String, Object> rtnMap = new HashMap<>();
|
rtnMap.put("inId", whFormProcureId);
|
rtnMap.put("inCode", inCode);
|
return rtnMap;
|
}
|
|
/**
|
* 根据信息创建出库单
|
*
|
* @param warehouseId 仓库ID
|
* @param procureTime 出库时间
|
* @param currentUser
|
*/
|
private Map<String, Object> createOutFormByInventoryId(Long warehouseId, Long procureTime, List<LWhFormInventoryGoods> inventoryGoodsList,
|
S_user_core currentUser, FinSysTenantUser sysInfo) {
|
if (CollectionUtils.isEmpty(inventoryGoodsList)) {
|
return null;
|
}
|
//1.新增出库单记录
|
LWhFormOutput lWhFormOutput = new LWhFormOutput();
|
//出入库id
|
long lWhFormOutputId = IdUtil.generateId();
|
lWhFormOutput.setId(lWhFormOutputId);
|
lWhFormOutput.setOutWarehouseType(0);
|
lWhFormOutput.setWarehouseId(warehouseId);
|
//根据仓库id查询仓库
|
BaseWarehouse warehouse = this.baseWarehouseService.getById(warehouseId);
|
if (warehouse == null) {
|
log.error("仓库id不存在");
|
return null;
|
}
|
lWhFormOutput.setWarehouseName(warehouse.getWarehouseName());
|
String outCode = codeGeneratorService.createBusinessFormCode(CodeGeneratorEnum.OutPut_Warehouse);
|
lWhFormOutput.setOutputCode(outCode);
|
lWhFormOutput.setOutputName("盘点出库");
|
// lWhFormOutput.setAgencyId(Long.valueOf(sysInfo.getTenantId()));
|
lWhFormOutput.setAgencyId(null);
|
// lWhFormOutput.setAgencyName(sysInfo.getTenantName());
|
lWhFormOutput.setAgencyName(null);
|
lWhFormOutput.setOperatorId(sysInfo.getId());
|
lWhFormOutput.setOperatorName(sysInfo.getUserName());
|
|
lWhFormOutput.setDealTime(procureTime);
|
lWhFormOutput.setStates(1);
|
int flag1 = lWhFormOutputService.insert(lWhFormOutput);
|
if (flag1 != 1) {
|
return null;
|
}
|
ArrayList<LWhProcureModel> lWhProcureModels = new ArrayList<>();
|
for (LWhFormInventoryGoods inventoryGoods : inventoryGoodsList) {
|
Long baseGoodsModelsId = inventoryGoods.getBaseGoodsModelsId();
|
Integer counts = inventoryGoods.getErrorCounts();
|
if (counts == null || counts <= 0) {
|
continue;
|
}
|
//根据物品型号查询物品库存
|
List<Long> warehouseIds = new ArrayList<>(Arrays.asList(warehouseId));
|
int goodsNum = lWhGoodsService.queryGoodsModelNum(0, warehouseIds, baseGoodsModelsId, 1, null);
|
//新增L_WH_PROCURE_MODEL记录
|
LWhProcureModel lWhProcureModel = new LWhProcureModel();
|
lWhProcureModel.setId(IdUtil.generateId());
|
lWhProcureModel.setBusinessType(WhBusinessEnum.CHUKU.getValue());
|
lWhProcureModel.setBusinessId(lWhFormOutputId);
|
lWhProcureModel.setBaseGoodsModelsId(baseGoodsModelsId);
|
lWhProcureModel.setCounts(counts);
|
lWhProcureModel.setWorehouseCount(goodsNum);
|
// lWhProcureModelService.insert(lWhProcureModel);
|
lWhProcureModels.add(lWhProcureModel);
|
}
|
if (!CollectionUtils.isEmpty(lWhProcureModels)) {
|
lWhProcureModelService.insertBatch(lWhProcureModels);
|
}
|
HashMap<String, Object> rtnMap = new HashMap<>();
|
rtnMap.put("outId", lWhFormOutputId);
|
rtnMap.put("outCode", outCode);
|
return rtnMap;
|
|
}
|
}
|