pom.xml
@@ -200,7 +200,7 @@ </dependencies> <build> <finalName>wcs</finalName> <finalName>ssdwcs</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> src/main/java/com/zy/asrs/controller/FillingMastController.java
New file @@ -0,0 +1,123 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.common.DateUtils; import com.zy.asrs.entity.FillingMast; import com.zy.asrs.service.FillingMastService; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController public class FillingMastController extends BaseController { @Autowired private FillingMastService fillingMastService; @RequestMapping(value = "/fillingMast/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(fillingMastService.selectById(String.valueOf(id))); } @RequestMapping(value = "/fillingMast/list/auth") @ManagerAuth public R list(@RequestParam(defaultValue = "1")Integer curr, @RequestParam(defaultValue = "10")Integer limit, @RequestParam(required = false)String orderByField, @RequestParam(required = false)String orderByType, @RequestParam Map<String, Object> param){ EntityWrapper<FillingMast> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} return R.ok(fillingMastService.selectPage(new Page<>(curr, limit), wrapper)); } 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()); if (val.contains(RANGE_TIME_LINK)){ String[] dates = val.split(RANGE_TIME_LINK); wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); } else { wrapper.like(entry.getKey(), val); } } } @RequestMapping(value = "/fillingMast/add/auth") @ManagerAuth public R add(FillingMast fillingMast) { fillingMastService.insert(fillingMast); return R.ok(); } @RequestMapping(value = "/fillingMast/update/auth") @ManagerAuth public R update(FillingMast fillingMast){ if (Cools.isEmpty(fillingMast) || null==fillingMast.getId()){ return R.error(); } fillingMastService.updateById(fillingMast); return R.ok(); } @RequestMapping(value = "/fillingMast/delete/auth") @ManagerAuth public R delete(@RequestParam(value="ids[]") Long[] ids){ for (Long id : ids){ fillingMastService.deleteById(id); } return R.ok(); } @RequestMapping(value = "/fillingMast/export/auth") @ManagerAuth public R export(@RequestBody JSONObject param){ EntityWrapper<FillingMast> wrapper = new EntityWrapper<>(); List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); Map<String, Object> map = excludeTrash(param.getJSONObject("fillingMast")); convert(map, wrapper); List<FillingMast> list = fillingMastService.selectList(wrapper); return R.ok(exportSupport(list, fields)); } @RequestMapping(value = "/fillingMastQuery/auth") @ManagerAuth public R query(String condition) { EntityWrapper<FillingMast> wrapper = new EntityWrapper<>(); wrapper.like("id", condition); Page<FillingMast> page = fillingMastService.selectPage(new Page<>(0, 10), wrapper); List<Map<String, Object>> result = new ArrayList<>(); for (FillingMast fillingMast : page.getRecords()){ Map<String, Object> map = new HashMap<>(); map.put("id", fillingMast.getId()); map.put("value", fillingMast.getId()); result.add(map); } return R.ok(result); } @RequestMapping(value = "/fillingMast/check/column/auth") @ManagerAuth public R query(@RequestBody JSONObject param) { Wrapper<FillingMast> wrapper = new EntityWrapper<FillingMast>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); if (null != fillingMastService.selectOne(wrapper)){ return R.parse(BaseRes.REPEAT).add(getComment(FillingMast.class, String.valueOf(param.get("key")))); } return R.ok(); } } src/main/java/com/zy/asrs/controller/RgvController.java
@@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.domain.enums.RgvStatusType; import com.zy.asrs.domain.param.CrnDemoParam; import com.zy.asrs.domain.param.CrnOperatorParam; import com.zy.asrs.domain.param.RgvOperatorParam; import com.zy.asrs.domain.vo.RgvMsgTableVo; @@ -33,15 +35,19 @@ import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.properties.SystemProperties; import com.zy.core.thread.SiemensRgvThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * RGV接口 @@ -64,7 +70,124 @@ private MainServiceImpl mainService; @Autowired private LocMastService locMastService; int wrkNo = 9990; @ManagerAuth(memo = "演示命令下发") @GetMapping("/rgvDemoTask") public R rgvDemoTask(Integer rgvNo, Integer sta,Integer end){ wrkNo++; RgvCommand command = new RgvCommand(); command.setRgvNo(rgvNo); // RGV编号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1(wrkNo); // 工作号 command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo1(sta.shortValue()); // 源站 command.setDestinationStaNo1(end.shortValue()); // 目标站 // command.setAckFinish2((short) 0); // 任务完成确认位 // command.setTaskNo2((short) 0); // 工作号 // command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 // command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 // command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "解锁小车") @PostMapping("/lock") public R lock(RgvOperatorParam param ){ SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, param.getRgvNo()); rgvThread.setPakMk(true); return R.ok(); } @GetMapping("/demo/status") public R demoStatus(Integer rgvNo){ if (Cools.isEmpty(rgvNo)){ return R.ok("X"); } String demo = "X"; // List<Map<String, Object>> res = new ArrayList<>(); for (RgvSlave rgvSlave : slaveProperties.getRgv()) { if (rgvSlave.getId() == rgvNo){ demo = rgvSlave.getDemo()?"Y":"N"; } } return R.ok(demo); } @GetMapping("/demo/status/true") public R demoStatusTrue(Integer rgvNo){ if (Cools.isEmpty(rgvNo)){ return R.error("请选择rgv"); } // List<Map<String, Object>> res = new ArrayList<>(); for (RgvSlave rgvSlave : slaveProperties.getRgv()) { if (rgvSlave.getId() == rgvNo){ rgvSlave.setDemo(true); } } return R.ok(); } @GetMapping("/demo/status/false") public R demoStatusFalse(Integer rgvNo){ if (Cools.isEmpty(rgvNo)){ return R.error("请选择rgv"); } // List<Map<String, Object>> res = new ArrayList<>(); for (RgvSlave rgvSlave : slaveProperties.getRgv()) { if (rgvSlave.getId() == rgvNo){ rgvSlave.setDemo(false); } } return R.ok(); } @PostMapping("/demo/switch") @ManagerAuth(memo = "RGV演示") public R crnDemo(CrnDemoParam param) throws InterruptedException { if (Cools.isEmpty(param.getCrnId())){ return R.error(); } if (Cools.isEmpty(param.getPassword())){ return R.error("请输入口令"); } if (!param.getPassword().equals(SystemProperties.WCS_PASSWORD)){ return R.error("口令错误"); } Thread.sleep(200L); for (RgvSlave rgvSlave : slaveProperties.getRgv()) { if (rgvSlave.getId().equals(param.getCrnId())) { rgvSlave.setDemo(param.getOpt()); } } // mainService.crnDemoOfLocMove(param.getCrnId()); return R.ok(); } @ManagerAuth(memo = "取放货") @PostMapping("/operator/put") public R rgvFetchPut(RgvOperatorParam param){ wrkNo++; RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1(wrkNo); // 工作号 command.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 command.setSourceStaNo1(param.getSourceRow().shortValue()); // 源站 command.setDestinationStaNo1(param.getSourceBay().shortValue()); // 目标站 // command.setAckFinish2((short) 0); // 任务完成确认位 // command.setTaskNo2((short) 0); // 工作号 // command.setTaskMode2(RgvTaskModeType.FETCH_PUT); // 任务模式: 取放货 // command.setSourceStaNo2(param.getSourceStaNo2()); // 源站 // command.setDestinationStaNo2(param.getStaNo2()); // 目标站 command.setCommand((short) 0); return rgvControl(command)? R.ok(): R.error(); } @ManagerAuth(memo = "复位") @PostMapping("/operator/reset") @@ -166,14 +289,14 @@ continue; } vo.setStatusType(rgvProtocol.modeType.desc); // 模式状态 vo.setStatus(rgvProtocol.getStatusType().desc); // 状态 vo.setStatus(rgvProtocol.getStatusType1().desc); // 状态 vo.setWorkNo1(rgvProtocol.getTaskNo1()); // 工位1任务号 vo.setRgvPos(rgvProtocol.getRgvPos()); vo.setPakMk(rgvThread.isPakMk()?"无锁":"锁定"); vo.setWalkPos(rgvProtocol.getAlarm() == 0?"正常":"报警"); vo.setWarnCode(String.valueOf(rgvProtocol.getAlarm())); vo.setStaNo(rgvProtocol.getSouSta().intValue()); vo.setSourceStaNo(rgvProtocol.getEndSta().intValue()); // vo.setStaNo(rgvProtocol.getSouSta().intValue()); // vo.setSourceStaNo(rgvProtocol.getEndSta().intValue()); if (rgvProtocol.getAlarm() > 0) { BasRgvErr rgvErr = basRgvErrMapper.selectById(rgvProtocol.getAlarm()); vo.setAlarm(rgvErr==null?"未知异常":rgvErr.getErrName()); @@ -247,8 +370,8 @@ public R rgvTaskComplete(RgvOperatorParam param){ RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 1); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1( 0); // 工作号 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 @@ -270,8 +393,8 @@ } RgvCommand command = new RgvCommand(); command.setRgvNo(param.getRgvNo()); // RGV编号 command.setAckFinish1((short) 0); // 任务完成确认位 command.setTaskNo1((short) 0); // 工作号 command.setAckFinish1(false); // 任务完成确认位 command.setTaskNo1(0); // 工作号 command.setTaskMode1(RgvTaskModeType.NONE); // 任务模式 command.setSourceStaNo1((short) 0); // 源站 command.setDestinationStaNo1((short) 0); // 目标站 @@ -306,7 +429,7 @@ RgvCommand Command = new RgvCommand(); Command.setRgvNo(rgv.getId()); // RGV编号 Command.setTaskMode1(RgvTaskModeType.NONE); Command.setAckFinish1((short) 0); // 任务完成确认位 Command.setAckFinish1(false); // 任务完成确认位 Command.setAckFinish2((short) 0); // 任务完成确认位 Command.setCommand((short) 0); // 任务完成确认位 // 延时发送 src/main/java/com/zy/asrs/controller/VacuumMastController.java
New file @@ -0,0 +1,123 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.common.DateUtils; import com.zy.asrs.entity.VacuumMast; import com.zy.asrs.service.VacuumMastService; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController public class VacuumMastController extends BaseController { @Autowired private VacuumMastService vacuumMastService; @RequestMapping(value = "/vacuumMast/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(vacuumMastService.selectById(String.valueOf(id))); } @RequestMapping(value = "/vacuumMast/list/auth") @ManagerAuth public R list(@RequestParam(defaultValue = "1")Integer curr, @RequestParam(defaultValue = "10")Integer limit, @RequestParam(required = false)String orderByField, @RequestParam(required = false)String orderByType, @RequestParam Map<String, Object> param){ EntityWrapper<VacuumMast> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} return R.ok(vacuumMastService.selectPage(new Page<>(curr, limit), wrapper)); } 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()); if (val.contains(RANGE_TIME_LINK)){ String[] dates = val.split(RANGE_TIME_LINK); wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); } else { wrapper.like(entry.getKey(), val); } } } @RequestMapping(value = "/vacuumMast/add/auth") @ManagerAuth public R add(VacuumMast vacuumMast) { vacuumMastService.insert(vacuumMast); return R.ok(); } @RequestMapping(value = "/vacuumMast/update/auth") @ManagerAuth public R update(VacuumMast vacuumMast){ if (Cools.isEmpty(vacuumMast) || null==vacuumMast.getId()){ return R.error(); } vacuumMastService.updateById(vacuumMast); return R.ok(); } @RequestMapping(value = "/vacuumMast/delete/auth") @ManagerAuth public R delete(@RequestParam(value="ids[]") Long[] ids){ for (Long id : ids){ vacuumMastService.deleteById(id); } return R.ok(); } @RequestMapping(value = "/vacuumMast/export/auth") @ManagerAuth public R export(@RequestBody JSONObject param){ EntityWrapper<VacuumMast> wrapper = new EntityWrapper<>(); List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); Map<String, Object> map = excludeTrash(param.getJSONObject("vacuumMast")); convert(map, wrapper); List<VacuumMast> list = vacuumMastService.selectList(wrapper); return R.ok(exportSupport(list, fields)); } @RequestMapping(value = "/vacuumMastQuery/auth") @ManagerAuth public R query(String condition) { EntityWrapper<VacuumMast> wrapper = new EntityWrapper<>(); wrapper.like("id", condition); Page<VacuumMast> page = vacuumMastService.selectPage(new Page<>(0, 10), wrapper); List<Map<String, Object>> result = new ArrayList<>(); for (VacuumMast vacuumMast : page.getRecords()){ Map<String, Object> map = new HashMap<>(); map.put("id", vacuumMast.getId()); map.put("value", vacuumMast.getId()); result.add(map); } return R.ok(result); } @RequestMapping(value = "/vacuumMast/check/column/auth") @ManagerAuth public R query(@RequestBody JSONObject param) { Wrapper<VacuumMast> wrapper = new EntityWrapper<VacuumMast>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); if (null != vacuumMastService.selectOne(wrapper)){ return R.parse(BaseRes.REPEAT).add(getComment(VacuumMast.class, String.valueOf(param.get("key")))); } return R.ok(); } } src/main/java/com/zy/asrs/controller/WrkMastStaController.java
New file @@ -0,0 +1,123 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.baomidou.mybatisplus.plugins.Page; import com.core.common.DateUtils; import com.zy.asrs.entity.WrkMastSta; import com.zy.asrs.service.WrkMastStaService; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController public class WrkMastStaController extends BaseController { @Autowired private WrkMastStaService wrkMastStaService; @RequestMapping(value = "/wrkMastSta/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(wrkMastStaService.selectById(String.valueOf(id))); } @RequestMapping(value = "/wrkMastSta/list/auth") @ManagerAuth public R list(@RequestParam(defaultValue = "1")Integer curr, @RequestParam(defaultValue = "10")Integer limit, @RequestParam(required = false)String orderByField, @RequestParam(required = false)String orderByType, @RequestParam Map<String, Object> param){ EntityWrapper<WrkMastSta> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} return R.ok(wrkMastStaService.selectPage(new Page<>(curr, limit), wrapper)); } 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()); if (val.contains(RANGE_TIME_LINK)){ String[] dates = val.split(RANGE_TIME_LINK); wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); } else { wrapper.like(entry.getKey(), val); } } } @RequestMapping(value = "/wrkMastSta/add/auth") @ManagerAuth public R add(WrkMastSta wrkMastSta) { wrkMastStaService.insert(wrkMastSta); return R.ok(); } @RequestMapping(value = "/wrkMastSta/update/auth") @ManagerAuth public R update(WrkMastSta wrkMastSta){ if (Cools.isEmpty(wrkMastSta) || null==wrkMastSta.getId()){ return R.error(); } wrkMastStaService.updateById(wrkMastSta); return R.ok(); } @RequestMapping(value = "/wrkMastSta/delete/auth") @ManagerAuth public R delete(@RequestParam(value="ids[]") Long[] ids){ for (Long id : ids){ wrkMastStaService.deleteById(id); } return R.ok(); } @RequestMapping(value = "/wrkMastSta/export/auth") @ManagerAuth public R export(@RequestBody JSONObject param){ EntityWrapper<WrkMastSta> wrapper = new EntityWrapper<>(); List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); Map<String, Object> map = excludeTrash(param.getJSONObject("wrkMastSta")); convert(map, wrapper); List<WrkMastSta> list = wrkMastStaService.selectList(wrapper); return R.ok(exportSupport(list, fields)); } @RequestMapping(value = "/wrkMastStaQuery/auth") @ManagerAuth public R query(String condition) { EntityWrapper<WrkMastSta> wrapper = new EntityWrapper<>(); wrapper.like("id", condition); Page<WrkMastSta> page = wrkMastStaService.selectPage(new Page<>(0, 10), wrapper); List<Map<String, Object>> result = new ArrayList<>(); for (WrkMastSta wrkMastSta : page.getRecords()){ Map<String, Object> map = new HashMap<>(); map.put("id", wrkMastSta.getId()); map.put("value", wrkMastSta.getId()); result.add(map); } return R.ok(result); } @RequestMapping(value = "/wrkMastSta/check/column/auth") @ManagerAuth public R query(@RequestBody JSONObject param) { Wrapper<WrkMastSta> wrapper = new EntityWrapper<WrkMastSta>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); if (null != wrkMastStaService.selectOne(wrapper)){ return R.parse(BaseRes.REPEAT).add(getComment(WrkMastSta.class, String.valueOf(param.get("key")))); } return R.ok(); } } src/main/java/com/zy/asrs/domain/param/RgvOperatorParam.java
@@ -15,4 +15,6 @@ private boolean restoreTask; private boolean compTask; private boolean reset; private Integer sourceRow; private Integer sourceBay; } src/main/java/com/zy/asrs/domain/vo/RgvMsgTableVo.java
@@ -13,7 +13,7 @@ private Integer rgvNo; // 工作号 private Short workNo = 0; private Integer workNo = 0; // 状态 private String status = "-"; src/main/java/com/zy/asrs/domain/vo/RgvStateTableVo.java
@@ -18,7 +18,7 @@ private String status = "-"; // 任务号 private Short workNo1 = 0; private Integer workNo1 = 0; // 状态 private String status1 = "-"; src/main/java/com/zy/asrs/entity/FillingMast.java
New file @@ -0,0 +1,42 @@ package com.zy.asrs.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("man_filling_mast") public class FillingMast implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value= "") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value= "") @TableField("sta_no") private Integer staNo; @ApiModelProperty(value= "") private String status; public FillingMast() {} public FillingMast(Integer staNo,String status) { this.staNo = staNo; this.status = status; } // FillingMast fillingMast = new FillingMast( // null, // // null // // ); } src/main/java/com/zy/asrs/entity/VacuumMast.java
New file @@ -0,0 +1,42 @@ package com.zy.asrs.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("man_vacuum_mast") public class VacuumMast implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value= "") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value= "") @TableField("sta_no") private Integer staNo; @ApiModelProperty(value= "") private String status; public VacuumMast() {} public VacuumMast(Integer staNo,String status) { this.staNo = staNo; this.status = status; } // VacuumMast vacuumMast = new VacuumMast( // null, // // null // // ); } src/main/java/com/zy/asrs/entity/WrkMastSta.java
New file @@ -0,0 +1,178 @@ package com.zy.asrs.entity; import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.enums.IdType; import com.baomidou.mybatisplus.annotations.TableField; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.text.SimpleDateFormat; import java.util.Date; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.baomidou.mybatisplus.annotations.TableName; import java.io.Serializable; @Data @TableName("asr_wrk_mast_sta") public class WrkMastSta implements Serializable { private static final long serialVersionUID = 1L; /** * ID */ @ApiModelProperty(value= "ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 工作号 */ @ApiModelProperty(value= "工作号") @TableField("wrk_no") private Long wrkNo; /** * 工作档开始位置 */ @ApiModelProperty(value= "工作档开始位置") @TableField("wrk_start") private Integer wrkStart; /** * 工作档结束位置 */ @ApiModelProperty(value= "工作档结束位置") @TableField("wrk_end") private Integer wrkEnd; /** * 小车接货位置 */ @ApiModelProperty(value= "小车接货位置") @TableField("sta_start") private Integer staStart; /** * 小车放货位置 */ @ApiModelProperty(value= "小车放货位置") @TableField("sta_end") private Integer staEnd; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @TableField("create_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 类型 0:满版 1:空板 */ @ApiModelProperty(value= "类型 0:满版 1:空板") private Integer type; /** * 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成 */ @ApiModelProperty(value= "工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成") @TableField("wrk_sts") private Integer wrkSts; /** * 行号 */ @ApiModelProperty(value= "行号") @TableField("line_number") private Integer lineNumber; /** * 工作类型 类型 1:取(叠盘) 2:放 3:取放 4:拆盘 */ @ApiModelProperty(value= "工作类型 类型 1:取(叠盘) 2:放 3:取放 4:拆盘") @TableField("wrk_type") private Integer wrkType; /** * 标记时间 */ @ApiModelProperty(value= "标记时间") @TableField("bign_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date bignTime; @ApiModelProperty(value= "") @TableField("wrk_crn") private Integer wrkCrn; public WrkMastSta() {} public WrkMastSta(Long wrkNo,Integer wrkStart,Integer wrkEnd,Integer staStart,Integer staEnd,Date createTime,Date updateTime,Integer type,Integer wrkSts,Integer lineNumber,Integer wrkType,Date bignTime,Integer wrkCrn) { this.wrkNo = wrkNo; this.wrkStart = wrkStart; this.wrkEnd = wrkEnd; this.staStart = staStart; this.staEnd = staEnd; this.createTime = createTime; this.updateTime = updateTime; this.type = type; this.wrkSts = wrkSts; this.lineNumber = lineNumber; this.wrkType = wrkType; this.bignTime = bignTime; this.wrkCrn = wrkCrn; } // WrkMastSta wrkMastSta = new WrkMastSta( // null, // 工作号[非空] // null, // 工作档开始位置[非空] // null, // 工作档结束位置[非空] // null, // 小车接货位置[非空] // null, // 小车放货位置[非空] // null, // 添加时间 // null, // 修改时间 // null, // 类型 0:满版 1:空板[非空] // null, // 工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成[非空] // null, // 行号[非空] // null, // 工作类型 类型 1:取(叠盘) 2:放 3:取放 4:拆盘[非空] // null, // 标记时间 // null // // ); public String getCreateTime$(){ if (Cools.isEmpty(this.createTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } public String getBignTime$(){ if (Cools.isEmpty(this.bignTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.bignTime); } } src/main/java/com/zy/asrs/mapper/FillingMastMapper.java
New file @@ -0,0 +1,16 @@ package com.zy.asrs.mapper; import com.zy.asrs.entity.FillingMast; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.VacuumMast; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface FillingMastMapper extends BaseMapper<FillingMast> { FillingMast selectByStatusIsn(); } src/main/java/com/zy/asrs/mapper/VacuumMastMapper.java
New file @@ -0,0 +1,13 @@ package com.zy.asrs.mapper; import com.zy.asrs.entity.VacuumMast; import com.baomidou.mybatisplus.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface VacuumMastMapper extends BaseMapper<VacuumMast> { VacuumMast selectByStatusIsN(); } src/main/java/com/zy/asrs/mapper/WrkMastStaMapper.java
New file @@ -0,0 +1,15 @@ package com.zy.asrs.mapper; import com.zy.asrs.entity.WrkMastSta; import com.baomidou.mybatisplus.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface WrkMastStaMapper extends BaseMapper<WrkMastSta> { WrkMastSta selectWrkSts0(); WrkMastSta selectWrkSts1(); } src/main/java/com/zy/asrs/service/FillingMastService.java
New file @@ -0,0 +1,9 @@ package com.zy.asrs.service; import com.zy.asrs.entity.FillingMast; import com.baomidou.mybatisplus.service.IService; public interface FillingMastService extends IService<FillingMast> { FillingMast selectByStatusIsn(); } src/main/java/com/zy/asrs/service/VacuumMastService.java
New file @@ -0,0 +1,9 @@ package com.zy.asrs.service; import com.zy.asrs.entity.VacuumMast; import com.baomidou.mybatisplus.service.IService; public interface VacuumMastService extends IService<VacuumMast> { VacuumMast selectByStatusIsN(); } src/main/java/com/zy/asrs/service/WrkMastStaService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.service; import com.zy.asrs.entity.WrkMastSta; import com.baomidou.mybatisplus.service.IService; public interface WrkMastStaService extends IService<WrkMastSta> { } src/main/java/com/zy/asrs/service/impl/FillingMastServiceImpl.java
New file @@ -0,0 +1,18 @@ package com.zy.asrs.service.impl; import com.zy.asrs.entity.VacuumMast; import com.zy.asrs.mapper.FillingMastMapper; import com.zy.asrs.entity.FillingMast; import com.zy.asrs.service.FillingMastService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service("fillingMastService") public class FillingMastServiceImpl extends ServiceImpl<FillingMastMapper, FillingMast> implements FillingMastService { @Override public FillingMast selectByStatusIsn() { return this.baseMapper.selectByStatusIsn(); } } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -3,50 +3,49 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.Cools; import com.core.common.R; import com.core.common.SpringUtils; import com.core.common.DateUtils; import com.core.exception.CoolException; import com.fasterxml.jackson.databind.ObjectMapper; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.TaskOverToWms; import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam; import com.zy.asrs.entity.param.taskCreateParam; import com.zy.asrs.mapper.*; import com.zy.asrs.service.*; import com.zy.asrs.utils.CommandUtils; import com.zy.asrs.utils.PostMesDataUtils; import com.zy.asrs.utils.Utils; import com.zy.asrs.utils.VersionUtils; import com.zy.common.model.LocTypeDto; import com.zy.common.model.MatDto; import com.zy.common.model.SearchLocParam; import com.zy.common.model.StartupDto; import com.zy.common.service.CommonService; import com.zy.common.utils.CollectionUtils; import com.zy.common.utils.HttpHandler; import com.zy.core.CrnThread; import com.zy.core.DevpThread; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.*; import com.zy.core.model.CrnSlave; import com.zy.core.model.DevpSlave; import com.zy.core.model.Task; import com.zy.core.model.command.CommandPackage; import com.zy.core.model.*; import com.zy.core.model.command.CrnCommand; import com.zy.core.model.command.LedCommand; import com.zy.core.model.command.RgvCommand; import com.zy.core.model.protocol.CrnProtocol; import com.zy.core.model.protocol.RgvProtocol; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.LedThread; import com.zy.core.thread.SiemensDevpThread; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import com.zy.core.thread.SiemensRgvThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.io.IOException; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * 立体仓库WCS系统主流程业务 @@ -60,309 +59,63 @@ public static final long COMMAND_TIMEOUT = 5 * 1000; @Autowired private CommonService commonService; @Autowired private SlaveProperties slaveProperties; @Autowired private WrkMastMapper wrkMastMapper; private WrkMastStaMapper wrkMastStaMapper; @Autowired private LocMastService locMastService; private FillingMastService fillingMastService; @Autowired private BasCrnpService basCrnpService; @Autowired private BasDevpService basDevpService; @Autowired private BasErrLogService basErrLogService; @Autowired private BasCrnErrorMapper basCrnErrorMapper; @Autowired private TaskWrkMapper taskWrkMapper; @Autowired private TaskWrkService taskWrkService; @Autowired private ConfigService configService; @Autowired private StaDescMapper staDescMapper; @Autowired private CommandInfoService commandInfoService; @Autowired private OpenServiceImpl openServiceImpl; @Autowired private StaDescService staDescService; @Autowired private ApiLogService apiLogService; private VacuumMastService vacuumMastService; @Value("${wms.url}") private String wmsUrl; @Value("${wms.movePath}") private String movePath; public Integer wrkNo1 = 10000; public Integer wrkNo2 = 20000; public void generateStoreWrkFile() throws IOException, InterruptedException { // 根据输送线plc遍历 /** * 堆垛机演示 ===>> 库位移转 */ public void getRgvTask() { for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.Sta inSta : devp.getInSta()) { // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } Short workNo = staProtocol.getWorkNo(); Short stano = staProtocol.getStaNo(); // 尺寸检测异常 boolean back = false; String errMsg = ""; if (staProtocol.isFrontErr()) { errMsg = "前超限"; back = true; } if (!back && staProtocol.isBackErr()) { errMsg = "后超限"; back = true; } if (!back && staProtocol.isHighErr()) { errMsg = "高超限"; back = true; } if (!back && staProtocol.isLeftErr()) { errMsg = "左超限"; back = true; } if (!back && staProtocol.isRightErr()) { errMsg = "右超限"; back = true; } if (!back && staProtocol.isWeightErr()) { errMsg = "超重"; back = true; } if (!back && staProtocol.isBarcodeErr()) { errMsg = "扫码失败"; back = true; } // 退回 if (back) { if (stano == inSta.getBackSta().shortValue()){ continue; } if (workNo == 0 && stano == 0){ continue; } if (!staProtocol.isPakMk()){ continue; } // News.warn("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); staProtocol.setWorkNo(workNo); staProtocol.setStaNo(inSta.getBackSta().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol)); TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); if (taskWrk != null) { taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 taskWrkMapper.updateById(taskWrk); } for (RgvSlave rgv : slaveProperties.getRgv()) { if (!rgv.getDemo()){ continue; } // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && (workNo >= 0) && staProtocol.isPakMk()) { // 获取条码扫描仪信息 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); if (barcodeThread == null) { continue; } String barcode = barcodeThread.getBarcode(); staProtocol.setBarcode(barcode); if(!Cools.isEmpty(barcode)) { StaDescService staDescService = SpringUtils.getBean(StaDescService.class); ToWmsDTO toWmsDTO = new ToWmsDTO(); Map<String, Object> map = new HashMap<>(); map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2"); TaskWrk taskWrk = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode)); if (Cools.isEmpty(taskWrk)){ continue; } //StaDesc staDesc1 = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("stn_no",inSta.getBackSta())); boolean sign = true; if (inSta.getBarcode() == 7 || inSta.getBarcode() == 8){ }else { if (taskWrk.getCrnNo() != inSta.getBarcode()){ sign = false; } } if (taskWrk.getTargetPoint() != null && taskWrk.getStartPoint() != null && sign){ if ( taskWrk.getWrkNo() != null && taskWrk.getWrkNo().shortValue() == workNo ){ continue; } if (taskWrk.getStatus() != 2){ continue; } //获取堆垛机站点 StaDesc staDesc = new StaDesc(); if (devp.getId() <= 1){ staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).lt("stn_no", 200)); }else { staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", taskWrk.getCrnNo()).eq("type_no",1).lt("stn_no", 400).ge("stn_no", 250)); } staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(3, staProtocol)); Thread.sleep(500); }else { //TaskWrk taskWrk = taskWrkService.selectByTaskNo(param.getTaskNo()); toWmsDTO.setWarehouseId("1688469798893297665"); toWmsDTO.setContainerCode(barcode); toWmsDTO.setApplyType("TUNNEL_LOCATION"); List<Integer> list = new ArrayList<>(); if (inSta.getBarcode() == 7 || inSta.getBarcode() == 8){ toWmsDTO.setTaskTunnel(taskWrk.getCrnNo()); list.add(taskWrk.getCrnNo()); }else { toWmsDTO.setTaskTunnel(inSta.getBarcode()); list.add(inSta.getBarcode()); } toWmsDTO.setCanInboundTunnels(list); String response = null; try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(wmsUrl) .setPath("wcsManager/wcsInterface/inboundTaskApply") .setJson(JSON.toJSONString(toWmsDTO)) .build() .doPost(); }catch (Exception e){ log.error("wms通讯失败,"+e.getMessage()); continue; } apiLogService.save("wms请求入库货位接口" ,wmsUrl+"wcsManager/wcsInterface/inboundTaskApply" ,null ,"127.0.0.1" ,JSON.toJSONString(toWmsDTO) ,response ,true ); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class); taskWrk.setOriginTargetPoint(getWmsDto.getTargetLocationCode()); taskWrk.setTargetPoint(Utils.getWcsLocNo(getWmsDto.getTargetLocationCode())); taskWrk.setStartPoint(String.valueOf(inSta.getBackSta())); if (inSta.getBarcode() == 7 || inSta.getBarcode() == 8){ }else { taskWrk.setCrnNo(inSta.getBarcode()); } if (!taskWrkService.updateById(taskWrk)){ log.error("保存wms库位号失败"); } }else { log.error("wms通讯失败,"+jsonObject.get("msg")); } } } } } } } /** * 堆垛机站出库到出库站 */ @Async public void crnStnToOutStn() { for (CrnSlave crnSlave : slaveProperties.getCrn()) { // 遍历堆垛机出库站 for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) { List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("crn_stn", crnStn.getStaNo())); for (StaDesc staDesc : staDescs){ // 获取堆垛机出库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) { // 查询工作档 TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString()); if (taskWrk == null) { continue; } // 判断工作档条件 if (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 2) { // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, taskWrk.getCrnNo()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) { // 移动中 continue; } // 判断堆垛机状态等待确认 if (crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(taskWrk.getWrkNo().shortValue()) && crnProtocol.getTaskFinish() == 0 && crnProtocol.forkPosType == CrnForkPosType.HOME) { // 命令下发区 -------------------------------------------------------------------------- //取出输送线命令 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); if (commandInfos.isEmpty()) { continue;//命令空 } // CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文 // CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class); Integer commandStep = taskWrk.getCommandStep(); CommandInfo commandInfo = commandInfos.get(commandStep); CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文 //StaProtocol staProtocol1 = JSON.parseObject(commandInfo.getCommand(), StaProtocol.class); StaProtocol staProtocol1 = JSON.parseObject(commandPackage.getCommand().toString(), StaProtocol.class); if (!MessageQueue.offer(SlaveType.Devp, crnStn.getDevpPlcId(), new Task(2, staProtocol1))) { log.error("输送线命令下方失败!!! [工作号:{}]", taskWrk.getWrkNo()); continue;//命令下发失败 } // 复位堆垛机 crnThread.setResetFlag(true); if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3){ taskWrk.setWrkSts(4); } else if (taskWrk.getIoType() == 2) { taskWrk.setWrkSts(14); } if (!taskWrkService.updateById(taskWrk)){ log.error(taskWrk.getTaskNo()+ " 堆垛机任务完成,改变任务状态失败"); } } if (staProtocol.isPakMk()){ VacuumMast vacuumMast = vacuumMastService.selectByStatusIsN(); FillingMast fillingMast = fillingMastService.selectByStatusIsn(); Date now = new Date(); WrkMastSta wrkMastSta = new WrkMastSta(); int workNo = commonService.getWorkNo(0); wrkMastSta.setWrkNo((long)workNo); wrkMastSta.setWrkStart(2); wrkMastSta.setWrkEnd(vacuumMast.getStaNo()); // wrkMastSta.setStaStart(); wrkMastSta.setStaEnd(fillingMast.getStaNo()); wrkMastSta.setCreateTime(now); wrkMastSta.setUpdateTime(now); wrkMastSta.setBignTime(now); wrkMastSta.setType(0); //类型 0:非空 1:空板 wrkMastSta.setWrkType(3); //工作类型 1:取(叠盘) 2:放 3:取放 4:拆盘 Integer insert = wrkMastStaMapper.insert(wrkMastSta); if (insert>0){ devpThread.setPakMk(devp.getId(),false); } } } @@ -370,800 +123,244 @@ } } } /** * 入出库 ===>> 堆垛机入出库作业下发 */ public synchronized void crnIoExecute() throws IOException { for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } BasCrnp basCrnp = basCrnpService.selectById(crn.getId()); if (basCrnp == null) { log.error("{}号堆垛机尚未在数据库进行维护!", crn.getId()); continue; } // 只有当堆垛机空闲 并且 无任务时才继续执行 if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) { // 如果最近一次是入库模式 if (crnProtocol.getLastIo().equals("I")) { if (basCrnp.getInEnable().equals("Y")) { this.crnStnToLoc(crn, crnProtocol); // 入库 crnProtocol.setLastIo("O"); } else if (basCrnp.getOutEnable().equals("Y")) { this.locToCrnStn(crn, crnProtocol); // 出库 crnProtocol.setLastIo("I"); } } // 如果最近一次是出库模式 else if (crnProtocol.getLastIo().equals("O")) { if (basCrnp.getOutEnable().equals("Y")) { this.locToCrnStn(crn, crnProtocol); // 出库 crnProtocol.setLastIo("I"); } else if (basCrnp.getInEnable().equals("Y")) { this.crnStnToLoc(crn, crnProtocol); // 入库 crnProtocol.setLastIo("O"); } } } // 库位移转 this.locToLoc(crn, crnProtocol); } } /** * 入库 ===>> 堆垛机站到库位 */ public void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException { for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) { List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); for (StaDesc staDesc : staDescs) { boolean flag = false; // 获取堆垛机入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); if (staDetl == null) { log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); continue; } if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable() && staDetl.getCanining()!=null && staDetl.getCanining().equals("Y")) { flag = true; } if (!flag) { continue; } // 获取工作状态为2(设备上走)的入库工作档 TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString()); if(null == taskWrk) { continue; } // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { continue; } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { continue; } // 修改工作档状态 2.设备上走 => 3.吊车入库中 log.error("进入修改工作档流程"); Date now = new Date(); taskWrk.setWrkSts(3); taskWrk.setModiTime(now); if (taskWrkMapper.updateById(taskWrk) == 0) { log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); } TaskWrk taskWrk2 = taskWrkService.selectByWrkNo(taskWrk.getWrkNo()); if (taskWrk2.getWrkSts() != 3){ continue; } log.error("进入修改工作档流程完成,taskWrk=", taskWrk.getWrkNo()); //取出命令 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); Integer commandStep = taskWrk.getCommandStep(); if (commandInfos.isEmpty()) { continue;//命令空 } CommandInfo commandInfo = commandInfos.get(commandStep); CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文 CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class); if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); } else { //开始运行 String response = CrnStartRunning(taskWrk); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { }else { log.error("入库开始运行通讯失败,"+jsonObject.get("msg")); } } // // 命令下发区 -------------------------------------------------------------------------- // CrnCommand crnCommand = new CrnCommand(); // crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 // crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 // crnCommand.setAckFinish((short) 0); // 任务完成确认位 // crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 // crnCommand.setSourcePosX(crnStn.getBay().shortValue()); // 源库位列 // crnCommand.setSourcePosY(crnStn.getLev().shortValue()); // 源库位层 // crnCommand.setSourcePosZ(crnStn.getRow().shortValue()); // 源库位排 // crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 // crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 // crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位排 // crnCommand.setCommand((short)1); // if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { // log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); // } else { // // 修改工作档状态 2.设备上走 => 3.吊车入库中 // Date now = new Date(); // taskWrk.setWrkSts(3); // taskWrk.setModiTime(now); // if (taskWrkMapper.updateById(taskWrk) == 0) { // log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); // } // } } // return; } } /** * 出库 ===>> 库位到堆垛机站 * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 */ public void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol){ List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null); if (taskWrksInitial.size()==0){ return; } for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo())); for (StaDesc staDesc : staDescs){ // 获取工作状态为11(生成出库ID)的出库工作档 List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(),staDesc.getStnNo().toString()); for (TaskWrk taskWrk : taskWrks){ if (taskWrk == null) { continue; } // 工作档状态判断 if (taskWrk.getIoType() != 2 || taskWrk.getTargetPoint() == null || taskWrk.getStartPoint() == null) { log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getStartPoint(), taskWrk.getIoType()); continue; } // 获取堆垛机出库站信息 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo()); if (staProtocol == null) { break; } else { staProtocol = staProtocol.clone(); } // 查询站点详细信息 BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo()); if (staDetl == null) { log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo()); break; } // 判断堆垛机出库站状态 if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() !=null && staDetl.getCanouting().equals("Y") && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { // 命令下发区 -------------------------------------------------------------------------- // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { break; } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { break; } // 双深库位且浅库位有货,则需先对浅库位进行库位移转 if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) { taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo()); List<TaskWrk> taskWrks1 = taskWrkMapper.selectPakOutIoType(taskWrk.getCrnNo()); if (Cools.isEmpty(taskWrks1) && taskWrks1.size()!=0){ continue; } String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint()); TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo); if (!Cools.isEmpty(hallowLocNoTask)){ // if (!Cools.isEmpty(hallowLocNoTask.getTargetPoint())){ // continue; // } //// new PostMesDataUtils().postMesData("移库任务分配库位",wmsUrl,movePath,hallowLocNoTask); // try { // String response = new HttpHandler.Builder() // .setUri(wmsUrl) // .setPath(movePath) // .setJson(JSON.toJSONString(hallowLocNoTask)) // .build() // .doPost(); // System.out.println("response:"+response); // JSONObject jsonObject = JSON.parseObject(response); // if (jsonObject.getInteger("code").equals(200)) { // //解析 // } // }catch (Exception e){ // log.error("请求接口失败!!!url:{};request:{};response:{}", wmsUrl+"/"+movePath, JSON.toJSONString(hallowLocNoTask), "请求移库任务分配库位"); // } continue; } } //取出命令 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); Integer commandStep = taskWrk.getCommandStep(); if (commandInfos.isEmpty()) { continue;//命令空 } //判断末端命令是否执行 CommandInfo commandInfo2 = commandInfos.get(commandInfos.size() - 1); if (commandInfo2.getCommandStatus() != CommandStatusType.CREATE.id) { continue;//指令已执行 } CommandInfo commandInfo = commandInfos.get(commandStep); CommandPackage commandPackage = JSON.parseObject(commandInfo.getCommand(), CommandPackage.class);//取出命令报文 CrnCommand crnCommand = JSON.parseObject(commandPackage.getCommand().toString(), CrnCommand.class); if (!MessageQueue.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand))) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 11.生成出库ID => 12.吊车出库中 Date now = new Date(); taskWrk.setWrkSts(12); taskWrk.setModiTime(now); if (taskWrkMapper.updateById(taskWrk) == 0) { log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); } //开始运行 String response = CrnStartRunning(taskWrk); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { }else { log.error("出库开始运行通讯失败,"+jsonObject.get("msg")); } } } } } } } /** * 库位移转 */ public void locToLoc(CrnSlave slave, CrnProtocol crnProtocol){ for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) { // 获取工作状态为11(生成出库ID)的移库工作档 List<TaskWrk> taskWrks = taskWrkMapper.selectList(new EntityWrapper<TaskWrk>() .eq("crn_no",slave.getId()) .eq("wrk_sts",11) .eq("io_type",3)); for (TaskWrk taskWrk : taskWrks){ // 双深库位且浅库位有货,则需先对浅库位进行库位移转 if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) { String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint()); TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo); if (!Cools.isEmpty(hallowLocNoTask)){ continue; } } // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { continue; } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { continue; } if (Cools.isEmpty(taskWrk.getTargetPoint())){ List<Integer> list = openServiceImpl.getInEnableRoadway(); Map<String, Object> map = new HashMap<>(); map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2"); ToWmsDTO toWmsDTO = new ToWmsDTO(); toWmsDTO.setWarehouseId("1688469798893297665"); toWmsDTO.setContainerCode(taskWrk.getBarcode()); toWmsDTO.setApplyType("TUNNEL_LOCATION"); toWmsDTO.setTaskTunnel(taskWrk.getCrnNo()); toWmsDTO.setCanInboundTunnels(list); String response = null; try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(wmsUrl) .setPath("wcsManager/wcsInterface/inboundTaskApply") .setJson(JSON.toJSONString(toWmsDTO)) .build() .doPost(); }catch (Exception e){ log.error("wms通讯失败,"+e.getMessage()); continue; } JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class); taskWrk.setOriginTargetPoint(getWmsDto.getTargetLocationCode()); taskWrk.setTargetPoint(Utils.getWcsLocNo(getWmsDto.getTargetLocationCode())); if (!taskWrkService.updateById(taskWrk)){ log.error("保存wms库位号失败"); } continue; }else { log.error("wms通讯失败,"+jsonObject.get("msg")); continue; } } if (taskWrk == null || Cools.isEmpty(taskWrk.getTargetPoint()) || taskWrk.getTargetPoint().equals("") || taskWrk.getWrkNo() == null) { continue; } // 工作档状态判断 if (taskWrk.getIoType() != 3 || taskWrk.getTargetPoint() == null) { log.error("查询工作档数据不符合条件--入出类型/目标库位号, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType()); continue; } // 命令下发区 -------------------------------------------------------------------------- // 1.堆垛机开始移动 CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(slave.getId()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosZ(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位排 crnCommand.setSourcePosX(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位列 crnCommand.setSourcePosY(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位层 crnCommand.setDestinationPosZ(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位排 crnCommand.setDestinationPosX(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位列 crnCommand.setDestinationPosY(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位层 crnCommand.setCommand((short) 1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand),false)) { log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); } else { // 修改工作档状态 11.生成出库ID => 12.吊车出库中 Date now = new Date(); taskWrk.setWrkSts(12); taskWrk.setModiTime(now); if (taskWrkMapper.updateById(taskWrk) == 0) { log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); } //开始运行 String response = CrnStartRunning(taskWrk); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.getInteger("code").equals(200)) { }else { log.error("移库任务开始运行通讯失败,"+jsonObject.get("msg")); continue; } break; } return; } } } /** * 执行对工作档的完成操作 */ @Async public void storeFinished() { for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } // 状态:等待确认 并且 任务完成位 = 1 if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { //获取入库待确认工作档 TaskWrk taskWrk = taskWrkMapper.selectCrnNoInWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); if (Cools.isEmpty(taskWrk)) { // log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); continue; } //获取指令ID Integer commandId = crnProtocol.getCommandId(); CommandInfo commandInfo = new CommandInfo(); if (Cools.isEmpty(commandId)){ commandInfo = commandInfoService.selectOne(new EntityWrapper<CommandInfo>() .eq("wrk_no",crnProtocol.getTaskNo()) .eq("device","Crn")); }else { commandInfo = commandInfoService.selectById(commandId); } if (commandInfo == null) { //指令不存在 continue; } if (commandInfo.getCommandStatus() == 3){ continue; } commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);//指令完成 commandInfo.setCompleteTime(new Date());//指令完成时间 if (commandInfoService.updateById(commandInfo)) {//修改成功后复位堆垛机 // 堆垛机复位 crnThread.setResetFlag(true); if (taskWrk.getIoType() == 1 || taskWrk.getIoType() == 3){ taskWrk.setWrkSts(4); } else if (taskWrk.getIoType() == 2) { taskWrk.setWrkSts(14); } if (!taskWrkService.updateById(taskWrk)){ log.error(taskWrk.getTaskNo()+ " 堆垛机任务完成,改变任务状态失败"); } } } } } // /** // * 执行对工作档的完成操作 // */ // @Async // public void storeFinished() { // for (CrnSlave crn : slaveProperties.getCrn()) { // // 获取堆垛机信息 // CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); // CrnProtocol crnProtocol = crnThread.getCrnProtocol(); // if (crnProtocol == null) { continue; } // // 状态:等待确认 并且 任务完成位 = 1 // if (crnProtocol.getTaskFinish() == 0 && crnProtocol.statusType == CrnStatusType.HANDLING_COMPLETED && crnProtocol.getTaskNo() != 0) { // // 获取入库待确认工作档 // TaskWrk taskWrk = taskWrkMapper.selectCrnNoWorking(crn.getId(),crnProtocol.getTaskNo().intValue()); // if (Cools.isEmpty(taskWrk)) { // log.error("堆垛机处于等待确认且任务完成状态,但未找到工作档。堆垛机号={},工作号={}", crn.getId(), crnProtocol.getTaskNo()); // continue; // } // // 入库 + 库位转移 ==> 4.入库完成 // if ((taskWrk.getWrkSts() == 3 && taskWrk.getIoType() == 1) || (taskWrk.getWrkSts() == 12 && taskWrk.getIoType() == 3)) { // taskWrk.setWrkSts(4); // } else { // continue; // } // Date now = new Date(); // taskWrk.setModiTime(now); // Integer integerTaskWrk = taskWrkMapper.updateById(taskWrk); // // 修改成功后复位堆垛机 // if (integerTaskWrk > 0) { // // 堆垛机复位 // crnThread.setResetFlag(true); // // //更新库位状态 // LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); // locMast.setLocSts("F");//F.在库 // locMast.setBarcode(taskWrk.getBarcode());//托盘码 // locMast.setModiTime(now); // locMast.setModiUser(9999L); // locMastService.updateById(locMast); // } // } // } // } /** * 堆垛机异常信息记录 */ @Async public void recCrnErr(){ Date now = new Date(); for (CrnSlave crn : slaveProperties.getCrn()) { // 获取堆垛机信息 CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId()); CrnProtocol crnProtocol = crnThread.getCrnProtocol(); if (crnProtocol == null) { continue; } if (false) { // if (crnProtocol.getModeType() != CrnModeType.STOP) { // 有任务 if (crnProtocol.getTaskNo() != 0) { BasErrLog latest = basErrLogService.findLatestByTaskNo(crn.getId(), crnProtocol.getTaskNo().intValue()); // 有异常 if (latest == null) { if (crnProtocol.getAlarm() != null && crnProtocol.getAlarm() > 0) { WrkMast wrkMast = wrkMastMapper.selectById(crnProtocol.getTaskNo()); if (wrkMast == null) { continue; } BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName(); BasErrLog basErrLog = new BasErrLog( null, // 编号 wrkMast.getWrkNo(), // 工作号 now, // 发生时间 null, // 结束时间 wrkMast.getWrkSts(), // 工作状态 wrkMast.getIoType(), // 入出库类型 crn.getId(), // 堆垛机 null, // plc wrkMast.getLocNo(), // 目标库位 wrkMast.getStaNo(), // 目标站 wrkMast.getSourceStaNo(), // 源站 wrkMast.getSourceLocNo(), // 源库位 wrkMast.getBarcode(), // 条码 (int) crnProtocol.getAlarm1(), // 异常码 errName, // 异常 1, // 异常情况 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 "任务中异常" // 备注 ); if (!basErrLogService.insert(basErrLog)) { log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); } } } else { // 异常修复 if (crnProtocol.getAlarm1() == null || crnProtocol.getAlarm1() == 0) { latest.setEndTime(now); latest.setUpdateTime(now); latest.setStatus(2); if (!basErrLogService.updateById(latest)) { log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); } } } // 无任务 } else { BasErrLog latest = basErrLogService.findLatest(crn.getId()); // 有异常 if (crnProtocol.getAlarm1() != null && crnProtocol.getAlarm() > 0) { // 记录新异常 if (latest == null || (latest.getErrCode() != crnProtocol.getAlarm().intValue())) { BasCrnError crnError = basCrnErrorMapper.selectById(crnProtocol.getAlarm()); String errName = crnError==null? String.valueOf(crnProtocol.getAlarm()):crnError.getErrName(); BasErrLog basErrLog = new BasErrLog( null, // 编号 null, // 工作号 now, // 发生时间 null, // 结束时间 null, // 工作状态 null, // 入出库类型 crn.getId(), // 堆垛机 null, // plc null, // 目标库位 null, // 目标站 null, // 源站 null, // 源库位 null, // 条码 (int)crnProtocol.getAlarm1(), // 异常码 errName, // 异常 1, // 异常情况 now, // 添加时间 null, // 添加人员 now, // 修改时间 null, // 修改人员 "无任务异常" // 备注 ); if (!basErrLogService.insert(basErrLog)) { log.error("堆垛机plc异常记录失败 ===>> [id:{}] [error:{}]", crn.getId(), errName); } } // 无异常 } else { // 异常修复 if (latest != null && latest.getStatus() == 1) { latest.setEndTime(now); latest.setUpdateTime(now); latest.setStatus(2); if (!basErrLogService.updateById(latest)) { log.error("堆垛机plc异常记录修复失败 ===>> [id:{}] [errLogId:{}]", crn.getId(), latest.getId()); } } } } } } } //自动派发任务 public void autoDistribute() { Config config = configService.selectByCode("autoDistribute"); if (config == null) { return; } if (config.getValue().equals("false")) {//判断是否开启自动派发任务 return; } for (TaskWrk taskWrk : taskWrkService.selectReceive()) { try { taskWrkService.distribute(taskWrk.getTaskNo(), 9527L); } catch (CoolException e) { // log.info(e.getMessage()); } } } //自动完成任务 public synchronized void autoCompleteTask() { List<TaskWrk> taskWrks = taskWrkMapper.selectWorkingTask(); for (TaskWrk taskWrk : taskWrks) { //获取命令集合 List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskWrk.getTaskNo()); if (taskWrk.getCommandStep() < commandInfos.size()) { continue;//当前步序没有到达最后一条命令 } //判断末端命令是否执行完成 if (!commandInfos.isEmpty()){ CommandInfo commandInfo = commandInfos.get(commandInfos.size() - 1); if (commandInfo.getCommandStatus() != CommandStatusType.COMPLETE.id) { continue;//指令未完成 } } Date now = new Date(); //指令已完成,更新任务 if (taskWrk.getIoType() == 1) { //入库任务 // taskWrk.setWrkSts(4);//3.吊车入库中 => 4.入库完成 taskWrk.setStatus(TaskStatusType.OVER.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast.setLocSts("Z");//F.在库 locMast.setBarcode(taskWrk.getBarcode());//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } else if (taskWrk.getIoType() == 2) { //出库任务 // taskWrk.setWrkSts(14);//12.吊车出库中 => 14.出库完成 taskWrk.setStatus(TaskStatusType.OVER.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); //更新库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); locMast.setLocSts("K");//O.空库位 locMast.setBarcode("");//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); } else if (taskWrk.getIoType() == 3) { //更新起始库位状态 LocMast locMastStart = locMastService.selectByLocNo(taskWrk.getStartPoint()); locMastStart.setLocSts("K");//O.空库位 locMastStart.setBarcode("");//托盘码 locMastStart.setModiTime(now); locMastStart.setModiUser(9999L); locMastService.updateById(locMastStart); //更新目标库位状态 LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast.setLocSts("Z");//F.在库 locMast.setBarcode(taskWrk.getBarcode());//托盘码 locMast.setModiTime(now); locMast.setModiUser(9999L); locMastService.updateById(locMast); taskWrk.setStatus(TaskStatusType.OVER.id); taskWrk.setModiTime(now); taskWrkService.updateById(taskWrk); } } } public synchronized String CrnStartRunning(TaskWrk taskWrk){ String tasktype = null; switch (taskWrk.getIoType()){ case 1: tasktype= "RK"; break; case 2: tasktype= "CK"; break; case 3: tasktype= "YK"; break; default: tasktype= "未知"; } Map<String, Object> map = new HashMap<>(); map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2"); TaskOverToWms taskOverToWms = new TaskOverToWms(); taskOverToWms.setFeedbackFrom("WCS"); //来源 taskOverToWms.setWarehouseId("1688469798893297665"); //仓库标识 taskOverToWms.setTaskNo(taskWrk.getTaskNo()); //任务号 taskOverToWms.setTaskType(tasktype); // 任务类型 taskOverToWms.setContainerCode(taskWrk.getBarcode()); // 容器编码 if (taskWrk.getIoType() ==1 || taskWrk.getIoType() == 3){ taskOverToWms.setEquipmentCode(String.valueOf(taskWrk.getCrnNo())); //设备编码 taskOverToWms.setTargetLocationCode(taskWrk.getOriginTargetPoint()); //目标库位 }else if (taskWrk.getIoType() ==2){ Map<Integer,String> map1 = new HashMap<>(); map1.put(102,"J-1101"); map1.put(106,"J-1103"); map1.put(110,"J-1105"); map1.put(114,"J-1107"); map1.put(118,"J-1109"); map1.put(122,"J-1111"); map1.put(305,"H-1101"); map1.put(405,"G-1101"); taskOverToWms.setEquipmentCode(map1.get(taskWrk.getTargetPoint())); //设备编码 taskOverToWms.setSourceLocationCode(taskWrk.getOriginStartPoint()); //源库位 } taskOverToWms.setTaskStatus("executing"); //任务状态 String response = null; public synchronized void RGVDemoShow0() { try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(wmsUrl) .setPath("wcsManager/wcsInterface/taskStatusFeedback") .setJson(JSON.toJSONString(taskOverToWms)) .build() .doPost(); }catch (Exception e){ log.error("堆垛机任务完成,请求wms任务完成接口失败"); for (DevpSlave devp : slaveProperties.getDevp()) { for (DevpSlave.Sta inSta : devp.getInSta()) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // if (){ //输送线状态 // // } for (RgvSlave rgv : slaveProperties.getRgv()) { SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; }else { rgvProtocol = rgvProtocol.clone(); } if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakMk() ){ WrkMastSta wrkMastSta = wrkMastStaMapper.selectWrkSts0(); if (!Cools.isEmpty(wrkMastSta)){ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgv.getId()); // RGV编号 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkNo1); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 rgvCommand.setSourceStaNo1(wrkMastSta.getWrkStart().shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMastSta.getWrkEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgv.getId(), JSON.toJSON(rgvCommand)); } else { vacuumMastStatusSetY(wrkMastSta.getWrkEnd()); rgvThread.setPakMk(false); wrkMastSta.setWrkSts(1); Integer update = wrkMastStaMapper.updateById(wrkMastSta); if (update>0){ }else { log.error("RGV命令下发后,更新工作任务状态失败"); } } } } } } } } catch (Exception e) { log.error("Rgv演示 ===>> 失败", e); e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } apiLogService.save("堆垛机开始运行" ,wmsUrl+"wcsManager/wcsInterface/taskStatusFeedback" ,null ,"127.0.0.1" ,JSON.toJSONString(taskOverToWms) ,response ,true ); return response; } public synchronized void RGVDemoShow1() { try { for (DevpSlave devp : slaveProperties.getDevp()) { for (DevpSlave.Sta inSta : devp.getInSta()) { SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); if (staProtocol == null) { continue; } else { staProtocol = staProtocol.clone(); } // if (){ //输送线状态 // // } for (RgvSlave rgv : slaveProperties.getRgv()) { if (!rgv.getDemo()) { continue; } SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; }else { rgvProtocol = rgvProtocol.clone(); } if (rgvProtocol.getStatusType() == RgvStatusType.IDLE && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getLoaded1()==0 && rgvProtocol.getTaskNo1() == 0 && rgvThread.isPakMk() ){ WrkMastSta wrkMastSta = wrkMastStaMapper.selectWrkSts1(); if (!Cools.isEmpty(wrkMastSta)){ // 命令下发区 -------------------------------------------------------------------------- RgvCommand rgvCommand = new RgvCommand(); rgvCommand.setRgvNo(rgv.getId()); // RGV编号 rgvCommand.setAckFinish1(false); // 工位1任务完成确认位 rgvCommand.setTaskNo1(wrkNo1); // 工位1工作号 rgvCommand.setTaskMode1(RgvTaskModeType.FETCH_PUT); // 工位1任务模式: 取放货 rgvCommand.setSourceStaNo1(wrkMastSta.getWrkEnd().shortValue()); //工位1起点 rgvCommand.setDestinationStaNo1(wrkMastSta.getStaEnd().shortValue()); //工位1目标站点 rgvCommand.setCommand((short) 1); //工位1任务确认 if (!MessageQueue.offer(SlaveType.Rgv, rgv.getId(), new Task(4, rgvCommand))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={},任务数据={}", rgv.getId(), JSON.toJSON(rgvCommand)); } else { rgvThread.setPakMk(false); vacuumMastStatusSetN(wrkMastSta.getWrkEnd()); fillingMastStatusSetY(wrkMastSta.getStaEnd()); wrkMastSta.setWrkSts(2); Integer update = wrkMastStaMapper.updateById(wrkMastSta); if (update>0){ }else { log.error("RGV命令下发后,更新工作任务状态失败"); } } } } } } } } catch (Exception e) { log.error("Rgv演示 ===>> 失败", e); e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } public synchronized void RGVDemoShow2() throws InterruptedException { for (RgvSlave rgv : slaveProperties.getRgv()) { // if (!rgv.getDemo()) { // continue; // } SiemensRgvThread rgvThread = (SiemensRgvThread) SlaveConnection.get(SlaveType.Rgv, rgv.getId()); RgvProtocol rgvProtocol = rgvThread.getRgvProtocol(); if (rgvProtocol == null) { continue; }else { rgvProtocol = rgvProtocol.clone(); } if ((rgvProtocol.getStatusType1() == RgvStatusType.WAITING || rgvProtocol.getStatusType1()==RgvStatusType.FETCHWAITING) && rgvProtocol.getModeType() == RgvModeType.AUTO && rgvProtocol.getTaskNo1() >0 // && (rgvProtocol.getStatusType() == RgvStatusType.WORKING1) ){ boolean rgvComplete = rgvComplete(rgv.getId()); if (rgvComplete){ rgvThread.setPakMk(true); } } } } public boolean vacuumMastStatusSetN(Integer staNo){ EntityWrapper<VacuumMast> vacuumMastEntityWrapper = new EntityWrapper<>(); vacuumMastEntityWrapper.eq("sta_no",staNo); VacuumMast vacuumMast = vacuumMastService.selectOne(vacuumMastEntityWrapper); vacuumMast.setStatus("N"); boolean update = vacuumMastService.update(vacuumMast, vacuumMastEntityWrapper); return update; } public boolean vacuumMastStatusSetY(Integer staNo){ EntityWrapper<VacuumMast> vacuumMastEntityWrapper = new EntityWrapper<>(); vacuumMastEntityWrapper.eq("sta_no",staNo); VacuumMast vacuumMast = vacuumMastService.selectOne(vacuumMastEntityWrapper); vacuumMast.setStatus("Y"); boolean update = vacuumMastService.update(vacuumMast, vacuumMastEntityWrapper); return update; } public boolean fillingMastStatusSetN(Integer staNo){ EntityWrapper<FillingMast> fillingMastEntityWrapper = new EntityWrapper<>(); fillingMastEntityWrapper.eq("sta_no",staNo); FillingMast fillingMast = fillingMastService.selectOne(fillingMastEntityWrapper); fillingMast.setStatus("N"); boolean update = fillingMastService.update(fillingMast, fillingMastEntityWrapper); return update; } public boolean fillingMastStatusSetY(Integer staNo){ EntityWrapper<FillingMast> fillingMastEntityWrapper = new EntityWrapper<>(); fillingMastEntityWrapper.eq("sta_no",staNo); FillingMast fillingMast = fillingMastService.selectOne(fillingMastEntityWrapper); fillingMast.setStatus("Y"); boolean update = fillingMastService.update(fillingMast, fillingMastEntityWrapper); return update; } /* * 小车复位 * */ public synchronized boolean rgvComplete(Integer rgvId){ try{ // 命令下发区 -------------------------------------------------------------------------- if (!MessageQueue.offer(SlaveType.Rgv, rgvId, new Task(3, new RgvCommand()))) { //step=2,工位1、2写任务; step=4,工位1写任务; step=5,工位2写任务 log.error("RGV命令下发失败,RGV号={}",rgvId); return false; } else { log.info("RGV命令下发成功,RGV号={}",rgvId); return true; } }catch (Exception e){ log.error("RGV命令下发失败,RGV号={}。异常:"+e,rgvId); return false; } } } src/main/java/com/zy/asrs/service/impl/VacuumMastServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.zy.asrs.service.impl; import com.zy.asrs.mapper.VacuumMastMapper; import com.zy.asrs.entity.VacuumMast; import com.zy.asrs.service.VacuumMastService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service("vacuumMastService") public class VacuumMastServiceImpl extends ServiceImpl<VacuumMastMapper, VacuumMast> implements VacuumMastService { @Override public VacuumMast selectByStatusIsN() { return this.baseMapper.selectByStatusIsN(); } } src/main/java/com/zy/asrs/service/impl/WrkMastStaServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.service.impl; import com.zy.asrs.mapper.WrkMastStaMapper; import com.zy.asrs.entity.WrkMastSta; import com.zy.asrs.service.WrkMastStaService; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import org.springframework.stereotype.Service; @Service("wrkMastStaService") public class WrkMastStaServiceImpl extends ServiceImpl<WrkMastStaMapper, WrkMastSta> implements WrkMastStaService { } src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@ generator.url="127.0.0.1:1433;databasename=ghtzasrs"; generator.username="sa"; generator.password="sa@123"; generator.table="asr_bas_rgv_err"; generator.table="man_vacuum_mast"; generator.packagePath="com.zy.asrs"; generator.js = false; generator.html = false; src/main/java/com/zy/core/MainProcess.java
@@ -42,36 +42,12 @@ if (!SystemProperties.WCS_RUNNING_STATUS.get()) { continue; } // 演示 // mainService.crnDemoOfLocMove1(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 mainService.generateStoreWrkFile(); // 组托 // 出库 ===>> 堆垛机出库站到出库站 mainService.crnStnToOutStn(); // 入出库 ===>> 堆垛机入出库作业下发 mainService.crnIoExecute(); // 入库 ===>> 执行对工作档的完成操作 mainService.storeFinished(); // mainService.getRgvTask(); // mainService.RGVDemoShow0(); // mainService.RGVDemoShow1(); mainService.RGVDemoShow2(); // 堆垛机异常信息记录 mainService.recCrnErr(); // 入库 ===>> 空栈板初始化入库,叉车入库站放货 // mainService.storeEmptyPlt(); // mainService.outOfDevp(); // 其他 ===>> // 入出库模式切换函数 i++; if (i > 1) { // mainService.ioConvert(); i = 0; } //自动派发任务 mainService.autoDistribute(); //自动完成任务 mainService.autoCompleteTask(); } catch (Exception e) { e.printStackTrace(); src/main/java/com/zy/core/ServerBootstrap.java
@@ -80,26 +80,26 @@ private void initThread(){ // 初始化堆垛机线程 log.info("初始化堆垛机线程..................................................."); for (CrnSlave crn : slaveProperties.getCrn()) { CrnThread crnThread = new SiemensCrnThread(crn); new Thread((Runnable) crnThread).start(); SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread); } // 初始化输送线线程 log.info("初始化输送线线程..................................................."); for (DevpSlave devp : slaveProperties.getDevp()) { DevpThread devpThread = new SiemensDevpThread(devp); new Thread((Runnable) devpThread).start(); SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread); } // 初始化条码扫描仪线程 log.info("初始化条码扫描仪线程..................................................."); for (Slave barcode : slaveProperties.getBarcode()) { BarcodeThread barcodeThread = new BarcodeThread(barcode); // new Thread(barcodeThread).start(); SlaveConnection.put(SlaveType.Barcode, barcode.getId(), barcodeThread); } // log.info("初始化堆垛机线程..................................................."); // for (CrnSlave crn : slaveProperties.getCrn()) { // CrnThread crnThread = new SiemensCrnThread(crn); // new Thread((Runnable) crnThread).start(); // SlaveConnection.put(SlaveType.Crn, crn.getId(), crnThread); // } // // 初始化输送线线程 // log.info("初始化输送线线程..................................................."); // for (DevpSlave devp : slaveProperties.getDevp()) { // DevpThread devpThread = new SiemensDevpThread(devp); // new Thread((Runnable) devpThread).start(); // SlaveConnection.put(SlaveType.Devp, devp.getId(), devpThread); // } // // 初始化条码扫描仪线程 // log.info("初始化条码扫描仪线程..................................................."); // for (Slave barcode : slaveProperties.getBarcode()) { // BarcodeThread barcodeThread = new BarcodeThread(barcode); //// new Thread(barcodeThread).start(); // SlaveConnection.put(SlaveType.Barcode, barcode.getId(), barcodeThread); // } // 初始化穿梭车线程 log.info("初始化RGV线程..................................................."); for (RgvSlave rgv : slaveProperties.getRgv()) { src/main/java/com/zy/core/enums/RgvStatusType.java
@@ -3,18 +3,21 @@ public enum RgvStatusType { NONE(-1, "离线"), IDLE(0, "无任务"), IDLE(0, "空闲"), WORKING(1, "取货行走"), SOS(2, "进站运行中"), WORKING1(3, "进站完成"), FETCHING(4, "有物待出站"), A5(5,"出站行走"), A6(6,"出站请求"), A7(7,"出站运行中"), A8(8,"出站完成"), SOS(2, "等待取货允许"), WORKING1(3, "取货中"), WORKING5(5, "放货行走"), // FETCHING(11, "取货中"), PUTTING(6, "放货中"), WORKING7(7, "放货完成"), WAITING(90, "任务完成等待WCS确认"), FETCHWAITING(91, "取货任务完成等待WCS确认"), error(99,"报警") ; public Integer id; public String desc; RgvStatusType(Integer id, String desc) { src/main/java/com/zy/core/model/DevpSlave.java
@@ -18,6 +18,7 @@ private Integer rack; private Integer slot; private boolean demo; private List<Sta> inSta = new ArrayList<>(); src/main/java/com/zy/core/model/command/RgvCommand.java
@@ -18,10 +18,10 @@ private Integer rgvNo = 0; // 工位1任务完成确认位 private Short ackFinish1 = 0; private boolean ackFinish1 = false; // 工位1任务号 private Short taskNo1 = 0; private Integer taskNo1 = 0; /** * 任务模式: src/main/java/com/zy/core/model/protocol/RgvProtocol.java
@@ -46,7 +46,7 @@ /** * 工位1任务号 */ public Short taskNo1 = 0; public Integer taskNo1 = 0; /** * RGV工位1当前状态 src/main/resources/application-prod.yml
@@ -5,31 +5,11 @@ # RGV穿梭车1 rgv[0]: id: 1 ip: 172.17.91.54 ip: 10.10.10.200 port: 502 rack: 0 slot: 0 # RGV穿梭车1 rgv[1]: id: 2 ip: 172.17.91.57 port: 502 rack: 0 slot: 0 # RGV穿梭车1 rgv[2]: id: 3 ip: 172.17.91.60 port: 502 rack: 0 slot: 0 # RGV穿梭车1 rgv[3]: id: 4 ip: 172.17.91.63 port: 502 rack: 0 slot: 0 demo: false crn[0]: #堆垛机1 id: 1 ip: 172.17.91.2 src/main/resources/mapper/FillingMastMapper.xml
New file @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.FillingMastMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.FillingMast"> <id column="id" property="id" /> <result column="sta_no" property="staNo" /> <result column="status" property="status" /> </resultMap> <select id="selectByStatusIsn" resultMap="BaseResultMap"> select TOP 1 * from man_filling_mast where status = 'N' </select> </mapper> src/main/resources/mapper/VacuumMastMapper.xml
New file @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.VacuumMastMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.VacuumMast"> <id column="id" property="id" /> <result column="sta_no" property="staNo" /> <result column="status" property="status" /> </resultMap> <select id="selectByStatusIsN" resultMap="BaseResultMap"> select TOP 1 * from man_vacuum_mast where status = 'N' </select> </mapper> src/main/resources/mapper/WrkMastStaMapper.xml
New file @@ -0,0 +1,36 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zy.asrs.mapper.WrkMastStaMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMastSta"> <id column="id" property="id" /> <result column="wrk_no" property="wrkNo" /> <result column="wrk_start" property="wrkStart" /> <result column="wrk_end" property="wrkEnd" /> <result column="sta_start" property="staStart" /> <result column="sta_end" property="staEnd" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="type" property="type" /> <result column="wrk_sts" property="wrkSts" /> <result column="line_number" property="lineNumber" /> <result column="wrk_type" property="wrkType" /> <result column="bign_time" property="bignTime" /> <result column="wrk_crn" property="wrkCrn" /> </resultMap> <select id="selectWrkSts0" resultMap="BaseResultMap"> select TOP 1 * from asr_wrk_mast_sta where 1=1 and wrk_sts=0 order by create_time,id </select> <select id="selectWrkSts1" resultMap="BaseResultMap"> select TOP 1 * from asr_wrk_mast_sta where 1=1 and wrk_sts=1 order by create_time,id </select> </mapper> src/main/webapp/static/wcs/js/common.js
@@ -1,4 +1,4 @@ var baseUrl = "/wcs"; var baseUrl = "/ssdwcs"; // 赋值 function setVal(el, val) { src/main/webapp/static/wms/js/common.js
@@ -1,4 +1,4 @@ var baseUrl = "/wcs"; var baseUrl = "/ssdwcs"; // 详情窗口-高度 var detailHeight = '80%'; src/main/webapp/static/wms/js/fillingMast/fillingMast.js
New file @@ -0,0 +1,247 @@ var pageCurr; layui.config({ base: baseUrl + "/static/wms/layui/lay/modules/" }).use(['table','laydate', 'form', 'admin'], function(){ var table = layui.table; var $ = layui.jquery; var layer = layui.layer; var layDate = layui.laydate; var form = layui.form; var admin = layui.admin; // 数据渲染 tableIns = table.render({ elem: '#fillingMast', headers: {token: localStorage.getItem('token')}, url: baseUrl+'/fillingMast/list/auth', page: true, limit: 15, limits: [15, 30, 50, 100, 200, 500], toolbar: '#toolbar', cellMinWidth: 50, height: 'full-120', cols: [[ {type: 'checkbox'} ,{field: 'id', align: 'center',title: 'ID',width: 50} ,{field: 'staNo', align: 'center',title: '站点'} ,{field: 'status', align: 'center',title: '状态'} ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120} ]], request: { pageName: 'curr', pageSize: 'limit' }, parseData: function (res) { return { 'code': res.code, 'msg': res.msg, 'count': res.data.total, 'data': res.data.records } }, response: { statusCode: 200 }, done: function(res, curr, count) { if (res.code === 403) { top.location.href = baseUrl+"/"; } pageCurr=curr; limit(); } }); // 监听排序事件 table.on('sort(fillingMast)', function (obj) { var searchData = {}; $.each($('#search-box [name]').serializeArray(), function() { searchData[this.name] = this.value; }); searchData['orderByField'] = obj.field; searchData['orderByType'] = obj.type; tableIns.reload({ where: searchData, page: {curr: 1} }); }); // 监听头工具栏事件 table.on('toolbar(fillingMast)', function (obj) { var checkStatus = table.checkStatus(obj.config.id).data; switch(obj.event) { case 'addData': showEditModel(); break; case 'deleteData': if (checkStatus.length === 0) { layer.msg('请选择要删除的数据', {icon: 2}); return; } del(checkStatus.map(function (d) { return d.id; })); break; case 'exportData': admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){ var titles=[]; var fields=[]; obj.config.cols[0].map(function (col) { if (col.type === 'normal' && col.hide === false && col.toolbar == null) { titles.push(col.title); fields.push(col.field); } }); var exportData = {}; $.each($('#search-box [name]').serializeArray(), function() { exportData[this.name] = this.value; }); var param = { 'fillingMast': exportData, 'fields': fields }; $.ajax({ url: baseUrl+"/fillingMast/export/auth", headers: {'token': localStorage.getItem('token')}, data: JSON.stringify(param), dataType:'json', contentType:'application/json;charset=UTF-8', method: 'POST', success: function (res) { layer.closeAll(); if (res.code === 200) { table.exportFile(titles,res.data,'xls'); } else if (res.code === 403) { top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}) } } }); }); break; } }); // 监听行工具事件 table.on('tool(fillingMast)', function(obj){ var data = obj.data; switch (obj.event) { case 'edit': showEditModel(data); break; case "del": del([data.id]); break; } }); /* 弹窗 - 新增、修改 */ function showEditModel(mData) { admin.open({ type: 1, area: '600px', title: (mData ? '修改' : '添加') + '订单状态', content: $('#editDialog').html(), success: function (layero, dIndex) { layDateRender(mData); form.val('detail', mData); form.on('submit(editSubmit)', function (data) { var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/fillingMast/"+(mData?'update':'add')+"/auth", headers: {'token': localStorage.getItem('token')}, data: data.field, method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ layer.close(dIndex); layer.msg(res.msg, {icon: 1}); tableReload(); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { layer.msg(res.msg, {icon: 2}); } } }) return false; }); $(layero).children('.layui-layer-content').css('overflow', 'visible'); layui.form.render('select'); } }); } /* 删除 */ function del(ids) { layer.confirm('确定要删除选中数据吗?', { skin: 'layui-layer-admin', shade: .1 }, function (i) { layer.close(i); var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/fillingMast/delete/auth", headers: {'token': localStorage.getItem('token')}, data: {ids: ids}, method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ layer.msg(res.msg, {icon: 1}); tableReload(); } else if (res.code === 403){ top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}); } } }) }); } // 搜索 form.on('submit(search)', function (data) { pageCurr = 1; tableReload(false); }); // 重置 form.on('submit(reset)', function (data) { pageCurr = 1; clearFormVal($('#search-box')); tableReload(false); }); // 时间选择器 function layDateRender(data) { setTimeout(function () { layDate.render({ elem: '.layui-laydate-range' ,type: 'datetime' ,range: true }); }, 300); } layDateRender(); }); // 关闭动作 $(document).on('click','#data-detail-close', function () { parent.layer.closeAll(); }); function tableReload(child) { var searchData = {}; $.each($('#search-box [name]').serializeArray(), function() { searchData[this.name] = this.value; }); tableIns.reload({ where: searchData, page: {curr: pageCurr} }); } src/main/webapp/static/wms/js/vacuumMast/vacuumMast.js
New file @@ -0,0 +1,247 @@ var pageCurr; layui.config({ base: baseUrl + "/static/wms/layui/lay/modules/" }).use(['table','laydate', 'form', 'admin'], function(){ var table = layui.table; var $ = layui.jquery; var layer = layui.layer; var layDate = layui.laydate; var form = layui.form; var admin = layui.admin; // 数据渲染 tableIns = table.render({ elem: '#vacuumMast', headers: {token: localStorage.getItem('token')}, url: baseUrl+'/vacuumMast/list/auth', page: true, limit: 15, limits: [15, 30, 50, 100, 200, 500], toolbar: '#toolbar', cellMinWidth: 50, height: 'full-120', cols: [[ {type: 'checkbox'} ,{field: 'id', align: 'center',title: 'ID',width: 50} ,{field: 'staNo', align: 'center',title: '站点'} ,{field: 'status', align: 'center',title: '状态'} ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120} ]], request: { pageName: 'curr', pageSize: 'limit' }, parseData: function (res) { return { 'code': res.code, 'msg': res.msg, 'count': res.data.total, 'data': res.data.records } }, response: { statusCode: 200 }, done: function(res, curr, count) { if (res.code === 403) { top.location.href = baseUrl+"/"; } pageCurr=curr; limit(); } }); // 监听排序事件 table.on('sort(vacuumMast)', function (obj) { var searchData = {}; $.each($('#search-box [name]').serializeArray(), function() { searchData[this.name] = this.value; }); searchData['orderByField'] = obj.field; searchData['orderByType'] = obj.type; tableIns.reload({ where: searchData, page: {curr: 1} }); }); // 监听头工具栏事件 table.on('toolbar(vacuumMast)', function (obj) { var checkStatus = table.checkStatus(obj.config.id).data; switch(obj.event) { case 'addData': showEditModel(); break; case 'deleteData': if (checkStatus.length === 0) { layer.msg('请选择要删除的数据', {icon: 2}); return; } del(checkStatus.map(function (d) { return d.id; })); break; case 'exportData': admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){ var titles=[]; var fields=[]; obj.config.cols[0].map(function (col) { if (col.type === 'normal' && col.hide === false && col.toolbar == null) { titles.push(col.title); fields.push(col.field); } }); var exportData = {}; $.each($('#search-box [name]').serializeArray(), function() { exportData[this.name] = this.value; }); var param = { 'vacuumMast': exportData, 'fields': fields }; $.ajax({ url: baseUrl+"/vacuumMast/export/auth", headers: {'token': localStorage.getItem('token')}, data: JSON.stringify(param), dataType:'json', contentType:'application/json;charset=UTF-8', method: 'POST', success: function (res) { layer.closeAll(); if (res.code === 200) { table.exportFile(titles,res.data,'xls'); } else if (res.code === 403) { top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}) } } }); }); break; } }); // 监听行工具事件 table.on('tool(vacuumMast)', function(obj){ var data = obj.data; switch (obj.event) { case 'edit': showEditModel(data); break; case "del": del([data.id]); break; } }); /* 弹窗 - 新增、修改 */ function showEditModel(mData) { admin.open({ type: 1, area: '600px', title: (mData ? '修改' : '添加') + '订单状态', content: $('#editDialog').html(), success: function (layero, dIndex) { layDateRender(mData); form.val('detail', mData); form.on('submit(editSubmit)', function (data) { var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/vacuumMast/"+(mData?'update':'add')+"/auth", headers: {'token': localStorage.getItem('token')}, data: data.field, method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ layer.close(dIndex); layer.msg(res.msg, {icon: 1}); tableReload(); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { layer.msg(res.msg, {icon: 2}); } } }) return false; }); $(layero).children('.layui-layer-content').css('overflow', 'visible'); layui.form.render('select'); } }); } /* 删除 */ function del(ids) { layer.confirm('确定要删除选中数据吗?', { skin: 'layui-layer-admin', shade: .1 }, function (i) { layer.close(i); var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/vacuumMast/delete/auth", headers: {'token': localStorage.getItem('token')}, data: {ids: ids}, method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ layer.msg(res.msg, {icon: 1}); tableReload(); } else if (res.code === 403){ top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}); } } }) }); } // 搜索 form.on('submit(search)', function (data) { pageCurr = 1; tableReload(false); }); // 重置 form.on('submit(reset)', function (data) { pageCurr = 1; clearFormVal($('#search-box')); tableReload(false); }); // 时间选择器 function layDateRender(data) { setTimeout(function () { layDate.render({ elem: '.layui-laydate-range' ,type: 'datetime' ,range: true }); }, 300); } layDateRender(); }); // 关闭动作 $(document).on('click','#data-detail-close', function () { parent.layer.closeAll(); }); function tableReload(child) { var searchData = {}; $.each($('#search-box [name]').serializeArray(), function() { searchData[this.name] = this.value; }); tableIns.reload({ where: searchData, page: {curr: pageCurr} }); } src/main/webapp/static/wms/js/wrkMastSta/wrkMastSta.js
New file @@ -0,0 +1,272 @@ var pageCurr; layui.config({ base: baseUrl + "/static/wms/layui/lay/modules/" }).use(['table','laydate', 'form', 'admin'], function(){ var table = layui.table; var $ = layui.jquery; var layer = layui.layer; var layDate = layui.laydate; var form = layui.form; var admin = layui.admin; // 数据渲染 tableIns = table.render({ elem: '#wrkMastSta', headers: {token: localStorage.getItem('token')}, url: baseUrl+'/wrkMastSta/list/auth', page: true, limit: 15, limits: [15, 30, 50, 100, 200, 500], toolbar: '#toolbar', height: 'full-120', cols: [[ {type: 'checkbox'} // ,{field: 'id', align: 'center',title: 'ID'} ,{field: 'wrkNo', align: 'center',title: '工作号'} ,{field: 'wrkStart', align: 'center',title: '工作档开始位置'} ,{field: 'wrkEnd', align: 'center',title: '工作档结束位置'} ,{field: 'staStart', align: 'center',title: '小车接货位置'} ,{field: 'staEnd', align: 'center',title: '小车放货位置'} // ,{field: 'type', align: 'center',title: '类型 0:满版 1:空板'} ,{field: 'wrkSts$', align: 'center',title: '工作状态'} // ,{field: 'lineNumber', align: 'center',title: '行号'} // ,{field: 'wrkType', align: 'center',title: '工作类型 类型 1:取(叠盘) 2:放 3:取放 4:拆盘'} ,{field: 'bignTime$', align: 'center',title: '标记时间'} // ,{field: 'wrkCrn', align: 'center',title: ''} ,{field: 'createTime$', align: 'center',title: '添加时间'} ,{field: 'updateTime$', align: 'center',title: '修改时间'} ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width:120} ]], request: { pageName: 'curr', pageSize: 'limit' }, parseData: function (res) { return { 'code': res.code, 'msg': res.msg, 'count': res.data.total, 'data': res.data.records } }, response: { statusCode: 200 }, done: function(res, curr, count) { if (res.code === 403) { top.location.href = baseUrl+"/"; } pageCurr=curr; limit(); } }); // 监听排序事件 table.on('sort(wrkMastSta)', function (obj) { var searchData = {}; $.each($('#search-box [name]').serializeArray(), function() { searchData[this.name] = this.value; }); searchData['orderByField'] = obj.field; searchData['orderByType'] = obj.type; tableIns.reload({ where: searchData, page: {curr: 1} }); }); // 监听头工具栏事件 table.on('toolbar(wrkMastSta)', function (obj) { var checkStatus = table.checkStatus(obj.config.id).data; switch(obj.event) { case 'addData': showEditModel(); break; case 'deleteData': if (checkStatus.length === 0) { layer.msg('请选择要删除的数据', {icon: 2}); return; } del(checkStatus.map(function (d) { return d.id; })); break; case 'exportData': admin.confirm('确定导出Excel吗', {shadeClose: true}, function(){ var titles=[]; var fields=[]; obj.config.cols[0].map(function (col) { if (col.type === 'normal' && col.hide === false && col.toolbar == null) { titles.push(col.title); fields.push(col.field); } }); var exportData = {}; $.each($('#search-box [name]').serializeArray(), function() { exportData[this.name] = this.value; }); var param = { 'wrkMastSta': exportData, 'fields': fields }; $.ajax({ url: baseUrl+"/wrkMastSta/export/auth", headers: {'token': localStorage.getItem('token')}, data: JSON.stringify(param), dataType:'json', contentType:'application/json;charset=UTF-8', method: 'POST', success: function (res) { layer.closeAll(); if (res.code === 200) { table.exportFile(titles,res.data,'xls'); } else if (res.code === 403) { top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}) } } }); }); break; } }); // 监听行工具事件 table.on('tool(wrkMastSta)', function(obj){ var data = obj.data; switch (obj.event) { case 'edit': showEditModel(data); break; case "del": del([data.id]); break; } }); /* 弹窗 - 新增、修改 */ function showEditModel(mData) { admin.open({ type: 1, area: '600px', title: (mData ? '修改' : '添加') + '订单状态', content: $('#editDialog').html(), success: function (layero, dIndex) { layDateRender(mData); form.val('detail', mData); form.on('submit(editSubmit)', function (data) { var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/wrkMastSta/"+(mData?'update':'add')+"/auth", headers: {'token': localStorage.getItem('token')}, data: data.field, method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ layer.close(dIndex); layer.msg(res.msg, {icon: 1}); tableReload(); } else if (res.code === 403){ top.location.href = baseUrl+"/"; }else { layer.msg(res.msg, {icon: 2}); } } }) return false; }); $(layero).children('.layui-layer-content').css('overflow', 'visible'); layui.form.render('select'); } }); } /* 删除 */ function del(ids) { layer.confirm('确定要删除选中数据吗?', { skin: 'layui-layer-admin', shade: .1 }, function (i) { layer.close(i); var loadIndex = layer.load(2); $.ajax({ url: baseUrl+"/wrkMastSta/delete/auth", headers: {'token': localStorage.getItem('token')}, data: {ids: ids}, method: 'POST', success: function (res) { layer.close(loadIndex); if (res.code === 200){ layer.msg(res.msg, {icon: 1}); tableReload(); } else if (res.code === 403){ top.location.href = baseUrl+"/"; } else { layer.msg(res.msg, {icon: 2}); } } }) }); } // 搜索 form.on('submit(search)', function (data) { pageCurr = 1; tableReload(false); }); // 重置 form.on('submit(reset)', function (data) { pageCurr = 1; clearFormVal($('#search-box')); tableReload(false); }); // 时间选择器 function layDateRender(data) { setTimeout(function () { layDate.render({ elem: '.layui-laydate-range' ,type: 'datetime' ,range: true }); layDate.render({ elem: '#createTime\\$', type: 'datetime', value: data!==undefined?data['createTime\\$']:null }); layDate.render({ elem: '#updateTime\\$', type: 'datetime', value: data!==undefined?data['updateTime\\$']:null }); layDate.render({ elem: '#bignTime\\$', type: 'datetime', value: data!==undefined?data['bignTime\\$']:null }); }, 300); } layDateRender(); }); // 关闭动作 $(document).on('click','#data-detail-close', function () { parent.layer.closeAll(); }); function tableReload(child) { var searchData = {}; $.each($('#search-box [name]').serializeArray(), function() { searchData[this.name] = this.value; }); tableIns.reload({ where: searchData, page: {curr: pageCurr} }); } src/main/webapp/views/deviceOperate/rgvOperate.html
@@ -26,6 +26,8 @@ </el-table-column> <el-table-column property="walkPos" label="设备状态"> </el-table-column> <el-table-column property="pakMk" label="锁定状态"> </el-table-column> </el-table> </div> @@ -40,26 +42,37 @@ <!-- <el-form-item label="源站/源库位">--> <!-- <el-input v-model="formParam.sourceStaNo" placeholder="源站/源库位"></el-input>--> <!-- </el-form-item>--> <el-form-item label="源排"> <el-input v-model="formParam.sourceRow" placeholder="排"></el-input> <el-form-item label="起始站"> <el-input v-model="formParam.sourceRow" placeholder="起始站"></el-input> </el-form-item> <el-form-item label="源列"> <el-input v-model="formParam.sourceBay" placeholder="列"></el-input> <el-form-item label="目标站"> <el-input v-model="formParam.sourceBay" placeholder="目标站"></el-input> </el-form-item> <el-form-item label="源层"> <el-input v-model="formParam.sourceLev" placeholder="层"></el-input> <el-form-item label="启动"> <el-button @click="initiate" type="warning">执行任务</el-button> </el-form-item> </el-form> <div> <el-button @click="requestOperate('auto')" type="warning">联机</el-button> <el-button @click="requestOperate('restoreTask')" type="warning">恢复联机任务</el-button> <el-button @click="requestOperate('compTask')" type="warning">强制完成任务</el-button> <br/> <br/> <el-button @click="requestOperate('stop')" type="warning">远程急停</el-button> <!-- <el-button @click="requestOperate('noStop')" type="warning">取消急停</el-button>--> <el-button @click="requestOperate('reset')" type="warning">系统复位</el-button> <el-button v-if="demo === 'N' " @click="demos('true')" type="warning">演示</el-button> <el-button v-if="demo === 'Y' " @click="demos('false')" type="warning">取消演示</el-button> </div> <div style="margin-top: 5px" v-if="demo === 'Y'"> <el-button @click="staTova(2,1)" type="warning">输送-置换1</el-button> <el-button @click="staTova(2,3)" type="warning">输送-置换2</el-button> <el-button @click="staTova(2,5)" type="warning">输送-置换3</el-button> <el-button @click="staTova(2,7)" type="warning">输送-置换4</el-button> </div> <div style="margin-top: 5px" v-if="demo === 'Y'"> <el-button @click="staTova(2,4)" type="warning">输送-灌装1</el-button> <el-button @click="staTova(2,6)" type="warning">输送-灌装2</el-button> <el-button @click="staTova(2,8)" type="warning">输送-灌装3</el-button> </div> <div style="margin-top: 5px" v-if="demo === 'Y'"> <el-button @click="staTova(1,10)" type="warning">置换1-放货</el-button> <el-button @click="staTova(2,10)" type="warning">置换2-放货</el-button> <el-button @click="staTova(3,10)" type="warning">置换3-放货</el-button> <el-button @click="staTova(4,10)" type="warning">置换4-放货</el-button> </div> </div> </el-card> @@ -84,12 +97,9 @@ <el-tag>{{ tableData[currentIndex].statusType }}</el-tag> </el-descriptions-item> <el-descriptions-item label="任务状态"> <div v-if="tableData[currentIndex].wrkStatus == 0"> <el-tag>{{ tableData[currentIndex].status}}</el-tag> </div> <div v-else> <el-tag type="success">{{ tableData[currentIndex].wrkStatus$ }}</el-tag> </div> </el-descriptions-item> <el-descriptions-item label="设备状态"> <el-tag>{{ tableData[currentIndex].walkPos }}</el-tag> @@ -98,11 +108,12 @@ </el-descriptions-item> <el-descriptions-item label="故障描述">{{ tableData[currentIndex].alarm }} </el-descriptions-item> <el-descriptions-item label="源站">{{ tableData[currentIndex].staNo }} </el-descriptions-item> <el-descriptions-item label="目标站">{{ tableData[currentIndex].sourceStaNo }} </el-descriptions-item> <!-- <el-descriptions-item label="源站">{{ tableData[currentIndex].staNo }}--> <!-- </el-descriptions-item>--> <!-- <el-descriptions-item label="目标站">{{ tableData[currentIndex].sourceStaNo }}--> <!-- </el-descriptions-item>--> </el-descriptions> </div> </div> </el-card> @@ -142,7 +153,8 @@ value:'0', label:'否' } ] ], demo: 'X' }, created() { this.init() @@ -151,11 +163,46 @@ }, methods: { staTova(sta,end){ let that = this that.$confirm('此操作存在风险,是否继续','提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(()=>{ $.ajax({ url: baseUrl + "/rgv/rgvDemoTask", headers: { 'token': localStorage.getItem('token') }, data:{ rgvNo : this.formParam.rgvNo, sta : sta, end : end }, method: 'Get', success: function (res) { if (res.code == 200) { that.$message({ message: res.msg, type: 'success' }); } else { that.$message({ message: res.msg, type: 'error' }); } } }); }) }, init() { this.getTableData() setInterval(() => { this.getTableData() this.demoStatus() }, 1000) }, handleRowClick(row, col, event) { @@ -183,6 +230,86 @@ } }); }, demoStatus() { let that = this; $.ajax({ url: baseUrl + "/rgv/demo/status", data:{ rgvNo : this.formParam.rgvNo }, headers: { 'token': localStorage.getItem('token') }, contentType: 'application/json;charset=UTF-8', method: 'get', success: function (res) { that.demo = res.msg } }); }, initiate(){ let that = this that.$confirm('此操作存在风险,是否继续','提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(()=>{ $.ajax({ url: baseUrl + "/rgv/operator/put", headers: { 'token': localStorage.getItem('token') }, data: this.formParam, method: 'POST', success: function (res) { if (res.code == 200) { that.$message({ message: res.msg, type: 'success' }); } else { that.$message({ message: res.msg, type: 'error' }); } } }); }) }, demos(method){ let that = this that.$confirm('此操作存在风险,是否继续','提示',{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(()=>{ $.ajax({ url: baseUrl + "/rgv/demo/status/" + method, headers: { 'token': localStorage.getItem('token') }, data:{ rgvNo : this.formParam.rgvNo }, method: 'Get', success: function (res) { if (res.code == 200) { that.$message({ message: res.msg, type: 'success' }); } else { that.$message({ message: res.msg, type: 'error' }); } } }); }) }, requestOperate(method) { let that = this that.$confirm('此操作存在风险,是否继续','提示',{ src/main/webapp/views/fillingMast/fillingMast.html
New file @@ -0,0 +1,98 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title></title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all"> <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all"> <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all"> </head> <body> <div class="layui-fluid"> <div class="layui-card"> <div class="layui-card-body"> <div class="layui-form toolbar" id="search-box"> <div class="layui-form-item"> <div class="layui-inline"> <div class="layui-input-inline"> <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off"> </div> </div> <div class="layui-inline" style="width: 300px"> <div class="layui-input-inline"> <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> </div> </div> <div class="layui-inline"> <div class="layui-input-inline"> <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off"> </div> </div> <div class="layui-inline">  <button class="layui-btn icon-btn" lay-filter="search" lay-submit> <i class="layui-icon"></i>搜索 </button> <button class="layui-btn icon-btn" lay-filter="reset" lay-submit> <i class="layui-icon"></i>重置 </button> </div> </div> </div> <table class="layui-hide" id="fillingMast" lay-filter="fillingMast"></table> </div> </div> </div> <script type="text/html" id="toolbar"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button> <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button> <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button> </div> </script> <script type="text/html" id="operate"> <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a> <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> </script> <script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/fillingMast/fillingMast.js" charset="utf-8"></script> </body> <!-- 表单弹窗 --> <script type="text/html" id="editDialog"> <form id="detail" lay-filter="detail" class="layui-form admin-form model-form"> <input name="id" type="hidden"> <div class="layui-row"> <div class="layui-col-md12"> <div class="layui-form-item"> <label class="layui-form-label">站点: </label> <div class="layui-input-block"> <input class="layui-input" name="staNo" placeholder="请输入"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">状态: </label> <div class="layui-input-block"> <input class="layui-input" name="status" placeholder="请输入"> </div> </div> </div> </div> <hr class="layui-bg-gray"> <div class="layui-form-item text-right"> <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button> <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button> </div> </form> </script> </html> src/main/webapp/views/index.html
@@ -149,16 +149,16 @@ } }); $.ajax({ url: baseUrl+"/loginInformation", data: {}, method: 'GET', success: function (res) { var data = res.data $(".copyright-text").text(data.loginCopyrightText); $(".loginLogo").attr("src", data.loginLogo); } }); // $.ajax({ // url: baseUrl+"/loginInformation", // data: {}, // method: 'GET', // success: function (res) { // var data = res.data // // $(".copyright-text").text(data.loginCopyrightText); // // $(".loginLogo").attr("src", data.loginLogo); // } // }); $.ajax({ url: baseUrl + "/license/getLicenseDays", @@ -179,7 +179,7 @@ // 默认加载主页 index.loadHome({ menuPath: baseUrl+'/views/home/console.html', menuPath: baseUrl+'/views/deviceOperate/rgvOperate.html', menuName: '<i class="layui-icon layui-icon-home"></i>' }); src/main/webapp/views/login.html
@@ -2,7 +2,7 @@ <html> <head> <meta charset="utf-8"> <title>冠鸿 │ login of zoneyung wcs</title> <title>中扬 │ login of zoneyung wcs</title> <style> * { padding: 0; @@ -237,21 +237,21 @@ <script> // remember pwd $(function () { $.ajax({ url: baseUrl+"/loginInformation", data: {}, method: 'GET', success: function (res) { var data = res.data $(".copyright-text").text(data.loginCopyrightText); $(".copyright-img-url").attr("src", data.loginCopyrightImg1); $(".loginLogoUrl").attr("src", data.loginLogo); if (data.loginCopyrightImg1 == "") { $(".copyright-img-url").hide() } } }); // $.ajax({ // url: baseUrl+"/loginInformation", // data: {}, // method: 'GET', // success: function (res) { // var data = res.data // $(".copyright-text").text(data.loginCopyrightText); // // $(".copyright-img-url").attr("src", data.loginCopyrightImg1); // // $(".loginLogoUrl").attr("src", data.loginLogo); // // if (data.loginCopyrightImg1 == "") { // $(".copyright-img-url").hide() // } // } // }); var oldUserName = localStorage.getItem('oldUserName'); var oldPass = localStorage.getItem('oldPass'); src/main/webapp/views/vacuumMast/vacuumMast.html
New file @@ -0,0 +1,98 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title></title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all"> <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all"> <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all"> </head> <body> <div class="layui-fluid"> <div class="layui-card"> <div class="layui-card-body"> <div class="layui-form toolbar" id="search-box"> <div class="layui-form-item"> <div class="layui-inline"> <div class="layui-input-inline"> <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off"> </div> </div> <div class="layui-inline" style="width: 300px"> <div class="layui-input-inline"> <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> </div> </div> <div class="layui-inline"> <div class="layui-input-inline"> <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off"> </div> </div> <div class="layui-inline">  <button class="layui-btn icon-btn" lay-filter="search" lay-submit> <i class="layui-icon"></i>搜索 </button> <button class="layui-btn icon-btn" lay-filter="reset" lay-submit> <i class="layui-icon"></i>重置 </button> </div> </div> </div> <table class="layui-hide" id="vacuumMast" lay-filter="vacuumMast"></table> </div> </div> </div> <script type="text/html" id="toolbar"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button> <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button> <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button> </div> </script> <script type="text/html" id="operate"> <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a> <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> </script> <script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/vacuumMast/vacuumMast.js" charset="utf-8"></script> </body> <!-- 表单弹窗 --> <script type="text/html" id="editDialog"> <form id="detail" lay-filter="detail" class="layui-form admin-form model-form"> <input name="id" type="hidden"> <div class="layui-row"> <div class="layui-col-md12"> <div class="layui-form-item"> <label class="layui-form-label">站点: </label> <div class="layui-input-block"> <input class="layui-input" name="staNo" placeholder="请输入"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">状态: </label> <div class="layui-input-block"> <input class="layui-input" name="status" placeholder="请输入"> </div> </div> </div> </div> <hr class="layui-bg-gray"> <div class="layui-form-item text-right"> <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button> <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button> </div> </form> </script> </html> src/main/webapp/views/wrkMastSta/wrkMastSta.html
New file @@ -0,0 +1,164 @@ <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title></title> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="../../static/wms/layui/css/layui.css" media="all"> <link rel="stylesheet" href="../../static/wms/css/admin.css?v=318" media="all"> <link rel="stylesheet" href="../../static/wms/css/cool.css" media="all"> </head> <body> <div class="layui-fluid"> <div class="layui-card"> <div class="layui-card-body"> <div class="layui-form toolbar" id="search-box"> <div class="layui-form-item"> <div class="layui-inline"> <div class="layui-input-inline"> <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off"> </div> </div> <div class="layui-inline" style="width: 300px"> <div class="layui-input-inline"> <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px"> </div> </div> <div class="layui-inline"> <div class="layui-input-inline"> <input class="layui-input" type="text" name="condition" placeholder="请输入" autocomplete="off"> </div> </div> <div class="layui-inline">  <button class="layui-btn icon-btn" lay-filter="search" lay-submit> <i class="layui-icon"></i>搜索 </button> <button class="layui-btn icon-btn" lay-filter="reset" lay-submit> <i class="layui-icon"></i>重置 </button> </div> </div> </div> <table class="layui-hide" id="wrkMastSta" lay-filter="wrkMastSta"></table> </div> </div> </div> <script type="text/html" id="toolbar"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button> <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button> <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button> </div> </script> <script type="text/html" id="operate"> <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a> <a class="layui-btn layui-btn-danger layui-btn-xs btn-edit" lay-event="del">删除</a> </script> <script type="text/javascript" src="../../static/wms/js/jquery/jquery-3.3.1.min.js"></script> <script type="text/javascript" src="../../static/wms/layui/layui.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/common.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/cool.js" charset="utf-8"></script> <script type="text/javascript" src="../../static/wms/js/wrkMastSta/wrkMastSta.js" charset="utf-8"></script> </body> <!-- 表单弹窗 --> <script type="text/html" id="editDialog"> <form id="detail" lay-filter="detail" class="layui-form admin-form model-form"> <input name="id" type="hidden"> <div class="layui-row"> <div class="layui-col-md12"> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">工作号: </label> <div class="layui-input-block"> <input class="layui-input" name="wrkNo" placeholder="请输入工作号" lay-vertype="tips" lay-verify="required"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">工作档开始位置: </label> <div class="layui-input-block"> <input class="layui-input" name="wrkStart" placeholder="请输入工作档开始位置" lay-vertype="tips" lay-verify="required"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">工作档结束位置: </label> <div class="layui-input-block"> <input class="layui-input" name="wrkEnd" placeholder="请输入工作档结束位置" lay-vertype="tips" lay-verify="required"> </div> </div> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label layui-form-required">小车接货位置: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="staStart" placeholder="请输入小车接货位置" lay-vertype="tips" lay-verify="required">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label layui-form-required">小车放货位置: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="staEnd" placeholder="请输入小车放货位置" lay-vertype="tips" lay-verify="required">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label">添加时间: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="createTime" id="createTime$" placeholder="请输入添加时间">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label">修改时间: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label layui-form-required">类型 0:满版 1:空板: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="type" placeholder="请输入类型 0:满版 1:空板" lay-vertype="tips" lay-verify="required">--> <!-- </div>--> <!-- </div>--> <div class="layui-form-item"> <label class="layui-form-label layui-form-required">工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成: </label> <div class="layui-input-block"> <input class="layui-input" name="wrkSts" placeholder="请输入工作状态 0:初始 1:等待小车取 2:等待小车放 3:完成" lay-vertype="tips" lay-verify="required"> </div> </div> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label layui-form-required">行号: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="lineNumber" placeholder="请输入行号" lay-vertype="tips" lay-verify="required">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label layui-form-required">工作类型 类型 1:取(叠盘) 2:放 3:取放 4:拆盘: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="wrkType" placeholder="请输入工作类型 类型 1:取(叠盘) 2:放 3:取放 4:拆盘" lay-vertype="tips" lay-verify="required">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label">标记时间: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="bignTime" id="bignTime$" placeholder="请输入标记时间">--> <!-- </div>--> <!-- </div>--> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label">: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="wrkCrn" placeholder="请输入">--> <!-- </div>--> <!-- </div>--> </div> </div> <hr class="layui-bg-gray"> <div class="layui-form-item text-right"> <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button> <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button> </div> </form> </script> </html>