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/IoSplitCodeService.java

1159 lines
70 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.glxp.api.service.inout;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.glxp.api.constant.Constant;
import com.glxp.api.dao.collect.IoCollectCodeBackMapper;
import com.glxp.api.dao.collect.IoCollectErrorLogMapper;
import com.glxp.api.dao.collect.IoCollectOrderBackupMapper;
import com.glxp.api.dao.inout.IoCodeLostMapper;
import com.glxp.api.dao.inout.IoSplitCodeMapper;
import com.glxp.api.entity.basic.SysWorkplacePutRel;
import com.glxp.api.entity.basic.UdiRelevanceEntity;
import com.glxp.api.entity.collect.*;
import com.glxp.api.entity.inout.*;
import com.glxp.api.exception.JsonException;
import com.glxp.api.req.basic.FilterUdiRelRequest;
import com.glxp.api.req.inout.IoSplitCodeRequest;
import com.glxp.api.res.basic.UdiRelevanceResponse;
import com.glxp.api.res.collect.ConfirmResponse;
import com.glxp.api.service.basic.UdiRelevanceService;
import com.glxp.api.service.collect.*;
import com.glxp.api.service.thrsys.SysWorkplacePutRelService;
import com.glxp.api.util.GennerOrderUtils;
import com.glxp.api.util.IntUtil;
import com.glxp.api.util.OrderNoTypeBean;
import com.glxp.api.util.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* 拆零码明细
*/
@Service
public class IoSplitCodeService extends ServiceImpl<IoSplitCodeMapper, IoSplitCodeEntity> {
@Resource
IoSplitCodeMapper splitCodeMapper;
@Resource
IoSplitFifoCodeService splitFifoCodeService;
@Resource
IoCollectOrderBizService collectOrderBizService;
@Resource
IoCollectOrderCodeAutoService collectOrderCodeAutoService;
@Resource
IoSplitDesOrderService splitDesOrderService;
@Resource
IoSplitDesOrderDetailService splitDesOrderDetailService;
@Resource
GennerOrderUtils gennerOrderUtils;
@Resource
UdiRelevanceService udiRelevanceService;
@Resource
IoCollectOrderCodeManService collectOrderCodeManService;
@Resource
IoSplitCodeService splitCodeService;
@Resource
IoCollectOrderBizBackupService ioCollectOrderBizBackupService;
@Resource
IoSplitFifoInvService splitFifoInvService;
@Resource
IoCollectLedGroupService ioCollectLedGroupService;
@Resource
IoCollectOrderBackupService collectOrderBackupService;
@Resource
SysWorkplacePutRelService workplacePutRelService;
@Autowired
private IoCollectCodeBackService ioCollectCodeBackService;
public List<IoSplitCodeEntity> filterList(IoSplitCodeRequest splitCodeRequest) {
if (splitCodeRequest == null) {
return Collections.emptyList();
}
if (splitCodeRequest.getPage() != null) {
int offset = (splitCodeRequest.getPage() - 1) * splitCodeRequest.getLimit();
PageHelper.offsetPage(offset, splitCodeRequest.getLimit());
}
return super.baseMapper.filterList(splitCodeRequest);
}
public List<IoSplitCodeEntity> findSplitCodes(Long relId, String batchNo, Long workPlaceCode) {
List<IoSplitCodeEntity> ioSplitCodeEntities = splitCodeMapper.selectList(new LambdaQueryWrapper<IoSplitCodeEntity>().eq(IoSplitCodeEntity::getRelId, relId).eq(StrUtil.isNotEmpty(batchNo), IoSplitCodeEntity::getBatchNo, batchNo).eq(workPlaceCode != null, IoSplitCodeEntity::getWorkPlaceCode, workPlaceCode).gt(IoSplitCodeEntity::getRemainCount, 0).in(IoSplitCodeEntity::getStatus, 1, 2).orderByAsc(IoSplitCodeEntity::getInBactchNo));
return ioSplitCodeEntities;
}
public List<IoSplitCodeEntity> findSplitCodes(String ybbm, String batchNo, Long workPlaceCode) {
List<IoSplitCodeEntity> ioSplitCodeEntities = splitCodeMapper.selectList(new LambdaQueryWrapper<IoSplitCodeEntity>().eq(StrUtil.isNotEmpty(batchNo), IoSplitCodeEntity::getBatchNo, batchNo).eq(workPlaceCode != null, IoSplitCodeEntity::getWorkPlaceCode, workPlaceCode).gt(IoSplitCodeEntity::getRemainCount, 0).in(IoSplitCodeEntity::getStatus, 1, 2).orderByAsc(IoSplitCodeEntity::getInBactchNo));
return ioSplitCodeEntities;
}
public IoSplitCodeEntity findByCode(String code, Long workPlaceCode) {
if (workPlaceCode == null) {
return null;
}
List<IoSplitCodeEntity> ioSplitCodeEntities = splitCodeMapper.selectList(new LambdaQueryWrapper<IoSplitCodeEntity>().eq(IoSplitCodeEntity::getCode, code).eq(workPlaceCode != null, IoSplitCodeEntity::getWorkPlaceCode, workPlaceCode).in(IoSplitCodeEntity::getStatus, 1, 2).orderByAsc(IoSplitCodeEntity::getInBactchNo));
if (CollUtil.isNotEmpty(ioSplitCodeEntities)) return ioSplitCodeEntities.get(0);
return null;
}
public IoSplitCodeEntity findByCode(String code) {
return splitCodeMapper.selectOne(new LambdaQueryWrapper<IoSplitCodeEntity>().eq(IoSplitCodeEntity::getCode, code).last("limit 1"));
}
public void splitRemove(IoCollectOrderBiz collectOrderBiz, IoCollectOrder collectOrder, Long putWorkPlaceCode, Boolean isAuto, String confirmSplitCode) {
//1.按照先进先出原则查询拆零表获取拆零表ID
List<IoSplitCodeEntity> ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
//2.如果拆零表为空,则自动从预出库队列中获拉取数据
if (CollUtil.isEmpty(ioSplitCodeEntities)) {
addFifoCode(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), IntUtil.value(collectOrderBiz.getUnTagCount()), putWorkPlaceCode, confirmSplitCode);
ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
}
//3.如果拆零表不为空,则开始扣除数量
int count = 0;
int unCount = 0; //剩余未扣减数量
unCount = IntUtil.value(collectOrderBiz.getUnTagCount());
for (IoSplitCodeEntity ioSplitCodeEntity : ioSplitCodeEntities) {
count = IntUtil.value(ioSplitCodeEntity.getRemainCount()) - unCount;
if (count > 0) {
ioSplitCodeEntity.setRemainCount(count);
unCount = 0;
splitCodeMapper.updateById(ioSplitCodeEntity);
} else if (count == 0) {
ioSplitCodeEntity.setRemainCount(0);
unCount = 0;
} else {
ioSplitCodeEntity.setRemainCount(0);
unCount = -count;
}
collectOrderCodeAutoService.save(IoCollectOrderCodeAuto.builder().codeIdFk(ioSplitCodeEntity.getId()).udiCode(ioSplitCodeEntity.getCode()).orderIdFk(collectOrder.getBillNo()).batchNo(ioSplitCodeEntity.getBatchNo()).productDate(ioSplitCodeEntity.getProduceDate()).expireDate(ioSplitCodeEntity.getExpireDate()).serialNo(ioSplitCodeEntity.getSerialNo()).relId(collectOrderBiz.getRelId()).bizIdFk(collectOrderBiz.getId()).fifoSplit(1).createTime(new Date()).updateTime(new Date()).count(count > 0 ? count : 0).reCount(unCount).build());
splitCodeMapper.updateById(ioSplitCodeEntity);
}
if (unCount > 0) {
//4.拆零表数量不足,则从预出库队列中获取数据
Integer fifoCount = addFifoCode(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), unCount, putWorkPlaceCode, confirmSplitCode);
if (fifoCount == 0) {
//预出库队列数量不足
collectOrderBiz.setTagStatus(2);
collectOrderBiz.setTagMsg("预出库队列码数量不足,赋码失败!");
if (isAuto)
throw new JsonException(500, "提交失败," + collectOrderBiz.getCpmctymc() + "工位库存数量不足!");
else return;
} else {
//再次执行赋码
ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
for (IoSplitCodeEntity ioSplitCodeEntity : ioSplitCodeEntities) {
if (IntUtil.value(ioSplitCodeEntity.getRemainCount()) > 0) {
count = IntUtil.value(ioSplitCodeEntity.getRemainCount()) - unCount;
collectOrderCodeAutoService.save(IoCollectOrderCodeAuto.builder().codeIdFk(ioSplitCodeEntity.getId()).udiCode(ioSplitCodeEntity.getCode()).orderIdFk(collectOrder.getBillNo()).batchNo(ioSplitCodeEntity.getBatchNo()).productDate(ioSplitCodeEntity.getProduceDate()).expireDate(ioSplitCodeEntity.getExpireDate()).serialNo(ioSplitCodeEntity.getSerialNo()).relId(collectOrderBiz.getRelId()).bizIdFk(collectOrderBiz.getId()).fifoSplit(count > 0 ? count : 0).reCount(count).createTime(new Date()).updateTime(new Date()).build());
if (count > 0) {
ioSplitCodeEntity.setRemainCount(count);
splitCodeMapper.updateById(ioSplitCodeEntity);
unCount = 0;
break;
} else if (count == 0) {
ioSplitCodeEntity.setRemainCount(0);
unCount = 0;
splitCodeMapper.updateById(ioSplitCodeEntity);
} else {
ioSplitCodeEntity.setRemainCount(0);
splitCodeMapper.updateById(ioSplitCodeEntity);
unCount = -count;
}
}
}
if (unCount > 0) {
collectOrderBiz.setTagStatus(2);
collectOrderBiz.setTagMsg("预出库队列码数量不足,赋码失败!");
if (isAuto) throw new JsonException(500, "工位库存数量不足!");
else return;
} else {
collectOrderBiz.setTagStatus(3);
collectOrderBiz.setTagMsg("赋码完成!");
}
}
} else {
collectOrderBiz.setTagStatus(3);
collectOrderBiz.setTagMsg("赋码完成!");
}
collectOrderBiz.setUnTagCount(unCount);
collectOrderBizService.updateById(collectOrderBiz);
}
@Resource
IoCollectSetService collectSetService;
@Transactional(rollbackFor = Exception.class)
public void finishAutoTagCode(IoCollectOrder collectOrder, Boolean isAuto, String queueCode) {
IoCollectSet collectSet = collectSetService.getSet();
SysWorkplacePutRel sysWorkplacePutRel = workplacePutRelService.findPutWorkPlace(collectOrder.getWorkPlaceCode(), collectOrder.getBusType());
Long putWorkPlaceCode = null;
if (sysWorkplacePutRel != null) putWorkPlaceCode = sysWorkplacePutRel.getWorkPlaceCode();
List<IoCollectOrderBiz> collectOrderBizs = null;
collectOrderBizs = collectOrderBizService.listByBillNo(collectOrder.getBillNo());
//如果手动扫码判断该码是否在队列里,如果已在队列,则队列里剔除
List<IoCollectOrderCodeMan> collectOrderCodeMEN = collectOrderCodeManService.listByBillNo(collectOrder.getBillNo());
if (CollUtil.isNotEmpty(collectOrderCodeMEN)) {
//扫码冲突
if (IntUtil.value(collectSet.getConflictScan())) {
dealOrderReplace(collectOrderCodeMEN, collectOrder, putWorkPlaceCode);
}
for (IoCollectOrderCodeMan collectOrderCodeMan : collectOrderCodeMEN) {
if (IntUtil.value(collectOrderCodeMan.getRemoveFlag())) {
continue;
}
IoSplitFifoCodeEntity splitFifoCodeEntity = splitFifoCodeService.findByCode(collectOrderCodeMan.getUdiCode(), putWorkPlaceCode);
if (splitFifoCodeEntity != null) {
collectOrderCodeMan.setRemoveFlag(true);
if (IntUtil.value(splitFifoCodeEntity.getScanCount()) - IntUtil.value(collectOrderCodeMan.getScanCount()) <= 0) {
splitFifoCodeService.removeById(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount());
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
} else {
//队列码数量大于扫码数量更新数量(一般指无序列号)
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(collectOrderCodeMan.getRelId());
filterUdiRelRequest.setPackLevel("1");
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest);
int removeCount = IntUtil.value(collectOrderCodeMan.getScanCount()) * udiRelevanceResponse.getBhxjsl();
splitFifoCodeService.updateById(IoSplitFifoCodeEntity.builder().id(splitFifoCodeEntity.getId()).scanCount(IntUtil.value(splitFifoCodeEntity.getScanCount()) - IntUtil.value(collectOrderCodeMan.getScanCount())).totalCount(IntUtil.value(splitFifoCodeEntity.getTotalCount()) - removeCount).build());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + removeCount);
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(collectOrderCodeMan.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - removeCount;
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
}
}
//判断拆零表里是否存在,如果存在则剔除
IoSplitCodeEntity splitCodeEntity = splitCodeService.findByCode(collectOrderCodeMan.getUdiCode(), putWorkPlaceCode);
if (splitCodeEntity != null && IntUtil.value(splitCodeEntity.getRemainCount()) > 0) {
if (IntUtil.value(splitCodeEntity.getRemainCount()) > IntUtil.value(collectOrderCodeMan.getScanActCount())) {
splitCodeEntity.setRemainCount(IntUtil.value(splitCodeEntity.getRemainCount()) - IntUtil.value(collectOrderCodeMan.getScanActCount()));
} else {
splitCodeEntity.setRemainCount(0);
}
collectOrderCodeMan.setSplitFlag(true);
splitCodeService.updateById(splitCodeEntity);
}
}
}
for (IoCollectOrderBiz collectOrderBiz : collectOrderBizs) {
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(collectOrderBiz.getRelId());
filterUdiRelRequest.setPackLevel("1");
//todo 后面可以 没有搜索到层级为1的
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest);
if (IntUtil.value(udiRelevanceResponse.getNotCodeType()) != 0) {
collectOrderBiz.setTagStatus(4);//无需扫码
collectOrderBizService.updateById(collectOrderBiz);
continue;
}
//去除掉已经手动扫码的数据,找出需要自动扫码的明细,执行上述的拆零或整取
int unTagCount = collectOrderBiz.getCount() - IntUtil.value(collectOrderBiz.getScanActCount());
if (unTagCount > 0) {
collectOrderBiz.setUnTagCount(unTagCount);
} else {
collectOrderBiz.setTagStatus(3);
//手动扫码时涉及到拆零时,把拆零剩余数量插入至拆零表里
if (unTagCount < 0) {
List<IoCollectOrderCodeMan> newList = filterCode(collectOrderCodeMEN, collectOrderBiz, udiRelevanceResponse);
if (CollUtil.isNotEmpty(newList)) {
for (IoCollectOrderCodeMan item : newList) {
if (IntUtil.value(item.getSplitFlag())) {
IoSplitCodeEntity splitCodeEntity = splitCodeService.findByCode(item.getUdiCode(), putWorkPlaceCode);
splitCodeEntity.setRemainCount(-unTagCount);
splitCodeService.updateById(splitCodeEntity);
} else {
IoSplitCodeEntity ioSplitCodeEntity = IoSplitCodeEntity.builder().code(item.getUdiCode()).errUdiCode(item.getUdiCode()).orderId(item.getOrderIdFk()).action(collectOrder.getBusType()).relId(item.getRelId()).nameCode(item.getNameCode()).batchNo(item.getBatchNo()).produceDate(item.getProductDate()).expireDate(item.getExpireDate()).serialNo(item.getSerialNo()).scanCount(item.getScanCount()).totalCount(item.getScanCount()).workPlaceCode(putWorkPlaceCode).status(2).fifoSplit(1).createTime(new Date()).updateTime(new Date()).remainCount(item.getRemainCount()).build();
this.decorateUnpackExpireTime(ioSplitCodeEntity);
splitCodeService.save(ioSplitCodeEntity);
}
item.setSplitFlag(true);
collectOrderCodeManService.updateById(item);
}
}
}
continue;
}
int quotient = 0;
int remainder = 0;
if (IntUtil.value(udiRelevanceResponse.getBhxjsl()) != 0) {
quotient = collectOrderBiz.getUnTagCount() / IntUtil.value(udiRelevanceResponse.getBhxjsl());
remainder = collectOrderBiz.getUnTagCount() % IntUtil.value(udiRelevanceResponse.getBhxjsl());
}
//2.如果整盒,从工位队列扣除 默认最后一个追溯码拆零
if (quotient > 0) {
List<IoSplitFifoCodeEntity> ioSplitFifoCodeEntities = splitFifoCodeService.findByRelId(putWorkPlaceCode, collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), queueCode);
if (ioSplitFifoCodeEntities.size() < quotient) {
if (isAuto) throw new JsonException(500, "提交失败,工位库存数量不足!");
}
if (ioSplitFifoCodeEntities.size() > 0) {
Integer indexFlag = ioSplitFifoCodeEntities.size() < quotient ? ioSplitFifoCodeEntities.size() : quotient;
for (int i = 0; i < indexFlag; i++) {
IoSplitFifoCodeEntity splitFifoCodeEntity = ioSplitFifoCodeEntities.get(i);
collectOrderBiz.setUnTagCount(IntUtil.value(collectOrderBiz.getUnTagCount()) - IntUtil.value(udiRelevanceResponse.getBhxjsl()));
collectOrderCodeAutoService.save(IoCollectOrderCodeAuto.builder().codeIdFk(splitFifoCodeEntity.getId()).udiCode(splitFifoCodeEntity.getCode()).orderIdFk(collectOrder.getBillNo()).batchNo(splitFifoCodeEntity.getBatchNo()).productDate(splitFifoCodeEntity.getProduceDate()).expireDate(splitFifoCodeEntity.getExpireDate()).serialNo(splitFifoCodeEntity.getSerialNo()).relId(collectOrderBiz.getRelId()).bizIdFk(collectOrderBiz.getId()).fifoSplit(2).createTime(new Date()).updateTime(new Date()).build());
splitFifoCodeService.removeById(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount());
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
}
}
}
//.如果拆零,拆零表扣除
if (remainder > 0) {
splitRemove(collectOrderBiz, collectOrder, putWorkPlaceCode, isAuto, null);
}
collectOrderBizService.updateById(collectOrderBiz);
}
ArrayList<IoCollectOrderBizBackup> ioCollectOrderBizBackups = new ArrayList<>();
for (IoCollectOrderBiz ioCollectOrderBiz : collectOrderBizs) {
IoCollectOrderBizBackup ioCollectOrderBizBackup = new IoCollectOrderBizBackup();
BeanUtils.copyProperties(ioCollectOrderBiz, ioCollectOrderBizBackup);
ioCollectOrderBizBackup.setId(IdUtil.getSnowflake().nextId());
// ioCollectOrderBizBackup.setId(ioCollectOrderBiz.getId());
ioCollectOrderBizBackups.add(ioCollectOrderBizBackup);
}
ioCollectOrderBizBackupService.saveBatch(ioCollectOrderBizBackups);
}
@Resource
IoCollectOrderBackupMapper collectOrderBackupMapper;
@Resource
IoCollectCodeBackMapper collectCodeBackMapper;
@Resource
IoCollectCodeBackService collectCodeBackService;
/**
* 手动赋码与自动赋码冲突时解决方案
*/
public void dealOrderReplace(List<IoCollectOrderCodeMan> collectOrderCodeManList, IoCollectOrder collectOrder, Long putWorkPlaceCode) {
for (IoCollectOrderCodeMan collectOrderCodeMan : collectOrderCodeManList) {
// 1. 查找已完成成单据扫码是否已被分配
List<IoCollectCodeBackup> collectCodeBackups = collectCodeBackMapper.selectList(new LambdaQueryWrapper<IoCollectCodeBackup>().eq(IoCollectCodeBackup::getBusType, collectOrder.getBusType()).eq(IoCollectCodeBackup::getCode, collectOrderCodeMan.getUdiCode()));
if (CollUtil.isNotEmpty(collectCodeBackups)) {
IoCollectCodeBackup collectCodeBackup = collectCodeBackups.get(0);
// 1. 如果本身标记为手动整取,则应报错提示,重复扫码
if (IntUtil.value(collectCodeBackup.getFifoSplit()) == 3) {
throw new JsonException(500, collectCodeBackup.getCode() + "重复扫码,请盘查后重试!");
}
// 不管是自动拆零或者手动拆零直接忽略,不走冲突赋码逻辑
if (IntUtil.value(collectCodeBackup.getFifoSplit()) != 2) {
break;
}
IoCollectOrderBackup collectOrderBackup = collectOrderBackupMapper.selectOne(new LambdaQueryWrapper<IoCollectOrderBackup>().eq(IoCollectOrderBackup::getBillNo, collectCodeBackup.getBillNo()));
collectOrderCodeMan.setRemoveFlag(true);
// 单据已被上传至医保
if (IntUtil.value(collectOrderBackup.getUploadStatus()) == 2) {
IoSplitFifoCodeEntity splitFifoCodeEntity = removeInvByCode(collectOrderCodeMan, putWorkPlaceCode);
if (splitFifoCodeEntity == null) {
throw new JsonException(500, "工位存量不足!");
}
IoCollectErrorLog ioCollectErrorLog = IoCollectErrorLog.builder().orderId(collectOrder.getId() + "").autoCode(splitFifoCodeEntity.getCode()).manuCode(collectOrderCodeMan.getUdiCode()).type(2) //未上传医保替换码
.updateTime(new Date()).build();
collectErrorLogMapper.insert(ioCollectErrorLog);
collectCodeBackup.setCode(splitFifoCodeEntity.getCode());
collectCodeBackMapper.updateById(collectCodeBackup);
} else {
//单据未上传医保,上传医保失败
IoSplitFifoCodeEntity splitFifoCodeEntity = removeInvByCode(collectOrderCodeMan, putWorkPlaceCode);
if (splitFifoCodeEntity == null) {
throw new JsonException(500, "工位存量不足!");
}
IoCollectErrorLog ioCollectErrorLog = IoCollectErrorLog.builder().orderId(collectOrder.getBillNo()).autoCode(splitFifoCodeEntity.getCode()).manuCode(collectOrderCodeMan.getUdiCode()).type(1) //未上传医保替换码
.updateTime(new Date()).build();
collectErrorLogMapper.insert(ioCollectErrorLog);
//替换已完成单据的码
collectCodeBackup.setCode(splitFifoCodeEntity.getCode());
collectCodeBackMapper.updateById(collectCodeBackup);
}
}
}
}
/**
* 工位退货扫码与自动赋码冲突解决方案
*/
public void workReturnReplace(IoCodeEntity codeEntity, Long workPlaceCode) {
// 1.判断工位库存是否足够
// 2.工位库存足够的话,判断已完成单是否存在,
// 3.存在的话,判断已完成单是否已上传医保
// 4.已上传医保的话,调用医保删除接口
List<IoSplitFifoCodeEntity> splitFifoCodeEntitys = splitFifoCodeService.findByRelId(workPlaceCode, codeEntity.getRelId(), codeEntity.getBatchNo(), null);
if (CollUtil.isEmpty(splitFifoCodeEntitys)) {
throw new JsonException(500, "工位库存不足!");
}
IoSplitFifoCodeEntity ioSplitFifoCodeEntity = splitFifoCodeEntitys.get(0);
List<IoCollectCodeBackup> collectCodeBackups = collectCodeBackMapper.selectList(new LambdaQueryWrapper<IoCollectCodeBackup>().eq(IoCollectCodeBackup::getCode, codeEntity.getCode()));
if (CollUtil.isNotEmpty(collectCodeBackups)) {
IoCollectCodeBackup collectCodeBackup = collectCodeBackups.get(0);
// if (IntUtil.value(collectCodeBackup.getFifoSplit()) == 3) {
// throw new JsonException(500, collectCodeBackup.getCode() + "重复扫码,请盘查后重试!");
// }
IoCollectOrderBackup collectOrderBackup = collectOrderBackupMapper.selectOne(new LambdaQueryWrapper<IoCollectOrderBackup>().eq(IoCollectOrderBackup::getBillNo, collectCodeBackup.getBillNo()));
if (IntUtil.value(collectOrderBackup.getUploadStatus()) == 2) {
// 单据已被上传至医保 ---- 取当前库存的码替换至已完成单的码,并退库,以当前的码为退库单的码,并生成替换日志
IoSplitFifoCodeEntity splitFifoCodeEntity = removeInvByCode(ioSplitFifoCodeEntity);
if (splitFifoCodeEntity == null) {
throw new JsonException(500, "工位存量不足!");
}
IoCollectErrorLog ioCollectErrorLog = IoCollectErrorLog.builder().orderId(codeEntity.getOrderId()).autoCode(splitFifoCodeEntity.getCode()).manuCode(codeEntity.getCode()).type(4) //退货已上传医保替换码
.updateTime(new Date()).build();
collectErrorLogMapper.insert(ioCollectErrorLog);
collectCodeBackup.setCode(splitFifoCodeEntity.getCode());
collectCodeBackMapper.updateById(collectCodeBackup);
// 若已完成单已上传医保,则当前已完成单的码就与医保实际已上传的码不匹配;
// 解决方案1 调用医保接口删除当前单据,并重新把最新的单据上传;
// 解决方案2 不管,保留替换记录
} else {
//单据未上传医保,上传医保失败
IoSplitFifoCodeEntity splitFifoCodeEntity = removeInvByCode(ioSplitFifoCodeEntity);
if (splitFifoCodeEntity == null) {
throw new JsonException(500, "工位存量不足!");
}
IoCollectErrorLog ioCollectErrorLog = IoCollectErrorLog.builder().orderId(codeEntity.getOrderId()).autoCode(splitFifoCodeEntity.getCode()).manuCode(codeEntity.getCode()).type(3) //退货未上传医保替换码
.updateTime(new Date()).build();
collectErrorLogMapper.insert(ioCollectErrorLog);
//替换已完成单据的码
collectCodeBackup.setCode(splitFifoCodeEntity.getCode());
collectCodeBackMapper.updateById(collectCodeBackup);
}
}
}
/**
* 后置拆零问题-1校验是否需要后置拆零更改单据状态
*/
public void delaySplitVail(IoCollectOrderBackup collectOrder) {
List<IoCollectOrderBizBackup> collectOrderBizBackups = ioCollectOrderBizBackupService.listByBillNo(collectOrder.getBillNo());
for (IoCollectOrderBizBackup collectOrderBizBackup : collectOrderBizBackups) {
int unTagCount = collectOrderBizBackup.getUnTagCount();
int remainder = 0;
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(collectOrderBizBackup.getRelId());
filterUdiRelRequest.setPackLevel("1");
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest);
if (IntUtil.value(udiRelevanceResponse.getBhxjsl()) != 0) {
remainder = unTagCount % IntUtil.value(udiRelevanceResponse.getBhxjsl());
if (remainder > 0) {
collectOrder.setTagStatus(6); //拆零未赋码
break;
}
}
}
collectOrderBackupService.updateByBillNo(collectOrder);
}
/**
* 后置拆零问题-2后置拆零赋码
*/
public void delaySplitTagCode() {
List<IoCollectOrderBackup> collectOrderBackups = collectOrderBackupMapper.selectList(new LambdaQueryWrapper<IoCollectOrderBackup>().eq(IoCollectOrderBackup::getTagStatus, 6));
for (IoCollectOrderBackup collectOrderBackup : collectOrderBackups) {
List<IoCollectOrderBizBackup> collectOrderBizBackups = ioCollectOrderBizBackupService.listByBillNo(collectOrderBackup.getBillNo());
Boolean isFullTag = true;
for (IoCollectOrderBizBackup collectOrderBizBackup : collectOrderBizBackups) {
int unTagCount = IntUtil.value(collectOrderBizBackup.getUnTagCount());
int remainder = 0;
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(collectOrderBizBackup.getRelId());
filterUdiRelRequest.setPackLevel("1");
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest);
if (IntUtil.value(udiRelevanceResponse.getBhxjsl()) != 0) {
remainder = unTagCount % IntUtil.value(udiRelevanceResponse.getBhxjsl());
if (remainder > 0) {
splitTagCode(collectOrderBizBackup, collectOrderBackup, null, false, null);
}
}
remainder = IntUtil.value(collectOrderBizBackup.getUnTagCount()) % IntUtil.value(udiRelevanceResponse.getBhxjsl());
if (remainder != 0) {
isFullTag = false;
}
}
if (isFullTag) {
collectOrderBackup.setTagStatus(3);
collectOrderBackup.setTagMsg("赋码完成!");
collectOrderBackupMapper.updateById(collectOrderBackup);
}
}
}
public void splitTagCode(IoCollectOrderBizBackup collectOrderBiz, IoCollectOrderBackup collectOrder, Long putWorkPlaceCode, Boolean isAuto, String confirmSplitCode) {
//1.按照先进先出原则查询拆零表获取拆零表ID
List<IoSplitCodeEntity> ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
List<IoCollectOrderCodeAuto> codeAutoList = new ArrayList<>();
//2.如果拆零表为空,则自动从预出库队列中获拉取数据
if (CollUtil.isEmpty(ioSplitCodeEntities)) {
addFifoCode(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), IntUtil.value(collectOrderBiz.getUnTagCount()), putWorkPlaceCode, confirmSplitCode);
ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
}
//3.如果拆零表不为空,则开始扣除数量
int count = 0;
int unCount = 0; //剩余未扣减数量
unCount = IntUtil.value(collectOrderBiz.getUnTagCount());
for (IoSplitCodeEntity ioSplitCodeEntity : ioSplitCodeEntities) {
count = IntUtil.value(ioSplitCodeEntity.getRemainCount()) - unCount;
if (count > 0) {
ioSplitCodeEntity.setRemainCount(count);
unCount = 0;
splitCodeMapper.updateById(ioSplitCodeEntity);
} else if (count == 0) {
ioSplitCodeEntity.setRemainCount(0);
unCount = 0;
} else {
ioSplitCodeEntity.setRemainCount(0);
unCount = -count;
}
IoCollectOrderCodeAuto collectOrderCodeAuto = IoCollectOrderCodeAuto.builder().codeIdFk(ioSplitCodeEntity.getId()).udiCode(ioSplitCodeEntity.getCode()).orderIdFk(collectOrder.getBillNo()).batchNo(ioSplitCodeEntity.getBatchNo()).productDate(ioSplitCodeEntity.getProduceDate()).expireDate(ioSplitCodeEntity.getExpireDate()).serialNo(ioSplitCodeEntity.getSerialNo()).relId(collectOrderBiz.getRelId()).bizIdFk(collectOrderBiz.getId()).fifoSplit(1).createTime(new Date()).updateTime(new Date()).count(count > 0 ? count : 0).reCount(unCount).build();
collectOrderCodeAutoService.save(collectOrderCodeAuto);
codeAutoList.add(collectOrderCodeAuto);
splitCodeMapper.updateById(ioSplitCodeEntity);
}
if (unCount > 0) {
//4.拆零表数量不足,则从预出库队列中获取数据
Integer fifoCount = addFifoCode(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), unCount, putWorkPlaceCode, confirmSplitCode);
if (fifoCount == 0) {
//预出库队列数量不足
collectOrderBiz.setTagStatus(2);
collectOrderBiz.setTagMsg("预出库队列码数量不足,赋码失败!");
if (isAuto)
throw new JsonException(500, "提交失败," + collectOrderBiz.getCpmctymc() + "工位库存数量不足!");
else return;
} else {
//再次执行赋码
ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
for (IoSplitCodeEntity ioSplitCodeEntity : ioSplitCodeEntities) {
if (IntUtil.value(ioSplitCodeEntity.getRemainCount()) > 0) {
count = IntUtil.value(ioSplitCodeEntity.getRemainCount()) - unCount;
IoCollectOrderCodeAuto collectOrderCodeAuto = IoCollectOrderCodeAuto.builder().codeIdFk(ioSplitCodeEntity.getId()).udiCode(ioSplitCodeEntity.getCode()).orderIdFk(collectOrder.getBillNo()).batchNo(ioSplitCodeEntity.getBatchNo()).productDate(ioSplitCodeEntity.getProduceDate()).expireDate(ioSplitCodeEntity.getExpireDate()).serialNo(ioSplitCodeEntity.getSerialNo()).relId(collectOrderBiz.getRelId()).bizIdFk(collectOrderBiz.getId())
.fifoSplit(1).reCount(count > 0 ? count : 0).createTime(new Date()).updateTime(new Date()).build();
collectOrderCodeAutoService.save(collectOrderCodeAuto);
codeAutoList.add(collectOrderCodeAuto);
if (count > 0) {
ioSplitCodeEntity.setRemainCount(count);
splitCodeMapper.updateById(ioSplitCodeEntity);
unCount = 0;
break;
} else if (count == 0) {
ioSplitCodeEntity.setRemainCount(0);
unCount = 0;
splitCodeMapper.updateById(ioSplitCodeEntity);
} else {
ioSplitCodeEntity.setRemainCount(0);
splitCodeMapper.updateById(ioSplitCodeEntity);
unCount = -count;
}
}
}
if (unCount > 0) {
collectOrderBiz.setTagStatus(2);
collectOrderBiz.setTagMsg("预出库队列码数量不足,赋码失败!");
if (isAuto) throw new JsonException(500, "工位库存数量不足!");
else return;
} else {
collectOrderBiz.setTagStatus(3);
collectOrderBiz.setTagMsg("赋码完成!");
}
}
} else {
collectOrderBiz.setTagStatus(3);
collectOrderBiz.setTagMsg("赋码完成!");
}
collectOrderBiz.setUnTagCount(unCount);
ioCollectOrderBizBackupService.updateById(collectOrderBiz);
if (CollUtil.isNotEmpty(codeAutoList)) {
saveSplitCode(codeAutoList, collectOrder);
}
}
public void saveSplitCode(List<IoCollectOrderCodeAuto> codeAutoList, IoCollectOrderBackup collectOrder) {
if (CollUtil.isEmpty(codeAutoList)) return;
List<IoCollectCodeBackup> ioCollectCodes = new ArrayList<>();
for (IoCollectOrderCodeAuto collectOrderCodeAuto : codeAutoList) {
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(collectOrderCodeAuto.getRelId() + "");
ioCollectCodes.add(IoCollectCodeBackup.builder().code(collectOrderCodeAuto.getUdiCode()).fromType(collectOrder.getFromType()).busType(collectOrder.getBusType()).billNo(collectOrder.getBillNo()).fromCorp(collectOrder.getFromCorp()).operTime(collectOrder.getUpdateTime()).operUser(collectOrder.getCreateUser()).fifoSplit(1).relId(collectOrderCodeAuto.getRelId()).workPlaceCode(collectOrder.getWorkPlaceCode()).remark(collectOrder.getRemark()).purType(udiRelevanceResponse.getPurType()).inBatchNo(System.currentTimeMillis()).reCount(collectOrderCodeAuto.getReCount()).build());
}
collectCodeBackService.saveBatch(ioCollectCodes);
}
@Resource
IoCollectErrorLogMapper collectErrorLogMapper;
/**
* 工位查找未使用码进行抠库
*/
public IoSplitFifoCodeEntity removeInvByCode(IoCollectOrderCodeMan collectOrderCodeMan, Long putWorkPlaceCode) {
List<IoSplitFifoCodeEntity> splitFifoCodeEntitys = splitFifoCodeService.findByRelId(putWorkPlaceCode, collectOrderCodeMan.getRelId(), collectOrderCodeMan.getBatchNo(), null);
if (CollUtil.isNotEmpty(splitFifoCodeEntitys)) {
IoSplitFifoCodeEntity splitFifoCodeEntity = splitFifoCodeEntitys.get(0);
splitFifoCodeService.removeById(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount());
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
return splitFifoCodeEntity;
}
return null;
}
/**
* 工位查找未使用码进行抠库
*/
public IoSplitFifoCodeEntity removeInvByCode(IoSplitFifoCodeEntity splitFifoCodeEntity) {
splitFifoCodeService.removeById(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount());
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
return splitFifoCodeEntity;
}
/**
* 完成销售出库自动扣工位库存
*/
public void finishSellOrder(IoCollectOrder collectOrder, Long workPlace) {
List<IoCollectOrderCodeMan> collectOrderCodeMENs = collectOrderCodeManService.listByBillNo(collectOrder.getBillNo());
for (IoCollectOrderCodeMan collectOrderCodeMan : collectOrderCodeMENs) {
IoSplitFifoCodeEntity splitFifoCodeEntity = splitFifoCodeService.findByCode(collectOrderCodeMan.getUdiCode(), workPlace);
if (splitFifoCodeEntity != null) {
collectOrderCodeMan.setRemoveFlag(true);
if (IntUtil.value(splitFifoCodeEntity.getScanCount()) - IntUtil.value(collectOrderCodeMan.getScanCount()) <= 0) {
splitFifoCodeService.removeById(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInvService.updateById(splitFifoInv);
}
} else {
//队列码数量大于扫码数量更新数量(一般指无序列号)
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(collectOrderCodeMan.getRelId());
filterUdiRelRequest.setPackLevel("1");
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest);
int removeCount = IntUtil.value(collectOrderCodeMan.getScanCount()) * udiRelevanceResponse.getBhxjsl();
splitFifoCodeService.updateById(IoSplitFifoCodeEntity.builder().id(splitFifoCodeEntity.getId()).scanCount(IntUtil.value(splitFifoCodeEntity.getScanCount()) - IntUtil.value(collectOrderCodeMan.getScanCount())).totalCount(IntUtil.value(splitFifoCodeEntity.getTotalCount()) - removeCount).build());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + removeCount);
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(collectOrderCodeMan.getScanCount()));
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInvService.updateById(splitFifoInv);
}
}
}
}
}
@Resource
IoCollectOrderService collectOrderService;
@Transactional(rollbackFor = Exception.class)
public ConfirmResponse confirmBizAutiTagCode(IoCollectOrderBiz collectOrderBiz, String queueCode, String confirmSplitCode, Boolean skipSplitConfirm) {
ConfirmResponse confirmResponse = new ConfirmResponse();
IoCollectOrder collectOrder = collectOrderService.getByBillNo(collectOrderBiz.getOrderIdFk());
if (collectOrder == null) {
throw new JsonException(500, "提交失败,未找到对应的单据!");
}
SysWorkplacePutRel sysWorkplacePutRel = workplacePutRelService.findPutWorkPlace(collectOrder.getWorkPlaceCode(), collectOrder.getBusType());
Long putWorkPlaceCode = null;
if (sysWorkplacePutRel != null) putWorkPlaceCode = sysWorkplacePutRel.getWorkPlaceCode();
FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest();
filterUdiRelRequest.setId(collectOrderBiz.getRelId());
filterUdiRelRequest.setPackLevel("1");
UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest);
//去除掉已经手动扫码的数据,找出需要自动扫码的明细,执行上述的拆零或整取
int unTagCount = collectOrderBiz.getCount() - IntUtil.value(collectOrderBiz.getScanActCount());
if (unTagCount > 0) {
collectOrderBiz.setUnTagCount(unTagCount);
}
int quotient = 0;
int remainder = 0;
if (IntUtil.value(udiRelevanceResponse.getBhxjsl()) != 0) {
quotient = collectOrderBiz.getUnTagCount() / IntUtil.value(udiRelevanceResponse.getBhxjsl());
remainder = collectOrderBiz.getUnTagCount() % IntUtil.value(udiRelevanceResponse.getBhxjsl());
}
// 获取所有可用的码列表
List<IoSplitFifoCodeEntity> availableCodes = splitFifoCodeService.findByRelId(putWorkPlaceCode, collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), queueCode);
IoSplitFifoCodeEntity confirmSplitCodeEntity = null;
if (CollUtil.isNotEmpty(availableCodes) && StrUtil.isNotEmpty(confirmSplitCode)) {
// 如果有确认的拆零码,直接使用
String finalConfirmSplitCode = confirmSplitCode;
confirmSplitCodeEntity = availableCodes.stream().filter(code -> StrUtil.equals(code.getCode(), finalConfirmSplitCode)).findFirst().orElse(null);
if (confirmSplitCodeEntity == null) {
throw new JsonException(500, "找不到指定的拆零码");
} else {
availableCodes.remove(confirmSplitCodeEntity);
}
}
// 检查是否有足够的拆零数量
boolean hasEnoughSplitCount = false;
if (remainder > 0 && CollUtil.isNotEmpty(availableCodes)) {
// 获取第一个码的可用数量
List<IoSplitCodeEntity> ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
if (CollUtil.isNotEmpty(ioSplitCodeEntities)) {
int firstCodeAvailableCount = IntUtil.value(ioSplitCodeEntities.get(0).getRemainCount());
hasEnoughSplitCount = firstCodeAvailableCount >= remainder;
}
}
// 判断是否需要拆零确认整箱数量大于1且有拆零数量且没有足够的拆零数量
boolean needSplitConfirm = quotient > 0 && remainder > 0 && !hasEnoughSplitCount;
// 如果是第一次调用confirmSplitCode为空且需要拆零确认且不跳过拆零确认只返回拆零信息
if (StrUtil.isEmpty(confirmSplitCode) && needSplitConfirm && !IntUtil.value(skipSplitConfirm)) {
if (CollUtil.isNotEmpty(availableCodes)) {
// 需要的总数量:整箱数量 + 拆零数量
int totalNeededCount = quotient + (remainder > 0 ? 1 : 0);
// 如果可用码数量小于需要的数量,直接报错
if (availableCodes.size() < totalNeededCount) {
throw new JsonException(500, "可用码数量不足!需要" + totalNeededCount + "个码,但只有" + availableCodes.size() + "个可用码。");
}
// 只返回需要的码数量
List<String> codeInfoList = availableCodes.stream()
// .limit(totalNeededCount) // 只取需要的数量
.map(code -> {
return code.getCode();
}).collect(Collectors.toList());
if (CollUtil.isNotEmpty(codeInfoList)) {
confirmResponse.setNeedSplitConfirm(true);
confirmResponse.setNeedSplitCodes(codeInfoList);
return confirmResponse;
}
}
}
// 执行实际的确认操作
//2.如果整盒,从工位队列扣除 默认最后一个追溯码拆零
if (quotient > 0) {
if (availableCodes.size() < quotient) {
throw new JsonException(500, "确认失败,工位库存数量不足!");
}
for (int i = 0; i < quotient; i++) {
IoSplitFifoCodeEntity splitFifoCodeEntity = availableCodes.get(i);
collectOrderBiz.setUnTagCount(IntUtil.value(collectOrderBiz.getUnTagCount()) - IntUtil.value(udiRelevanceResponse.getBhxjsl()));
collectOrderCodeAutoService.save(IoCollectOrderCodeAuto.builder().codeIdFk(splitFifoCodeEntity.getId()).udiCode(splitFifoCodeEntity.getCode()).orderIdFk(collectOrder.getBillNo()).batchNo(splitFifoCodeEntity.getBatchNo()).productDate(splitFifoCodeEntity.getProduceDate()).expireDate(splitFifoCodeEntity.getExpireDate()).serialNo(splitFifoCodeEntity.getSerialNo()).relId(collectOrderBiz.getRelId()).bizIdFk(collectOrderBiz.getId()).fifoSplit(2).createTime(new Date()).updateTime(new Date()).build());
splitFifoCodeService.removeById(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount());
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
}
}
//.如果拆零,拆零表扣除
if (remainder > 0) {
if (confirmSplitCode == null && (IntUtil.value(skipSplitConfirm) || !needSplitConfirm)) {
// 如果跳过拆零确认或不需要拆零确认,直接使用第一个可用的拆零码
if (CollUtil.isEmpty(availableCodes)) {
throw new JsonException(500, "没有可用的拆零码!");
}
confirmSplitCode = availableCodes.get(quotient).getCode(); // 使用整箱之后的下一个码
}
splitRemove(collectOrderBiz, collectOrder, putWorkPlaceCode, true, confirmSplitCode);
}
if (collectOrderBiz.getTagStatus() == 2) {
throw new JsonException(500, "确认失败,工位库存数量不足!");
} else {
collectOrderBiz.setGetConfirm(true);
collectOrderBizService.updateById(collectOrderBiz);
}
// 返回确认后的信息
confirmResponse.setConfirmed(true);
if (confirmSplitCode != null) {
confirmResponse.setUsedSplitCode(confirmSplitCode);
}
return confirmResponse;
}
@Resource
IoSplitFifoInvRelService splitFifoInvRelService;
public List<Long> findInvIdFk(IoCollectOrder collectOrder) {
List<IoSplitFifoInvRel> ioSplitFifoInvRels = splitFifoInvRelService.findInvIdFk(collectOrder.getWorkPlaceCode(), collectOrder.getBusType());
if (CollUtil.isNotEmpty(ioSplitFifoInvRels)) {
return ioSplitFifoInvRels.stream().map(IoSplitFifoInvRel::getInvIdFk).collect(Collectors.toList());
} else return null;
}
public List<IoCollectOrderCodeMan> filterCode(List<IoCollectOrderCodeMan> collectOrderCodes, IoCollectOrderBiz collectOrderBiz, UdiRelevanceResponse udiRelevanceResponse) {
int unTagCount = IntUtil.value(collectOrderBiz.getScanActCount()) - collectOrderBiz.getCount();
List<IoCollectOrderCodeMan> newList = new ArrayList<IoCollectOrderCodeMan>();
int count = 0;
boolean first = true;
for (IoCollectOrderCodeMan collectOrderCode : collectOrderCodes) {
if (collectOrderCode.getBizIdFk().equals(collectOrderBiz.getId())) {
if (IntUtil.value(collectOrderCode.getIsSplitCode())) {
if (first) {
int remainder = unTagCount % IntUtil.value(udiRelevanceResponse.getBhxjsl());
collectOrderCode.setRemainCount(remainder);
first = false;
} else {
collectOrderCode.setRemainCount(collectOrderCode.getScanActCount());
}
newList.add(collectOrderCode);
} else {
count = count + collectOrderCode.getScanActCount();
if (!IntUtil.value(collectOrderCode.getRemoveFlag())) {
if (count > collectOrderBiz.getCount()) {
if (first) {
int remainder = unTagCount % IntUtil.value(udiRelevanceResponse.getBhxjsl());
collectOrderCode.setRemainCount(remainder);
first = false;
} else {
collectOrderCode.setRemainCount(collectOrderCode.getScanActCount());
}
newList.add(collectOrderCode);
}
}
}
}
}
return newList;
}
@Resource
private IoCodeLostMapper ioCodeLostMapper;
/**
* 单据预赋码
*
* @param collectOrder
*/
public void preAutoTagCode(IoCollectOrder collectOrder, String queueCode) {
Long putWorkPlaceCode = null;
//获取上货工位
SysWorkplacePutRel sysWorkplacePutRel = workplacePutRelService.findPutWorkPlace(collectOrder.getWorkPlaceCode(), collectOrder.getBusType());
if (sysWorkplacePutRel != null) putWorkPlaceCode = sysWorkplacePutRel.getWorkPlaceCode();
List<IoCollectOrderBiz> collectOrderBizs = collectOrderBizService.listByBillNo(collectOrder.getBillNo());
for (IoCollectOrderBiz collectOrderBiz : collectOrderBizs) {
List<IoSplitFifoCodeEntity> splitFifoCodeEntities = splitFifoCodeService.findByRelId(putWorkPlaceCode, collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), queueCode);
int total = splitFifoCodeEntities.stream().mapToInt(IoSplitFifoCodeEntity::getTotalCount).sum();
collectOrderBiz.setTempWorkPlaceCount(total);
List<IoSplitCodeEntity> splitCodeEntities = splitCodeService.findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
int splitTotal = splitCodeEntities.stream().mapToInt(IoSplitCodeEntity::getRemainCount).sum();
collectOrderBiz.setTempSplitCount(splitTotal);
total = total + splitTotal;
if (total >= IntUtil.value(collectOrderBiz.getCount())) {
collectOrderBiz.setAutoTagStatus(2);
} else if (total > 0) {
collectOrderBiz.setAutoTagStatus(3);
} else collectOrderBiz.setAutoTagStatus(1);
if (CollUtil.isNotEmpty(splitFifoCodeEntities)) {
IoSplitFifoCodeEntity ioSplitFifoCodeEntity = splitFifoCodeEntities.get(0);
IoCodeLostEntity ioCodeLostEntity = ioCodeLostMapper.selectOne(new QueryWrapper<IoCodeLostEntity>().eq("code", ioSplitFifoCodeEntity.getCode()).last("limit 1"));
if (ioCodeLostEntity != null && StringUtils.isNotEmpty(ioCodeLostEntity.getBatchNo())) {
collectOrderBiz.setBatchNo(ioCodeLostEntity.getBatchNo());
collectOrderBiz.setProductDate(ioCodeLostEntity.getProduceDate());
collectOrderBiz.setExpireDate(ioCodeLostEntity.getExpireDate());
}
}
}
// ThreadUtil.execAsync(() -> {
// ioCollectLedGroupService.openLed(collectOrderBizs);
// });
collectOrderBizService.updateBatchById(collectOrderBizs);
}
/**
* 单据预赋码
*
* @param collectOrder
*/
public void preQxAutoTagCode(IoCollectOrder collectOrder, String queueCode) {
Long putWorkPlaceCode = null;
//获取上货工位
SysWorkplacePutRel sysWorkplacePutRel = workplacePutRelService.findPutWorkPlace(collectOrder.getWorkPlaceCode(), collectOrder.getBusType());
if (sysWorkplacePutRel != null) putWorkPlaceCode = sysWorkplacePutRel.getWorkPlaceCode();
List<IoCollectOrderBiz> collectOrderBizs = collectOrderBizService.listByBillNo(collectOrder.getBillNo());
for (IoCollectOrderBiz collectOrderBiz : collectOrderBizs) {
List<IoSplitFifoCodeEntity> splitFifoCodeEntities = splitFifoCodeService.findByCheckCode(putWorkPlaceCode, collectOrderBiz.getYbbm(), collectOrderBiz.getBatchNo(), queueCode);
int total = splitFifoCodeEntities.stream().mapToInt(IoSplitFifoCodeEntity::getTotalCount).sum();
collectOrderBiz.setTempWorkPlaceCount(total);
List<IoSplitCodeEntity> splitCodeEntities = splitCodeService.findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode);
int splitTotal = splitCodeEntities.stream().mapToInt(IoSplitCodeEntity::getRemainCount).sum();
collectOrderBiz.setTempSplitCount(splitTotal);
total = total + splitTotal;
if (total >= IntUtil.value(collectOrderBiz.getCount())) {
collectOrderBiz.setAutoTagStatus(2);
} else if (total > 0) {
collectOrderBiz.setAutoTagStatus(3);
} else collectOrderBiz.setAutoTagStatus(1);
}
collectOrderBizService.updateBatchById(collectOrderBizs);
}
/**
* 拆零单据撤回,则将拆零表剩余数量加回预出库队列
*
* @param collectOrder
*/
public void backSplit(IoCollectOrder collectOrder) {
List<IoCollectOrderBiz> collectOrderBizs = collectOrderBizService.listByBillNo(collectOrder.getBillNo());
for (IoCollectOrderBiz collectOrderBiz : collectOrderBizs) {
List<IoSplitCodeEntity> ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), collectOrder.getWorkPlaceCode());
if (CollUtil.isNotEmpty(ioSplitCodeEntities)) {
IoSplitCodeEntity splitCodeEntity = ioSplitCodeEntities.get(0);
splitCodeEntity.setRemainCount(IntUtil.value(splitCodeEntity.getRemainCount()) + (IntUtil.value(collectOrderBiz.getCount()) - IntUtil.value(collectOrderBiz.getUnTagCount())));
splitCodeMapper.updateById(splitCodeEntity);
}
}
}
/**
* 从预出库队列里面取出数据,添加至拆零表
*/
public Integer addFifoCode(Long relId, String batchNo, Integer needCount, Long putWorkPlaceCode, String confirmSplitCode) {
List<IoSplitFifoCodeEntity> splitFifoCodeEntities;
if (StrUtil.isNotEmpty(confirmSplitCode)) {
splitFifoCodeEntities = splitFifoCodeService.list(new LambdaQueryWrapper<IoSplitFifoCodeEntity>().eq(IoSplitFifoCodeEntity::getCode, confirmSplitCode).eq(putWorkPlaceCode != null, IoSplitFifoCodeEntity::getWorkPlaceCode, putWorkPlaceCode).orderByAsc(IoSplitFifoCodeEntity::getInBactchNo));
} else {
splitFifoCodeEntities = splitFifoCodeService.list(new LambdaQueryWrapper<IoSplitFifoCodeEntity>().eq(IoSplitFifoCodeEntity::getRelId, relId).eq(StrUtil.isNotEmpty(batchNo), IoSplitFifoCodeEntity::getBatchNo, batchNo).eq(putWorkPlaceCode != null, IoSplitFifoCodeEntity::getWorkPlaceCode, putWorkPlaceCode).orderByAsc(IoSplitFifoCodeEntity::getInBactchNo));
}
Integer count = 0;
List<IoSplitCodeEntity> addSplitCodeEntities = new ArrayList<>();
List<Long> removeIds = new ArrayList<>();
for (IoSplitFifoCodeEntity splitFifoCodeEntity : splitFifoCodeEntities) {
IoSplitCodeEntity splitCodeEntity = new IoSplitCodeEntity();
BeanUtils.copyProperties(splitFifoCodeEntity, splitCodeEntity);
splitCodeEntity.setWorkPlaceCode(splitFifoCodeEntity.getWorkPlaceCode());
count = IntUtil.value(splitFifoCodeEntity.getTotalCount()) + count;
splitCodeEntity.setRemainCount(splitCodeEntity.getTotalCount());
splitCodeEntity.setStatus(1);
splitCodeEntity.setFifoSplit(splitFifoCodeEntity.getFifoSplit());
splitCodeEntity.setId(null);
this.decorateUnpackExpireTime(splitCodeEntity);
addSplitCodeEntities.add(splitCodeEntity);
removeIds.add(splitFifoCodeEntity.getId());
IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity);
if (splitFifoInv != null) {
splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount()));
splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(splitFifoCodeEntity.getScanCount()));
int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount());
splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0);
splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount()));
splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount()));
splitFifoInvService.updateById(splitFifoInv);
}
if (count >= needCount) {
break;
}
}
if (removeIds.size() > 0) {
splitFifoCodeService.removeByIds(removeIds);
}
if (addSplitCodeEntities.size() > 0) {
splitCodeMapper.insertBatch(addSplitCodeEntities);
}
return count;
}
public int checkStatus(List<IoCollectOrderBiz> list) {
boolean hasTwo = false;
boolean hasOne = false;
boolean hasNone = true;
for (IoCollectOrderBiz di : list) {
int tagStatus = di.getTagStatus();
if (tagStatus == 2) {
hasTwo = true;
} else if (tagStatus == 1) {
hasOne = true;
} else if (tagStatus != 3) {
throw new IllegalArgumentException("Invalid tagStatus value: " + tagStatus);
}
}
for (IoCollectOrderBiz di : list) {
if (IntUtil.value(di.getCount()) != IntUtil.value(di.getUnTagCount())) {
hasNone = false;
break;
}
}
if (hasNone) {
return 1;
}
if (hasTwo) {
return 2;
} else if (hasOne) {
return 1;
} else {
return 3;
}
}
//包装拆包失效时间
void decorateUnpackExpireTime(IoSplitCodeEntity ioSplitCodeEntity) {
Long relId = ioSplitCodeEntity.getRelId();
UdiRelevanceEntity relevanceEntity = udiRelevanceService.getById(relId);
int n = IntUtil.value(relevanceEntity.getUnpackUseTime());
// 获取当前时间
Calendar calendar = Calendar.getInstance();
Date unpackTime = calendar.getTime();
// 加上n小时
calendar.add(Calendar.HOUR_OF_DAY, n);
// 转换为Date对象
Date unpackExpireTime = calendar.getTime();
ioSplitCodeEntity.setUnpackTime(unpackTime);
ioSplitCodeEntity.setUnpackExpireTime(unpackExpireTime);
}
/**
* 扫描拆包过期进行处理损耗出库
*/
public void asyncUnpackExpireTask() {
LambdaQueryWrapper<IoSplitCodeEntity> lqw = new LambdaQueryWrapper<>();
Date now = new Date();
lqw.lt(IoSplitCodeEntity::getUnpackExpireTime, now);
List<IoSplitCodeEntity> ioSplitCodeEntities = splitCodeMapper.selectList(lqw);
if (CollUtil.isNotEmpty(ioSplitCodeEntities)) {
//进行损耗出库
IoSplitDesOrder collectOrder;
List<IoSplitDesOrderDetail> splitDesOrderDetails = new ArrayList<>();
List<Long> removeByIds = new ArrayList<>();
collectOrder = IoSplitDesOrder.builder().id(IdUtil.getSnowflakeNextId()).billNo(gennerOrderUtils.createWdOrderNo(new OrderNoTypeBean(Constant.SPLIT_DES_ORDER, "yyyyMMdd"))).busType(null).workPlaceCode(null).createTime(new Date()).billTime(new Date()).remark(null).status(2).createUser("1").updateTime(new Date()).updateUser("1").build();
splitDesOrderService.save(collectOrder);
ioSplitCodeEntities.forEach(splitCodeEntity -> {
//损耗详细表
IoSplitDesOrderDetail splitDesOrderDetail = IoSplitDesOrderDetail.builder().id(IdUtil.getSnowflakeNextId()).workPlaceCode(collectOrder.getWorkPlaceCode()).orderIdFk(collectOrder.getBillNo()).relId(splitCodeEntity.getRelId()).batchNo(splitCodeEntity.getBatchNo()).produceDate(splitCodeEntity.getProduceDate()).expireDate(splitCodeEntity.getExpireDate()).supId(splitCodeEntity.getSupId()).count(splitCodeEntity.getRemainCount()).reCount(splitCodeEntity.getRemainCount()).createTime(new Date()).updateTime(new Date()).remark("").build();
splitDesOrderDetails.add(splitDesOrderDetail);
removeByIds.add(splitCodeEntity.getId());
});
if (removeByIds.size() > 0) {
this.removeByIds(removeByIds);
}
if (splitDesOrderDetails.size() > 0) {
splitDesOrderDetailService.saveBatch(splitDesOrderDetails);
}
}
}
}