src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -82,7 +82,11 @@ wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); } else { wrapper.like(entry.getKey(), val); if (entry.getKey().equals("loc_type2")){ wrapper.eq(entry.getKey(), val); }else { wrapper.like(entry.getKey(), val); } } } } @@ -197,20 +201,20 @@ locMast.setBay1(b); // 列 locMast.setLev1(l); // 层 locMast.setCrnNo(crnNo); // 堆垛机 locMast.setLocType1(!Cools.isEmpty(param.getLocType1()) ? param.getLocType1() : 1); locMast.setLocType2(param.getLocType2()); locMast.setLocType3(param.getLocType3()); locMast.setLocType1((short)0); locMast.setLocType2((short)0); locMast.setLocType3((short)0); locMast.setAppeUser(getUserId()); locMast.setAppeTime(now); locMast.setModiUser(getUserId()); locMast.setModiTime(now); if (r==equipmentRow){ if (r==equipmentRow && b<3){ locMast.setChannel(l+(b-2)*param.getEndLev()); locMast.setLocType1((short)1); int i = (locMast.getChannel() - 1) / (channelMax / equipmentCount) + 1; locMast.setLocType2((short)i); } if (r==quietRow){ if (r==quietRow && b<3){ locMast.setLocType1((short)2); } list.add(locMast); src/main/java/com/zy/asrs/entity/BasDevp.java
@@ -228,9 +228,13 @@ case 0: return "未知"; case 1: return "低库位"; return "测试库位"; case 2: return "高库位"; return "静置库位"; case 3: return "测试前暂存库位"; case 4: return "NG库位"; default: return String.valueOf(this.locType1); } @@ -240,13 +244,22 @@ if (null == this.locType2){ return null; } switch (this.locType2){ case 0: return "未知"; return ""; case 1: return "窄库位"; return "1号"; case 2: return "宽库位"; return "2号"; case 3: return "3号"; case 4: return "4号"; case 5: return "5号"; case 6: return "6号"; default: return String.valueOf(this.locType2); // return String.valueOf(this.locType2); return ""; } } src/main/java/com/zy/asrs/entity/LocMast.java
@@ -90,11 +90,11 @@ @TableField("loc_type") private String locType; @ApiModelProperty(value= "高低类型{0:未知,1:低库位,2:高库位}") @ApiModelProperty(value= "库位类型:1:测试库位、2:静置库位、3:测试前暂存库为、4:测试失败库位、0:未知") @TableField("loc_type1") private Short locType1; @ApiModelProperty(value= "宽窄类型{0:未知,1:窄库位,2:宽库位}") @ApiModelProperty(value= "通道:1、2、3、4、5、6") @TableField("loc_type2") private Short locType2; @@ -236,6 +236,10 @@ return "测试库位"; case 2: return "静置库位"; case 3: return "测试前暂存库位"; case 4: return "NG库位"; default: return String.valueOf(this.locType1); } @@ -259,7 +263,8 @@ case 6: return "6号"; default: return String.valueOf(this.locType2); // return String.valueOf(this.locType2); return ""; } } src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -604,7 +604,7 @@ matNew.setTagId(tag.getId()); matNew.setMatnr(param.getPackName()); matNew.setMaktx(param.getPackName()); matNew.setDeadWarn(mat.getDeadWarn()); matNew.setDeadWarn(480);//8小时 480分钟 matNew.setCreateBy(9999L);//9999表示erp下发 matNew.setCreateTime(new Date()); matNew.setUpdateBy(9999L);//9999表示erp下发 src/main/java/com/zy/asrs/task/FireHeartScheduler.java
@@ -20,7 +20,7 @@ /** * */ @Scheduled(cron = "0/60 * * * * ? ") // @Scheduled(cron = "0/60 * * * * ? ") private void execute() { if (!confirmDeep) return; src/main/java/com/zy/asrs/task/MoveLocScheduler.java
@@ -1,5 +1,6 @@ package com.zy.asrs.task; import com.zy.asrs.service.LocMastService; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.FireOutHandler; import com.zy.asrs.task.handler.MoveLocHandler; @@ -17,6 +18,8 @@ private boolean confirmDeep; @Autowired private MoveLocHandler moveLocHandler; @Autowired private LocMastService locMastService; /** * src/main/java/com/zy/asrs/task/handler/MoveLocHandler.java
@@ -2,14 +2,16 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.service.LocDetlService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.TestMastService; import com.zy.asrs.service.WorkService; import com.zy.asrs.entity.param.CombParam; import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.utils.PostMesDataUtils; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -35,18 +37,31 @@ private TestMastService testMastService; @Autowired private WorkService workService; @Autowired private WrkMastService wrkMastService; @Autowired private CommonService commonService; @Autowired private WrkDetlService wrkDetlService; @Value("${channel.equipmentRow}") private Integer equipmentRow; //测试库位所在排号 @Value("${channel.quietRow}") private Integer quietRow; //静置库位所在排号 @Value("${mes.url}") private String mesUrl; @Value("${mes.inPath}") private String inpath; @Transactional public ReturnT<String> start() { //测试失败(NG)移库 try { List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("loc_sts", "F") .eq("pack_status", 3) .eq("pack_status", 4) .eq("row1", equipmentRow) .eq("loc_type1", (short) 1) .eq("fire_status",0) @@ -61,12 +76,13 @@ if (!Cools.isEmpty(testMast)){ if (testMast.getStatus()==4){ //移库开始,查询目标库位 LocMast targetLocNo = locMastService.queryFreeLocMast(quietRow,(short)2); LocMast targetLocNo = locMastService.queryFreeLocMast(2,(short)4); if (Cools.isEmpty(targetLocNo)){ targetLocNo=locMastService.queryFreeLocMast(equipmentRow,(short)2); targetLocNo=locMastService.queryFreeLocMast(1,(short)4); } if (targetLocNo != null){ workService.locMove(locMast.getLocNo(),targetLocNo.getLocNo(),(long)Integer.parseInt(testMast.getUserId())); return SUCCESS; }else { log.error("测试完成自动移库--->没有空库位!"); } @@ -83,7 +99,167 @@ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } //测试成功 出库、移库 try { List<LocMast> locMasts2 = locMastService.selectList(new EntityWrapper<LocMast>() .eq("loc_sts", "F") .eq("pack_status", 4) .eq("row1", equipmentRow) .eq("loc_type1", (short) 1) .eq("fire_status",0) ); if (!Cools.isEmpty(locMasts2)){ for (LocMast locMast:locMasts2){ TestMast testMast = testMastService.selectOne(new EntityWrapper<TestMast>() .eq("loc_no",locMast.getLocNo()) .eq("barcode",locMast.getBarcode()) .eq("status",4) ); if (!Cools.isEmpty(testMast)){ if (testMast.getStatus()==4){ //移库开始,查询目标库位 LocMast targetLocNo = locMastService.queryFreeLocMast(4,(short)2); if (Cools.isEmpty(targetLocNo)){ targetLocNo=locMastService.queryFreeLocMast(3,(short)2); } if (targetLocNo != null){ //生成出库任务 if (outLoc(locMast)){ return SUCCESS; } }else { //3\4排满 向2排移库,查询目标库位 targetLocNo = locMastService.queryFreeLocMast(2,(short)2); if (Cools.isEmpty(targetLocNo)){ targetLocNo=locMastService.queryFreeLocMast(1,(short)2); } if (targetLocNo != null){ workService.locMove(locMast.getLocNo(),targetLocNo.getLocNo(),(long)Integer.parseInt(testMast.getUserId())); return SUCCESS; }else { log.error("测试完成自动移库--->没有空库位!"); } } }else if (testMast.getStatus()!=4) { log.error("测试状态异常,库位号为:" + testMast.getLocNo()); } }else { log.error("测试库位:"+locMast.getLocNo()+"所属测试档为空或者不状态为4"); } } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } //测试有空库位 移库 try { List<LocMast> locMasts3 = locMastService.selectList(new EntityWrapper<LocMast>() .eq("loc_sts", "F") .eq("pack_status", 0) .eq("loc_type1", (short) 3) .eq("fire_status",0) ); if (!Cools.isEmpty(locMasts3)){ for (LocMast locMast:locMasts3){ //移库开始,查询目标库位 LocMast targetLocNo = locMastService.queryFreeLocMast(equipmentRow,(short)1); if (targetLocNo != null){ workService.locMove(locMast.getLocNo(),targetLocNo.getLocNo(),(long)9999); }else { // log.error("向测试库位移库失败--->等待空库位!"); } } } } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } return SUCCESS; } public boolean outLoc(LocMast locMast){ try { Date now = new Date(); Integer ioType = 101; //入出库类型 LocDetl locDetl=locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",locMast.getLocNo())); if (Cools.isEmpty(locDetl)){ log.error("库位:"+locMast.getLocNo()+"没有明细"); } else if (Cools.isEmpty(locDetl.getDeadWarn())){ log.error("库位:"+locMast.getLocNo()+"没有静置时间"); } else if (Cools.isEmpty(locMast.getModiTime())){ log.error("库位:"+locMast.getLocNo()+"modiTime为空"); } else if (Cools.isEmpty(locMast.getBarcode())){ log.error("库位:"+locMast.getLocNo()+"Pack码为空"); } else { // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(1); wrkMast.setSourceStaNo(203); // 源站 wrkMast.setStaNo(205); // 目标站 2号堆垛机入库站 wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setAppeTime(now); wrkMast.setModiTime(now); if (!wrkMastService.insert(wrkMast)) { log.error("保存工作档失败,出库库位号:"+locMast.getLocNo()); return false; } // 生成工作档明细 WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(locDetl); wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); wrkDetl.setAnfme(1.0); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setModiTime(now); if (!wrkDetlService.insert(wrkDetl)) { log.error("保存工作档明细失败"); return false; } // 修改库位状态: F.在库 ====>>> R.出库预约 if (locMast.getLocSts().equals("F")) { locMast.setLocSts("R"); locMast.setModiTime(now); locMast.setPackStatus(6); //6:静置完成 CombParam combParam = new CombParam(); combParam.setPackNo(locMast.getBarcode()); combParam.setLocNo(locMast.getLocNo()); combParam.setPackSts(6); combParam.setRequestTime(DateUtils.convert(new Date())); new PostMesDataUtils().postMesData("MES系统",mesUrl,inpath,combParam); if (!locMastService.updateById(locMast)) { log.error("预约库位状态失败,库位号:"+locMast.getLocNo()); return false; }else { return true; } } else { log.error(locMast.getLocNo() + "库位不是在库状态"); } } return false; } catch (Exception e) { return false; } } } src/main/java/com/zy/asrs/task/handler/StandingHandler.java
@@ -63,7 +63,8 @@ List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>() .eq("fire_status", 0) .eq("loc_sts", "F") .eq("pack_status", 5)); .eq("loc_type1",(short)2) .eq("pack_status", 6)); Integer ioType = 101; //入出库类型 //静置完成出库站104 for(LocMast locMast : locMasts){ @@ -86,8 +87,12 @@ wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(1); wrkMast.setSourceStaNo(107); // 源站 wrkMast.setCrnNo(locMast.getCrnNo()); if (wrkMast.getCrnNo()==1){ wrkMast.setSourceStaNo(203); // 源站 }else { wrkMast.setSourceStaNo(210); // 源站 } wrkMast.setStaNo(104); // 目标站 wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -155,22 +155,27 @@ locMast.setModiTime(now); locMast.setFireStatus(0); if (locMast.getCrnNo()==1){ locMast.setPackStatus(1); if (locMast.getLocType1()==1){ locMast.setPackStatus(1); }else { locMast.setPackStatus(0); } }else { locMast.setPackStatus(6); locMast.setPackStatus(5); TestMast testMast = testMastService.selectOne(new EntityWrapper<TestMast>() .eq("barcode",locMast.getBarcode()) .eq("status",4) ); testMast.setStatus(5); testMast.setModiTime(new Date()); if (!testMastService.update(testMast,new EntityWrapper<TestMast>().eq("barcode",locMast.getBarcode()).eq("status",4))){ throw new CoolException("更改测试状态失败"); } } if (!locMastService.updateById(locMast)) { // exceptionHandle("全板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo()); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("全板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]"); }else { //2.入库完成 CombParam combParam = new CombParam(); combParam.setPackNo(locMast.getBarcode()); combParam.setLocNo(locMast.getLocNo()); combParam.setPackSts(2); combParam.setRequestTime(DateUtils.convert(new Date())); new PostMesDataUtils().postMesData("MES系统",mesUrl,inpath,combParam); } } break; @@ -327,10 +332,17 @@ locMast.setIoTime(now); locMast.setModiTime(now); locMast.setFireStatus(0); if (locMast.getLocType1()==sourceLoc.getLocType1()){ if (locMast.getLocType1().equals(sourceLoc.getLocType1())){ locMast.setPackStatus(packStatus); }else if (locMast.getLocType1().equals((short)1) && sourceLoc.getLocType1().equals((short)3)){ locMast.setPackStatus(1); }else { locMast.setPackStatus(5); //5:静置中 if (locMast.getLocType1().equals((short)4)){ locMast.setPackStatus(4); //4:NG }else { locMast.setPackStatus(5); //5:静置中 } if (locMast.getLocType1()==1 && sourceLoc.getLocType1()==2){ TestMast testMast = testMastService.selectOne(new EntityWrapper<TestMast>() .eq("loc_no",sourceLoc.getLocNo()) src/main/java/com/zy/asrs/utils/PostMesDataUtils.java
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.core.exception.CoolException; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.impl.ApiLogServiceImpl; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.common.utils.HttpHandler; @@ -13,15 +14,10 @@ @Slf4j public class PostMesDataUtils extends AbstractHandler<String> { @Autowired private ApiLogService apiLogService; @Value("${mes.start}") private boolean start; //上报开关 private ApiLogService apiLogService = new ApiLogServiceImpl(); public ReturnT<String> postMesData(String name,String URL,String mesPath, Object combParam){ if (!start){ return SUCCESS; } if(combParam != null){ String response = ""; boolean success = false; src/main/java/com/zy/common/service/CommonService.java
@@ -159,19 +159,29 @@ rowLastno.setCurrentRow(curRow); rowLastnoService.updateById(rowLastno); // 开始查找库位 ==============================> int ruleId = Integer.parseInt(Parameter.get().getFindLocRule()); if (whsType != 1) { locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1()); } else if (ruleId == 1) { //按测试设备排序,优先排满单台设备 locMast = locMastService.queryFreeLocMast1(curRow, locTypeDto.getLocType1(), channelMax + 1); } else if (ruleId == 2) { //按通道排序,均匀分配每台设备 Short locType2 = getLocType2Small(curRow, locTypeDto.getLocType1()); locMast = locMastService.queryFreeLocMast2(curRow, locTypeDto.getLocType1(), locType2); } else { //默认规则 if (crnNo==1){ LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "F").eq("loc_type2", (short) 3)); if (!Cools.isEmpty(locMast1)){ locMast = locMastService.queryFreeLocMast(2,(short)3); if (Cools.isEmpty(locMast)){ locMast = locMastService.queryFreeLocMast(1,(short)3); } } } if (Cools.isEmpty(locMast)){ // 开始查找库位 ==============================> int ruleId = Integer.parseInt(Parameter.get().getFindLocRule()); if (whsType != 1) { locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1()); } else if (ruleId == 1) { //按测试设备排序,优先排满单台设备 locMast = locMastService.queryFreeLocMast1(curRow, locTypeDto.getLocType1(), channelMax + 1); } else if (ruleId == 2) { //按通道排序,均匀分配每台设备 Short locType2 = getLocType2Small(curRow, locTypeDto.getLocType1()); locMast = locMastService.queryFreeLocMast2(curRow, locTypeDto.getLocType1(), locType2); } else { //默认规则 locMast = locMastService.queryFreeLocMast(curRow, locTypeDto.getLocType1()); } } // 2.库位当前所属尺寸无空库位时,调整尺寸参数,向上兼容检索库位 src/main/java/com/zy/common/web/WcsController.java
@@ -88,11 +88,11 @@ } } if (Cools.isEmpty(param.getLocType1())){ return R.error("高低检测信号不能为空"); param.setLocType1((short)1); } // 源站点状态检测 BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true); BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), false); // sourceStaNo.setLocType1(param.getLocType1()); sourceStaNo.setLocType1((short)1); LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo); src/main/resources/mapper/LocMastMapper.xml
@@ -46,9 +46,14 @@ from asr_loc_mast where row1=#{row} and loc_sts='O' <if test="locType1 != null"> and loc_type1 != 1 </if> <choose> <when test="locType1 != null"> and loc_type1 = #{locType1} </when> <otherwise> and 1!=1 </otherwise> </choose> order by lev1 asc,bay1 asc </select> src/main/webapp/static/js/basDevp/basDevp.js
@@ -77,7 +77,7 @@ }} ,{field: 'wrkNo', align: 'center',title: '工作号', edit:true, style:'color: blue;font-weight: bold'} // ,{field: 'wrkNo1', align: 'center',title: ''} ,{field: 'locType1$', align: 'center',title: '高低'} ,{field: 'locType1$', align: 'center',title: '库位类型'} ,{field: 'barcode', align: 'center',title: '条形码'} ,{field: 'inQty', align: 'center',title: '入库暂存'} // ,{field: 'row1', align: 'center',title: ''} src/main/webapp/views/locMast/locMast.html
@@ -65,6 +65,8 @@ <!-- <option style="display: none"></option>--> <option value="">设备号</option> <option value="0">静置库位</option> <option value="10">NG库位</option> <option value="11">测试前暂存库位</option> <option value="1">1号</option> <option value="2">2号</option> <option value="3">3号</option>