package com.glxp.api.service.inout; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.glxp.api.dao.collect.IoCollectCodeBackMapper; import com.glxp.api.dao.collect.IoCollectOrderBackupMapper; import com.glxp.api.dao.inout.IoSplitFifoInvMapper; import com.glxp.api.entity.basic.SysWorkplaceLayer; import com.glxp.api.entity.basic.SysWorkplacePutRel; import com.glxp.api.entity.basic.SysWorkplaceQueue; import com.glxp.api.entity.collect.*; import com.glxp.api.entity.inout.*; import com.glxp.api.exception.JsonException; import com.glxp.api.req.basic.SysWorkplaceLayerRequest; import com.glxp.api.req.inout.IoSplitCodeRequest; import com.glxp.api.req.inout.IoSplitFifoInvRequest; import com.glxp.api.res.basic.UdiRelevanceResponse; import com.glxp.api.res.inout.IoSplitInvResponse; import com.glxp.api.service.basic.SysWorkplaceDocumentService; import com.glxp.api.service.basic.SysWorkplaceLayerService; import com.glxp.api.service.basic.SysWorkplaceQueueService; import com.glxp.api.service.basic.UdiRelevanceService; import com.glxp.api.service.collect.IoCollectSetService; import com.glxp.api.service.collect.IoSplitFifoInvRelService; import com.glxp.api.service.thrsys.SysWorkplacePutRelService; import com.glxp.api.util.IntUtil; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Service public class IoSplitFifoInvService extends ServiceImpl { @Resource IoSplitFifoCodeService splitFifoCodeService; @Resource SysWorkplaceDocumentService sysWorkplaceDocumentService; @Resource UdiRelevanceService udiRelevanceService; /** * 插入库存 * * @param codeList */ @Transactional(rollbackFor = Exception.class) public void insertInv(List codeList, IoOrderEntity orderEntity) { List splitCodeEntities = new ArrayList<>(); if (CollUtil.isNotEmpty(codeList)) { long index = 1; for (IoCodeEntity codeEntity : codeList) { IoSplitFifoCodeEntity ioSplitFifoCodeEntity = null; if (StrUtil.isEmpty(codeEntity.getSerialNo())) { ioSplitFifoCodeEntity = splitFifoCodeService.findByCode(codeEntity.getCode(), orderEntity.getWorkPlaceCode()); } if (ioSplitFifoCodeEntity != null) { ioSplitFifoCodeEntity.setScanCount(IntUtil.value(ioSplitFifoCodeEntity.getScanCount()) + IntUtil.value(codeEntity.getCount())); ioSplitFifoCodeEntity.setTotalCount(ioSplitFifoCodeEntity.getTotalCount() + codeEntity.getReCount()); ioSplitFifoCodeEntity.setUpdateTime(new Date()); ioSplitFifoCodeEntity.setBusType(orderEntity.getSplitBusType()); ioSplitFifoCodeEntity.setWorkPlaceQueueCode(orderEntity.getWorkPlaceQueueCode()); splitFifoCodeService.updateById(ioSplitFifoCodeEntity); IoSplitFifoInv splitFifoInv = findByFifoCode(ioSplitFifoCodeEntity); if (splitFifoInv != null) { splitFifoInv.setInCount(IntUtil.value(splitFifoInv.getInCount()) + IntUtil.value(codeEntity.getReCount())); splitFifoInv.setInCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) + IntUtil.value(codeEntity.getCount())); // splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(codeEntity.getReCount())); 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.getOutCount()) - IntUtil.value(splitFifoInv.getLockCount())); // splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) + IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())); updateById(splitFifoInv); } } else { IoSplitFifoCodeEntity splitCodeEntity = new IoSplitFifoCodeEntity(); BeanUtils.copyProperties(codeEntity, splitCodeEntity); splitCodeEntity.setInBactchNo(codeEntity.getInBatchNo()); splitCodeEntity.setScanCount(codeEntity.getCount()); splitCodeEntity.setTotalCount(IntUtil.value(splitCodeEntity.getTotalCount()) + codeEntity.getReCount()); if (StrUtil.isNotEmpty(codeEntity.getSupId())) splitCodeEntity.setSupId(Long.parseLong(codeEntity.getSupId())); splitCodeEntity.setWorkPlaceCode(orderEntity.getWorkPlaceCode()); splitCodeEntity.setWorkPlaceQueueCode(orderEntity.getWorkPlaceQueueCode()); splitCodeEntity.setFifoSplit(codeEntity.getFifoSplit()); UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectByRelId(codeEntity.getRelId() + ""); if (udiRelevanceResponse != null) { splitCodeEntity.setYbbm(udiRelevanceResponse.getYbbm()); } splitCodeEntity.setBusType(orderEntity.getSplitBusType()); index++; splitCodeEntity.setInBactchNo(System.currentTimeMillis() + index + ""); splitCodeEntity.setId(null); splitCodeEntities.add(splitCodeEntity); } } } for (IoSplitFifoCodeEntity ioSplitFifoCodeEntity : splitCodeEntities) { IoSplitFifoInv splitFifoInv = findByFifoCode(ioSplitFifoCodeEntity); if (splitFifoInv != null) { splitFifoInv.setInCount(IntUtil.value(splitFifoInv.getInCount()) + IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())); splitFifoInv.setInCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) + IntUtil.value(ioSplitFifoCodeEntity.getScanCount())); 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.getAvailableCount()) + IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())); updateById(splitFifoInv); } else { splitFifoInv = IoSplitFifoInv.builder() .id(IdUtil.getSnowflakeNextId()).workPlaceCode(ioSplitFifoCodeEntity.getWorkPlaceCode()) .deptCode(ioSplitFifoCodeEntity.getDeptCode()) .invCode(ioSplitFifoCodeEntity.getInvCode()) .productType(ioSplitFifoCodeEntity.getProductType()) .fifoSplit(ioSplitFifoCodeEntity.getFifoSplit()).relId(ioSplitFifoCodeEntity.getRelId()) .inCodeCount(ioSplitFifoCodeEntity.getScanCount()) .batchNo(ioSplitFifoCodeEntity.getBatchNo()) .produceDate(ioSplitFifoCodeEntity.getProduceDate()) .expireDate(ioSplitFifoCodeEntity.getExpireDate()) .supId(ioSplitFifoCodeEntity.getSupId()) .inCount(ioSplitFifoCodeEntity.getTotalCount()).outCount(0) .reCount(IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())) .availableCount(IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())).lockCount(0) .createTime(new Date()).updateTime(new Date()).remark(null) .enableRemind(false).invRemindCount(0) .workPlaceQueueCode(orderEntity.getWorkPlaceQueueCode() == null ? setQueueCode(ioSplitFifoCodeEntity.getWorkPlaceCode(), orderEntity.getCreateUser(), ioSplitFifoCodeEntity.getRelId()) : orderEntity.getWorkPlaceQueueCode()) .build(); splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount())); save(splitFifoInv); //更新库存工位关联 List sysWorkplacePutRels = sysWorkplacePutRelService.selectByWorkPutCode(orderEntity.getWorkPlaceCode()); if (CollUtil.isNotEmpty(sysWorkplacePutRels)) { for (SysWorkplacePutRel sysWorkplacePutRel : sysWorkplacePutRels) { IoSplitFifoInvRel splitFifoInvRel = new IoSplitFifoInvRel(); splitFifoInvRel.setInvIdFk(splitFifoInv.getId()); splitFifoInvRel.setPutWorkCode(orderEntity.getWorkPlaceCode()); splitFifoInvRel.setCollectWorkCode(sysWorkplacePutRel.getCollectWorkCode()); splitFifoInvRel.setBusType(sysWorkplacePutRel.getCollectBusType()); splitFifoInvRel.setCreateTime(new Date()); splitFifoInvRel.setUpdateTime(new Date()); splitFifoInvRelService.saveOrUpdate(splitFifoInvRel); } } } ioSplitFifoCodeEntity.setInvIdFk(splitFifoInv.getId()); } splitFifoCodeService.saveBatch(splitCodeEntities); } @Resource SysWorkplaceQueueService sysWorkplaceQueueService; @Resource SysWorkplaceLayerService sysWorkplaceLayerService; public String setQueueCode(Long workPlaceCode, String userId, Long relId) { List queues = sysWorkplaceQueueService.list(new LambdaQueryWrapper().eq(SysWorkplaceQueue::getWorkPlaceIdFk, workPlaceCode)); if (queues.size() == 0) { throw new JsonException(500, "请增加取货槽"); } //需要先判断 该产品是否已经有库存了 不然 工位有库存 在设置新的虚拟槽位 会显示同样产品 的多条数据但是 下面码明细一样 List ioSplitFifoInvs = list(new LambdaQueryWrapper().eq(IoSplitFifoInv::getRelId, relId)); if (ioSplitFifoInvs != null && ioSplitFifoInvs.size() > 0) { return ioSplitFifoInvs.get(0).getWorkPlaceQueueCode(); } SysWorkplaceQueue workplaceQueue = queues.get(0); // 使用流来过滤掉匹配的元素 List filteredQueues = queues.stream() .filter(queue -> { if (queue.getRelId() != null) { return false; } List list = list( new LambdaQueryWrapper() .eq(IoSplitFifoInv::getWorkPlaceQueueCode, queue.getCode()) ); return list == null || list.isEmpty(); }) .sorted((queue1, queue2) -> queue1.getCode().compareTo(queue2.getCode())) .collect(Collectors.toList()); if (filteredQueues.size() > 0) { //还有剩余的槽位 可分配 SysWorkplaceQueue sysWorkplaceQueue = filteredQueues.get(0); return sysWorkplaceQueue.getCode(); } else { //增加一个槽位 SysWorkplaceLayer layer = sysWorkplaceLayerService.getOne(new LambdaQueryWrapper().eq(SysWorkplaceLayer::getCode, workplaceQueue.getLayerCode())); SysWorkplaceLayerRequest sysWorkplaceLayerRequest = new SysWorkplaceLayerRequest(); sysWorkplaceLayerRequest.setFreightCode(workplaceQueue.getFreightCode()); sysWorkplaceLayerRequest.setCode(workplaceQueue.getLayerCode()); sysWorkplaceLayerRequest.setWorkPlaceIdFk(workPlaceCode); sysWorkplaceLayerRequest.setQueueNum(layer.getQueueNum() + 1); Boolean aBoolean = sysWorkplaceLayerService.addSysWorkplaceLayer(sysWorkplaceLayerRequest, Long.valueOf(userId)); if (!aBoolean) { throw new JsonException(500, "虚拟槽位增加失败"); } } return setQueueCode(workPlaceCode, userId, relId); } @Resource SysWorkplacePutRelService sysWorkplacePutRelService; @Resource IoSplitFifoInvRelService splitFifoInvRelService; @Resource IoCollectOrderBackupMapper collectOrderBackupMapper; @Resource IoCollectCodeBackMapper collectCodeBackMapper; @Resource IoCollectSetService collectSetService; /** * 移除库存 */ @Transactional(rollbackFor = Exception.class) public void removeInv(List codeList, IoOrderEntity orderEntity) { List splitCodeEntities = new ArrayList<>(); IoCollectSet collectSet = collectSetService.getSet(); if (CollUtil.isNotEmpty(codeList)) { for (IoCodeEntity codeEntity : codeList) { IoSplitFifoCodeEntity ioSplitFifoCodeEntity = splitFifoCodeService.findByCode(codeEntity.getCode(), orderEntity.getWorkPlaceCode()); if (ioSplitFifoCodeEntity == null && IntUtil.value(collectSet.getConflictReturn())) { ioSplitCodeService.workReturnReplace(codeEntity, orderEntity.getWorkPlaceCode()); } else { //退库扫码冲突判断 if (StrUtil.isEmpty(codeEntity.getSerialNo())) { if (ioSplitFifoCodeEntity != null) { ioSplitFifoCodeEntity.setScanCount(IntUtil.value(ioSplitFifoCodeEntity.getScanCount()) - IntUtil.value(codeEntity.getCount())); ioSplitFifoCodeEntity.setTotalCount(IntUtil.value(ioSplitFifoCodeEntity.getTotalCount()) - IntUtil.value(codeEntity.getReCount())); ioSplitFifoCodeEntity.setUpdateTime(new Date()); splitFifoCodeService.updateById(ioSplitFifoCodeEntity); IoSplitFifoInv splitFifoInv = findByFifoCode(ioSplitFifoCodeEntity); if (splitFifoInv != null) { splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(codeEntity.getReCount())); splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + IntUtil.value(codeEntity.getCount())); splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(codeEntity.getReCount())); splitFifoInv.setReCodeCount(IntUtil.value(splitFifoInv.getInCodeCount()) - IntUtil.value(splitFifoInv.getOutCodeCount())); splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount()) - IntUtil.value(splitFifoInv.getLockCount())); updateById(splitFifoInv); } if (ioSplitFifoCodeEntity.getScanCount() == 0) { splitFifoCodeService.removeById(ioSplitFifoCodeEntity); } } } else { if (ioSplitFifoCodeEntity != null) splitCodeEntities.add(ioSplitFifoCodeEntity); splitFifoCodeService.removeBatchByIds(splitCodeEntities); for (IoSplitFifoCodeEntity tempEntity : splitCodeEntities) { IoSplitFifoInv splitFifoInv = findByFifoCode(tempEntity); if (splitFifoInv != null) { splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(tempEntity.getTotalCount())); splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + 1); 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.getOutCount()) - IntUtil.value(splitFifoInv.getLockCount())); updateById(splitFifoInv); } } } } } } } @Transactional(rollbackFor = Exception.class) public void removeByCodes(List codes, Long workPlaceCode) { List splitCodeEntities = new ArrayList<>(); for (String code : codes) { IoSplitFifoCodeEntity ioSplitFifoCodeEntity = splitFifoCodeService.findByCode(code, workPlaceCode); if (ioSplitFifoCodeEntity == null) { throw new JsonException(500, "工位队列不存在!"); } splitCodeEntities.add(ioSplitFifoCodeEntity); } if (CollUtil.isNotEmpty(splitCodeEntities)) { splitFifoCodeService.removeBatchByIds(splitCodeEntities); for (IoSplitFifoCodeEntity ioSplitFifoCodeEntity : splitCodeEntities) { IoSplitFifoInv splitFifoInv = findByFifoCode(ioSplitFifoCodeEntity); if (splitFifoInv != null) { splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())); splitFifoInv.setOutCodeCount(IntUtil.value(splitFifoInv.getOutCodeCount()) + 1); 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.getOutCount()) - IntUtil.value(splitFifoInv.getLockCount())); updateById(splitFifoInv); } } } } public IoSplitFifoInv findByFifoCode(IoSplitFifoCodeEntity ioSplitFifoCodeEntity) { // Boolean isOnlyInv = sysWorkplaceDocumentService.isOnlyInv(ioSplitFifoCodeEntity.getWorkPlaceCode(), ioSplitFifoCodeEntity.getBusType()); IoSplitFifoInv splitFifoInv = getOne(new LambdaQueryWrapper().eq(IoSplitFifoInv::getRelId, ioSplitFifoCodeEntity.getRelId()).eq(IoSplitFifoInv::getWorkPlaceCode, ioSplitFifoCodeEntity.getWorkPlaceCode()).eq(StrUtil.isNotEmpty(ioSplitFifoCodeEntity.getBatchNo()), IoSplitFifoInv::getBatchNo, ioSplitFifoCodeEntity.getBatchNo()).eq(ioSplitFifoCodeEntity.getSupId() != null, IoSplitFifoInv::getSupId, ioSplitFifoCodeEntity.getSupId()).last("limit 1")); // .eq(StrUtil.isNotEmpty(ioSplitFifoCodeEntity.getBusType()) && isOnlyInv, IoSplitFifoInv::getBusType, ioSplitFifoCodeEntity.getBusType()) return splitFifoInv; } /** * 库存查询 * 若开启了库存预警,需要在库存上有一个状态显示预警状态 1:正常;2:低库存;3:负库存 * * @param ioSplitFifoInvRequest * @return */ public List filterList(IoSplitFifoInvRequest ioSplitFifoInvRequest) { if (ioSplitFifoInvRequest == null) { return Collections.emptyList(); } if (ioSplitFifoInvRequest.getPage() != null) { int offset = (ioSplitFifoInvRequest.getPage() - 1) * ioSplitFifoInvRequest.getLimit(); PageHelper.offsetPage(offset, ioSplitFifoInvRequest.getLimit()); } List ioSplitInvResponses = this.baseMapper.filterList(ioSplitFifoInvRequest); if (CollUtil.isNotEmpty(ioSplitInvResponses)) { ioSplitInvResponses.forEach(t -> { if (IntUtil.value(t.getQueueEnableRemind())) { int count = t.getReCount() - t.getQueueRemindCount(); if (count > 0) { t.setRemindState(1); } else { t.setRemindState(2); } } else { t.setRemindState(1); } }); return ioSplitInvResponses; } else { return Collections.emptyList(); } } public List filterKcyjList(IoSplitFifoInvRequest ioSplitFifoInvRequest) { if (ioSplitFifoInvRequest == null) { return Collections.emptyList(); } if (ioSplitFifoInvRequest.getPage() != null) { int offset = (ioSplitFifoInvRequest.getPage() - 1) * ioSplitFifoInvRequest.getLimit(); PageHelper.offsetPage(offset, ioSplitFifoInvRequest.getLimit()); } List ioSplitInvResponses = this.baseMapper.filterKcyjList(ioSplitFifoInvRequest); if (CollUtil.isNotEmpty(ioSplitInvResponses)) { ioSplitInvResponses.forEach(t -> { if (IntUtil.value(t.getQueueEnableRemind())) { int count = IntUtil.value(t.getReCount()) - IntUtil.value(t.getQueueRemindCount()); if (count > 0) { t.setRemindState(1); } else { t.setRemindState(2); } } else { t.setRemindState(0); } Integer suggestOutCount = t.getSuggestOutCount(); if (suggestOutCount != null && suggestOutCount < 0) { t.setSuggestOutCount(0); } }); return ioSplitInvResponses; } else { return Collections.emptyList(); } } /** * 库存预警设置 * * @param ioSplitFifoInvRequest */ @Transactional(rollbackFor = Exception.class) public void remindSet(IoSplitFifoInvRequest ioSplitFifoInvRequest) { Assert.notNull(ioSplitFifoInvRequest.getId(), "Id不能为空"); IoSplitFifoInv old = this.getById(ioSplitFifoInvRequest.getId()); Assert.notNull(old, "不存在该库存预警设置"); this.lambdaUpdate().set(ioSplitFifoInvRequest.getEnableRemind() != null, IoSplitFifoInv::getEnableRemind, ioSplitFifoInvRequest.getEnableRemind() ? 1 : 0).set(ioSplitFifoInvRequest.getInvRemindCount() != null, IoSplitFifoInv::getInvRemindCount, ioSplitFifoInvRequest.getInvRemindCount()).set(IoSplitFifoInv::getUpdateTime, new Date()).eq(IoSplitFifoInv::getId, ioSplitFifoInvRequest.getId()).update(); } @Resource IoSplitCodeService ioSplitCodeService; public List getStock(IoSplitFifoInvRequest ioSplitFifoInvRequest) { if (ioSplitFifoInvRequest == null) { return Collections.emptyList(); } if (ioSplitFifoInvRequest.getPage() != null) { int offset = (ioSplitFifoInvRequest.getPage() - 1) * ioSplitFifoInvRequest.getLimit(); PageHelper.offsetPage(offset, ioSplitFifoInvRequest.getLimit()); } List ioSplitInvResponses = this.baseMapper.getStockList(ioSplitFifoInvRequest); for (IoSplitInvResponse ioSplitInvResponse : ioSplitInvResponses) { IoSplitCodeRequest ioSplitCodeRequest = new IoSplitCodeRequest(); ioSplitCodeRequest.setRelId(ioSplitInvResponse.getRelId()); List ioSplitCodeEntities = ioSplitCodeService.filterList(ioSplitCodeRequest); if (ioSplitCodeEntities.size() > 0) { int totalRemainCount = ioSplitCodeEntities.stream() .mapToInt(item -> item.getRemainCount()) .sum(); ioSplitInvResponse.setSplitRemCount(totalRemainCount); } } ioSplitInvResponses.forEach(t -> { if (IntUtil.value(t.getQueueEnableRemind())) { int count = IntUtil.value(t.getRemCount()) - IntUtil.value(t.getQueueRemindCount()); if (count > 0) { t.setRemindState(1); } else { t.setRemindState(2); } } else { t.setRemindState(0); } Integer suggestOutCount = t.getSuggestOutCount(); if (suggestOutCount != null && suggestOutCount < 0) { t.setSuggestOutCount(0); } }); return ioSplitInvResponses; } }