You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
udi-wms-java/src/main/java/com/glxp/api/service/inout/IoChangeInoutService.java

364 lines
18 KiB
Java

package com.glxp.api.service.inout;
import com.glxp.api.entity.basic.UdiRelevanceEntity;
import com.glxp.api.service.basic.UdiRelevanceService;
import com.glxp.api.service.inout.impl.IoCodeService;
import com.glxp.api.util.*;
import org.springframework.beans.BeanUtils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.glxp.api.constant.Constant;
import com.glxp.api.constant.ConstantStatus;
import com.glxp.api.constant.ConstantType;
import com.glxp.api.entity.auth.InvWarehouseEntity;
import com.glxp.api.entity.basic.BasicBusTypePreEntity;
import com.glxp.api.entity.basic.BasicBussinessTypeEntity;
import com.glxp.api.entity.inout.*;
import com.glxp.api.service.auth.InvWarehouseService;
import com.glxp.api.service.basic.IBasicBusTypePreService;
import com.glxp.api.service.basic.IBasicBussinessTypeService;
import com.glxp.api.service.inout.impl.IoOrderInvoiceService;
import com.glxp.api.service.system.SystemParamConfigService;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 单据流转
*/
@Service
public class IoChangeInoutService {
@Resource
IBasicBusTypePreService basicBusTypePreService;
@Resource
IoCodeService codeService;
@Resource
IoOrderService orderService;
@Resource
IBasicBussinessTypeService basicBussinessTypeService;
@Resource
GennerOrderUtils gennerOrderUtils;
@Resource
IoAddInoutService addInoutService;
@Resource
@Lazy
IoCheckInoutService ioCheckInoutService;
@Resource
InvWarehouseService invWarehouseService;
@Resource
SystemParamConfigService systemParamConfigService;
@Resource
IoCodeTempService codeTempService;
@Resource
IoOrderInvoiceService ioOrderInvoiceService;
@Resource
IoOrderDetailBizService orderDetailBizService;
public void changeOrder(IoOrderEntity orderEntity) {
BasicBusTypePreEntity basicBusTypePreEntity = basicBusTypePreService.findByOriginAction(orderEntity.getAction());
List<IoCodeEntity> codeEnttities = codeService.findByOrderId(orderEntity.getBillNo());
if (basicBusTypePreEntity != null) {
buildInOrder(basicBusTypePreEntity, codeEnttities, orderEntity, true);
}
//结束,不生成库存,
}
//后续做修改
public void changeBusOrder(IoOrderEntity orderEntity) {
}
//普通出入库单据流转
public void genNewOrder(IoOrderEntity orderEntity) {
if (orderEntity.getFromType() == ConstantStatus.FROM_UDISP && (orderEntity.getOutChangeEnable() != null && !orderEntity.getOutChangeEnable())) {
return;
}
BasicBusTypePreEntity basicBusTypePreEntity = basicBusTypePreService.findByOriginAction(orderEntity.getAction());
List<IoCodeEntity> codeEnttities = codeService.findByOrderId(orderEntity.getBillNo());
if (basicBusTypePreEntity.getSupplementAll()) {//全量补单
buildInOrder(basicBusTypePreEntity, codeEnttities, orderEntity, false);
}
}
@Resource
UdiRelevanceService udiRelevanceService;
/**
* 单据补单
*
* @param bussinessChangeTypeEntity
* @param useInList
* @param orderEntity
* @param isGenInovice
*/
public void buildInOrder(BasicBusTypePreEntity bussinessChangeTypeEntity, List<IoCodeEntity> useInList, IoOrderEntity orderEntity, boolean isGenInovice) {
if (StrUtil.isEmpty(orderEntity.getRelKey())) {
orderEntity.setRelKey(UUID.fastUUID().toString(true));
orderService.update(orderEntity);
}
if (useInList.size() <= 0) {
return;
}
//是否根据耗材属性拆单
if (IntUtil.value(bussinessChangeTypeEntity.getSplitOrder()) > 0) {
List<BasicBusTypePreEntity> busTypePreEntities = basicBusTypePreService.findByOiginActions(orderEntity.getAction());
if (CollUtil.isNotEmpty(busTypePreEntities)) {
List<IoCodeEntity> normalCodes = new ArrayList<>();
List<IoCodeEntity> preInCodes = new ArrayList<>();
List<IoCodeEntity> preCodes = new ArrayList<>();
for (IoCodeEntity codeEntity : useInList) {
if (udiRelevanceService.findPurType(codeEntity.getRelId()) == ConstantStatus.ACTION_TYPE_NORMAL) {
normalCodes.add(codeEntity);
} else if (udiRelevanceService.findPurType(codeEntity.getRelId()) == ConstantStatus.ACTION_TYPE_PREIN) {
preInCodes.add(codeEntity);
} else if (udiRelevanceService.findPurType(codeEntity.getRelId()) == ConstantStatus.ACTION_TYPE_ADVANCE) {
preCodes.add(codeEntity);
}
}
BasicBussinessTypeEntity targetBustypeEntity;
for (BasicBusTypePreEntity busTypePreEntity : busTypePreEntities) {
targetBustypeEntity = basicBussinessTypeService.findByAction(busTypePreEntity.getAction());
if (busTypePreEntity.getSplitOrder() == ConstantStatus.ACTION_TYPE_NORMAL && CollUtil.isNotEmpty(normalCodes)) {
buildGenOrder(targetBustypeEntity, busTypePreEntity, normalCodes, orderEntity, isGenInovice);
} else if (busTypePreEntity.getSplitOrder() == ConstantStatus.ACTION_TYPE_PREIN && CollUtil.isNotEmpty(preInCodes)) {
buildGenOrder(targetBustypeEntity, busTypePreEntity, preInCodes, orderEntity, isGenInovice);
} else if (busTypePreEntity.getSplitOrder() == ConstantStatus.ACTION_TYPE_ADVANCE && CollUtil.isNotEmpty(preCodes)) {
buildGenOrder(targetBustypeEntity, busTypePreEntity, preCodes, orderEntity, isGenInovice);
}
}
}
} else {
//补单根据集采、非集采拆单
BasicBussinessTypeEntity targetBustypeEntity = basicBussinessTypeService.findByAction(bussinessChangeTypeEntity.getAction());
List<IoCodeEntity> groupBuyList = new ArrayList<>();
List<IoCodeEntity> unGroupBuyList = new ArrayList<>();
if (IntUtil.value(targetBustypeEntity.getGroupBuySplit()) == 1) {
for (IoCodeEntity codeEntity : useInList) {
UdiRelevanceEntity udiRelevanceEntity = udiRelevanceService.selectById(codeEntity.getRelId());
if (IntUtil.value(udiRelevanceEntity.getGroupBuy())) {
groupBuyList.add(codeEntity);
} else {
unGroupBuyList.add(codeEntity);
}
}
if (CollUtil.isNotEmpty(groupBuyList)) {
String value = systemParamConfigService.selectValueByParamKey("split_groupbuy");
if (IntUtil.value(value) > 0) {
Map<Long, List<IoCodeEntity>> splitMap = groupBuyList.stream()
.collect(Collectors.groupingBy(IoCodeEntity::getRelId));
if (splitMap.size() > 1) {
for (List<IoCodeEntity> splitItems : splitMap.values()) {
buildGenOrder(targetBustypeEntity, bussinessChangeTypeEntity, splitItems, orderEntity, isGenInovice);
}
}
} else {
buildGenOrder(targetBustypeEntity, bussinessChangeTypeEntity, groupBuyList, orderEntity, isGenInovice);
}
}
if (CollUtil.isNotEmpty(unGroupBuyList)) {
buildGenOrder(targetBustypeEntity, bussinessChangeTypeEntity, unGroupBuyList, orderEntity, isGenInovice);
}
} else {
buildGenOrder(targetBustypeEntity, bussinessChangeTypeEntity, useInList, orderEntity, isGenInovice);
}
}
}
public void buildGenOrder(BasicBussinessTypeEntity targetBustypeEntity, BasicBusTypePreEntity bussinessChangeTypeEntity, List<IoCodeEntity> useInList, IoOrderEntity orderEntity, boolean isGenInvoice) {
Map<String, List<IoCodeEntity>> filterSupMaps = new HashMap<>();
//过滤供应商
if (targetBustypeEntity.getCorpType() == ConstantStatus.CORP_TYPE_OUT || bussinessChangeTypeEntity.getCreateType() == 3 || bussinessChangeTypeEntity.getCreateType() == 4) {
for (IoCodeEntity warehouseEntity : useInList) {
if (warehouseEntity.getSupId() != null) {
if (filterSupMaps.get(warehouseEntity.getSupId()) == null) {
List<IoCodeEntity> temps = new ArrayList<>();
temps.add(warehouseEntity);
filterSupMaps.put(warehouseEntity.getSupId(), temps);
} else {
filterSupMaps.get(warehouseEntity.getSupId()).add(warehouseEntity);
}
}
}
} else {
// 原先单据流程
filterSupMaps.put("test", useInList);
// filterSupMaps.put(bussinessChangeTypeEntity.getDefaultInvCode(), useInList);
}
//根据往来单位生成入库单
for (String corpName : filterSupMaps.keySet()) {
List<IoCodeEntity> temps;
temps = filterSupMaps.get(corpName);
IoOrderEntity outOrder = new IoOrderEntity();
BeanUtils.copyProperties(orderEntity, outOrder);
outOrder.setId(null);
outOrder.setSupplementNo(null);//补单需置空
if (bussinessChangeTypeEntity.getBeforeTime() != null)
outOrder.setCreateTime(MsDateUtil.getBeforeDay(MsDateUtil.fromDate(orderEntity), bussinessChangeTypeEntity.getBeforeTime()));
else
outOrder.setCreateTime(new Date()); //不设,默认为当前时间
outOrder.setAction(targetBustypeEntity.getAction());
outOrder.setMainAction(targetBustypeEntity.getMainAction());
outOrder.setBusType(targetBustypeEntity.getBusType());
outOrder.setFromType(ConstantStatus.FROM_CHANGE);
String orderNo = gennerOrderUtils.createScOrderNo(new OrderNoTypeBean(Constant.SCAN_ORDER + StrUtil.trimToEmpty(targetBustypeEntity.getPrefix()), "yyyyMMdd"));
outOrder.setBillNo(orderNo);
if (bussinessChangeTypeEntity.getCreateType() == 1) {//送货至入库补单
outOrder.setCustomerId(corpName);
outOrder.setFromCorp(corpName);
outOrder.setFromInvCode(null);
outOrder.setFromDeptCode(null);
} else if (bussinessChangeTypeEntity.getCreateType() == 3) { //预验收转入库单模式
outOrder.setCustomerId(corpName);
outOrder.setFromCorp(corpName);
InvWarehouseEntity invWarehouseEntity = invWarehouseService.findByPreInInv();
outOrder.setFromInvCode(invWarehouseEntity.getCode());
outOrder.setFromDeptCode(invWarehouseEntity.getParentId());
} else if (bussinessChangeTypeEntity.getCreateType() == 4) { //寄售转入库单模式
outOrder.setCustomerId(corpName);
outOrder.setFromCorp(corpName);
InvWarehouseEntity invWarehouseEntity = invWarehouseService.findByPreInv();
outOrder.setFromInvCode(invWarehouseEntity.getCode());
outOrder.setFromDeptCode(invWarehouseEntity.getParentId());
} else if (bussinessChangeTypeEntity.getCreateType() == 5) { //退货出库
outOrder.setCustomerId(Constant.SYSTEM_CUSTOMER_ID);
InvWarehouseEntity curInv = invWarehouseService.findByInvSubByCode(orderEntity.getInvCode());
InvWarehouseEntity upInv = invWarehouseService.findByInvSubByCode(curInv.getParentCode());
if (upInv != null) {
outOrder.setFromInvCode(upInv.getCode());
outOrder.setFromDeptCode(upInv.getParentId());
outOrder.setFromCorp(null);
} else {
outOrder.setCustomerId(corpName);
outOrder.setFromCorp(corpName);
}
//原先流程---使用流转单据默认仓库
// outOrder.setFromInvCode(bussinessChangeTypeEntity.getDefaultInvCode());
// outOrder.setFromDeptCode(bussinessChangeTypeEntity.getDefaultDeptCode());
} else { //向上级补单模式
outOrder.setCustomerId(Constant.SYSTEM_CUSTOMER_ID);
InvWarehouseEntity curInv = invWarehouseService.findByInvSubByCode(orderEntity.getInvCode());
InvWarehouseEntity upInv = invWarehouseService.findByInvSubByCode(curInv.getParentCode());
if (upInv != null) {
outOrder.setFromInvCode(upInv.getCode());
outOrder.setFromDeptCode(upInv.getParentId());
outOrder.setFromCorp(null);
}
if (StrUtil.isNotEmpty(bussinessChangeTypeEntity.getDefaultInvCode())) {
outOrder.setFromInvCode(bussinessChangeTypeEntity.getDefaultInvCode());
InvWarehouseEntity fromInv = invWarehouseService.findByInvSubByCode(bussinessChangeTypeEntity.getDefaultInvCode());
outOrder.setFromDeptCode(fromInv.getParentId());
}
//原先流程---使用流转单据默认仓库
// outOrder.setFromInvCode(bussinessChangeTypeEntity.getDefaultInvCode());
// outOrder.setFromDeptCode(bussinessChangeTypeEntity.getDefaultDeptCode());
outOrder.setFromCorp(null);
}
outOrder.setCorpOrderId(CustomUtil.getId() + "x");
//原先流程---使用流转单据默认仓库
// InvWarehouseEntity invWarehouseEntity = invWarehouseService.findByInvSubByCode(bussinessChangeTypeEntity.getInvCode());
// outOrder.setInvCode(invWarehouseEntity.getCode());
// outOrder.setDeptCode(invWarehouseEntity.getParentId());
InvWarehouseEntity invWarehouseEntity = invWarehouseService.findByInvSubByCode(orderEntity.getInvCode());
outOrder.setInvCode(invWarehouseEntity.getCode());
outOrder.setDeptCode(invWarehouseEntity.getParentId());
outOrder.setStatus(ConstantStatus.ORDER_STATUS_PROCESS);
//互填单号
orderEntity.setUllageSupNo(outOrder.getBillNo());
orderEntity.setUpdateTime(new Date());
orderService.update(orderEntity);
outOrder.setOriginUllageSupNo(orderEntity.getBillNo());
outOrder.setCreateUser(null);
outOrder.setReviewUser(null);
orderService.insertOrder(outOrder);
//生成条码
List<IoCodeTempEntity> codeTempEntities = new ArrayList<>();
for (IoCodeEntity warehouseEntity : temps) {
IoCodeTempEntity codeTempEntity = new IoCodeTempEntity();
BeanUtils.copyProperties(warehouseEntity, codeTempEntity);
codeTempEntity.setId(null);
codeTempEntity.setOrderId(outOrder.getBillNo());
codeTempEntity.setAction(outOrder.getAction());
codeTempEntity.setMainAction(outOrder.getMainAction());
codeTempEntities.add(codeTempEntity);
}
codeTempService.insertBatch(codeTempEntities);
// 生成业务单
List<IoOrderDetailBizEntity> orderDetailBizEntities = orderDetailBizService.findByOrderId(orderEntity.getBillNo());
if (CollUtil.isNotEmpty(orderDetailBizEntities)) {
for (IoOrderDetailBizEntity orderDetailBizEntity : orderDetailBizEntities) {
if (corpName.equals(orderDetailBizEntity.getSupId())) {
orderDetailBizEntity.setOrderIdFk(outOrder.getBillNo());
orderDetailBizEntity.setId(IdUtil.getSnowflakeNextId());
orderDetailBizService.insert(orderDetailBizEntity);
}
}
}
if (isGenInvoice) {
//生成发票信息
List<IoOrderInvoiceEntity> invoiceEntities = ioOrderInvoiceService.findByBillNo(orderEntity.getBillNo());
if (CollUtil.isNotEmpty(invoiceEntities)) {
for (IoOrderInvoiceEntity orderInvoiceEntity : invoiceEntities) {
orderInvoiceEntity.setOrderIdFk(outOrder.getBillNo());
orderInvoiceEntity.setBizIdFk(null);
orderInvoiceEntity.setUpdateTime(new Date());
orderInvoiceEntity.setId(IdUtil.getSnowflakeNextId());
ioOrderInvoiceService.insertInvoice(orderInvoiceEntity);
}
}
}
//根据单据设置状态 1:草稿
if (bussinessChangeTypeEntity.getAuditStatus() == 1) {
outOrder.setStatus(ConstantStatus.ORDER_STATUS_TEMP_SAVE);
outOrder.setDealStatus(ConstantStatus.ORDER_STATUS_TEMP_SAVE);
orderService.update(outOrder);
for (IoCodeTempEntity codeTempEntity : codeTempEntities) {
addInoutService.genOrderDetailCode(outOrder, codeTempEntity);
}
} else if (bussinessChangeTypeEntity.getAuditStatus() == 2 || bussinessChangeTypeEntity.getAuditStatus() == 3) {
addInoutService.dealProcess(outOrder);
if (!ioCheckInoutService.checkManual(outOrder.getBillNo())) {
ioCheckInoutService.check(outOrder.getBillNo());
}
}
}
}
}