优化agv工作档生成
组托时管控料箱码
拣料出库时生成工作党
AGV库存主档,工作主档的barcode也要记录料箱条码号
AGV工作党任务完成、取消优化
自动补货 管控不带料箱的托盘
盘点加上楼层选择
| | |
| | | import com.baomidou.mybatisplus.mapper.Wrapper; |
| | | import com.baomidou.mybatisplus.plugins.Page; |
| | | import com.core.annotations.ManagerAuth; |
| | | import com.core.common.BaseRes; |
| | | import com.core.common.Cools; |
| | | import com.core.common.DateUtils; |
| | | import com.core.common.R; |
| | | import com.core.common.*; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.entity.param.LocMastInitParam; |
| | |
| | | try { |
| | | devNos = (List<String>) map.get("devNo"); |
| | | agvWrkMastList = devNos.stream().map(devNo -> { |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo)); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo).eq("wrk_sts",205L)); |
| | | if(agvWrkMast.getIoType() != 101 && agvWrkMast.getIoType() != 110){ |
| | | throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型不为101.出库,无法执行容器离场任务,请重新选择站点。"); |
| | | } |
| | |
| | | try { |
| | | devNos = (List<String>) map.get("devNo"); |
| | | agvWrkMastList = devNos.stream().map(devNo -> { |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo)); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo).eq("wrk_sts",205L)); |
| | | if(agvWrkMast.getIoType() == 101){ |
| | | throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型为101.出库,无法执行拣料入库任务,请重新选择站点。"); |
| | | } |
| | |
| | | }).collect(Collectors.toList()); |
| | | }catch (Exception e){ |
| | | String devNo = map.get("devNo").toString(); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo)); |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", devNo).eq("wrk_sts",205L)); |
| | | if(agvWrkMast.getIoType() == 101){ |
| | | throw new CoolException("工作号为" + agvWrkMast.getWrkNo() + "类型为101.出库,无法执行拣料入库任务,请重新选择站点。"); |
| | | } |
| | |
| | | param.remove("row"); |
| | | } |
| | | } |
| | | if(!Cools.isEmpty(param.get("floor"))){ |
| | | wrapper.like("loc_no","@"+param.get("floor")); |
| | | param.remove("floor"); |
| | | } |
| | | excludeTrash(param); |
| | | convert(param, wrapper); |
| | | allLike(AgvLocDetl.class, param.keySet(), wrapper, condition); |
| | |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RequestParam; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | |
| | | return R.ok(exportSupport(list, fields)); |
| | | } |
| | | |
| | | @RequestMapping(value = "/locDetl/compare/auth") |
| | | @ManagerAuth(memo = "库存明细比对") |
| | | public R compareLocDetl(MultipartFile file) throws IOException { |
| | | agvLocDetlService.compareToEss(file); |
| | | |
| | | return R.ok(); |
| | | } |
| | | |
| | | private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){ |
| | | for (Map.Entry<String, Object> entry : map.entrySet()){ |
| | | String val = String.valueOf(entry.getValue()); |
| | |
| | | import com.zy.asrs.entity.AgvLocDetl; |
| | | import com.zy.common.model.LocDto; |
| | | import com.zy.common.model.TaskDto; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.IOException; |
| | | import java.util.List; |
| | | |
| | | public interface AgvLocDetlService extends IService<AgvLocDetl> { |
| | |
| | | |
| | | public AgvLocDetl selectLocdetl(String locNo,String matnr,String batch,String csocode,String isocode); |
| | | |
| | | public void compareToEss(MultipartFile file) throws IOException; |
| | | |
| | | } |
| | |
| | | |
| | | void updateLocType2ByRBL(Integer locType2, AgvLocRule locRule); |
| | | |
| | | public void updateLocStsByLocNo(String locNo, String locSts); |
| | | public void updateLocStsByLocNo(String locNo, String locSts, String barcode); |
| | | |
| | | public List<String> queryGroupEmptyStock(int floor); |
| | | |
| | |
| | | |
| | | public List<AgvWrkMast> selectReadyAgvWrkMast(); |
| | | |
| | | public AgvWrkMast selectByContainerCode(String containerCode); |
| | | |
| | | } |
| | |
| | | |
| | | List<String> list = this.selectCacheShelvesStationCodeByFloor(3); |
| | | if(list.contains(stationCode)){ |
| | | if(Cools.eq(stationCode,"CS-305") || Cools.eq(stationCode,"CS-306") || Cools.eq(stationCode,"CS-307")){ |
| | | wrapper.orderBy("dev_no",false); |
| | | } |
| | | } |
| | | |
| | | List<AgvBasDevp> agvBasDevpList = this.selectList(wrapper); |
| | |
| | | return agvBasDevpDto; |
| | | } |
| | | |
| | | AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>() |
| | | List<AgvWrkMast> agvWrkMasts = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>() |
| | | .eq("loc_no", agvBasDevpDto.getDevNo()) |
| | | .or().eq("source_loc_no",agvBasDevpDto.getDevNo())); |
| | | |
| | | AgvWrkMast agvWrkMast = null; |
| | | for (AgvWrkMast wrkMast : agvWrkMasts){ |
| | | if(Cools.isEmpty(agvWrkMast)){ |
| | | agvWrkMast = wrkMast; |
| | | }else { |
| | | if(agvWrkMast.getWrkSts() < wrkMast.getWrkSts()){ |
| | | agvWrkMast = wrkMast; |
| | | } |
| | | } |
| | | } |
| | | |
| | | agvBasDevpDto.setAgvWrkMast(agvWrkMast); |
| | | |
| | | if("F".equals(agvBasDevpDto.getLocSts()) || "R".equals(agvBasDevpDto.getLocSts())){ |
| | |
| | | import com.baomidou.mybatisplus.plugins.Page; |
| | | import com.baomidou.mybatisplus.service.impl.ServiceImpl; |
| | | import com.core.common.Cools; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.AgvLocDetl; |
| | | import com.zy.asrs.entity.AgvLocMast; |
| | | import com.zy.asrs.entity.AgvWrkDetl; |
| | |
| | | import com.zy.common.model.LocDto; |
| | | import com.zy.common.model.TaskDto; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| | | import org.apache.poi.ss.usermodel.DataFormatter; |
| | | import org.apache.poi.ss.usermodel.Row; |
| | | import org.apache.poi.ss.usermodel.Sheet; |
| | | import org.apache.poi.ss.usermodel.Workbook; |
| | | import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.IOException; |
| | | import java.io.InputStream; |
| | | import java.util.ArrayList; |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | return this.baseMapper.selectLocdetl(locNo,matnr,batch,csocode,isocode); |
| | | } |
| | | |
| | | @Override |
| | | public void compareToEss(MultipartFile file) throws IOException { |
| | | InputStream inStream = file.getInputStream(); |
| | | String fileMime = file.getContentType(); |
| | | int excelVersion = 2007; |
| | | if ("application/vnd.ms-excel".equals(fileMime)) { |
| | | excelVersion = 2003; |
| | | } |
| | | Workbook book = null; |
| | | try { |
| | | if (excelVersion == 2003) { |
| | | book = new HSSFWorkbook(inStream); |
| | | } |
| | | else { // 当 excel 是 2007 时 |
| | | book = new XSSFWorkbook(inStream); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("fail", e); |
| | | throw new CoolException("导入文件格式错误,请使用xls后缀的文件!"); |
| | | } |
| | | |
| | | Sheet sheet = book.getSheetAt(0); |
| | | int totalRows = sheet.getLastRowNum() + 1; // 总 |
| | | Date now = new Date(); |
| | | DataFormatter dataFormatter = new DataFormatter(); |
| | | for (int i = 0; i < totalRows; i++) { |
| | | Row row = sheet.getRow(i); |
| | | // 库位号 |
| | | String locNo = dataFormatter.formatCellValue(row.getCell(0)); |
| | | // 容器码 |
| | | String containerCode = dataFormatter.formatCellValue(row.getCell(1)); |
| | | |
| | | List<AgvLocDetl> agvLocDetls = this.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo).eq("supp_code", containerCode)); |
| | | if(Cools.isEmpty(agvLocDetls)){ |
| | | log.info("库位号:" + locNo + ",容器码:" + containerCode + ",不存在明细"); |
| | | } |
| | | if(agvLocDetls.size()>1){ |
| | | log.info("库位号:" + locNo + ",容器码:" + containerCode + ",存在1条以上记录"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | |
| | | this.baseMapper.updateLocType2(locType2,locRule.getRowBeg(),locRule.getRowEnd(),locRule.getBayBeg(),locRule.getBayEnd(),locRule.getLevBeg(),locRule.getLevEnd(),locRule.getFloor()); |
| | | } |
| | | |
| | | public void updateLocStsByLocNo(String locNo, String locSts) { |
| | | public void updateLocStsByLocNo(String locNo, String locSts, String barcode) { |
| | | AgvLocMast agvLocMast = this.selectById(locNo); |
| | | agvLocMast.setLocSts(locSts); |
| | | agvLocMast.setBarcode(barcode); |
| | | this.updateById(agvLocMast); |
| | | } |
| | | |
| | |
| | | private AgvBasDevpService agvBasDevpService; |
| | | @Autowired |
| | | private AgvLocDetlService agvLocDetlService; |
| | | @Autowired |
| | | private AgvWrkMastService agvWrkMastService; |
| | | |
| | | |
| | | /* |
| | |
| | | |
| | | //检查是否已存在相同的托盘条码,存在则抛出异常 |
| | | if (agvWaitPakinService.selectCount(new EntityWrapper<AgvWaitPakin>().eq("supp_code", param.getBarcode())) > 0) { |
| | | throw new CoolException(param.getBarcode() + "数据正在进行入库"); |
| | | throw new CoolException(param.getBarcode() + "料想码已存在AGV入库通知档中"); |
| | | } |
| | | |
| | | //检查库存是否有相同料箱,存在则抛出异常 |
| | | if(!Cools.isEmpty(agvLocDetlService.selectOne(new EntityWrapper<AgvLocDetl>().eq("supp_code",param.getBarcode())))){ |
| | | throw new CoolException(param.getBarcode() + "料箱码已在库存中"); |
| | | throw new CoolException(param.getBarcode() + "料箱码已存在AGV库存明细中"); |
| | | } |
| | | |
| | | //查看工作档是否有相同料箱,存在则抛出异常 |
| | | if(!Cools.isEmpty(agvWrkMastService.selectByContainerCode(param.getBarcode()))){ |
| | | throw new CoolException(param.getBarcode() + "料箱码已存在AGV工作档中"); |
| | | } |
| | | |
| | | if (Cools.isEmpty(param.getOrderNo())) { |
| | |
| | | //检索库位,选择合适的库位 |
| | | AgvLocMast agvLocMast = agvCommonService.getLocNo(agvWaitPakinList, agvBasDevp.getFloor()); |
| | | //生成工作档 |
| | | //AgvWrkMast wrkMast = createWrkMast(agvBasDevp, agvLocMast, now, userId); |
| | | AgvWrkMast wrkMast = createWrkMast(1,201L,agvBasDevp.getDevNo(),agvLocMast.getLocNo(),agvBasDevp.getBarcode(),now,userId, isConveyor); |
| | | //标记是否为输送线入库 |
| | | wrkMast.setMk(isConveyor ? "Y" : "N"); |
| | | //生成工作档明细 |
| | | //createWrkDetlReWrite(agvWaitPakinList,wrkMast,userId); |
| | | agvWaitPakinList.forEach(wp -> { |
| | | createWrkDetlReWrite(wp.getMatnr(),wrkMast.getWrkNo(),wp.getOrderNo(),wp.getBatch(),wp.getAnfme(),wp.getSuppCode(),now,userId,wp.getThreeCode(),wp.getDeadTime()); |
| | | }); |
| | |
| | | public void pickIn(List<AgvWrkMast> agvWrkMastList){ |
| | | Date now = new Date(); |
| | | agvWrkMastList.forEach(agvWrkMast -> { |
| | | |
| | | //保存拣料出库的工作档和明细 |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | | agvWrkDetlLogService.save(agvWrkMast.getWrkNo()); |
| | | |
| | | //修改工作党 |
| | | agvWrkMast.setWrkSts(201L); |
| | | |
| | |
| | | throw new CoolException(workNo+"工作档不存在"); |
| | | } |
| | | |
| | | if(wrkMast.getWrkSts() > 202){ |
| | | //修改AGV工作档的工作状态为205.工作完成 |
| | | agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205); |
| | | |
| | |
| | | //出库任务 110.空板出库 |
| | | if(wrkMast.getIoType() == 110){ |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode()); |
| | | } |
| | | } |
| | | |
| | | } |
| | |
| | | throw new CoolException("当前任务不可取消"); |
| | | } |
| | | |
| | | //AGV机器人未取货前取消 |
| | | if(wrkMast.getWrkSts() < 203){ |
| | | //入库取消 |
| | | if(wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10){ |
| | | //源站点 |
| | | String devNo = wrkMast.getSourceLocNo(); |
| | | //目标库位 |
| | | String locNo = wrkMast.getLocNo(); |
| | | agvLocMastService.updateLocStsByLocNo(locNo,"O"); |
| | | agvLocMastService.updateLocStsByLocNo(locNo,"O",""); |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"F",wrkMast.getBarcode()); |
| | | |
| | | //出库取消 |
| | |
| | | String locNo = wrkMast.getSourceLocNo(); |
| | | //目标站点 |
| | | String devNo = wrkMast.getLocNo(); |
| | | agvLocMastService.updateLocStsByLocNo(locNo,"F"); |
| | | agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode()); |
| | | if(devNo.contains("@")){ |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(devNo,"O",""); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | //订单回滚 |
| | | //List<AgvWrkDetl> agvWrkDetlList = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo()); |
| | |
| | | //return this.baseMapper.selectReadyAgvWrkMast(); |
| | | } |
| | | |
| | | @Override |
| | | public AgvWrkMast selectByContainerCode(String containerCode) { |
| | | return this.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode",containerCode)); |
| | | } |
| | | |
| | | private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){ |
| | | //往容器入场参数中放入源站点位置 |
| | | for(AgvWrkMast agvWrkMast : agvWrkMastList){ |
| | |
| | | /* |
| | | 定时处理等待执行的任务 工作状态为21.生成出库任务 且目标库位中不含@字符 |
| | | */ |
| | | @Scheduled(cron = "0/5 * * * * ? ") |
| | | @Scheduled(cron = "0/10 * * * * ? ") |
| | | public void dealWatiWrk(){ |
| | | List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectReadyAgvWrkMast(); |
| | | if(!Cools.isEmpty(agvWrkMastList)){ |
| | |
| | | log.error(e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | |
| | | import com.zy.asrs.entity.DocType; |
| | | import com.zy.asrs.entity.Order; |
| | | import com.zy.asrs.service.DocTypeService; |
| | | import com.zy.asrs.service.MatService; |
| | | import com.zy.asrs.service.OrderService; |
| | | import com.zy.asrs.task.handler.AutoReplenishmentHandler; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | private DocTypeService docTypeService; |
| | | @Autowired |
| | | private AutoReplenishmentHandler autoReplenishmentHandler; |
| | | @Autowired |
| | | private MatService matService; |
| | | |
| | | /* |
| | | 定时便利库存,生成自动补货单据 |
| | | */ |
| | | //@Scheduled(cron = "0/5 * * * * ? ") |
| | | public void createOrder(){ |
| | | |
| | | } |
| | | |
| | | /* |
| | | 定时处理自动补货单据 |
| | | */ |
| | | @Scheduled(cron = "0/5 * * * * ? ") |
| | | public void excute(){ |
| | | public void excuteOrder(){ |
| | | DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", "自动补货单")); |
| | | List<Order> orderList = orderService.selectList(new EntityWrapper<Order>() |
| | | .eq("doc_type", docType.getDocId()) |
| | |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import lombok.Synchronized; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | if(agvWrkMast.getIoType() == 10){ |
| | | // 空板入库 设置库位状态为D.空桶/空栈板 |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D"); |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"D",agvWrkMast.getBarcode()); |
| | | }else{ |
| | | //修改目标库位状态为F.在库 |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F"); |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getLocNo(),"F",agvWrkMast.getBarcode()); |
| | | } |
| | | //生成AGV工作历史档 |
| | | agvWrkMastLogService.save(agvWrkMast); |
| | |
| | | //更新库存明细 |
| | | agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(),agvWrkMast.getLocNo()); |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O"); |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O",""); |
| | | } |
| | | |
| | | //删除AGV工作档 |
| | |
| | | agvWrkMast.setWrkSts(207L); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | //修改源库位状态为O |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O"); |
| | | agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O",""); |
| | | if(agvWrkMast.getIoType() == 101){ |
| | | //更新目标库位明细 101.出库 删除源库位库存明细 |
| | | agvLocDetlService.delete(new EntityWrapper<AgvLocDetl>().eq("loc_no",agvWrkMast.getSourceLocNo())); |
| | |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | //202.RCS取货中 |
| | | agvWrkMast.setWrkSts(202L); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | |
| | | agvWaitPakinService.updateIoStatus(agvWrkMast.getWrkNo(),"Y"); |
| | | } |
| | | } |
| | | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | return FAIL; |
| | | } |
| | | |
| | |
| | | return FAIL; |
| | | } |
| | | |
| | | @Synchronized |
| | | @Transactional |
| | | public ReturnT<String> dealWatiWrk(List<AgvWrkMast> agvWrkMastList) throws IOException { |
| | | |
| | | agvWrkMastList.forEach(agvWrkMast -> { |
| | | // //寻找空站点位置 |
| | | // AgvBasDevp agvBasDevp = agvBasDevpService.selectEmptyDevpByStation(agvWrkMast.getLocNo()); |
| | | // if(!Cools.isEmpty(agvBasDevp)){ |
| | | // agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvBasDevp.getDevNo(),"S",null); |
| | | // agvWrkMast.setLocNo(agvBasDevp.getDevNo()); |
| | | // agvWrkMastService.updateById(agvWrkMast); |
| | | // } |
| | | |
| | | //查询该站点所有暂存位在工作档中出现的次数 |
| | | List<Map<String, Object>> devNoMaps = agvBasDevpService.selectDevNoAndNumBystationCode(agvWrkMast.getLocNo()); |
| | | //取第一个暂存位,并查询其次数与配置的次数做比较 |
| | |
| | | if((int)devNoMap.get("num") < maxWrokNum){ |
| | | agvWrkMast.setLocNo(devNoMap.get("dev_no").toString()); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | log.info("after:" + devNoMap.toString() + ", wrkNo:" + agvWrkMast.getWrkNo() + ", locNo: " + agvWrkMast.getLocNo()); |
| | | } |
| | | |
| | | }); |
| | | |
| | | return SUCCESS; |
| | |
| | | package com.zy.asrs.task.handler; |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.core.common.Cools; |
| | | import com.core.exception.CoolException; |
| | | import com.zy.asrs.entity.*; |
| | | import com.zy.asrs.service.*; |
| | | import com.zy.asrs.task.AbstractHandler; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.utils.Utils; |
| | | import com.zy.common.model.enums.WorkNoType; |
| | | import com.zy.common.service.CommonService; |
| | | import org.springframework.beans.BeanUtils; |
| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.util.Date; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | | public class AutoReplenishmentHandler extends AbstractHandler<String> { |
| | |
| | | //List<String> locNosSearch = locDetlService.selectLocNo(matnr); |
| | | Set<String> locNosSearch = locDetlService.selectLocNo(matnr, batch, csocode, isocode); |
| | | |
| | | for(String locNo : locNosSearch){ |
| | | //重新排序 并且检测该库位是否含没有料箱码的物料,如有有则不允许出库 |
| | | Set<String> resort = resort(locNosSearch); |
| | | |
| | | for(String locNo : resort){ |
| | | List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); |
| | | locNos.add(locNo); |
| | | for (LocDetl locDetl :locDetls){ |
| | |
| | | } |
| | | } |
| | | |
| | | // orderDetlList.forEach(orderDetl -> { |
| | | // |
| | | // if(orderDetl.getAnfme() - orderDetl.getQty() <= 0){ |
| | | // cont |
| | | // } |
| | | // |
| | | // String matnr = orderDetl.getMatnr(); |
| | | // Double orderAnfme = orderDetl.getAnfme(); |
| | | // |
| | | // List<String> locNosSearch = locDetlService.selectLocNo(matnr); |
| | | // |
| | | // for(String locNo : locNosSearch){ |
| | | // List<LocDetl> locDetls = locDetlService.selectByLocNo(locNo); |
| | | // locNos.add(locNo); |
| | | // for (LocDetl locDetl :locDetls){ |
| | | // if(matnr.equals(locDetl.getMatnr())){ |
| | | // orderAnfme -= locDetl.getAnfme(); |
| | | // } |
| | | // } |
| | | // if(orderAnfme <= 0){ |
| | | // orderDetl.setQty(orderDetl.getAnfme() - orderAnfme); |
| | | // orderDetlService.updateById(orderDetl); |
| | | // break; |
| | | // } |
| | | // } |
| | | // |
| | | // }); |
| | | |
| | | return locNos; |
| | | } |
| | | |
| | | //根据深浅库位进行重新排序 |
| | | private Set<String> resort(Set<String> locNos){ |
| | | Set<String> locNosResort = new LinkedHashSet<>(); |
| | | |
| | | for(String locNoSearch : locNos){ |
| | | LocMast locMast = locMastService.selectById(locNoSearch); |
| | | if(!"F".equals(locMast.getLocSts())){ |
| | | continue; |
| | | } |
| | | |
| | | List<String> groupOuterLoc = Utils.getGroupOuterLoc(locNoSearch); |
| | | |
| | | if(Cools.isEmpty(groupOuterLoc)){ |
| | | locNosResort.add(locNoSearch); |
| | | }else { |
| | | groupOuterLoc.add(locNoSearch); |
| | | //如果是深库位,则先找外侧的库位 |
| | | for (String locNoOut : groupOuterLoc){ |
| | | LocMast locMastOuter = locMastService.selectById(locNoOut); |
| | | //外侧如果是拣料,则内测不允许出 |
| | | if("P".equals(locMastOuter.getLocSts()) || "Q".equals(locMastOuter.getLocSts()) || "S".equals(locMastOuter.getLocSts())){ |
| | | break; |
| | | } |
| | | |
| | | if(!"F".equals(locMastOuter.getLocSts())){ |
| | | continue; |
| | | } |
| | | locNosResort.add(locNoOut); |
| | | |
| | | } |
| | | } |
| | | } |
| | | return locNosResort; |
| | | } |
| | | |
| | | private WrkMast createWrkMast(String locNo,String barCode,Date now){ |
| | | int ioType = 101; |
| | | int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); |
| | |
| | | password: Wlzh44338 |
| | | |
| | | agv: |
| | | # url: localhost:8080 |
| | | # taskCreatePath: /agv/task/create |
| | | # containerMoveInPath: /agv/container/moveIn |
| | | # containerMoveOutPath: /agv/container/moveOut |
| | | # containerArrivedPath: /agv/containerArrived |
| | | url: 10.10.10.182:9046 |
| | | taskCreatePath: /task/create |
| | | containerMoveInPath: /expand/api/moveIn/container |
| | | containerMoveOutPath: /expand/api/moveOut/container |
| | | containerArrivedPath: /conveyor/containerArrived |
| | | url: localhost:8080 |
| | | taskCreatePath: /agv/task/create |
| | | containerMoveInPath: /agv/container/moveIn |
| | | containerMoveOutPath: /agv/container/moveOut |
| | | containerArrivedPath: /agv/containerArrived |
| | | # url: 10.10.10.182:9046 |
| | | # taskCreatePath: /task/create |
| | | # containerMoveInPath: /expand/api/moveIn/container |
| | | # containerMoveOutPath: /expand/api/moveOut/container |
| | | # containerArrivedPath: /conveyor/containerArrived |
| | | |
| | | u8: |
| | | url: http://192.168.1.55:8010 |
| | | orderReportPath: /api/RdAudit |
| | | |
| | | agvBasDev: |
| | | maxWorkNum: 2 |
| | | maxWorkNum: 1 |
| | | |
| | |
| | | var pageCurr; |
| | | var tableData; |
| | | var admin; |
| | | function getCol() { |
| | | var cols = [ |
| | | {field: 'locNo', align: 'center',title: '库位号'}, |
| | |
| | | return cols; |
| | | } |
| | | |
| | | layui.use(['table','laydate', 'form'], function(){ |
| | | layui.config({ |
| | | base: baseUrl + "/static/layui/lay/modules/" |
| | | }).use(['table','laydate','admin','form'], function(){ |
| | | var table = layui.table; |
| | | var $ = layui.jquery; |
| | | var layer = layui.layer; |
| | | var layDate = layui.laydate; |
| | | var form = layui.form; |
| | | admin = layui.admin; |
| | | |
| | | // 数据渲染 |
| | | tableIns = table.render({ |
| | |
| | | }); |
| | | }); |
| | | |
| | | // 导入销售单 |
| | | $("#compareToEss").click(function () { |
| | | $("#importExcel").trigger("click"); |
| | | }); |
| | | |
| | | // 时间选择器 |
| | | layDate.render({ |
| | | elem: '#modiTime\\$', |
| | |
| | | $("#search").click(); |
| | | } |
| | | }); |
| | | function upload(obj){ |
| | | if(!obj.files) { |
| | | return; |
| | | } |
| | | var file = obj.files[0]; |
| | | admin.confirm('确认导入 [' + file.name +'] 文件吗?', function (index) { |
| | | layer.load(1, {shade: [0.1,'#fff']}); |
| | | var url = baseUrl + "/agv/locDetl/compare/auth"; |
| | | var form = new FormData(); |
| | | form.append("file", file); |
| | | let xhr = new XMLHttpRequest(); |
| | | xhr.open("post", url, true); |
| | | xhr.setRequestHeader('token', localStorage.getItem('token')); |
| | | xhr.onload = uploadComplete; |
| | | xhr.onerror = uploadFailed; |
| | | xhr.onloadend = function () { |
| | | layer.closeAll('loading'); |
| | | }; |
| | | // xhr.upload.onprogress = progressFunction; |
| | | xhr.upload.onloadstart = function(){ |
| | | ot = new Date().getTime(); |
| | | oloaded = 0; |
| | | }; |
| | | xhr.send(form); |
| | | }, function(index){ |
| | | }); |
| | | } |
| | | function uploadComplete(evt) { |
| | | let res = JSON.parse(evt.target.responseText); |
| | | if(res.code === 200) { |
| | | layer.msg(res.msg, {icon: 1}); |
| | | insTb.reload({page: {curr: 1}}); |
| | | } else { |
| | | alert(res.msg); |
| | | // layer.msg(res.msg, {icon: 2}); |
| | | } |
| | | } |
| | | function uploadFailed(evt) { |
| | | let res = JSON.parse(evt.target.responseText); |
| | | alert(res.msg); |
| | | // layer.msg(res.msg, {icon: 2}); |
| | | } |
| | |
| | | var detlCols = [ |
| | | ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: true} |
| | | ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: false} |
| | | ,{field: 'suppCode', align: 'center',title: '料箱码', hide: false} |
| | | ,{field: 'matnr', align: 'center',title: '存货编码',hide: true} |
| | | ,{field: 'suppCode', align: 'center',title: '料箱码', hide: false} |
| | | ,{field: 'matnr', align: 'center',title: '存货编码'} |
| | | ,{field: 'anfme', align: 'center',title: '数量'} |
| | | ,{field: 'batch', align: 'center',title: '序列码', width: 300, sort:true, hide: true} |
| | |
| | | <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all"> |
| | | <link rel="stylesheet" href="../../static/css/cool.css" media="all"> |
| | | <link rel="stylesheet" href="../../static/css/common.css" media="all"> |
| | | <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all"> |
| | | </head> |
| | | <body> |
| | | |
| | |
| | | <div class="layui-btn-container"> |
| | | <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="margin-top: 10px">导出</button> |
| | | </div> |
| | | <button style="display:none" id="compareToEss" > |
| | | <i class="layui-icon layui-icon-upload"></i> 库存比对 |
| | | </button> |
| | | <input style="display:none" id="importExcel" type="file" onchange="upload(this)" > |
| | | </script> |
| | | |
| | | <script type="text/html" id="operate"> |
| | |
| | | <input class="layui-input" type="text" name="maktx" placeholder="物料描述" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <div class="layui-inline"> |
| | | <div class="layui-input-inline"> |
| | | <input class="layui-input" type="number" name="floor" placeholder="楼层" autocomplete="off"> |
| | | </div> |
| | | </div> |
| | | <!-- 日期范围 --> |
| | | <div class="layui-inline" style="width: 300px"> |
| | | <div class="layui-input-inline"> |
| | |
| | | tableReload(); |
| | | }); |
| | | |
| | | // 搜索栏重置事件 |
| | | form.on('submit(reset)', function (data) { |
| | | pageCurr = 1; |
| | | clearFormVal($('#search-box')); |
| | | $('#detlTable').css("display", 'none'); |
| | | tableReload(false); |
| | | }); |
| | | |
| | | layDate.render({ |
| | | elem: '.layui-laydate-range' |
| | | ,type: 'datetime' |
| | |
| | | form.on('submit(search)', function (data) { |
| | | tableReload(); |
| | | }); |
| | | // 搜索栏重置事件 |
| | | form.on('submit(reset)', function (data) { |
| | | pageCurr = 1; |
| | | clearFormVal($('#search-box')); |
| | | $('#detlTable').css("display", 'none'); |
| | | tableReload(false); |
| | | }); |
| | | |
| | | layDate.render({ |
| | | elem: '.layui-laydate-range' |