package com.glxp.api.service.inout; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.pagehelper.PageHelper; import com.glxp.api.entity.inout.IoCodeEntity; import com.glxp.api.entity.inout.IoSplitFifoCodeEntity; import com.glxp.api.req.inout.IoSplitFifoInvRequest; import com.glxp.api.res.inout.IoSplitInvResponse; import com.glxp.api.util.IntUtil; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.glxp.api.entity.inout.IoSplitFifoInv; import com.glxp.api.dao.inout.IoSplitFifoInvMapper; import org.springframework.transaction.annotation.Transactional; @Service public class IoSplitFifoInvService extends ServiceImpl { @Resource IoSplitFifoCodeService splitFifoCodeService; @Transactional(rollbackFor = Exception.class) public void insertInv(List codeList, Long workPlaceCode) { List splitCodeEntities = new ArrayList<>(); if (CollUtil.isNotEmpty(codeList)) { for (IoCodeEntity codeEntity : codeList) { IoSplitFifoCodeEntity ioSplitFifoCodeEntity = null; if (StrUtil.isEmpty(codeEntity.getSerialNo())) { ioSplitFifoCodeEntity = splitFifoCodeService.findByCode(codeEntity.getCode(), workPlaceCode); } if (ioSplitFifoCodeEntity != null) { ioSplitFifoCodeEntity.setScanCount(IntUtil.value(ioSplitFifoCodeEntity.getScanCount()) + IntUtil.value(codeEntity.getCount())); ioSplitFifoCodeEntity.setTotalCount(ioSplitFifoCodeEntity.getTotalCount() + codeEntity.getReCount()); ioSplitFifoCodeEntity.setUpdateTime(new Date()); splitFifoCodeService.updateById(ioSplitFifoCodeEntity); } 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()); splitCodeEntity.setSupId(Long.parseLong(codeEntity.getSupId())); splitCodeEntity.setWorkPlaceCode(workPlaceCode); splitCodeEntity.setFifoSplit(codeEntity.getFifoSplit()); splitCodeEntity.setId(null); splitCodeEntities.add(splitCodeEntity); } } } splitFifoCodeService.saveBatch(splitCodeEntities); for (IoSplitFifoCodeEntity ioSplitFifoCodeEntity : splitCodeEntities) { 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")); if (splitFifoInv != null) { splitFifoInv.setInCount(IntUtil.value(splitFifoInv.getInCount()) + IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())); splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount() - IntUtil.value(splitFifoInv.getOutCount()))); } else { IoSplitFifoInv ioSplitFifoInv = IoSplitFifoInv.builder() .workPlaceCode(ioSplitFifoCodeEntity.getWorkPlaceCode()) .deptCode(ioSplitFifoCodeEntity.getDeptCode()) .invCode(ioSplitFifoCodeEntity.getInvCode()) .productType(ioSplitFifoCodeEntity.getProductType()) .fifoSplit(ioSplitFifoCodeEntity.getFifoSplit()) .relId(ioSplitFifoCodeEntity.getRelId()) .batchNo(ioSplitFifoCodeEntity.getBatchNo()) .produceDate(ioSplitFifoCodeEntity.getProduceDate()) .expireDate(ioSplitFifoCodeEntity.getExpireDate()) .supId(ioSplitFifoCodeEntity.getSupId()) .inCount(ioSplitFifoCodeEntity.getTotalCount()) .outCount(0) .reCount(IntUtil.value(ioSplitFifoCodeEntity.getTotalCount())) .lockCount(0) .createTime(new Date()) .updateTime(new Date()) .remark(null) .enableRemind(false) .invRemindCount(0).build(); save(ioSplitFifoInv); } } ThreadUtil.execAsync(() -> { // splitFifoCodeService.preAllotInv(orderEntity.getWorkPlaceCode()); }); } @Transactional(rollbackFor = Exception.class) public void removeInv(List codeList, Long workPlaceCode) { List splitCodeEntities = new ArrayList<>(); if (CollUtil.isNotEmpty(codeList)) { for (IoCodeEntity codeEntity : codeList) { IoSplitFifoCodeEntity ioSplitFifoCodeEntity = splitFifoCodeService.findByCode(codeEntity.getCode(), workPlaceCode); if (StrUtil.isEmpty(codeEntity.getSerialNo())) { if (ioSplitFifoCodeEntity != null) { ioSplitFifoCodeEntity.setScanCount(IntUtil.value(ioSplitFifoCodeEntity.getScanCount()) - IntUtil.value(codeEntity.getCount())); ioSplitFifoCodeEntity.setTotalCount(ioSplitFifoCodeEntity.getTotalCount() + codeEntity.getReCount()); ioSplitFifoCodeEntity.setUpdateTime(new Date()); splitFifoCodeService.updateById(ioSplitFifoCodeEntity); } } else { splitCodeEntities.add(ioSplitFifoCodeEntity); } } } splitFifoCodeService.removeBatchByIds(splitCodeEntities); //todo 根据工位,产品ID,批次号,供应商 进行库存表进行移除 ThreadUtil.execAsync(() -> { // splitFifoCodeService.preAllotInv(orderEntity.getWorkPlaceCode()); }); } /** * 库存查询 * 若开启了库存预警,需要在库存上有一个状态显示预警状态 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(t.getEnableRemind()){ int count = t.getReCount() - t.getInvRemindCount(); if(count >= 0){ t.setRemindState(1); }else{ t.setRemindState(2); } }else { t.setRemindState(1); } }); 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(); } }