package com.zy.asrs.common.wms.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.domain.dto.DetlDto; import com.zy.asrs.common.domain.param.MobileAdjustParam; import com.zy.asrs.common.openapi.entity.param.CombParam; import com.zy.asrs.common.wms.entity.*; import com.zy.asrs.common.wms.mapper.LocDetlMapper; import com.zy.asrs.common.wms.service.*; import com.zy.asrs.framework.common.BaseRes; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.exception.CoolException; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; /** * 移动端服务核心类 */ @Slf4j @Service public class MobileServiceImpl implements MobileService { @Autowired private WaitPakinService waitPakinService; @Autowired private MatService matService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private BasDevpService basDevpService; @Autowired private WrkMastService wrkMastService; @Autowired private WrkDetlService wrkDetlService; @Autowired private LocMastService locMastService; @Autowired private LocDetlService locDetlService; @Autowired private WaitPakinLogService waitPakinLogService; @Override @Transactional public void comb(CombParam param, Long userId, Long hostId) { if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) { throw new CoolException(BaseRes.PARAM); } // 判断是否有相同条码的数据 if (waitPakinService.count(new LambdaQueryWrapper(). eq(WaitPakin::getZpallet, param.getBarcode()).eq(WaitPakin::getIoStatus, "N")) > 0) { throw new CoolException(param.getBarcode() + "数据正在进行入库"); } Date now = new Date(); // 无单组托 if (Cools.isEmpty(param.getOrderNo())) { // 生成入库通知档 List detlDtos = new ArrayList<>(); param.getCombMats().forEach(elem -> { DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme()); if (DetlDto.has(detlDtos, detlDto)) { DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch()); assert one != null; one.setAnfme(one.getAnfme() + detlDto.getAnfme()); } else { detlDtos.add(detlDto); } }); for (DetlDto detlDto : detlDtos) { Mat mat = matService.getOne(new LambdaQueryWrapper().eq(Mat::getMatnr, detlDto.getMatnr()).eq(Mat::getHostId, hostId)); if (Cools.isEmpty(mat)) { throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); } WaitPakin waitPakin = new WaitPakin(); waitPakin.sync(mat); waitPakin.setBatch(detlDto.getBatch()); waitPakin.setZpallet(param.getBarcode()); // 托盘码 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAnfme(detlDto.getAnfme()); // 数量 waitPakin.setStatus("Y"); // 状态 waitPakin.setAppeUser(userId); waitPakin.setAppeTime(now); waitPakin.setModiUser(userId); waitPakin.setModiTime(now); if (!waitPakinService.save(waitPakin)) { throw new CoolException("保存入库通知档失败"); } } // 关联组托 } else { Order order = orderService.selectByNo(param.getOrderNo(), hostId); if (order.getSettle() > 2) { throw new CoolException("单据编号已过期"); } // 生成入库通知档 List detlDtos = new ArrayList<>(); param.getCombMats().forEach(elem -> { // 订单明细数量校验 OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), elem.getMatnr(), elem.getBatch(),hostId); if (elem.getAnfme() > orderDetl.getEnableQty()) { throw new CoolException(orderDetl.getMatnr() + "入库数量不合法"); } // 修改订单明细数量 if (!orderDetlService.increaseWorkQtyByOrderNo(order.getOrderNo(), elem.getMatnr(), elem.getBatch(), elem.getAnfme(), hostId)) { throw new CoolException("修改单据明细数量失败"); } DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme()); detlDto.setWarehouse(orderDetl.getThreeCode());//来源仓库 detlDto.setOrigin(orderDetl.getSupp());//来源单号 detlDto.setOriginNo(orderDetl.getSuppCode());//来源序号 if (DetlDto.has(detlDtos, detlDto)) { DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch()); assert one != null; one.setAnfme(one.getAnfme() + detlDto.getAnfme()); } else { detlDtos.add(detlDto); } }); for (DetlDto detlDto : detlDtos) { Mat mat = matService.getOne(new LambdaQueryWrapper().eq(Mat::getMatnr, detlDto.getMatnr()).eq(Mat::getHostId, hostId)); if (Cools.isEmpty(mat)) { throw new CoolException(detlDto.getMatnr() + "商品档案不存在"); } WaitPakin waitPakin = new WaitPakin(); waitPakin.sync(mat); waitPakin.setOrderNo(order.getOrderNo()); // 单据编号 waitPakin.setBatch(detlDto.getBatch()); // 序列码 waitPakin.setZpallet(param.getBarcode()); // 托盘码 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAnfme(detlDto.getAnfme()); // 数量 waitPakin.setThreeCode(detlDto.getWarehouse()); // 仓库 waitPakin.setSupp(detlDto.getOrigin()); // 来源单号 waitPakin.setSuppCode(detlDto.getOriginNo()); // 来源序号 waitPakin.setStatus("Y"); // 状态 waitPakin.setAppeUser(userId); waitPakin.setAppeTime(now); waitPakin.setModiUser(userId); waitPakin.setModiTime(now); if (!waitPakinService.save(waitPakin)) { throw new CoolException("保存入库通知档失败"); } } orderService.updateSettle(order.getId(), 2L, userId, hostId); } } @Override public void adjust(MobileAdjustParam param, Long userId, Long hostId) { BasDevp basDevp = basDevpService.getOne(new LambdaQueryWrapper().eq(BasDevp::getDevNo, param.getStaNo()).eq(BasDevp::getHostId, hostId)); if (null == basDevp || basDevp.getWrkNo() == null) { throw new CoolException(param.getStaNo() + "盘点站无效"); } if (!param.getWrkNo().equals(basDevp.getWrkNo())) { throw new CoolException(param.getStaNo() + "盘点站更新,请重新检索"); } WrkMast wrkMast = wrkMastService.getOne(new LambdaQueryWrapper().eq(WrkMast::getWrkNo, param.getWrkNo()).eq(WrkMast::getHostId, hostId)); if (wrkMast.getWrkSts() < 10) { throw new CoolException("盘点无效,任务已盘点再入库"); } Date now = new Date(); List wrkDetls = wrkDetlService.list(new LambdaQueryWrapper().eq(WrkDetl::getWrkNo, wrkMast.getWrkNo()).eq(WrkDetl::getHostId, hostId)); List list = param.getWrkDetls(); // 修改数量 Iterator iterator = wrkDetls.iterator(); while (iterator.hasNext()) { WrkDetl wrkDetl = iterator.next(); Iterator iterator1 = list.iterator(); while (iterator1.hasNext()) { WrkDetl wrkDetl1 = iterator1.next(); if (wrkDetl1.getAnfme() == 0) { iterator1.remove(); } if (wrkDetl.getMatnr().equals(wrkDetl1.getMatnr()) && Cools.eq(wrkDetl.getBatch(), wrkDetl1.getBatch())) { if (!wrkDetl.getAnfme().equals(wrkDetl1.getAnfme())) { // todo 盘点记录、保存调整记录 // 修改明细 if (!wrkDetlService.updateAnfme(wrkDetl1.getAnfme(), wrkMast.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), hostId)) { throw new CoolException(wrkMast.getWrkNo() + "盘点任务," + wrkDetl.getMatnr() + "商品," + wrkDetl.getBatch() + "序列码修改数量失败"); } } iterator.remove(); iterator1.remove(); } } } // 删除明细 for (WrkDetl wrkDetl : wrkDetls) { // todo 盘点记录、保存调整记录 if (!wrkDetlService.updateAnfme(-1.0D, wrkMast.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), hostId)) { throw new CoolException("删除" + wrkMast.getWrkNo() + "盘点任务," + wrkDetl.getMatnr() + "商品," + wrkDetl.getBatch() + "序列码任务明细失败"); } } // 添加明细 for (WrkDetl wrkDetl : list) { if (wrkDetl.getAnfme() == 0.0D) { continue; } // todo 盘点记录、保存调整记录 String orderNo = wrkDetl.getOrderNo(); Mat mat = matService.getOne(new LambdaQueryWrapper().eq(Mat::getMatnr, wrkDetl.getMatnr()).eq(Mat::getHostId, hostId)); wrkDetl.sync(mat); wrkDetl.setOrderNo(orderNo); wrkDetl.setModiTime(now); wrkDetl.setModiUser(userId); wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); if (!wrkDetlService.save(wrkDetl)) { throw new CoolException("添加" + wrkMast.getWrkNo() + "盘点任务," + wrkDetl.getMatnr() + "商品," + wrkDetl.getBatch() + "序列码任务明细失败"); } } // 修改盘点任务主档状态 wrkMast.setFullPlt(wrkDetlService.count(new LambdaQueryWrapper().eq(WrkDetl::getWrkNo, wrkMast.getWrkNo()).eq(WrkDetl::getHostId, hostId)) != 0 ? "Y" : "N"); wrkMast.setModiTime(now); wrkMast.setModiUser(String.valueOf(userId)); if (!wrkMastService.updateById(wrkMast)) { throw new CoolException("修改盘点任务主档失败"); } } @Override @Transactional public R WarehouseIn(String locNo, String barcode,Long hostId) { //判断库位状态 LocMast locMast = locMastService.getOne(new LambdaQueryWrapper().eq(LocMast::getLocNo, locNo).eq(LocMast::getHostId,hostId)); if (Cools.isEmpty(locMast)){ return R.error("该库位不存在"); } if (!locMast.getLocSts().equals("O")){ return R.error("该库位状态为:"+locMast.getLocSts()+",禁止入库"); } //查询组托数据 List list = waitPakinService.list(new LambdaQueryWrapper().eq(WaitPakin::getZpallet, barcode).eq(WaitPakin::getHostId, hostId)); if (Cools.isEmpty(list)){ return R.error("未找到组托信息"); } Date now = new Date(); //插入库存数据 for (WaitPakin waitPakin: list){ Mat mat = matService.getOne(new LambdaQueryWrapper().eq(Mat::getMatnr, waitPakin.getMatnr()).eq(Mat::getHostId, hostId)); LocDetl locDetl = new LocDetl(); locDetl.sync(mat); locDetl.setLocNo(locNo); // locDetl.setBarcode(waitPakin.getBarcode()); locDetl.setZpallet(waitPakin.getZpallet()); locDetl.setAnfme(waitPakin.getAnfme()); locDetl.setBatch(waitPakin.getBatch()); // locDetl.setWeight(waitPakin.getWeight()); locDetl.setHostId(hostId); locDetl.setModiTime(now); locDetl.setAppeTime(now); locDetlService.save(locDetl); //是否属于订单数据 if (!Cools.isEmpty(waitPakin.getOrderNo())){ Order order = orderService.selectByNo(waitPakin.getOrderNo(), hostId); if (Cools.isEmpty(order)){ continue; } OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), waitPakin.getMatnr(), waitPakin.getBatch(),hostId); if (Cools.isEmpty(orderDetl)){ continue; } // 修改订单明细完成数量 if (!orderDetlService.increase(order.getId(), hostId, waitPakin.getMatnr(), waitPakin.getBatch(), waitPakin.getAnfme())) { throw new CoolException("修改单据明细数量失败"); } // 修改订单状态 作业中 ===>> 已完成 orderService.checkComplete(waitPakin.getOrderNo(), hostId); } } //修改库位状态 locMast.setLocSts("F"); locMast.setModiTime(now); locMastService.updateById(locMast); // 保存入库通知档历史档 if (!waitPakinLogService.saveToHistory(barcode, hostId)) { throw new CoolException("保存组托数据失败"); } // 删除入库通知档 if (!waitPakinService.remove(new LambdaQueryWrapper().eq(WaitPakin::getZpallet, barcode).eq(WaitPakin::getHostId, hostId))) { throw new CoolException("删除组托数据失败"); } return R.ok("上架成功"); } @Override @Transactional public R WarehouseOut(CombParam combParam, Long hostId) { //判断库位状态 LocMast locMast = locMastService.getOne(new LambdaQueryWrapper().eq(LocMast::getLocNo, combParam.getLocno()).eq(LocMast::getHostId,hostId)); if (Cools.isEmpty(locMast)){ return R.error("该库位不存在"); } if (!locMast.getLocSts().equals("F")){ return R.error("该库位状态为:"+locMast.getLocSts()+",禁止出库"); } //查询库存数据 for (CombParam.CombMat combMat :combParam.getCombMats()){ LocDetl locDetl = locDetlService.getOne(new LambdaQueryWrapper() .eq(LocDetl::getLocNo, combParam.getLocno()) .eq(LocDetl::getHostId, hostId) .eq(LocDetl::getZpallet, combMat.getZpallet()) .eq(LocDetl::getMatnr, combMat.getMatnr()) .eq(LocDetl::getBatch, combMat.getBatch()) ); if (Cools.isEmpty(locDetl)){ return R.error("未查询到库存数据"); } if (combMat.getAnfme() > locDetl.getAnfme()){ return R.error("下架数量错误,超出库存数量"); } if (!Cools.isEmpty(combParam.getOrderNo())){ Order order = orderService.selectByNo(combParam.getOrderNo(), hostId); if (Cools.isEmpty(order)){ continue; } if (order.getSettle() == 1){ orderService.updateSettle(order.getId(), 2L, 9527L, hostId); } OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), combMat.getMatnr(), combMat.getBatch(),hostId); if (Cools.isEmpty(orderDetl)){ continue; } if (orderDetl.getAnfme() < orderDetl.getWorkQty()+combMat.getAnfme()){ throw new CoolException("下架数量出错"); } // 修改订单明细作业数量 if (!orderDetlService.increaseWorkQtyByOrderNo(combParam.getOrderNo(), combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme(), hostId)) { throw new CoolException("修改单据明细工作数量失败"); } // 修改订单明细完成数量 if (!orderDetlService.increase(order.getId(), hostId, combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme())) { throw new CoolException("修改单据明细完成数量失败"); } // 修改订单状态 作业中 ===>> 已完成 orderService.checkComplete(combParam.getOrderNo(), hostId); } try { //处理库存信息 if (combMat.getAnfme().equals(locDetl.getAnfme())){ //库存相等删除数据 locDetlService.removeById(locDetl); int count = locDetlService.count(new LambdaQueryWrapper().eq(LocDetl::getLocNo,combParam.getLocno()).eq(LocDetl::getHostId, hostId)); if (count == 0){ LocMast locMast1 = locMastService.getOne(new LambdaQueryWrapper().eq(LocMast::getLocNo, combParam.getLocno()).eq(LocMast::getHostId, hostId)); locMast1.setLocSts("O"); locMastService.updateById(locMast1); } }else { BigDecimal subtract = BigDecimal.valueOf(locDetl.getAnfme()).subtract(BigDecimal.valueOf(combMat.getAnfme())); locDetl.setAnfme(subtract.doubleValue()); locDetlService.updateById(locDetl); } }catch (Exception e){ throw new CoolException("更新库存数据出错"+e.getMessage()); } } return R.ok(); } }