package com.glxp.api.service.collect; import cn.hutool.core.bean.BeanUtil; 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.constant.Constant; import com.glxp.api.dao.collect.IoSplitDesOrderMapper; import com.glxp.api.entity.collect.IoCollectOrderBiz; import com.glxp.api.entity.collect.IoSplitDesOrder; import com.glxp.api.entity.collect.IoSplitDesOrderCode; import com.glxp.api.entity.collect.IoSplitDesOrderDetail; import com.glxp.api.entity.inout.IoSplitCodeEntity; import com.glxp.api.entity.inout.IoSplitFifoCodeEntity; import com.glxp.api.entity.inout.IoSplitFifoInv; import com.glxp.api.exception.JsonException; import com.glxp.api.req.collect.AddInvDesDetaiRequest; import com.glxp.api.req.collect.IoSplitDesOrderRequest; import com.glxp.api.res.basic.UdiRelevanceResponse; import com.glxp.api.res.collect.IoSplitDesOrderResponse; import com.glxp.api.service.inout.IoSplitCodeService; import com.glxp.api.service.inout.IoSplitFifoCodeService; import com.glxp.api.service.inout.IoSplitFifoInvService; import com.glxp.api.util.GennerOrderUtils; import com.glxp.api.util.IntUtil; import com.glxp.api.util.OrderNoTypeBean; import okhttp3.internal.http2.ErrorCode; import org.apache.poi.ss.formula.functions.Offset; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Collections; import java.util.Date; import java.util.List; @Service public class IoSplitDesOrderService extends ServiceImpl { @Resource IoSplitDesOrderMapper splitDesOrderMapper; @Resource IoSplitDesOrderDetailService splitDesOrderDetailService; @Resource GennerOrderUtils gennerOrderUtils; public List filterList(IoSplitDesOrderRequest splitDesOrderRequest) { if (splitDesOrderRequest == null) { return Collections.emptyList(); } if (splitDesOrderRequest.getPage() != null) { int offset = (splitDesOrderRequest.getPage() - 1) * splitDesOrderRequest.getLimit(); PageHelper.offsetPage(offset, splitDesOrderRequest.getLimit()); } List data = splitDesOrderMapper.filterList(splitDesOrderRequest); return data; } public IoSplitDesOrder getByBillNo(String billNo) { return splitDesOrderMapper.selectOne(new LambdaQueryWrapper().eq(IoSplitDesOrder::getBillNo, billNo).last("limit 1")); } public IoSplitDesOrder addInv(AddInvDesDetaiRequest addInvDesDetaiRequest) { IoSplitDesOrder collectOrder; if (StrUtil.isNotEmpty(addInvDesDetaiRequest.getBillNo())) { collectOrder = getByBillNo(addInvDesDetaiRequest.getBillNo()); } else { collectOrder = IoSplitDesOrder.builder() .billNo(gennerOrderUtils.createWdOrderNo(new OrderNoTypeBean(Constant.SPLIT_DES_ORDER, "yyyyMMdd"))) .busType("1") .workPlaceCode(addInvDesDetaiRequest.getWorkPlaceCode()) .createTime(new Date()) .billTime(new Date()) .remark(addInvDesDetaiRequest.getRemark()) .status(1) .createUser(addInvDesDetaiRequest.getCreateUser()) .updateTime(new Date()) .updateUser(addInvDesDetaiRequest.getUpdateUser()) .build(); save(collectOrder); } IoSplitFifoInv splitFifoInv = addInvDesDetaiRequest.getSplitFifoInv(); IoSplitDesOrderDetail splitDesOrderDetail = IoSplitDesOrderDetail.builder() .id(IdUtil.getSnowflakeNextId()) .workPlaceCode(collectOrder.getWorkPlaceCode()) .orderIdFk(collectOrder.getBillNo()) .invId(splitFifoInv.getId()) .relId(splitFifoInv.getRelId()) .batchNo(splitFifoInv.getBatchNo()) .produceDate(splitFifoInv.getProduceDate()) .expireDate(splitFifoInv.getExpireDate()) .supId(splitFifoInv.getSupId()) .count(splitFifoInv.getReCount()) .reCount(splitFifoInv.getReCount()) .createTime(new Date()) .updateTime(new Date()) .remark("").build(); splitDesOrderDetailService.save(splitDesOrderDetail); return collectOrder; } @Resource IoSplitFifoCodeService splitFifoCodeService; @Resource IoSplitDesOrderCodeService ioSplitDesOrderCodeService; public IoSplitDesOrder addCode(AddInvDesDetaiRequest addInvDesDetaiRequest) { IoSplitFifoCodeEntity splitFifoCodeEntity = splitFifoCodeService.findByCode(addInvDesDetaiRequest.getCode(), addInvDesDetaiRequest.getWorkPlaceCode()); if (splitFifoCodeEntity == null) { throw new JsonException("工位存量不存在,请检查后重试!"); } IoSplitDesOrder collectOrder; if (StrUtil.isNotEmpty(addInvDesDetaiRequest.getBillNo())) { collectOrder = getByBillNo(addInvDesDetaiRequest.getBillNo()); } else { collectOrder = IoSplitDesOrder.builder() .billNo(gennerOrderUtils.createWdOrderNo(new OrderNoTypeBean(Constant.SPLIT_DES_ORDER, "yyyyMMdd"))) .busType("1") .workPlaceCode(addInvDesDetaiRequest.getWorkPlaceCode()) .createTime(new Date()) .billTime(new Date()) .remark(addInvDesDetaiRequest.getRemark()) .status(1) .createUser(addInvDesDetaiRequest.getCreateUser()) .updateTime(new Date()) .updateUser(addInvDesDetaiRequest.getUpdateUser()) .build(); save(collectOrder); } IoSplitDesOrderCode splitDesOrderCode = new IoSplitDesOrderCode(); BeanUtil.copyProperties(splitFifoCodeEntity, splitDesOrderCode); splitDesOrderCode.setCount(0); splitDesOrderCode.setReCount(0); ioSplitDesOrderCodeService.save(splitDesOrderCode); return collectOrder; } @Resource IoSplitFifoInvService ioSplitFifoInvService; @Resource IoSplitCodeService splitCodeService; @Transactional(rollbackFor = Exception.class) public Boolean destroyOut(AddInvDesDetaiRequest addInvDesDetaiRequest) { IoSplitDesOrder collectOrder; collectOrder = IoSplitDesOrder.builder() .id(IdUtil.getSnowflakeNextId()) .billNo(gennerOrderUtils.createWdOrderNo(new OrderNoTypeBean(Constant.SPLIT_DES_ORDER, "yyyyMMdd"))) .busType("1") .orderType(1) .workPlaceCode(addInvDesDetaiRequest.getSplitFifoInv().getWorkPlaceCode()) .createTime(new Date()) .billTime(new Date()) .remark(addInvDesDetaiRequest.getRemark()) .status(2) .createUser(addInvDesDetaiRequest.getCreateUser()) .updateTime(new Date()) .updateUser(addInvDesDetaiRequest.getUpdateUser()) .build(); boolean save = save(collectOrder); if (!save) { return false; } //拿到 产品库存 IoSplitFifoInv splitFifoInv = ioSplitFifoInvService.getById(addInvDesDetaiRequest.getSplitFifoInv().getId()); int count = splitFifoInv.getReCount() - addInvDesDetaiRequest.getOutCount(); if (count < 0){ throw new JsonException(500,"库存不足"); } //修改产品 库存 出库数量 可用数量 剩余数量 splitFifoInv.setOutCount(splitFifoInv.getOutCount() + addInvDesDetaiRequest.getOutCount());//出库数量 splitFifoInv.setReCount(splitFifoInv.getInCount() - splitFifoInv.getOutCount());//剩余数量 int availableCount = splitFifoInv.getInCount() - splitFifoInv.getOutCount() - splitFifoInv.getLockCount(); if (availableCount < 0){ throw new JsonException(500,"可用数量库存不足"); } //剩余数量 splitFifoInv.setAvailableCount(availableCount); splitFifoInv.setUpdateTime(new Date()); //更改 库存 boolean update = ioSplitFifoInvService.updateById(splitFifoInv); if (!update) { return false; } // IoSplitFifoInv splitFifoInv = addInvDesDetaiRequest.getSplitFifoInv(); IoSplitDesOrderDetail splitDesOrderDetail = IoSplitDesOrderDetail.builder() .id(IdUtil.getSnowflakeNextId()) .workPlaceCode(collectOrder.getWorkPlaceCode()) .orderIdFk(collectOrder.getBillNo()) .invId(splitFifoInv.getId()) .relId(splitFifoInv.getRelId()) .batchNo(splitFifoInv.getBatchNo()) .produceDate(splitFifoInv.getProduceDate()) .expireDate(splitFifoInv.getExpireDate()) .supId(splitFifoInv.getSupId()) .count(addInvDesDetaiRequest.getOutCount()) .reCount(addInvDesDetaiRequest.getOutCount()) .createTime(new Date()) .updateTime(new Date()) .remark("").build(); boolean save1 = splitDesOrderDetailService.save(splitDesOrderDetail); if (!save1){ return false; } return true; } public Boolean destroyOutByCode(AddInvDesDetaiRequest addInvDesDetaiRequest) { IoSplitFifoCodeEntity splitFifoCodeEntity = splitFifoCodeService.findByCode(addInvDesDetaiRequest.getCode(), addInvDesDetaiRequest.getSplitFifoInv().getWorkPlaceCode()); if (splitFifoCodeEntity == null) { throw new JsonException("该工位不存在,请检查后重试!"); } IoSplitDesOrder collectOrder; collectOrder = IoSplitDesOrder.builder() .id(IdUtil.getSnowflakeNextId()) .billNo(gennerOrderUtils.createWdOrderNo(new OrderNoTypeBean(Constant.SPLIT_DES_ORDER, "yyyyMMdd"))) .busType("1") .orderType(1) .workPlaceCode(addInvDesDetaiRequest.getSplitFifoInv().getWorkPlaceCode()) .createTime(new Date()) .billTime(new Date()) .remark(addInvDesDetaiRequest.getRemark()) .status(2) .createUser(addInvDesDetaiRequest.getCreateUser()) .updateTime(new Date()) .updateUser(addInvDesDetaiRequest.getUpdateUser()) .build(); boolean save = save(collectOrder); if(!save){ return false; } splitFifoCodeEntity.setTotalCount(splitFifoCodeEntity.getTotalCount() - addInvDesDetaiRequest.getOutCount()); //是否在增加一个码字段 记录可用数量 splitFifoCodeEntity.setUpdateTime(new Date()); boolean b = splitFifoCodeService.updateById(splitFifoCodeEntity); if (!b){ return false; } //拿到 产品库存 IoSplitFifoInv splitFifoInv = ioSplitFifoInvService.getOne(new LambdaQueryWrapper() .eq(IoSplitFifoInv::getId,splitFifoCodeEntity.getInvIdFk())); if (splitFifoInv == null){ throw new JsonException(500,"未找到该产品!"); } int count = splitFifoInv.getReCount() - addInvDesDetaiRequest.getOutCount(); if (count < 0){ throw new JsonException(500,"库存不足"); } //修改产品 库存 入库数 splitFifoInv.setInCount(splitFifoInv.getInCount() - addInvDesDetaiRequest.getOutCount()); splitFifoInv.setOutCount(splitFifoInv.getOutCount() + addInvDesDetaiRequest.getOutCount());//出库数量 splitFifoInv.setReCount(splitFifoInv.getInCount() - splitFifoInv.getOutCount());//剩余数量 int availableCount = splitFifoInv.getInCount() - splitFifoInv.getOutCount() - splitFifoInv.getLockCount(); if (availableCount < 0){ throw new JsonException(500,"可用数量库存不足"); } splitFifoInv.setAvailableCount(availableCount);//可用数量 splitFifoInv.setUpdateTime(new Date()); //更改 库存 boolean update = ioSplitFifoInvService.updateById(splitFifoInv); if (!update){ return false; } IoSplitDesOrderDetail splitDesOrderDetail = IoSplitDesOrderDetail.builder() .id(IdUtil.getSnowflakeNextId()) .workPlaceCode(collectOrder.getWorkPlaceCode()) .orderIdFk(collectOrder.getBillNo()) .invId(splitFifoInv.getId()) .relId(splitFifoInv.getRelId()) .batchNo(splitFifoInv.getBatchNo()) .produceDate(splitFifoInv.getProduceDate()) .expireDate(splitFifoInv.getExpireDate()) .supId(splitFifoInv.getSupId()) .count(addInvDesDetaiRequest.getOutCount()) .reCount(addInvDesDetaiRequest.getOutCount()) .createTime(new Date()) .updateTime(new Date()) .remark("").build(); boolean save1 = splitDesOrderDetailService.save(splitDesOrderDetail); if (!save1) { return false; } return true; } public void splitDesOrder(AddInvDesDetaiRequest addInvDesDetaiRequest) { IoSplitDesOrder collectOrder; collectOrder = IoSplitDesOrder.builder() .billNo(gennerOrderUtils.createWdOrderNo(new OrderNoTypeBean(Constant.SPLIT_DES_ORDER, "yyyyMMdd"))) .busType("1") .workPlaceCode(addInvDesDetaiRequest.getWorkPlaceCode()) .createTime(new Date()) .billTime(new Date()) .remark(addInvDesDetaiRequest.getRemark()) .status(1) .createUser(addInvDesDetaiRequest.getCreateUser()) .updateTime(new Date()) .updateUser(addInvDesDetaiRequest.getUpdateUser()) .build(); save(collectOrder); IoSplitCodeEntity splitCodeEntity = splitCodeService.findByCode(addInvDesDetaiRequest.getCode(), addInvDesDetaiRequest.getWorkPlaceCode(), null); if (splitCodeEntity == null) { throw new RuntimeException("该追溯码不存在!"); } int count = IntUtil.value(splitCodeEntity.getRemainCount()) - IntUtil.value(addInvDesDetaiRequest.getOutCount()); if (count < 0) { if (splitCodeEntity == null) { throw new RuntimeException("存量不足!"); } } splitCodeEntity.setRemainCount(count); splitCodeService.updateById(splitCodeEntity); } }