pom.xml
@@ -9,7 +9,7 @@ <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.zy</groupId> <artifactId>jdzwcs</artifactId> <artifactId>wcs</artifactId> <version>1.0.0</version> <packaging>war</packaging> @@ -200,7 +200,7 @@ </dependencies> <build> <finalName>jdzwcs</finalName> <finalName>wcs</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> src/main/java/com/zy/asrs/controller/BasShuttleController.java
New file @@ -0,0 +1,127 @@ package com.zy.asrs.controller; 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.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.R; import com.zy.asrs.entity.BasShuttle; import com.zy.asrs.service.BasShuttleService; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController public class BasShuttleController extends BaseController { @Autowired private BasShuttleService basShuttleService; @RequestMapping(value = "/basShuttle/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(basShuttleService.selectById(String.valueOf(id))); } @RequestMapping(value = "/basShuttle/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(required = false)String condition, @RequestParam Map<String, Object> param){ EntityWrapper<BasShuttle> wrapper = new EntityWrapper<>(); excludeTrash(param); convert(param, wrapper); allLike(BasShuttle.class, param.keySet(), wrapper, condition); if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} return R.ok(basShuttleService.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 = "/basShuttle/add/auth") @ManagerAuth public R add(BasShuttle basShuttle) { basShuttleService.insert(basShuttle); return R.ok(); } @RequestMapping(value = "/basShuttle/update/auth") @ManagerAuth public R update(BasShuttle basShuttle){ if (Cools.isEmpty(basShuttle) || null==basShuttle.getShuttleNo()){ return R.error(); } basShuttleService.updateById(basShuttle); return R.ok(); } @RequestMapping(value = "/basShuttle/delete/auth") @ManagerAuth public R delete(@RequestParam(value="ids[]") Long[] ids){ for (Long id : ids){ basShuttleService.deleteById(id); } return R.ok(); } @RequestMapping(value = "/basShuttle/export/auth") @ManagerAuth public R export(@RequestBody JSONObject param){ EntityWrapper<BasShuttle> wrapper = new EntityWrapper<>(); List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); Map<String, Object> map = excludeTrash(param.getJSONObject("basShuttle")); convert(map, wrapper); List<BasShuttle> list = basShuttleService.selectList(wrapper); return R.ok(exportSupport(list, fields)); } @RequestMapping(value = "/basShuttleQuery/auth") @ManagerAuth public R query(String condition) { EntityWrapper<BasShuttle> wrapper = new EntityWrapper<>(); wrapper.like("shuttle_no", condition); Page<BasShuttle> page = basShuttleService.selectPage(new Page<>(0, 10), wrapper); List<Map<String, Object>> result = new ArrayList<>(); for (BasShuttle basShuttle : page.getRecords()){ Map<String, Object> map = new HashMap<>(); map.put("id", basShuttle.getShuttleNo()); map.put("value", basShuttle.getShuttleNo()); result.add(map); } return R.ok(result); } @RequestMapping(value = "/basShuttle/check/column/auth") @ManagerAuth public R query(@RequestBody JSONObject param) { Wrapper<BasShuttle> wrapper = new EntityWrapper<BasShuttle>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); if (null != basShuttleService.selectOne(wrapper)){ return R.parse(BaseRes.REPEAT).add(getComment(BasShuttle.class, String.valueOf(param.get("key")))); } return R.ok(); } } src/main/java/com/zy/asrs/controller/OpenController.java
@@ -464,6 +464,17 @@ return R.ok(crnStatusParams); } //设备状态查询接口 @PostMapping("/devpdeviceStatus") @Transactional public String devpDeviceStatus(@RequestBody HashMap staNo) { BasDevp basDevp=basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no",staNo.get("staNo"))); if(basDevp==null||basDevp.getLoading().equals("Y")||basDevp.getOutEnable().equals("N")){ return "no"; } return "ok"; } public static <T> List<T> convertListMapToListObject(List<HashMap<String, Object>> listMap, Class<T> clazz) throws Exception { List<T> list = new ArrayList<>(); src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -11,6 +11,8 @@ import com.zy.asrs.entity.CommandInfo; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.entity.TaskWrkLog; import com.zy.asrs.entity.param.NotifyDto; import com.zy.asrs.entity.param.TaskOverToWms; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.CommandInfoService; @@ -349,4 +351,32 @@ } } @PostMapping(value = "/taskWrk/state") // @ManagerAuth(memo = "接收RCS任务状态") public R taskWrkState(@RequestBody NotifyDto notifyDto) { log.info("接收RCS任务状态={}", notifyDto); TaskWrk taskWrk = taskWrkService.selectByTaskNo(notifyDto.getSuperTaskNo());//wms任务号 if (taskWrk == null) { return R.error("没有找到该任务={"+notifyDto+"}"); } Date now = new Date(); if(notifyDto.getMsgType().equals("task_complete")&&taskWrk.getIoType()==3){ taskWrk.setWrkSts(9);//更新数据完成,直接转历史档 //更新源库位状态为空库位 LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); locMast.setLocSts("O"); locMastService.updateById(locMast); //更新目标库状态为在库 LocMast locMast2 = locMastService.selectByLocNo(taskWrk.getTargetPoint()); locMast2.setLocSts("F"); locMastService.updateById(locMast2); taskWrk.setModiTime(now);//操作时间 taskWrk.setModiUser(9998L);//操作员 taskWrkService.updateById(taskWrk); } return R.ok(); } } src/main/java/com/zy/asrs/entity/BasShuttle.java
New file @@ -0,0 +1,202 @@ package com.zy.asrs.entity; import com.baomidou.mybatisplus.annotations.TableField; import com.baomidou.mybatisplus.annotations.TableId; import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.core.common.Cools; import com.core.common.SpringUtils; import com.zy.system.entity.User; import com.zy.system.service.UserService; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; @Data @TableName("asr_bas_shuttle") public class BasShuttle implements Serializable { private static final long serialVersionUID = 1L; /** * 四向穿梭车号 */ @ApiModelProperty(value= "四向穿梭车号") @TableId(value = "shuttle_no", type = IdType.INPUT) @TableField("shuttle_no") private Integer shuttleNo; /** * 状态 1: 正常 0: 禁用 */ @ApiModelProperty(value= "状态 1: 正常 0: 禁用 ") private Integer status; /** * 当前小车状态(内部自我维护) */ @ApiModelProperty(value= "当前小车状态(内部自我维护)") @TableField("shuttle_status") private Integer shuttleStatus; /** * 任务号 */ @ApiModelProperty(value= "任务号") @TableField("wrk_no") private Integer wrkNo; /** * 暂存库位 */ @ApiModelProperty(value= "暂存库位") @TableField("idle_loc") private String idleLoc; /** * 自动充电 */ @ApiModelProperty(value= "自动充电") @TableField("auto_charge") private Integer autoCharge; /** * 电量线 */ @ApiModelProperty(value= "电量线") @TableField("charge_line") private Integer chargeLine; /** * 添加人员 */ @ApiModelProperty(value= "添加人员") @TableField("create_by") private Long createBy; /** * 添加时间 */ @ApiModelProperty(value= "添加时间") @TableField("create_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 修改人员 */ @ApiModelProperty(value= "修改人员") @TableField("update_by") private Long updateBy; /** * 修改时间 */ @ApiModelProperty(value= "修改时间") @TableField("update_time") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 备注 */ @ApiModelProperty(value= "备注") private String memo; /** * 作业标记 */ @ApiModelProperty(value= "作业标记") @TableField("pak_mk") private Boolean pakMk; /** * 小车运行速度 */ @ApiModelProperty(value= "小车运行速度") @TableField("run_speed") private Integer runSpeed; /** * 设备状态 */ @ApiModelProperty(value= "设备状态") @TableField("device_status") private String deviceStatus; /** * 小车禁用楼层 */ @ApiModelProperty(value= "小车禁用楼层") @TableField("disable_lev") private String disableLev; public BasShuttle() {} public BasShuttle(Integer shuttleNo, Integer status, Integer shuttleStatus, Integer wrkNo, String idleLoc, Integer autoCharge, Integer chargeLine, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo, Boolean pakMk, String deviceStatus) { this.shuttleNo = shuttleNo; this.status = status; this.shuttleStatus = shuttleStatus; this.wrkNo = wrkNo; this.idleLoc = idleLoc; this.autoCharge = autoCharge; this.chargeLine = chargeLine; this.createBy = createBy; this.createTime = createTime; this.updateBy = updateBy; this.updateTime = updateTime; this.memo = memo; this.pakMk = pakMk; this.deviceStatus = deviceStatus; } public String getStatus$(){ if (null == this.status){ return null; } switch (this.status){ case 1: return "正常"; case 0: return "禁用"; default: return String.valueOf(this.status); } } public String getCreateBy$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.createBy); if (!Cools.isEmpty(user)){ return String.valueOf(user.getUsername()); } return null; } public String getCreateTime$(){ if (Cools.isEmpty(this.createTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime); } public String getUpdateBy$(){ UserService service = SpringUtils.getBean(UserService.class); User user = service.selectById(this.updateBy); if (!Cools.isEmpty(user)){ return String.valueOf(user.getUsername()); } return null; } public String getUpdateTime$(){ if (Cools.isEmpty(this.updateTime)){ return ""; } return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime); } } src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -50,7 +50,7 @@ /** * 任务状态 1: 接收 2: 派发 3: 完结 4: 取消 */ @ApiModelProperty(value= "任务状态 1: 接收 2: 派发 5: 完结 4: 取消 ") @ApiModelProperty(value= "任务状态 1: 接收 2: 派发 4: 取消 5: 完结 ") private Integer status; /** @@ -70,6 +70,8 @@ /** * 任务类型 * * */ @ApiModelProperty(value= "任务类型") @TableField("io_type") src/main/java/com/zy/asrs/entity/param/NotifyDto.java
New file @@ -0,0 +1,44 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class NotifyDto { private Long id; //通知类型 private String notifyType; //设备号 private Integer device; //工作号 private String taskNo; //消息类型 private String msgType; //消息描述 private String msgDesc; //消息数据 private String data; //失败重试次数 private Integer failTimes = 3; //重试次数 private Integer retryTimes = 0; //重试间隔默认30s private Integer retryTime = 30; //上次重试时间 private Long lastRetryTime = 0L; //wms工作号 private String superTaskNo; } src/main/java/com/zy/asrs/mapper/BasShuttleMapper.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.mapper; import com.baomidou.mybatisplus.mapper.BaseMapper; import com.zy.asrs.entity.BasShuttle; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @Mapper @Repository public interface BasShuttleMapper extends BaseMapper<BasShuttle> { } src/main/java/com/zy/asrs/service/BasShuttleService.java
New file @@ -0,0 +1,8 @@ package com.zy.asrs.service; import com.baomidou.mybatisplus.service.IService; import com.zy.asrs.entity.BasShuttle; public interface BasShuttleService extends IService<BasShuttle> { } src/main/java/com/zy/asrs/service/impl/BasShuttleServiceImpl.java
New file @@ -0,0 +1,12 @@ package com.zy.asrs.service.impl; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.zy.asrs.entity.BasShuttle; import com.zy.asrs.mapper.BasShuttleMapper; import com.zy.asrs.service.BasShuttleService; import org.springframework.stereotype.Service; @Service("basShuttleService") public class BasShuttleServiceImpl extends ServiceImpl<BasShuttleMapper, BasShuttle> implements BasShuttleService { } src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -85,48 +85,48 @@ @Override public R toWmsLocStatus(LocMast locMast) { String response = null; Map<String, Object> map = new HashMap<>(); map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2"); WmsLocStatus param = new WmsLocStatus(); param.setWarehouseId("1688469798893297665"); param.setLocationCode(Utils.getWmsLocNo(locMast.getLocNo())); param.setEmptyContainer(locMast.getEmptyContainer$()); if (locMast.getLocSts().equals("Z")){ param.setStatus("JY"); }else { param.setStatus("QY"); } if (Cools.isEmpty(locMast.getBarcode()) || locMast.getLocSts().equals("O")){ param.setContainerCode(""); param.setContainerTypeCode(""); }else { param.setContainerCode(locMast.getBarcode()); param.setContainerTypeCode(locMast.getContainerTypeCode()); } try { response = new HttpHandler.Builder() .setHeaders(map) .setUri(wmsUrl) .setPath("wcsManager/wcsInterface/locationUpdate") .setJson(JSON.toJSONString(param)) .build() .doPost(); }catch (Exception e){ log.error("堆垛机任务完成,请求wms任务完成接口失败"); } JSONObject jsonObject = JSON.parseObject(response); apiLogService.save("Wms变更货位状态" ,wmsUrl+"wcsManager/wcsInterface/inboundTaskApply" ,null ,"127.0.0.1" ,JSON.toJSONString(param) ,response ,true ); // String response = null; // Map<String, Object> map = new HashMap<>(); // map.put("x-api-key","7a15b5db-29b6-552c-8cff-0cfec3756da2"); // WmsLocStatus param = new WmsLocStatus(); // param.setWarehouseId("1688469798893297665"); // param.setLocationCode(Utils.getWmsLocNo(locMast.getLocNo())); // param.setEmptyContainer(locMast.getEmptyContainer$()); // if (locMast.getLocSts().equals("Z")){ // param.setStatus("JY"); // }else { // param.setStatus("QY"); // } // if (Cools.isEmpty(locMast.getBarcode()) || locMast.getLocSts().equals("O")){ // param.setContainerCode(""); // param.setContainerTypeCode(""); // }else { // param.setContainerCode(locMast.getBarcode()); // param.setContainerTypeCode(locMast.getContainerTypeCode()); // } // // try { // response = new HttpHandler.Builder() // .setHeaders(map) // .setUri(wmsUrl) // .setPath("wcsManager/wcsInterface/locationUpdate") // .setJson(JSON.toJSONString(param)) // .build() // .doPost(); // }catch (Exception e){ // log.error("堆垛机任务完成,请求wms任务完成接口失败"); // } // JSONObject jsonObject = JSON.parseObject(response); // // // apiLogService.save("Wms变更货位状态" // ,wmsUrl+"wcsManager/wcsInterface/inboundTaskApply" // ,null // ,"127.0.0.1" // ,JSON.toJSONString(param) // ,response // ,true // ); return null; } src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -103,6 +103,11 @@ private String TaskExecCallback; @Value("${wms.taskStatusFeedbackPath}") private String taskStatusFeedbackPath; @Value("${wcs.urlWcs}") private String wcsUrl; @Value("${wcs.inboundTaskApplyPathWcs}") private String wcsInboundTaskApplyPath; @Autowired private CrnController crnController; @Autowired @@ -198,20 +203,20 @@ .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if(back){ if(staProtocol.getWorkNo()>=9801&&staProtocol.getWorkNo()<=9825){ staProtocol.setStaNo((short)105); } else if (staProtocol.getWorkNo()>=9826&&staProtocol.getWorkNo()<=9850) { staProtocol.setStaNo((short)107); }else if (staProtocol.getWorkNo()>=9851&&staProtocol.getWorkNo()<=9875) { staProtocol.setStaNo((short)109); }else{ staProtocol.setStaNo((short)110); if (back) { if (staProtocol.getWorkNo() >= 9801 && staProtocol.getWorkNo() <= 9825) { staProtocol.setStaNo((short) 105); } else if (staProtocol.getWorkNo() >= 9826 && staProtocol.getWorkNo() <= 9850) { staProtocol.setStaNo((short) 107); } else if (staProtocol.getWorkNo() >= 9851 && staProtocol.getWorkNo() <= 9875) { staProtocol.setStaNo((short) 109); } else { staProtocol.setStaNo((short) 110); } devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); }else{ if (!Cools.isEmpty(response)&&!Cools.isEmpty(jsonObject.get("ReturnStatus"))&&jsonObject.get("ReturnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("Result").toString())) { } else { if (!Cools.isEmpty(response) && !Cools.isEmpty(jsonObject.get("ReturnStatus")) && jsonObject.get("ReturnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("Result").toString())) { Result result = JSON.parseObject(jsonObject.get("Result").toString(), Result.class); // 创新一个入库工作档 TaskWrk taskWrk = taskWrkService.selectByTaskNo(result.getTaskNo()); @@ -227,7 +232,7 @@ staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("TaskNo",taskWrk.getTaskNo()); hashMap.put("TaskNo", taskWrk.getTaskNo()); try { //开始上报,任务开始时,WCS回调WMS response = new HttpHandler.Builder() @@ -238,7 +243,7 @@ .doPost(); JSONObject jsonObject1 = JSON.parseObject(response); Boolean bool = false; if(jsonObject1.get("ReturnStatus").equals(0)){ if (jsonObject1.get("ReturnStatus").equals(0)) { bool = true; } apiLogService.save("wcs开始入库任务上报wms" @@ -255,14 +260,14 @@ } } else { // staProtocol.setWorkNo((short) 9991); if(staProtocol.getWorkNo()>=9801&&staProtocol.getWorkNo()<=9825){ staProtocol.setStaNo((short)105); } else if (staProtocol.getWorkNo()>=9826&&staProtocol.getWorkNo()<=9850) { staProtocol.setStaNo((short)107); }else if (staProtocol.getWorkNo()>=9851&&staProtocol.getWorkNo()<=9875) { staProtocol.setStaNo((short)109); }else{ staProtocol.setStaNo((short)110); if (staProtocol.getWorkNo() >= 9801 && staProtocol.getWorkNo() <= 9825) { staProtocol.setStaNo((short) 105); } else if (staProtocol.getWorkNo() >= 9826 && staProtocol.getWorkNo() <= 9850) { staProtocol.setStaNo((short) 107); } else if (staProtocol.getWorkNo() >= 9851 && staProtocol.getWorkNo() <= 9875) { staProtocol.setStaNo((short) 109); } else { staProtocol.setStaNo((short) 110); } devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); @@ -310,280 +315,6 @@ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } public synchronized void generateStoreWrkFile() throws IOException, InterruptedException { try { // 根据输送线plc遍历 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.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); if (taskWrk != null) { taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 taskWrkMapper.updateById(taskWrk); } continue; } // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && !staProtocol.isEmptyMk() && (workNo >= 9899) && staProtocol.isPakMk()) { // 获取条码扫描仪信息 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); if (barcodeThread == null) { continue; } String barcode = barcodeThread.getBarcode(); if (!Cools.isEmpty(barcode) && !barcode.equals("99999999")) { // 请求wms接口,获取工作号和目标库位 ToWmsDTO toWmsDTO = new ToWmsDTO(barcode, staProtocol.getSiteId(), staProtocol.isHigh() ? 2 : 1); TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", barcode)); if (!Cools.isEmpty(taskWrk1)) { log.info("托盘码:" + barcode + "任务档存在"); if (taskWrk1.getIoType() == 1 && taskWrk1.getStartPoint().equals(staProtocol.getSiteId().toString())) { StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", taskWrk1.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId())); if (Cools.isEmpty(staDesc)) { log.info("托盘码:" + barcode + "任务档存在"); return; } else { staProtocol.setWorkNo(taskWrk1.getWrkNo().shortValue()); staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); } } return; } HashMap<String, Object> headParam = new HashMap<>(); headParam.put("Content-Type", "application/json"); System.out.println(JSON.toJSONString(toWmsDTO)); String response; try { response = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(wmsUrl) .setPath(inboundTaskApplyPath) .setJson(JSON.toJSONString(toWmsDTO)) .build() .doPost(); } catch (Exception e) { log.error("请求入库调用接口失败"); log.error("异常信息打印:" + e); try { BasDevp basDevp = basDevpService.selectById(inSta.getStaNo()); if (Cools.isEmpty(basDevp)) { log.error("站点号异常" + inSta.getStaNo()); } else if (basDevp.getStaErr() != 0) { basDevp.setStaErr(2); basDevpService.updateById(basDevp); } } catch (Exception e1) { // 退回 log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1); } staProtocol.setWorkNo((short) 9999); staProtocol.setStaNo(inSta.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); // TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); // if (taskWrk != null) { // taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 // taskWrkMapper.updateById(taskWrk); // } continue; } JSONObject jsonObject = JSON.parseObject(response); log.info("入库请求参数{}" + JSON.toJSONString(toWmsDTO)); log.info("入库请求返回参数{}" + JSON.toJSONString(response)); if (jsonObject.getInteger("code").equals(200) && !Cools.isEmpty(jsonObject.get("data").toString())) { GetWmsDto getWmsDto = JSON.parseObject(jsonObject.get("data").toString(), GetWmsDto.class); try { BasDevp basDevp = basDevpService.selectById(inSta.getStaNo()); if (Cools.isEmpty(basDevp)) { log.error("站点号异常1" + inSta.getStaNo()); throw new CoolException("站点号异常1,未查询到站点信息" + inSta.getStaNo()); } Integer staNoCrnNo = Utils.StaNoCrnNo(inSta.getStaNo()); if (staNoCrnNo == 0) { basDevp.setStaErr(1); basDevpService.updateById(basDevp); log.error("站点号异常2" + inSta.getStaNo()); throw new CoolException("站点号异常2,站点号不存在" + inSta.getStaNo()); } else { LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() .eq("crn_no", staNoCrnNo.longValue()) .eq("loc_no", getWmsDto.getLocNo())); if (Cools.isEmpty(locMast)) { basDevp.setStaErr(1); basDevpService.updateById(basDevp); log.error("站点号异常3" + inSta.getStaNo()); throw new CoolException("站点号异常3:此巷道不存在目标库位" + inSta.getStaNo()); } } } catch (Exception e) { // log.error("扫码检测程序异常"+inSta.getStaNo()+"异常信息"+e); // 退回 log.error("扫码检测程序异常" + inSta.getStaNo() + errMsg); log.error("扫码检测程序异常,异常信息" + e); staProtocol.setWorkNo((short) 9999); staProtocol.setStaNo(inSta.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); // TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); // if (taskWrk != null) { // taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 // taskWrkMapper.updateById(taskWrk); // } continue; } //查看该库位是否为空库位 LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>() .eq("loc_sts", "O") .eq("loc_no", getWmsDto.getLocNo())); if (Cools.isEmpty(locMast)) { try { HashMap<String, Object> headParam1 = new HashMap<>(); headParam1.put("taskNo", getWmsDto.getTaskNo()); headParam1.put("status", 6); headParam1.put("ioType", 1); headParam1.put("barcode", barcode); String response2; response2 = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(wmsUrl) .setPath(taskStatusFeedbackPath) .setJson(JSON.toJSONString(headParam1)) .build() .doPost(); JSONObject jsonObject1 = JSON.parseObject(response2); apiLogService.save("wcs派发库位==》不为空《==上报wms" , wmsUrl + taskStatusFeedbackPath , null , "127.0.0.1" , JSON.toJSONString(headParam1) , response , true ); } catch (Exception e) { log.error("wcs派发库位==》不为空《==上报wms", getWmsDto.getWrkNo()); throw new CoolException("wcs派发入库任务上报wms失败,派发库位==》不为空《==,异常信息:" + e); } } // 创新一个入库工作档 TaskWrk taskWrk = taskWrkService.selectByTaskNo(getWmsDto.getWrkNo()); if (Cools.isEmpty(taskWrk)) { taskWrk = createTask(getWmsDto, barcode); if (Cools.isEmpty(taskWrk)) { log.error("库位异常,库位号:{}", getWmsDto.getTargetLocationCode()); } else { taskWrkService.insert(taskWrk); StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>() .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId())); staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue()); staProtocol.setStaNo(staDesc.getCrnStn().shortValue()); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); } } } else { continue; } apiLogService.save("wms请求入库货位接口" , wmsUrl + inboundTaskApplyPath , null , "127.0.0.1" , JSON.toJSONString(toWmsDTO) , response , true ); } else { // 退回 log.error("扫码入库失败,{}入库站因{}异常,托盘已被退回", inSta.getStaNo(), errMsg); staProtocol.setWorkNo((short) 9999); staProtocol.setStaNo(inSta.getStaNo().shortValue()); devpThread.setPakMk(staProtocol.getSiteId(), false); MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol)); TaskWrk taskWrk = taskWrkMapper.selectByWrkNo(Integer.valueOf(workNo)); if (taskWrk != null) { taskWrk.setMemo(errMsg);//将错误码存入备注字段进行展示 taskWrkMapper.updateById(taskWrk); } } } } } } catch (Exception e) { log.error("generateStoreWrkFile e", e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } } /** * 堆垛机站出库到出库站 @@ -642,58 +373,21 @@ } /** * 入出库 ===>> 堆垛机入出库作业下发 * 入出库 ===>> 调用RCS进行入出库 */ 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); } this.crnStnToLoc(crn); // 入库 this.locToCrnStn(crn); // 出库 // 库位移转 // this.locToLoc(crn, crnProtocol); } } /** * 入库 ===>> 堆垛机站到库位 */ public synchronized void crnStnToLoc(CrnSlave slave, CrnProtocol crnProtocol) throws IOException { public synchronized void crnStnToLoc(CrnSlave slave) 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) { @@ -726,49 +420,44 @@ continue; } // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { continue; } String mbz=taskWrk.getTargetPoint().substring(5); // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { continue; } HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("taskNo",taskWrk.getTaskNo());//wms任务号 hashMap.put("sourceStaNo",staDetl.getDevNo());//源站点 hashMap.put("staNo",Integer.parseInt(mbz)+"");//目标站 hashMap.put("locNo",taskWrk.getTargetPoint());//目标库位 String response = ""; Boolean bool = false; try { //开始上报,出库任务开始时,WCS回调WMS response = new HttpHandler.Builder() .setUri(wcsUrl) .setPath(wcsInboundTaskApplyPath) .setJson(JSON.toJSONString(hashMap)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); // int workNo = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号 // taskWrk.setWrkNo(workNo);//工作号 taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态 taskWrk.setAssignTime(new Date());//派发时间 taskWrk.setWrkSts(3);//工作状态 3.吊车入库 taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号 taskWrk.setModiTime(new Date()); taskWrk.setModiUser(9988L); // 命令下发区 -------------------------------------------------------------------------- CrnCommand crnCommand = new CrnCommand(); crnCommand.setCrnNo(staDesc.getCrnNo()); // 堆垛机编号 crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 crnCommand.setAckFinish((short) 0); // 任务完成确认位 crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式: 库位移转 crnCommand.setSourcePosX(crnStn.getRow().shortValue()); // 源库位列 crnCommand.setSourcePosY(crnStn.getBay().shortValue()); // 源库位层 crnCommand.setSourcePosZ(crnStn.getLev().shortValue()); // 源库位排 crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint())); // 目标库位列 crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint())); // 目标库位层 crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint())); // 目标库位排 crnCommand.setCommand((short) 1); log.info("堆垛机入库任务下发={}",crnCommand); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand)); throw new CoolException("堆垛机命令生成失败"); } else { try { taskWrkService.updateById(taskWrk); } catch (Exception e) { log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,工作号={}", taskWrk.getWrkNo()); log.error("修改工作档状态 2.设备上走 => 3.吊车入库中 失败!!,异常:" + e); if(jsonObject.get("code").equals(200)){ bool = true; taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态 taskWrk.setAssignTime(new Date());//派发时间 taskWrk.setWrkSts(3);//工作状态 3.成功下发入库任务给RCS taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号 taskWrk.setModiTime(new Date()); taskWrk.setModiUser(9988L); } } catch (Exception e) { }finally { apiLogService.save("wcs派发入库任务给RCS" , wcsUrl + wcsInboundTaskApplyPath , null , "127.0.0.1" , JSON.toJSONString(hashMap) , response , bool ); } } } @@ -778,7 +467,7 @@ * 出库 ===>> 库位到堆垛机站 * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库 */ public synchronized void locToCrnStn(CrnSlave slave, CrnProtocol crnProtocol) { public synchronized void locToCrnStn(CrnSlave slave) { List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null); if (taskWrksInitial.size() == 0) { return; @@ -798,27 +487,10 @@ continue; } LocMast locMast=locMastService.selectByLocNo(taskWrk.getStartPoint()); LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint()); //判断其库位是否为深库位,如果为深库位找其浅库位是都有货 if(locMast.getRow1()==1||locMast.getRow1()==5){ LocMast locMast1=locMastService.selectOne(new EntityWrapper<LocMast>() .eq("row1", (locMast.getRow1()+1)) .eq("bay1",locMast.getBay1()) .eq("lev1",locMast.getLev1()).eq("loc_sts","F")); if (!Cools.isEmpty(locMast1)){ log.info(locMast.getLocNo()+"出深库位,浅库位有货"); continue; } }else if(locMast.getRow1()==4||locMast.getRow1()==8){ LocMast locMast1=locMastService.selectOne(new EntityWrapper<LocMast>() .eq("row1", (locMast.getRow1()-1)) .eq("bay1",locMast.getBay1()) .eq("lev1",locMast.getLev1()).eq("loc_sts","F")); if (!Cools.isEmpty(locMast1)){ log.info(locMast.getLocNo()+"出深库位,浅库位有货"); continue; } } //预留 // 获取堆垛机出库站信息 SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId()); @@ -841,44 +513,23 @@ && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) { // 命令下发区 -------------------------------------------------------------------------- // 堆垛机控制过滤 if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) { break; } // 已经存在吊车执行任务时,则过滤 if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) { break; } CrnCommand command = new CrnCommand(); command.setCrnNo(taskWrk.getCrnNo()); // 堆垛机编号 command.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号 command.setAckFinish((short) 0); // 任务完成确认位 command.setTaskMode(CrnTaskModeType.PAKIN); // 任务模式 command.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint())); // 源库位排 command.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint())); // 源库位列 command.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint())); // 源库位层 command.setDestinationPosX(crnStn.getRow().shortValue()); // 目标库位排 command.setDestinationPosY(crnStn.getBay().shortValue()); // 目标库位列 command.setDestinationPosZ(crnStn.getLev().shortValue()); // 目标库位层 command.setCommand((short) 1); if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, command), false)) { log.error("堆垛机命令生成失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(command)); throw new CoolException("堆垛机命令生成失败"); } else { try { // 修改工作档状态 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()); } } catch (Exception e) { try { // 修改工作档状态 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()); log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e); } } catch (Exception e) { log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo()); log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e); } // try { // HashMap<String, Object> headParam = new HashMap<>(); // headParam.put("taskNo", taskWrk.getTaskNo()); @@ -906,7 +557,7 @@ // log.error("wcs派发出库任务上报wms失败", JSON.toJSONString(taskWrk)); //// throw new CoolException("wcs派发入库任务上报wms失败"); // } } } } } @@ -1085,7 +736,7 @@ crnOperatorParam.setCrnNo(crn.getId()); R r = crnController.crnTaskComplete(crnOperatorParam); Thread.sleep(1000); if(!r.get("code").equals(200)){ if (!r.get("code").equals(200)) { return; } if (!Cools.isEmpty(taskWrk)) { src/main/java/com/zy/asrs/task/AssignTasksRCSScheduler.java
New file @@ -0,0 +1,94 @@ package com.zy.asrs.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.exception.CoolException; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.entity.TaskWrkLog; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.TaskWrkService; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.HashMap; import java.util.List; @Slf4j @Component public class AssignTasksRCSScheduler { @Autowired private TaskWrkService taskWrkService; @Autowired private ApiLogService apiLogService; @Value("${wcs.urlWcs}") private String wcsUrl; @Value("${wcs.movePathWcs}") private String wcsmovePath; @Value("${wcs.outboundTaskRequest}") private String wcsoutboundTaskRequest; @Value("${wms.TaskExecCallback}") private String TaskExecCallback; @Value("${wms.taskStatusFeedbackPath}") private String taskStatusFeedbackPath; /** * 自动派发出库任务给RCS * * @throws IOException */ @Scheduled(cron = "0/3 * * * * ? ") public void execute() throws IOException { if(true){ List<TaskWrk> taskWrks=taskWrkService.selectList(new EntityWrapper<TaskWrk>() .eq("wrk_sts",1).eq("io_type",3)); for(TaskWrk taskWrk:taskWrks){ HashMap<String, Object> headParam = new HashMap<>(); String response = ""; Boolean bool = false; String dz=""; if(taskWrk.getIoType()==2){ dz=wcsoutboundTaskRequest; }else{ dz=wcsmovePath; } try { headParam.put("taskNo", taskWrk.getTaskNo()); headParam.put("sourceLocNo",taskWrk.getStartPoint());//源库位 headParam.put("locNo",taskWrk.getTargetPoint());//目标库位 log.info("wcs派发任务给RCS出库={}", taskWrk); response = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(wcsUrl) .setPath(dz) .setJson(JSON.toJSONString(headParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if(jsonObject.get("code").equals(200)){ //派发出库任务给RCS==>成功下发出库任务 taskWrk.setWrkSts(2); taskWrkService.updateById(taskWrk); bool = true; } } catch (Exception e) { log.error("wcs派发任务给RCS出库失败{},返回值={}", taskWrk, response); } finally { apiLogService.save("wcs派发任务给RCS出库" , wcsUrl + dz , null , "127.0.0.1" , JSON.toJSONString(headParam) , response , bool ); } } } } } src/main/java/com/zy/asrs/task/SameLayerTransferScheduler.java
New file @@ -0,0 +1,91 @@ package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.domain.enums.TaskStatusType; import com.zy.asrs.domain.enums.WorkNoType; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.TaskWrk; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.TaskWrkService; import com.zy.asrs.utils.Utils; import com.zy.common.service.CommonService; import com.zy.system.entity.Config; import com.zy.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.List; @Slf4j @Component public class SameLayerTransferScheduler { @Autowired private TaskWrkService taskWrkService; @Autowired private LocMastService locMastService; @Autowired private CommonService commonService; @Autowired private ConfigService configService; /** * 自动生成移库任务 * * @throws IOException */ @Scheduled(cron = "0/3 * * * * ? ") public void execute() throws IOException { Config config=configService.selectByCode("autoRemove"); if (config.getValue().equals("true")) { List<TaskWrk> taskWrks = taskWrkService.selectList(new EntityWrapper<TaskWrk>()); if (Cools.isEmpty(taskWrks)) { List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "F")); for (LocMast locMast : locMasts) { List<LocMast> list = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("lev1", locMast.getLev1())); String[] locMs = new String[list.size()]; int i = 0; for (LocMast locMast1 : list) { locMs[i] = locMast1.getLocNo(); i++; } double v = Math.random() * list.size(); int m = (int) v; //目标库位 String locNo = locMs[m]; HashMap<String, Object> map = new HashMap<>(); Date now = new Date(); TaskWrk taskWrk = new TaskWrk(); int workNo1 = commonService.getWorkNo(WorkNoType.PAKOUT.type);//获取入库工作号 taskWrk.setTaskNo(workNo1+"");//任务号 taskWrk.setWrkNo(workNo1); taskWrk.setStatus(TaskStatusType.RECEIVE.id);//任务状态:接收 taskWrk.setCreateTime(now); taskWrk.setIoType(3);//任务类型 taskWrk.setIoPri(10);//优先级 taskWrk.setBarcode("123");//条码 taskWrk.setCrnNo(locMast.getCrnNo()); taskWrk.setWrkSts(1); taskWrk.setStartPoint(locMast.getLocNo());//起点 taskWrk.setTargetPoint(locNo);//重点 if (!taskWrkService.insert(taskWrk)) { } else { } break; } } } } } src/main/java/com/zy/asrs/task/TaskLogScheduler.java
@@ -61,47 +61,63 @@ @Scheduled(cron = "0/3 * * * * ? ") public void execute() throws IOException { for (TaskWrk taskWrk : taskWrkService.selectToBeHistoryData()) { HashMap<String, Object> headParam = new HashMap<>(); if (taskWrk.getStatus().equals(TaskStatusType.OVER.id) || taskWrk.getStatus() == 7) {//完成 headParam.put("Result", 1); } else if (taskWrk.getStatus().equals(TaskStatusType.CANCEL.id)) { headParam.put("Result", 2); //入库9转历史档 List<TaskWrk> taskWrkList = taskWrkService.selectList(new EntityWrapper<TaskWrk>().eq("wrk_sts", 9)); for (TaskWrk taskWrk : taskWrkList) { TaskWrkLog taskWrkLog = new TaskWrkLog(taskWrk); if (!wrkLogService.insert(taskWrkLog)) { throw new CoolException("转历史档失败" + taskWrkLog); } String response = ""; Boolean bool = false; try { headParam.put("TaskNo", taskWrk.getTaskNo()); log.info("wcs手动完成任务上报wms={}", taskWrk); response = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(wmsUrl) .setPath(TaskExecCallback) .setJson(JSON.toJSONString(headParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); TaskWrkLog taskWrkLog = new TaskWrkLog(taskWrk); if (!wrkLogService.insert(taskWrkLog)) { throw new CoolException("转历史档失败" + taskWrkLog); } if (!taskWrkService.deleteById(taskWrk)) { throw new CoolException("任务档删除失败" + taskWrkLog); } bool = true; } catch (Exception e) { log.error("wcs手动完成任务上报wms失败{},返回值={}", taskWrk, response); } finally { apiLogService.save("wcs完成或者取消任务上报wms" , wmsUrl + TaskExecCallback , null , "127.0.0.1" , JSON.toJSONString(headParam) , response , bool ); if (!taskWrkService.deleteById(taskWrk)) { throw new CoolException("任务档删除失败" + taskWrkLog); } } // for (TaskWrk taskWrk : taskWrkService.selectToBeHistoryData()) { // HashMap<String, Object> headParam = new HashMap<>(); // if (taskWrk.getStatus().equals(TaskStatusType.OVER.id) || taskWrk.getStatus() == 7) {//完成 // headParam.put("Result", 1); // } else if (taskWrk.getStatus().equals(TaskStatusType.CANCEL.id)) { // headParam.put("Result", 2); // } // String response = ""; // Boolean bool = false; // try { // headParam.put("TaskNo", taskWrk.getTaskNo()); // log.info("wcs手动完成任务上报wms={}", taskWrk); // response = new HttpHandler.Builder() // // .setHeaders(headParam) // .setUri(wmsUrl) // .setPath(TaskExecCallback) // .setJson(JSON.toJSONString(headParam)) // .build() // .doPost(); // JSONObject jsonObject = JSON.parseObject(response); // TaskWrkLog taskWrkLog = new TaskWrkLog(taskWrk); // if(jsonObject.get("ReturnStatus").equals(0)){ // taskWrkLog.setWrkSts(8); // if (!wrkLogService.insert(taskWrkLog)) { // throw new CoolException("转历史档失败" + taskWrkLog); // } // if (!taskWrkService.deleteById(taskWrk)) { // throw new CoolException("任务档删除失败" + taskWrkLog); // } // bool = true; // } // } catch (Exception e) { // log.error("wcs手动完成任务上报wms失败{},返回值={}", taskWrk, response); // } finally { // apiLogService.save("wcs完成或者取消任务上报wms" // , wmsUrl + TaskExecCallback // , null // , "127.0.0.1" // , JSON.toJSONString(headParam) // , response // , bool // ); // } // } } } src/main/java/com/zy/core/MainProcess.java
@@ -47,15 +47,15 @@ // mainService.crnDemoOfLocMove1(); // 入库 ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档 mainService.generateStoreWrkFile1(); // 组托 // 入出库 ===>> 调用RCS进行入出库 mainService.crnIoExecute(); // 出库 ===>> 堆垛机出库站到出库站 mainService.crnStnToOutStn(); // 入出库 ===>> 堆垛机入出库作业下发 mainService.crnIoExecute(); // 入库 ===>> 执行对工作档的完成操作 mainService.storeFinished(); // mainService.storeFinished(); // 堆垛机异常信息记录 mainService.recCrnErr(); // mainService.recCrnErr(); // 入库 ===>> 空栈板初始化入库,叉车入库站放货 // mainService.storeEmptyPlt(); src/main/java/com/zy/core/ServerBootstrap.java
@@ -75,12 +75,12 @@ 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 (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()) { src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -76,42 +76,42 @@ if (task != null) { step = task.getStep(); } switch (step) { // 读数据 case 1: readStatus(); break; // 写入数据 case 2: write5((CrnCommand) task.getData()); break; // 复位 case 3: CrnCommand command = (CrnCommand) task.getData(); if (null == command) { command = new CrnCommand(); } command.setCrnNo(slave.getId()); // 堆垛机编号 command.setTaskNo((short) 0); // 工作号 command.setAckFinish((short) 1); // 任务完成确认位 command.setTaskMode(CrnTaskModeType.NONE); // 任务模式 command.setSourcePosX((short)0); // 源库位排 command.setSourcePosY((short)0); // 源库位列 command.setSourcePosZ((short)0); // 源库位层 command.setDestinationPosX((short)0); // 目标库位排 command.setDestinationPosY((short)0); // 目标库位列 command.setDestinationPosZ((short)0); // 目标库位层 write(command); break; case 4: writeAuto((CrnCommand) task.getData()); break; case 5: write((CrnCommand) task.getData()); break; default: break; } // switch (step) { // // 读数据 // case 1: // readStatus(); // break; // // 写入数据 // case 2: // write5((CrnCommand) task.getData()); // break; // // 复位 // case 3: // CrnCommand command = (CrnCommand) task.getData(); // if (null == command) { // command = new CrnCommand(); // } // command.setCrnNo(slave.getId()); // 堆垛机编号 // command.setTaskNo((short) 0); // 工作号 // command.setAckFinish((short) 1); // 任务完成确认位 // command.setTaskMode(CrnTaskModeType.NONE); // 任务模式 // command.setSourcePosX((short)0); // 源库位排 // command.setSourcePosY((short)0); // 源库位列 // command.setSourcePosZ((short)0); // 源库位层 // command.setDestinationPosX((short)0); // 目标库位排 // command.setDestinationPosY((short)0); // 目标库位列 // command.setDestinationPosZ((short)0); // 目标库位层 // write(command); // break; // case 4: // writeAuto((CrnCommand) task.getData()); // break; // case 5: // write((CrnCommand) task.getData()); // break; // default: // break; // } Thread.sleep(500); } catch (Exception e) { // e.printStackTrace(); src/main/resources/application.yml
@@ -1,5 +1,5 @@ server: port: 8080 port: 9092 servlet: context-path: /@pom.build.finalName@ @@ -8,7 +8,7 @@ name: @pom.build.finalName@ datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;databasename=rywxasrs url: jdbc:sqlserver://127.0.0.1:1433;databasename=lfdwcs_sxc username: sa password: sa@123 mvc: @@ -37,7 +37,7 @@ #License相关配置 license: subject: jdzwcs subject: lfdwcs_sxc publicAlias: publicCert storePass: public_zhongyang_123456789 licensePath: license.lic @@ -61,3 +61,11 @@ TaskExecCallback: api/StereoscopicCallBack/TaskExecFinishedCallback # 移库申请接口 movePath: api/InterFace/get_InterFace_TestStorage wcs: urlWcs: 10.10.20.200:9090/wcs #入库任务申请 inboundTaskApplyPathWcs: openapi/createInTask #出库任务申请 outboundTaskRequest : openapi/createOutTask # 移库申请接口 movePathWcs: openapi/createLocMoveTask src/main/resources/mapper/BasShuttleMapper.xml
New file @@ -0,0 +1,27 @@ <?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.BasShuttleMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.zy.asrs.entity.BasShuttle"> <result column="shuttle_no" property="shuttleNo" /> <result column="status" property="status" /> <result column="shuttle_status" property="shuttleStatus" /> <result column="wrk_no" property="wrkNo" /> <result column="idle_loc" property="idleLoc" /> <result column="auto_charge" property="autoCharge" /> <result column="charge_line" property="chargeLine" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> <result column="memo" property="memo" /> <result column="pak_mk" property="pakMk" /> <result column="run_speed" property="runSpeed" /> <result column="device_status" property="deviceStatus" /> <result column="disable_lev" property="disableLev" /> </resultMap> </mapper> src/main/resources/mapper/TaskWrkMapper.xml
@@ -119,7 +119,7 @@ <select id="selectToBeHistoryData" resultMap="BaseResultMap"> select * from dbo.wcs_task_wrk where 1=1 and ((wrk_sts=14 and status=5) or status=7 or status=4 or (wrk_sts=4 and status=5)) and ((wrk_sts=14 and status=5) or status=7 or status=4 or (wrk_sts=7 and status=5)) order by io_pri desc,create_time,wrk_no ASC </select> src/main/webapp/static/wcs/js/common.js
@@ -1,4 +1,4 @@ var baseUrl = "/jdzwcs"; var baseUrl = "/wcs"; // 赋值 function setVal(el, val) { src/main/webapp/static/wcs/js/console.map.js
@@ -1,5 +1,5 @@ mapInfo = { "mapName": "jdzwcs", "mapName": "wcs", "rackCount": 13, "crnCount": 4, "stbCount": 4, src/main/webapp/static/wms/js/basShuttle/basShuttle.js
New file @@ -0,0 +1,279 @@ 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: '#basShuttle', headers: {token: localStorage.getItem('token')}, url: baseUrl+'/basShuttle/list/auth', page: true, limit: 15, limits: [15, 30, 50, 100, 200, 500], toolbar: '#toolbar', cellMinWidth: 50, height: 'full-120', cols: [[ {type: 'checkbox'} ,{field: 'shuttleNo', align: 'center',title: '四向穿梭车号', width: 120} ,{field: 'status$', align: 'center',title: '状态'} ,{field: 'shuttleStatus', align: 'center',title: '作业态'} ,{field: 'wrkNo', align: 'center',title: '任务号'} ,{field: 'idleLoc', align: 'center',title: '暂存库位'} // ,{field: 'autoCharge', align: 'center',title: '自动充电'} ,{field: 'chargeLine', align: 'center',title: '电量线'} ,{field: 'busyStatus$', align: 'center',title: '小车忙状态'} ,{field: 'currentCode', align: 'center',title: '二维码'} ,{field: 'batteryPower$', align: 'center',title: '电量'} ,{field: 'batteryTemp$', align: 'center',title: '电池温度'} // ,{field: 'createBy$', align: 'center',title: '添加人员'} // ,{field: 'createTime$', align: 'center',title: '添加时间'} // ,{field: 'updateBy$', align: 'center',title: '修改人员'} // ,{field: 'updateTime$', align: 'center',title: '修改时间'} ,{field: 'memo', align: 'center',title: '备注'} ,{field: 'liftNo', align: 'center',title: '提升机号'} ,{field: 'pakMk$', 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(basShuttle)', 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(basShuttle)', 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.shuttleNo; })); 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 = { 'basShuttle': exportData, 'fields': fields }; $.ajax({ url: baseUrl+"/basShuttle/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(basShuttle)', function(obj){ var data = obj.data; switch (obj.event) { case 'edit': showEditModel(data); break; case "del": del([data.shuttleNo]); 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+"/basShuttle/"+(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+"/basShuttle/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 clearFormVal(el) { $(':input', el) .val('') .removeAttr('checked') .removeAttr('selected'); } // 时间选择器 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 }); }, 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/common.js
@@ -1,4 +1,4 @@ var baseUrl = "/jdzwcs"; var baseUrl = "/wcs"; // 详情窗口-高度 var detailHeight = '80%'; src/main/webapp/views/basShuttle/basShuttle.html
New file @@ -0,0 +1,148 @@ <!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="shuttle_no" placeholder="四向穿梭车号" autocomplete="off"> </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="basShuttle" lay-filter="basShuttle"></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/basShuttle/basShuttle.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="shuttleNo" 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"> <select name="status"> <option value="">请选择状态</option> <option value="1">正常</option> <option value="0">禁用</option> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">作业态: </label> <div class="layui-input-block"> <input class="layui-input" name="shuttleStatus" placeholder="请输入作业态"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">任务号: </label> <div class="layui-input-block"> <input class="layui-input" name="wrkNo" placeholder="请输入任务号"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">暂存库位: </label> <div class="layui-input-block"> <input class="layui-input" name="idleLoc" placeholder="请输入暂存库位"> </div> </div> <!-- <div class="layui-form-item">--> <!-- <label class="layui-form-label">自动充电: </label>--> <!-- <div class="layui-input-block">--> <!-- <input class="layui-input" name="autoCharge" placeholder="请输入自动充电">--> <!-- </div>--> <!-- </div>--> <div class="layui-form-item"> <label class="layui-form-label">电量线: </label> <div class="layui-input-block"> <input class="layui-input" name="chargeLine" placeholder="请输入电量线"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">备注: </label> <div class="layui-input-block"> <input class="layui-input" name="memo" placeholder="请输入备注"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">提升机号: </label> <div class="layui-input-block"> <input class="layui-input" name="liftNo" placeholder="请输入提升机号"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">标记: </label> <div class="layui-input-block"> <select name="pakMk"> <option value="1">Y</option> <option value="0">N</option> </select> </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>