| | |
| | | import com.zy.common.model.StartupDto; |
| | | import com.zy.common.service.CommonService; |
| | | import com.zy.common.utils.NodeUtils; |
| | | import com.zy.system.entity.Config; |
| | | import com.zy.system.service.ConfigService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * Created by vincent on 2022/4/9 |
| | |
| | | |
| | | @Autowired |
| | | private LocMastService locMastService; |
| | | @Autowired |
| | | private ConfigService configService; |
| | | @Override |
| | | public R synCallowWarehousing() { |
| | | |
| | | Config outModel = configService.selectConfigByCode("outModel"); |
| | | if (outModel.getValue().equals("Y")) { |
| | | // 没有到305的出库任务(305的出库任务优先) |
| | | int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("io_type", 101) |
| | | .eq("sta_no", 305)); |
| | | if (count > 0) { |
| | | return R.parse("存在305出库任务"); |
| | | } |
| | | outModel.setValue("N"); |
| | | configService.updateById(outModel); |
| | | } |
| | | return R.ok(); |
| | | } |
| | | @Autowired |
| | | private WaitPakinService waitPakinService; |
| | | @Override |
| | | public R syncWarehousing(CombParam param) { |
| | | |
| | | Long userId = 9999L; |
| | | |
| | | // 参数非空判断 |
| | | if (Cools.isEmpty(param.getCombMats())) { |
| | | throw new CoolException("数据不完整,请检查请求参数"); |
| | | } |
| | | |
| | | Config outModel = configService.selectConfigByCode("outModel"); |
| | | if (outModel.getValue().equals("Y")) { |
| | | throw new CoolException("305不允许入库"); |
| | | } |
| | | |
| | | for (CombParam.CombMat combMat : param.getCombMats()) { |
| | | String batch = combMat.getBatch(); |
| | | int countL = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("batch", batch)); |
| | | int countW = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("batch", batch)); |
| | | if (countW > 0) { |
| | | return R.ok("存在任务"); |
| | | } |
| | | int countP = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("batch", batch)); |
| | | if (countL > 0 || countW > 0 || countP > 0) { |
| | | throw new CoolException("该批号已经存在===>>" + batch); |
| | | } |
| | | WaitPakin waitPakin = new WaitPakin(); |
| | | Date now = new Date(); |
| | | waitPakin.sync(combMat); |
| | | waitPakin.setBarcode(""); |
| | | waitPakin.setZpallet(""); // 托盘码 |
| | | waitPakin.setIoStatus("N"); // 入出状态 |
| | | waitPakin.setAnfme(1.0); // 数量 |
| | | waitPakin.setStatus("Y"); // 状态 |
| | | waitPakin.setAppeUser(userId); |
| | | waitPakin.setAppeTime(now); |
| | | waitPakin.setModiUser(userId); |
| | | waitPakin.setModiTime(now); |
| | | |
| | | // 源站点状态检测 |
| | | BasDevp sourceStaNo = basDevpService.checkSiteStatus(305, true); |
| | | |
| | | // 长度>3500放宽库位 |
| | | sourceStaNo.setLocType2((short) (waitPakin.getLength() > 3500 ? 2 : 1)); |
| | | LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); |
| | | |
| | | // 寻找库位 |
| | | StartupDto dto = commonService.getLocNo(sourceStaNo, locTypeDto, 1); |
| | | |
| | | int workNo = dto.getWorkNo(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | | wrkMast.setWhsType(1); |
| | | wrkMast.setIoTime(new Date()); |
| | | wrkMast.setWrkSts(1L); // 工作状态:生成入库ID |
| | | wrkMast.setIoType(1); // 入出库状态:1.入库 |
| | | wrkMast.setIoPri(13D); // 优先级 |
| | | wrkMast.setCrnNo(dto.getCrnNo()); |
| | | wrkMast.setSourceStaNo(dto.getSourceStaNo()); |
| | | wrkMast.setStaNo(dto.getStaNo()); |
| | | wrkMast.setLocNo(dto.getLocNo()); |
| | | wrkMast.setBarcode(""); // 托盘码 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | | wrkMast.setExitMk("N"); // 退出 |
| | | wrkMast.setEmptyMk("N"); // 空板 |
| | | wrkMast.setLinkMis("Y"); |
| | | wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 |
| | | // 操作人员数据 |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiTime(now); |
| | | boolean res = wrkMastService.insert(wrkMast); |
| | | if (!res) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | |
| | | // 生成工作档明细 |
| | | WrkDetl wrkDetl = new WrkDetl(); |
| | | wrkDetl.sync(waitPakin); |
| | | wrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | wrkDetl.setIoTime(wrkMast.getIoTime()); |
| | | wrkDetl.setAppeTime(now); |
| | | wrkDetl.setModiTime(now); |
| | | if (!wrkDetlService.insert(wrkDetl)) { |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | // // 更新源站点信息 |
| | | // sourceStaNo.setWrkNo(workNo); |
| | | // sourceStaNo.setModiTime(now); |
| | | // if (!basDevpService.updateById(sourceStaNo)) { |
| | | // throw new CoolException("更新源站失败"); |
| | | // } |
| | | |
| | | // 更新目标库位状态 |
| | | LocMast locMast = locMastService.selectById(dto.getLocNo()); |
| | | if (locMast.getLocSts().equals("O")) { |
| | | locMast.setLocSts("S"); // S.入库预约 |
| | | locMast.setModiTime(now); |
| | | if (!locMastService.updateById(locMast)) { |
| | | throw new CoolException("改变库位状态失败"); |
| | | } |
| | | } else { |
| | | throw new CoolException(dto.getLocNo() + "目标库位已被占用"); |
| | | } |
| | | } |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public R agvAskOpen(AgvAskOpenParam param) { |
| | | if (param.getFlag() == 0) { // 出库请求wms开门 |
| | | BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305)); |
| | | if (basDevp.getWrkNo() > 6000 && basDevp.getWrkNo() <= 9000 && basDevp.getLoading().equals("Y") && basDevp.getAutoing().equals("Y") |
| | | && basDevp.getOutEnable().equals("Y")) { // 出库工作档 |
| | | WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo()); |
| | | if (wrkMast.getWhsType() == null) { |
| | | throw new CoolException("没有通知agv过来取货"); |
| | | } else if (wrkMast.getWhsType() == 1) { |
| | | WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", basDevp.getWrkNo())); |
| | | if (wrkDetl.getMatnr().equals(param.getMatnr()) && wrkDetl.getBatch().equals(param.getBatch())) { |
| | | wrkMast.setWhsType(2); |
| | | wrkMastService.updateById(wrkMast); |
| | | return R.ok("物料校验成功,马上开门"); |
| | | } else { |
| | | throw new CoolException("编码+批号校验失败:" + param.getBatch()); |
| | | } |
| | | } else if (wrkMast.getWhsType() == 2) { |
| | | return R.ok("马上开门"); |
| | | } else { |
| | | return R.error("工作档当前状态有误"); |
| | | } |
| | | } else { |
| | | return R.error("不满足出库条件"); |
| | | } |
| | | } else if(param.getFlag() == 1) { // 入库请求wms开门 |
| | | BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 305)); |
| | | if (basDevp.getAutoing().equals("Y") && basDevp.getLoading().equals("Y") |
| | | && basDevp.getInEnable().equals("Y")) { // 入库底座 |
| | | WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type",1) |
| | | .eq("source_sta_no",305).lt("wrk_sts",3)); |
| | | if (wrkMast.getWhsType() == null) { |
| | | throw new CoolException("没有入库任务"); |
| | | } else if (wrkMast.getWhsType() == 1) { |
| | | WrkDetl wrkDetl = wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); |
| | | if (wrkDetl.getMatnr().equals(param.getMatnr()) && wrkDetl.getBatch().equals(param.getBatch())) { |
| | | wrkMast.setWhsType(2); |
| | | wrkMastService.updateById(wrkMast); |
| | | return R.ok("物料校验成功,马上开门"); |
| | | } else { |
| | | throw new CoolException("编码+批号校验失败:" + param.getBatch()); |
| | | } |
| | | } else if (wrkMast.getWhsType() == 2) { |
| | | return R.ok("马上开门"); |
| | | } else { |
| | | return R.error("工作档当前状态有误"); |
| | | } |
| | | } else { |
| | | return R.error("底座还未达到"); |
| | | } |
| | | } |
| | | return R.error("出入库标识错误:" + param.getFlag()); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public R synCallowWarehousing(String flag) { |
| | | List<WrkMast> wrkMasts = wrkMastMapper.queryOutLocWork(); |
| | | if (wrkMasts.isEmpty()) { |
| | | return R.ok(); |
| | | } |
| | | return R.parse("当前存在出库任务"); |
| | | } |
| | | |
| | | @Override |
| | | public R syncWarehousing(FullStoreParam param) { |
| | | |
| | | Long userId = 9999L; |
| | | |
| | | // 参数非空判断 |
| | | if (Cools.isEmpty(param.getBarcode(), param.getList())) { |
| | | throw new CoolException("数据不完整,请检查请求参数"); |
| | | } |
| | | |
| | | List<WrkMast> wrkMasts = wrkMastMapper.queryOutLocWork(); |
| | | if(!wrkMasts.isEmpty()) { |
| | | throw new CoolException("305存在出库任务"); |
| | | } |
| | | |
| | | int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode())); |
| | | int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode())); |
| | | if (countLoc > 0 || countWrk > 0) { |
| | | throw new CoolException("工作档/库存条码数据已存在"); |
| | | } |
| | | |
| | | Date now = new Date(); |
| | | // 源站点状态检测 |
| | | BasDevp sourceStaNo = basDevpService.checkSiteStatus(305, true); |
| | | // 检索库位 |
| | | LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); |
| | | List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList()); |
| | | List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList()); |
| | | StartupDto dto = commonService.getLocNo(sourceStaNo,locTypeDto, 1); |
| | | // 生成工作号 |
| | | int workNo = dto.getWorkNo(); |
| | | // 生成工作档 |
| | | WrkMast wrkMast = new WrkMast(); |
| | | wrkMast.setWrkNo(workNo); |
| | | wrkMast.setIoTime(now); |
| | | wrkMast.setWrkSts(2L); // 工作状态:生成入库ID |
| | | wrkMast.setIoType(1); // 入出库状态:1.入库 |
| | | wrkMast.setIoPri(13D); // 优先级:13 |
| | | wrkMast.setCrnNo(dto.getCrnNo()); |
| | | wrkMast.setSourceStaNo(dto.getSourceStaNo()); |
| | | wrkMast.setStaNo(dto.getStaNo()); |
| | | wrkMast.setLocNo(dto.getLocNo()); |
| | | wrkMast.setBarcode(param.getBarcode()); // 托盘码 |
| | | wrkMast.setFullPlt("Y"); // 满板:Y |
| | | wrkMast.setPicking("N"); // 拣料 |
| | | wrkMast.setExitMk("N"); // 退出 |
| | | wrkMast.setEmptyMk("N"); // 空板 |
| | | wrkMast.setLinkMis("N"); |
| | | wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 |
| | | wrkMast.setAppeUser(userId); |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiUser(userId); |
| | | wrkMast.setModiTime(now); |
| | | if (!wrkMastService.insert(wrkMast)) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | // 生成工作档明细 |
| | | List<DetlDto> detlDtos = new ArrayList<>(); |
| | | param.getList().forEach(elem -> { |
| | | DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme()); |
| | | detlDto.setMaktx(elem.getMaktx()); |
| | | detlDto.setSpecs(elem.getSpecs()); |
| | | detlDto.setTagId(elem.getTagId()); |
| | | if (DetlDto.has(detlDtos, detlDto)) { |
| | | DetlDto detlDto1 = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch()); |
| | | assert detlDto1 != null; |
| | | detlDto1.setAnfme(detlDto1.getAnfme() + detlDto.getAnfme()); |
| | | } else { |
| | | detlDtos.add(detlDto); |
| | | } |
| | | }); |
| | | wrkDetlService.createWorkDetail(workNo, detlDtos, param.getBarcode(), userId, now); |
| | | // 更新源站点信息 |
| | | sourceStaNo.setWrkNo(workNo); |
| | | sourceStaNo.setModiUser(userId); |
| | | sourceStaNo.setModiTime(now); |
| | | if (!basDevpService.updateById(sourceStaNo)){ |
| | | throw new CoolException("更新源站失败"); |
| | | } |
| | | // 更新目标库位状态 |
| | | LocMast locMast = locMastService.selectById(dto.getLocNo()); |
| | | if (locMast.getLocSts().equals("O")){ |
| | | locMast.setLocSts("S"); // S.入库预约 |
| | | locMast.setModiUser(userId); |
| | | locMast.setModiTime(now); |
| | | if (!locMastService.updateById(locMast)){ |
| | | throw new CoolException("改变库位状态失败"); |
| | | } |
| | | } else { |
| | | throw new CoolException(dto.getLocNo()+"目标库位已被占用"); |
| | | } |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | | @Override |
| | | public R getOutboundMaterials(String flag) { |
| | | List<WrkDetl> outboundMaterials = wrkMastMapper.getOutboundMaterials(); |
| | | if (Cools.isEmpty(outboundMaterials)) { |
| | | return R.parse("货物未到达或已取走"); |
| | | } |
| | | List<FullStoreParam.MatCodeStore> matCodeStoreList = new ArrayList<>(); |
| | | for(WrkDetl wrkDetl : outboundMaterials){ |
| | | FullStoreParam.MatCodeStore matCodeStore = new FullStoreParam.MatCodeStore(); |
| | | matCodeStore.setMatnr(wrkDetl.getMatnr()); |
| | | matCodeStore.setBatch(wrkDetl.getBatch()); |
| | | matCodeStore.setAnfme(wrkDetl.getAnfme()); |
| | | matCodeStoreList.add(matCodeStore); |
| | | } |
| | | |
| | | return R.ok(matCodeStoreList); |
| | | } |
| | | |
| | | } |