| | |
| | | private AgvLocDetlService agvLocDetlService; |
| | | @Autowired |
| | | private AgvWrkMastService agvWrkMastService; |
| | | @Autowired |
| | | private AgvWrkDetlService agvWrkDetlService; |
| | | |
| | | |
| | | /* |
| | |
| | | } |
| | | for (HashMap<String, String> map : dbList) { |
| | | String locNo = map.get("locNo"); |
| | | String barcode = map.get("barcode"); |
| | | //生成工作档 |
| | | AgvWrkMast mast = new AgvWrkMast(); |
| | | //工作状态 |
| | | mast.setWrkSts(22L); |
| | | //入出库类型 |
| | | mast.setIoType(ioType); |
| | | mast.setIoTime(now); |
| | | //优先级 |
| | | mast.setIoPri(300.0); |
| | | //源站点 |
| | | mast.setSourceLocNo(locNo); |
| | | //目标站点 |
| | | mast.setLocNo(""); |
| | | //容器编码 |
| | | mast.setBarcode(barcode); |
| | | //容器类型 |
| | | mast.setWhsType(30); |
| | | // 目标楼层 |
| | | mast.setCrnNo(floor); |
| | | mast.setAppeUser(getUserId()); |
| | | mast.setAppeTime(now); |
| | | mast.setModiUser(getUserId()); |
| | | mast.setModiTime(now); |
| | | if (!agvWrkMastService.insertByIncrease(mast)) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | String barcode = map.get("suppCode"); |
| | | AgvWrkMast wrkMast = createWrkMast(ioType, 22L, locNo, "", barcode, now, getUserId(), 30,floor); |
| | | // 同步调拨单 |
| | | List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo)); |
| | | for (AgvLocDetl agvLocDetl : agvLocDetls) { |
| | | AgvWrkDetl wrkDetl = new AgvWrkDetl(); |
| | | wrkDetl.setWrkNo(wrkMast.getWrkNo()); |
| | | wrkDetl.sync(agvLocDetl); |
| | | wrkDetl.setSuppCode(agvLocDetl.getSuppCode()); |
| | | wrkDetl.setIoTime(now); |
| | | wrkDetl.setAppeUser(getUserId()); |
| | | wrkDetl.setAppeTime(now); |
| | | wrkDetl.setModiUser(getUserId()); |
| | | wrkDetl.setModiTime(now); |
| | | if (!agvWrkDetlService.insert(wrkDetl)) { |
| | | throw new CoolException("保存工作明细失败"); |
| | | } |
| | | // 更新订单 |
| | | OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("order_no", "DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode())); |
| | | orderDetl.setQty(orderDetl.getQty() + agvLocDetl.getAnfme()); |
| | |
| | | } |
| | | } |
| | | // 更新源库位 |
| | | |
| | | AgvLocMast locMast = agvLocMastService.selectOne(new EntityWrapper<AgvLocMast>().eq("loc_no", locNo)); |
| | | locMast.setLocSts("R"); |
| | | agvLocMastService.updateById(locMast); |
| | | } |
| | | return R.ok(); |
| | | } |
| | |
| | | |
| | | System.out.println(agvLocDetls22.equals(agvLocDetls2)); |
| | | } |
| | | /* |
| | | 生成工作档 |
| | | */ |
| | | private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode, Date now, Long userId, int containerType,int floor){ |
| | | AgvWrkMast wrkMast = new AgvWrkMast(); |
| | | //工作状态 |
| | | wrkMast.setWrkSts(wrkSts); |
| | | //入出库类型 |
| | | wrkMast.setIoType(ioType); |
| | | wrkMast.setIoTime(now); |
| | | //优先级 |
| | | wrkMast.setIoPri(300.0); |
| | | //源站点 |
| | | wrkMast.setSourceLocNo(sourceLocNo); |
| | | //目标站点 |
| | | wrkMast.setLocNo(locNo); |
| | | //容器编码 |
| | | wrkMast.setBarcode(barcode); |
| | | //容器类型 |
| | | wrkMast.setWhsType(containerType); |
| | | // 目标楼层 |
| | | wrkMast.setCrnNo(floor); |
| | | |
| | | wrkMast.setAppeUser(userId); |
| | | wrkMast.setAppeTime(now); |
| | | wrkMast.setModiUser(userId); |
| | | wrkMast.setModiTime(now); |
| | | |
| | | if (!agvWrkMastService.insertByIncrease(wrkMast)) { |
| | | throw new CoolException("保存工作档失败"); |
| | | } |
| | | |
| | | wrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("loc_no", locNo).eq("source_loc_no",sourceLocNo)); |
| | | |
| | | return wrkMast; |
| | | } |
| | | |
| | | } |
| | |
| | | "io_pri," + |
| | | "source_loc_no," + |
| | | "loc_no," + |
| | | "crn_no," + |
| | | "barcode," + |
| | | "whs_type," + |
| | | "appe_user," + |
| | | "appe_time," + |
| | | "modi_user," + |
| | | "modi_time) " + |
| | | "VALUES(#{wrkSts},#{ioType},#{ioTime},#{ioPri},#{sourceLocNo},#{locNo},#{barcode},#{whsType},#{appeUser},#{appeTime},#{modiUser},#{modiTime})") |
| | | "VALUES(#{wrkSts},#{ioType},#{ioTime},#{ioPri},#{sourceLocNo},#{locNo},#{crnNo},#{barcode},#{whsType},#{appeUser},#{appeTime},#{modiUser},#{modiTime})") |
| | | public int insertByIncrease(AgvWrkMast agvWrkMast); |
| | | |
| | | } |
| | |
| | | agvWrkMastService.updateWrkStsByWrkNo(wrkMast.getWrkNo(),205); |
| | | |
| | | //出库任务 101.出库 || 103.拣料出库 || 107.盘点出库 |
| | | if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107){ |
| | | if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 111){ |
| | | //修改出库站点状态 |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(wrkMast.getLocNo(),"F",wrkMast.getBarcode(),wrkMast.getWhsType().shortValue()); |
| | | } |
| | |
| | | String targetLocNo = wrkMast.getLocNo(); |
| | | agvLocMastService.updateLocStsByLocNo(locNo,"F",wrkMast.getBarcode(),(short)getContainerTypeByloc(locNo),"",(short)0); |
| | | if (wrkMast.getIoType() == 108) { |
| | | agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null); |
| | | if (wrkMast.getWrkSts() != 22) { |
| | | agvLocMastService.updateLocStsByLocNo(targetLocNo,"O","",null); |
| | | } |
| | | } else { |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(targetLocNo,"O","",wrkMast.getWhsType().shortValue()); |
| | | if (wrkMast.getWrkSts() != 22) { |
| | | agvBasDevpService.updateLocStsAndBarcodeByDevNo(targetLocNo,"O","",wrkMast.getWhsType().shortValue()); |
| | | } |
| | | } |
| | | |
| | | List<AgvLocDetl> agvLocDetls = agvLocDetlService.selectList(new EntityWrapper<AgvLocDetl>().eq("loc_no", locNo)); |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | 定时处理AGV工作档中工作状态为206.出库完成 且 (101.出库 || 110.空板出库) |
| | | */ |
| | |
| | | |
| | | import com.baomidou.mybatisplus.mapper.EntityWrapper; |
| | | import com.zy.asrs.entity.AgvLocMast; |
| | | import com.zy.asrs.entity.AgvWrkMast; |
| | | import com.zy.asrs.service.AgvLocMastService; |
| | | import com.zy.asrs.service.AgvWrkMastService; |
| | | import com.zy.asrs.task.core.ReturnT; |
| | | import com.zy.asrs.task.handler.AutoMoveHandler; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | private AgvLocMastService agvLocMastService; |
| | | @Autowired |
| | | private AutoMoveHandler autoMoveHandler; |
| | | @Autowired |
| | | private AgvWrkMastService agvWrkMastService; |
| | | |
| | | // 调拨出库 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | |
| | | |
| | | } |
| | | |
| | | // 调拨出库 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | private void execute2(){ |
| | | List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>() |
| | | .eq("wrk_sts", 22) |
| | | .andNew().eq("io_type",108) |
| | | ); |
| | | if (agvWrkMastList.isEmpty()) { |
| | | return; |
| | | } |
| | | for (AgvWrkMast agvWrkMast : agvWrkMastList) { |
| | | ReturnT<String> returnT = autoMoveHandler.start2(agvWrkMast); |
| | | } |
| | | |
| | | } |
| | | |
| | | // 调拨出库 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | private void execute3(){ |
| | | List<AgvWrkMast> agvWrkMastList = agvWrkMastService.selectList(new EntityWrapper<AgvWrkMast>() |
| | | .eq("wrk_sts", 22) |
| | | .andNew().eq("io_type",111) |
| | | ); |
| | | if (agvWrkMastList.isEmpty()) { |
| | | return; |
| | | } |
| | | for (AgvWrkMast agvWrkMast : agvWrkMastList) { |
| | | ReturnT<String> returnT = autoMoveHandler.start3(agvWrkMast); |
| | | } |
| | | |
| | | } |
| | | |
| | | // 空板自动回库 |
| | | @Scheduled(cron = "0/2 * * * * ? ") |
| | | private void autoEmptyBack(){ |
| | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | public ReturnT<String> start2(AgvWrkMast agvWrkMast) { |
| | | // locType 1. 自动, 2. 手动 |
| | | doAutoMove2(agvWrkMast); |
| | | return SUCCESS; |
| | | } |
| | | public ReturnT<String> start3(AgvWrkMast agvWrkMast) { |
| | | // locType 1. 自动, 2. 手动 |
| | | doHandMove2(agvWrkMast); |
| | | return SUCCESS; |
| | | } |
| | | |
| | | private ReturnT<String> doAutoMove(AgvLocMast agvLocMast) { |
| | | Date now = new Date(); |
| | | //查询工作档 |
| | |
| | | return SUCCESS; |
| | | } |
| | | |
| | | private ReturnT<String> doAutoMove2(AgvWrkMast agvWrkMast) { |
| | | Date now = new Date(); |
| | | //检索库位,选择合适的库位 |
| | | AgvLocMast locMast = agvCommonService.getLocNo(3,agvWrkMast.getCrnNo()); |
| | | if (Cools.isEmpty(locMast)) { |
| | | throw new CoolException("暂无库位"); |
| | | } |
| | | agvWrkMast.setWrkSts(201L); |
| | | agvWrkMast.setLocNo(locMast.getLocNo()); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | //更新目标库位状态 |
| | | updateAgvLocMast(locMast,"S"); |
| | | |
| | | return SUCCESS; |
| | | } |
| | | private ReturnT<String> doHandMove2(AgvWrkMast agvWrkMast) { |
| | | Date now = new Date(); |
| | | AgvBasDevp devpNo = agvCommonService.getDevpNo(3, 1); |
| | | if (Cools.isEmpty(devpNo)) { |
| | | throw new CoolException("暂无空闲接驳位"); |
| | | } |
| | | agvWrkMast.setWrkSts(201L); |
| | | agvWrkMast.setLocNo(devpNo.getDevNo()); |
| | | agvWrkMastService.updateById(agvWrkMast); |
| | | updateAgvBasDevp(devpNo,"S",null,agvWrkMast.getBarcode()); |
| | | return SUCCESS; |
| | | } |
| | | /* |
| | | 更新目标库位信息 |
| | | */ |
| | |
| | | } |
| | | |
| | | //找不到库位,抛出异常 |
| | | throw new CoolException("该楼层没有空库位"); |
| | | throw new CoolException("该楼层没有空接驳位"); |
| | | } |
| | | |
| | | //随机取一个货位 |
| | |
| | | ,{field: 'ioTime$', align: 'center',title: '工作时间',sort: true, width: 160} |
| | | ,{field: 'wrkSts$', align: 'center',title: '工作状态'} |
| | | ,{field: 'ioType$', align: 'center',title: '入出库类型'} |
| | | ,{field: 'ioPri', align: 'center',title: '优先级'} |
| | | ,{field: 'ioPri', align: 'center',title: '优先级',width: 80} |
| | | //,{field: 'sourceStaNo$', align: 'center',title: '源站'} |
| | | //,{field: 'staNo$', align: 'center',title: '目标站'} |
| | | ,{field: 'sourceLocNo', align: 'center',title: '源库位'} |
| | | ,{field: 'locNo', align: 'center',title: '目标库位'} |
| | | //,{field: 'steNo', align: 'center',title: '小车', width: 70} |
| | | ,{field: 'barcode', align: 'center',title: '容器码'} |
| | | ,{field: 'whsType', align: 'center',title: '容器类型'} |
| | | ,{field: 'barcode', align: 'center',title: '容器码',width: 80} |
| | | ,{field: 'whsType', align: 'center',title: '容器类型',width: 90} |
| | | ,{field: 'preHave', align: 'center',title: '先入品', hide: true} |
| | | ,{field: 'takeNone', align: 'center',title: '空操作', hide: true} |
| | | ,{field: 'crnNo', align: 'center',title: '目标楼层', hide: false} |
| | | // ,{field: 'picking', align: 'center',title: '拣料', templet:function(row){ |
| | | // var html = "<input value='picking' type='checkbox' lay-skin='primary' lay-filter='tableCheckbox' table-index='"+row.LAY_TABLE_INDEX+"'"; |
| | | // if(row.picking === 'Y'){html += " checked ";} |