pom.xml
@@ -114,7 +114,7 @@ </dependencies> <build> <finalName>htwms</finalName> <finalName>lfdsxkwms</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -64,6 +64,7 @@ if (!Cools.isEmpty(orderByField)) { wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType)); } wrapper.orderBy("loc_attribute",false); return R.ok(locMastService.selectPage(new Page<>(curr, limit), wrapper)); } src/main/java/com/zy/asrs/controller/MatController.java
@@ -89,7 +89,7 @@ public R pdaSearch(@RequestParam(required = false) String condition) { EntityWrapper<Mat> wrapper = new EntityWrapper<>(); if (!Cools.isEmpty(condition)) { wrapper.like("matnr", condition).or().like("maktx", condition); wrapper.like("matnr", condition).or().like("maktx", condition).or().like("specs", condition); } wrapper.orderBy("create_time", false); List<Mat> mats = matService.selectList(wrapper); src/main/java/com/zy/asrs/controller/OpenController.java
@@ -8,6 +8,7 @@ import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.param.*; import com.zy.asrs.service.OpenService; import com.zy.asrs.service.WorkService; import com.zy.asrs.service.WrkMastService; import com.zy.common.model.DetlDto; import com.zy.common.web.BaseController; @@ -38,12 +39,14 @@ private OpenService openService; @Autowired private WrkMastService wrkMastService; @Autowired private WorkService workService; @PostMapping("/order/matSync/default/v1") @AppAuth(memo = "商品信息同步接口") public synchronized R syncMatInfo(@RequestHeader(required = false) String appkey, @RequestBody(required = false) MatSyncParam param, HttpServletRequest request){ HttpServletRequest request) { auth(appkey, param, request); if (Cools.isEmpty(param)) { return R.parse(BaseRes.PARAM); @@ -218,30 +221,30 @@ * 任务开始 */ @RequestMapping("/start/task") public HashMap<String ,Object> startTask(@RequestBody HashMap<String,Object> map) { String taskNo = map.get("TaskNo")+""; HashMap<String ,Object> map1 = new HashMap<>(); if(Cools.isEmpty(taskNo)){ public HashMap<String, Object> startTask(@RequestBody HashMap<String, Object> map) { String taskNo = map.get("TaskNo") + ""; HashMap<String, Object> map1 = new HashMap<>(); if (Cools.isEmpty(taskNo)) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "任务号为空"); }else{ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(taskNo))); if(wrkMast == null){ } else { WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo))); if (wrkMast == null) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "没有找到该任务号:"+taskNo); }else{ if(wrkMast.getIoType()==1){ map1.put("ErrorMessage", "没有找到该任务号:" + taskNo); } else { if (wrkMast.getIoType() == 1) { wrkMast.setWrkSts(3L);//入库开始 }else if(wrkMast.getIoType()==11){ } else if (wrkMast.getIoType() == 11) { wrkMast.setWrkSts(13L);//出库开始 } wrkMast.setModiTime(new Date()); if(wrkMastService.updateById(wrkMast)){ if (wrkMastService.updateById(wrkMast)) { map1.put("ReturnStatus", "0"); map1.put("ErrorMessage", ""); }else{ } else { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "更新任务状态失败"+wrkMast); map1.put("ErrorMessage", "更新任务状态失败" + wrkMast); } } } @@ -252,62 +255,97 @@ * 搬运到目的地 */ @RequestMapping("/destination/task") public HashMap<String ,Object> destinationTask(@RequestBody HashMap<String,Object> map) { String taskNo = map.get("TaskNo")+""; HashMap<String ,Object> map1 = new HashMap<>(); if(Cools.isEmpty(taskNo)){ public HashMap<String, Object> destinationTask(@RequestBody HashMap<String, Object> map) { String taskNo = map.get("TaskNo") + ""; HashMap<String, Object> map1 = new HashMap<>(); if (Cools.isEmpty(taskNo)) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "任务号为空"); }else{ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(taskNo))); if(wrkMast == null){ map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "没有找到该任务号:"+taskNo); }else{ if(wrkMast.getIoType()==1){ wrkMast.setWrkSts(4L);//任务结束 }else if(wrkMast.getIoType()==11){ wrkMast.setWrkSts(13L);//出库到站点上 } wrkMast.setModiTime(new Date()); if(wrkMastService.updateById(wrkMast)){ map1.put("ReturnStatus", "0"); map1.put("ErrorMessage", ""); }else{ } else { //任务完成 if (map.get("Result").equals(1)) { WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo))); if (wrkMast == null) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "更新任务状态失败"+wrkMast); map1.put("ErrorMessage", "没有找到该任务号:" + taskNo); } else { if (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10) { wrkMast.setWrkSts(4L);//任务结束 } else if (wrkMast.getIoType() == 101) { wrkMast.setWrkSts(13L);//出库到站点上 } else if (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57) { wrkMast.setWrkSts(4L);//4.任务结束 } else if (wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110) { wrkMast.setWrkSts(14L); } wrkMast.setModiTime(new Date()); if (wrkMastService.updateById(wrkMast)) { map1.put("ReturnStatus", "0"); map1.put("ErrorMessage", ""); } else { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "更新任务状态失败" + wrkMast); } } } else { //任务取消 WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo))); if (wrkMast == null) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "没有找到该任务号:" + taskNo); return map1; } workService.cancelWrkMast(String.valueOf(wrkMast.getWrkNo()),9999L); } } return map1; } /** * 搬运到目的地 * 出库---目的地搬离 */ @RequestMapping("/leave/task") public HashMap<String ,Object> leaveTask(@RequestBody HashMap<String,Object> map) { String taskNo = map.get("TaskNo")+""; HashMap<String ,Object> map1 = new HashMap<>(); if(Cools.isEmpty(taskNo)){ public HashMap<String, Object> leaveTask(@RequestBody HashMap<String, Object> map) { String taskNo = map.get("TaskNo") + ""; HashMap<String, Object> map1 = new HashMap<>(); if (Cools.isEmpty(taskNo)) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "任务号为空"); }else{ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(taskNo))); if(wrkMast == null){ } else { WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo))); if (wrkMast == null) { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "没有找到该任务号:"+taskNo); }else{ map1.put("ErrorMessage", "没有找到该任务号:" + taskNo); return map1; } if ((wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110) && wrkMast.getWrkSts() != 14) { wrkMast.setWrkSts(14L);//出库到站点上 wrkMast.setModiTime(new Date()); if(wrkMastService.updateById(wrkMast)){ if (wrkMastService.updateById(wrkMast)) { map1.put("ReturnStatus", "0"); map1.put("ErrorMessage", ""); }else{ } else { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "更新任务状态失败"+wrkMast); map1.put("ErrorMessage", "更新任务状态失败" + wrkMast); } } else if (wrkMast.getIoType() != 101) { map1.put("ReturnStatus", "0"); map1.put("ErrorMessage", ""); return map1; } else { wrkMast.setWrkSts(14L);//出库到站点上 wrkMast.setModiTime(new Date()); if (wrkMastService.updateById(wrkMast)) { map1.put("ReturnStatus", "0"); map1.put("ErrorMessage", ""); } else { map1.put("ReturnStatus", "1"); map1.put("ErrorMessage", "更新任务状态失败" + wrkMast); } } } return map1; } src/main/java/com/zy/asrs/controller/OutController.java
@@ -1,16 +1,19 @@ package com.zy.asrs.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.ManagerAuth; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.R; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.LocDetl; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.service.*; import com.zy.common.model.LocDto; import com.zy.common.model.TaskDto; import com.zy.common.web.BaseController; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,7 +26,7 @@ /** * Created by vincent on 2022/3/26 */ @Slf4j @RestController public class OutController extends BaseController { @@ -66,17 +69,37 @@ if (issued <= 0.0D) { continue; } List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null, exist); for (LocDetl locDetl : locDetls) { if (issued > 0) { LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(), issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued); List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103); locDto.setStaNos(staNos); locDtos.add(locDto); exist.add(locDetl.getLocNo()); // 剩余待出数量递减 issued = issued - locDetl.getAnfme(); } else { break; LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo())); if(locMast==null){ R.error("没有找到该库位:"+locDetl.getLocNo()); } List<LocMast> locMasts=locMastService.selectList(new EntityWrapper<LocMast>() .eq("group1",locMast.getGroup1()) .eq("loc_sts","F") .orderBy("loc_attribute",false)); for (LocMast locMast1 : locMasts) { LocDetl locDetl1 = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMast1.getLocNo())); if(locDetl1==null){ return R.error(locMast1.getLocNo()+"没有找到物料"); } if (!locDetl1.getMatnr().equals(locDetl.getMatnr())) { log.error(locMast1.getGroup1()+"巷道的第"+locMast1.getLocAttribute()+"深浅库位号和同巷道物料不同"); break; } if (issued > 0) { LocDto locDto = new LocDto(locDetl1.getLocNo(), locDetl1.getMatnr(), locDetl1.getMaktx(), locDetl1.getBatch(), orderDetl.getOrderNo(), issued >= locDetl1.getAnfme() ? locDetl1.getAnfme() : issued); List<Integer> staNos = new ArrayList<>(); staNos.add(100); staNos.add(200); locDto.setStaNos(staNos); locDtos.add(locDto); exist.add(locDetl.getLocNo()); // 剩余待出数量递减 issued = issued - locDetl.getAnfme(); } else { break; } } } if (issued > 0) { src/main/java/com/zy/asrs/entity/BasCrnp.java
@@ -50,8 +50,8 @@ /** * 状态 * 1.联机 * 2.手动 * 3.充电中 * 0.手动 * 2.充电中 */ @ApiModelProperty(value= "状态") @TableField("crn_sts") src/main/java/com/zy/asrs/entity/LocDetl.java
@@ -67,7 +67,7 @@ @ApiModelProperty(value= "单位") private String unit; @ApiModelProperty(value= "单价") @ApiModelProperty(value= "库存数量") private Double price; @ApiModelProperty(value= "sku") src/main/java/com/zy/asrs/entity/Mat.java
@@ -86,10 +86,10 @@ private String specs; /** * 型号 * 图号 */ @ApiModelProperty(value= "型号") @ExcelProperty(value = "型号") @ExcelProperty(value = "图号") private String model; /** src/main/java/com/zy/asrs/entity/param/CarryParam.java
New file @@ -0,0 +1,46 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class CarryParam { //工作号 private String TaskNo; //入出库类型 private Integer StereoscopicTaskType; //优先级 private Integer Priority; //容器编码 private String BoxNo; //源货位排编号 private Integer OriginalRowNo; //源货位层编号 private Integer OriginalFloorNo; //源货位列编号 private Integer OriginalColumnNo; //目标库位排编号 private Integer GoalRowNo; //目标库位层编号 private Integer GoalFloorNo; //目标库位列编号 private Integer GoalColumnNo; //起点 private String startPoint; //终端编号(输送线上某一点位) private String TerminalNo; //备注 private String meno; } src/main/java/com/zy/asrs/entity/param/GetShuttleStatusParam.java
New file @@ -0,0 +1,91 @@ package com.zy.asrs.entity.param; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class GetShuttleStatusParam { /** * 小车号 */ private Integer shuttleNo; /** * 状态 1: 正常 0: 手动 2.充电中 */ @ApiModelProperty(value= "状态 1: 正常 0: 手动 2.充电中 ") private Integer status; /** * 小车所在层 */ @ApiModelProperty(value= "小车所在层") @TableField("charge_line") private Integer chargeLine; /** * 小车异常码 */ @ApiModelProperty(value= "小车异常码") @TableField("errorCode") private Integer errorCode; /** * 小车状态 * <p> * IDLE(1, "空闲"), * WORKING(2, "作业中"), * WAITING(3, "等待确认"), * CHARGING(4, "充电中"), * CHARGING_WAITING(5, "充电任务等待确认"), * FIXING(6, "故障修复中"), * OFFLINE(7, "离线"), */ private Integer protocolStatus; /** * 当前二维码 * 0为空 */ private String currentCode; /** * 是否为充电状态 */ private Boolean hasCharge; public String getProtocolStatus$() { String protocolStatus$ = ""; switch (this.protocolStatus) { case 1: protocolStatus$ = "空闲"; break; case 2: protocolStatus$ = "作业中"; break; case 3: protocolStatus$ = "等待确认"; break; case 4: protocolStatus$ = "充电中"; break; case 5: protocolStatus$ = "充电任务等待确认"; break; case 6: protocolStatus$ = "故障修复中"; break; case 7: protocolStatus$ = "离线"; break; } return protocolStatus$; } } src/main/java/com/zy/asrs/entity/result/StorageResult.java
@@ -8,12 +8,15 @@ private Integer ReturnStatus = 0; private Results Results; @Data public static class Results{ //库位号 private String ShelfUnitId; //任务号 private Integer TaskNo; private String barcode; } } src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -232,7 +232,7 @@ wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setIoPri(10.0+locMast.getLocAttribute()); // 优先级 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 @@ -300,6 +300,7 @@ StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo()); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); int yz=staDesc.getStnNo()*10+Integer.valueOf(taskDto.getLocNo().substring(6)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); @@ -308,7 +309,7 @@ wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 wrkMast.setSourceStaNo(yz); // 源站 wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y @@ -331,6 +332,7 @@ if (orderDetl == null) { orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null); } LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locDto.getLocNo()).eq("matnr", locDto.getMatnr())); Mat mat=matService.selectOne(new EntityWrapper<Mat>().eq("matnr",locDto.getMatnr())); WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(orderDetl); @@ -340,6 +342,7 @@ wrkDetl.setBatch(locDto.getBatch()); wrkDetl.setOrderNo(locDto.getOrderNo()); wrkDetl.setModel(mat.getModel()); wrkDetl.setPrice(locDetl.getAnfme());//库存数量 wrkDetl.setAnfme(locDto.getAnfme()); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(userId); @@ -465,6 +468,7 @@ wrkMast.setStaNo(param.getOutSite()); // 目标站 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceLocNo(locNo); // 源库位 wrkMast.setIoPri(10.0+locMast.getLocAttribute());//优先级 wrkMast.setFullPlt("N"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 src/main/java/com/zy/asrs/task/GetEquipmentStatus.java
New file @@ -0,0 +1,74 @@ package com.zy.asrs.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.entity.BasCrnp; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.param.GetShuttleStatusParam; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.BasCrnpService; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.impl.BasDevpServiceImpl; import com.zy.asrs.task.core.ReturnT; import com.zy.common.utils.HttpHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.util.List; @Component public class GetEquipmentStatus { private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class); @Value("${wcs.address.URL}") private String addrs; @Value("${wcs.address.deviceStatus}") private String deviceStatus; @Autowired private BasCrnpService basCrnpService; @Autowired private ApiLogService apiLogService; @Autowired private BasDevpService basDevpService; @Scheduled(cron = "0/3 * * * * ? ") private void execute() { //获取设备信息 String response =""; try { response = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(addrs) .setPath(deviceStatus) .build() .doGet(); JSONObject jsonObject = JSON.parseObject(response); if (jsonObject.get("code").equals(200)) { JSONObject data = JSON.parseObject(jsonObject.get("data").toString()); List<GetShuttleStatusParam> shuttles = JSON.parseArray(data.get("basShuttle").toString(), GetShuttleStatusParam.class); for (GetShuttleStatusParam shuttle : shuttles) { BasCrnp shuttle1 = basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no", shuttle.getShuttleNo())); shuttle1.setCrnSts(shuttle.getStatus());//小车模式 shuttle1.setCrnErr(Long.valueOf(shuttle.getErrorCode()));//小车报警 shuttle1.setLev1(shuttle.getChargeLine());//小车所在层 basCrnpService.updateById(shuttle1); } List<BasDevp> basDevps = JSON.parseArray(data.get("basDevp").toString(), BasDevp.class); for (BasDevp basDevp : basDevps) { basDevpService.updateById(basDevp); } } } catch (Exception e) { log.error("wms读取wcs小车状态失败"); } } } src/main/java/com/zy/asrs/task/OutWorkScheduler.java
New file @@ -0,0 +1,41 @@ package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.OutWorkHandler; import com.zy.asrs.task.handler.WorkMastHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; @Component public class OutWorkScheduler { private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class); @Autowired OutWorkHandler outWorkHandler; @Autowired WrkMastService wrkMastService; /** * 出库任务下发 */ @Scheduled(cron = "0/3 * * * * ? ") private void execute() { List<WrkMast> wrkMasts=wrkMastService.selectList(new EntityWrapper<WrkMast>() .eq("wrk_sts",11) .in("io_type",11,101,103,107,110)); for(WrkMast wrkMast:wrkMasts){ ReturnT<String> result = outWorkHandler.start(wrkMast); if (!result.isSuccess()) { log.error("wms下发出库移库任务={}给wcs下发失败", wrkMast.getWrkNo()); } } } } src/main/java/com/zy/asrs/task/handler/OutWorkHandler.java
New file @@ -0,0 +1,95 @@ package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.param.CarryParam; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.service.impl.LocMastServiceImpl; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; 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.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @Slf4j @Service @Transactional public class OutWorkHandler extends AbstractHandler<String> { @Autowired private LocMastService locMastService; @Autowired private ApiLogService apiLogService; @Value("${wcs.address.URL}") private String addrs; @Value("${wcs.address.outboundTaskSend}") private String outboundTaskSend; @Autowired private WrkMastService wrkMastService; public synchronized ReturnT<String> start(WrkMast wrkMast) { //优先级 LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", wrkMast.getSourceLocNo())); int Priority = locMast.getLocAttribute() == null ? 0 : locMast.getLocAttribute(); HashMap<String, Object> map = new HashMap<>(); CarryParam carryParam = new CarryParam(); carryParam.setBoxNo(wrkMast.getBarcode());//托盘码 carryParam.setTaskNo(wrkMast.getWrkNo()+"");//任务号 carryParam.setStereoscopicTaskType(2);//2.出库 carryParam.setPriority(10+Priority);//优先级 carryParam.setOriginalRowNo(locMast.getRow1());//源库位排 carryParam.setOriginalColumnNo(locMast.getBay1());//源库位列 carryParam.setOriginalFloorNo(locMast.getLev1());//源库位层 carryParam.setStartPoint(wrkMast.getStaNo()+""+locMast.getLev1());//源站 carryParam.setTerminalNo(wrkMast.getStaNo()+"");//目标站 List<CarryParam> carryParamList=new ArrayList<>(); carryParamList.add(carryParam); map.put("TaskList",carryParamList); String response =""; Boolean bool =false; try { log.info("wms派发任务给wcs出库={}", map); response = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(addrs) .setPath(outboundTaskSend) .setJson(JSON.toJSONString(map)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if(jsonObject.get("Code").equals("1")){ wrkMast.setWrkSts(12L); wrkMastService.updateById(wrkMast); bool = true; } } catch (Exception e) { log.error("wcs派发任务给RCS出库失败{},返回值={}", wrkMast, response); } finally { apiLogService.save("wcs派发任务给RCS出库" , addrs + outboundTaskSend , null , "127.0.0.1" , JSON.toJSONString(map) , response , bool ); } return SUCCESS; } } src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -71,27 +71,27 @@ } } // 手动入库生成单据 【 上报三方平台 】 if (!Cools.isEmpty(wrkDetls)) { if (!orderService.saveHandlerOrder(Boolean.TRUE, wrkMast, wrkDetls)) { exceptionHandle("生成手动入库单据[workNo={0}]失败", wrkMast.getWrkNo()); } } // if (!Cools.isEmpty(wrkDetls)) { // if (!orderService.saveHandlerOrder(Boolean.TRUE, wrkMast, wrkDetls)) { // exceptionHandle("生成手动入库单据[workNo={0}]失败", wrkMast.getWrkNo()); // } // } // 拣料再入库 } else if (wrkMast.getIoType() == 53) { if (!Cools.isEmpty(wrkDetls)) { if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) { exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo()); } } // if (!Cools.isEmpty(wrkDetls)) { // if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) { // exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo()); // } // } } // 出库 -------------------------------------------------------------------------------- } else if (wrkMast.getWrkSts() == 15) { if (!Cools.isEmpty(wrkDetls)) { if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) { exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo()); } } // if (!Cools.isEmpty(wrkDetls)) { // if (!orderService.saveHandlerOrder(Boolean.FALSE, wrkMast, wrkDetls)) { // exceptionHandle("生成手动出库单据[workNo={0}]失败", wrkMast.getWrkNo()); // } // } } // 保存工作主档历史档 src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -35,6 +35,10 @@ private WaitPakinService waitPakinService; @Autowired private OrderDetlService orderDetlService; @Autowired private WrkMastLogService wrkMastLogService; @Autowired private WrkDetlLogService wrkDetlLogService; public ReturnT<String> start(WrkMast wrkMast) { // 4.入库完成 @@ -156,9 +160,16 @@ } for (WrkDetl wrkDetl : wrkDetls53) { LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch()); LocDetl locDetl = new LocDetl(); locDetl.sync(wrkDetl); locDetl.setAnfme(wrkDetl.getPrice()-wrkDetl.getAnfme());//数量 locDetl.setLocNo(wrkMast.getLocNo()); // 库位号 locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码 locDetl.setModiTime(now); locDetl.setAppeTime(now); locDetl.setPrice(0.0); if (null != locDetl) { if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) { if (!locDetlService.insert(locDetl)) { // exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo()); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("拣料入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]"); @@ -184,7 +195,7 @@ } // 修改库位状态 Q ====>> F if (locMast.getLocSts().equals("Q")) { if (locMast.getLocSts().equals("S")) { locMast.setLocSts("F"); locMast.setBarcode(wrkMast.getBarcode()); locMast.setIoTime(now); @@ -382,6 +393,8 @@ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); } // 修改工作主档状态 wrkMast.setWrkSts(15L); } break; // 空板出库 @@ -397,13 +410,40 @@ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); } // 修改工作主档状态 wrkMast.setWrkSts(15L); } break; //拣料和盘点出库 case 103: case 107: if (locMast.getLocSts().equals("P")) { locMast.setLocSts("O"); locMast.setBarcode(""); locMast.setModiTime(now); locMast.setIoTime(now); if (!locMastService.updateById(locMast)) { // exceptionHandle("空板出库 ===>> 修改源库位状态失败;[workNo={0}],[sourceLocNo={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo()); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("拣料和盘点出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); } wrkMast.setWrkSts(16L);//等待入库 // 保存工作主档历史档 if (!wrkMastLogService.save(wrkMast.getWrkNo())) { exceptionHandle("保存工作历史档[workNo={0}]失败", wrkMast.getWrkNo()); } if(!wrkMast.getEmptyMk().equals("Y")) { // 保存工作明细档历史档 if (!wrkDetlLogService.save(wrkMast.getWrkNo())) { exceptionHandle("保存工作明细历史档[workNo={0}]失败", wrkMast.getWrkNo()); } } } break; default: break; } // 修改工作主档状态 wrkMast.setWrkSts(15L); wrkMast.setModiTime(now); if (!wrkMastService.updateById(wrkMast)) { // exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo()); src/main/java/com/zy/common/web/WcsController.java
@@ -46,43 +46,100 @@ private LocDetlService locDetlService; @Autowired private BasCrnpService basCrnpService; @PostMapping("/pakin/loc/returnWarehouse") @ResponseBody public synchronized StorageResult returnWarehouse(@RequestBody(required = false) SearchLocParam param) { StorageResult storageResult=new StorageResult(); if (Cools.isEmpty(param.getTaskNo())) { storageResult.setReturnStatus(1); storageResult.setErrorMessage("传入工作号为空"); return storageResult; } WrkMast wrkMast =wrkMastService.selectOne(new EntityWrapper<WrkMast>() .eq("wrk_no",param.getTaskNo()) .in("io_type",103,107)); if (Cools.isEmpty(wrkMast)){ storageResult.setReturnStatus(1); storageResult.setErrorMessage("没有找到盘点拣料任务---------"+param.getTaskNo()); return storageResult; } SearchLocParam searchLocParam = new SearchLocParam(); searchLocParam.setBoxNo(wrkMast.getBarcode()); searchLocParam.setWcsIoType(1);//满板 searchLocParam.setWcsSourceStaNo(wrkMast.getStaNo()); searchLocParam.setWcsStatus(0); return getLocNo(searchLocParam); } @PostMapping("/pakin/loc/v1") @ResponseBody public synchronized R getLocNo(@RequestBody(required = false) SearchLocParam param) { public synchronized StorageResult getLocNo(@RequestBody(required = false) SearchLocParam param) { StorageResult storageResult=new StorageResult(); log.info("收到WCS入库接口请求====>>入参:{}", param); if (Cools.isEmpty(param.getWcsIoType())) { return R.error("入出库类型不能为空"); storageResult.setReturnStatus(1); storageResult.setErrorMessage("入出库类型不能为空"); return storageResult; } if (Cools.isEmpty(param.getWcsSourceStaNo())) { return R.error("源站编号不能为空"); storageResult.setReturnStatus(1); storageResult.setErrorMessage("源站编号不能为空"); return storageResult; } int ioType = 0; List<WaitPakin> waitPakins = null; if (param.getWcsIoType() == 1) { if (Cools.isEmpty(param.getBoxNo())) { return R.error("条码不能为空"); //拣料和盘点入库 WrkMast wrkMast1037 =wrkMastService.selectOne(new EntityWrapper<WrkMast>() .eq("barcode", param.getBoxNo()) .in("io_type",103,107)); WrkMast wrkMast537 =wrkMastService.selectOne(new EntityWrapper<WrkMast>() .eq("barcode", param.getBoxNo()) .in("io_type",53,57)); if (wrkMast537 != null) { StorageResult.Results results=new StorageResult.Results(); results.setTaskNo(wrkMast537.getWrkNo()); results.setShelfUnitId(wrkMast537.getLocNo()+""); storageResult.setResults(results); return storageResult; } waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBoxNo())); if (Cools.isEmpty(waitPakins)) { WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBoxNo()); if (wrkMast != null && wrkMast.getIoType() == 103) { return R.parse(CodeRes.PICK_600); if(Cools.isEmpty(wrkMast1037)) { if (Cools.isEmpty(param.getBoxNo())) { storageResult.setReturnStatus(1); storageResult.setErrorMessage("条码不能为空"); return storageResult; } return R.parse(CodeRes.NO_COMB_700); waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBoxNo())); if (Cools.isEmpty(waitPakins)) { WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBoxNo()); if (wrkMast != null && wrkMast.getIoType() == 103) { storageResult.setReturnStatus(1); storageResult.setErrorMessage(CodeRes.PICK_600); return storageResult; } storageResult.setReturnStatus(1); storageResult.setErrorMessage(CodeRes.NO_COMB_700); return storageResult; } int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", param.getBoxNo())); int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", param.getBoxNo())); if (countLoc > 0 || countWrk > 0) { storageResult.setReturnStatus(1); storageResult.setErrorMessage(CodeRes.EXIST_500); return storageResult; } }else { ioType = wrkMast1037.getIoType(); } int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBoxNo())); int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBoxNo())); if (countLoc > 0 || countWrk > 0) { return R.error(CodeRes.EXIST_500); } } switch (param.getWcsIoType()) { case 1://满托盘入库 assert waitPakins != null; storageResult = startupFullPutStore(param.getWcsSourceStaNo(), param.getBoxNo(), waitPakins); storageResult = startupFullPutStore(param.getWcsSourceStaNo(), param.getBoxNo(), waitPakins,ioType); break; case 2://空托盘入库 storageResult = emptyPlateIn(param.getWcsSourceStaNo(), param.getBoxNo()); @@ -91,80 +148,111 @@ break; } log.info("WCS入库接口返参:{},托盘码:{}", storageResult, param.getBoxNo()); return R.ok().add(storageResult); return storageResult; } /** * 全板入库 */ @Transactional public StorageResult startupFullPutStore(Integer devpNo, String barcode, List<WaitPakin> waitPakins) { public StorageResult startupFullPutStore(Integer devpNo, String barcode, List<WaitPakin> waitPakins,Integer ioType) { StorageResult storageResult=new StorageResult(); Integer[] arr=arr(); int type=Cools.isEmpty(waitPakins.get(0).getBeBatch())?1:waitPakins.get(0).getBeBatch(); // 检索库位 LocMast locMast1 =commonService.getLocNo2(waitPakins.get(0),arr,0,type,1); int workNo = commonService.getWorkNo(0); Date now = new Date(); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(new Date()); wrkMast.setWrkSts(2L); // 工作状态:生成入库ID wrkMast.setIoType(1); // 入出库状态:1.入库 wrkMast.setIoPri(13D); // 优先级 wrkMast.setSourceStaNo(devpNo); wrkMast.setLocNo(locMast1.getLocNo()); wrkMast.setBarcode(barcode); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); wrkMast.setCtnType(1); // 容器类型 // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiTime(now); boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); } // 生成工作档明细 waitPakins.forEach(waitPakin -> { WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(waitPakin); wrkDetl.setWrkNo(wrkMast.getWrkNo()); wrkDetl.setIoTime(wrkMast.getIoTime()); wrkDetl.setAppeTime(now); wrkDetl.setModiTime(now); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作明细失败"); LocMast locMast1=new LocMast(); Integer workNo = 0; //判断是否是拣料或者是盘点 if(ioType==103||ioType==107) { WrkDetl wrkDetl=wrkDetlService.selectOne(new EntityWrapper<WrkDetl>().eq("zpallet", barcode)); int type=Cools.isEmpty(wrkDetl.getBeBatch())?1:wrkDetl.getBeBatch(); // 检索库位 WaitPakin waitPakin1=new WaitPakin(); waitPakin1.sync(wrkDetl); locMast1 =commonService.getLocNo2(waitPakin1,arr,0,type,1); WrkMast wrkMast=wrkMastService.selectByBarcode(barcode); workNo = wrkMast.getWrkNo(); int mbz=wrkMast.getStaNo()*10+Integer.valueOf(wrkMast.getSourceLocNo().substring(6)); String ykw=wrkMast.getLocNo(); wrkMast.setIoType(ioType-50); wrkMast.setWrkSts(1L);//入库 wrkMast.setModiTime(new Date()); wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 wrkMast.setStaNo(mbz); // 目标站 wrkMast.setLocNo(locMast1.getLocNo()); // 目标库位 = 出库时的源库位 wrkMast.setSourceLocNo(ykw); // 源库位 wrkMastService.updateById(wrkMast); }else{ int type=Cools.isEmpty(waitPakins.get(0).getBeBatch())?1:waitPakins.get(0).getBeBatch(); // 检索库位 locMast1 =commonService.getLocNo2(waitPakins.get(0),arr,0,type,1); //正常入库 workNo = commonService.getWorkNo(0); Date now = new Date(); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(new Date()); wrkMast.setWrkSts(2L); // 工作状态:生成入库ID wrkMast.setIoType(1); // 入出库状态:1.入库 wrkMast.setIoPri(13D); // 优先级 wrkMast.setSourceStaNo(devpNo); wrkMast.setLocNo(locMast1.getLocNo()); wrkMast.setBarcode(barcode); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("Y"); wrkMast.setCtnType(1); // 容器类型 // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiTime(now); boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); } }); // 更新入库通知档 ioStatus ===>> Y Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>() .eq("zpallet", barcode); WaitPakin setParam = new WaitPakin(); setParam.setLocNo(locMast1.getLocNo()); setParam.setIoStatus("Y"); setParam.setModiTime(now); if (!waitPakinService.update(setParam, wrapper)) { throw new CoolException("更新通知档失败"); // 生成工作档明细 waitPakins.forEach(waitPakin -> { WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(waitPakin); wrkDetl.setWrkNo(wrkMast.getWrkNo()); wrkDetl.setIoTime(wrkMast.getIoTime()); wrkDetl.setAppeTime(now); wrkDetl.setModiTime(now); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作明细失败"); } }); // 更新入库通知档 ioStatus ===>> Y Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>() .eq("zpallet", barcode); WaitPakin setParam = new WaitPakin(); setParam.setLocNo(locMast1.getLocNo()); setParam.setIoStatus("Y"); setParam.setModiTime(now); if (!waitPakinService.update(setParam, wrapper)) { throw new CoolException("更新通知档失败"); } } // 更新目标库位状态 LocMast locMast = locMastService.selectById(locMast1.getLocNo()); if (locMast.getLocSts().equals("O")){ locMast.setLocSts("S"); // S.入库预约 locMast.setModiTime(now); locMast.setModiTime(new Date()); if (!locMastService.updateById(locMast)){ throw new CoolException("改变库位状态失败"); } } else { throw new CoolException(locMast1.getLocNo()+"目标库位已被占用"); } StorageResult.Results results=new StorageResult.Results(); results.setTaskNo(workNo); results.setShelfUnitId(locMast1.getLocNo()); results.setBarcode(barcode); storageResult.setResults(results); return storageResult; } @@ -252,6 +340,7 @@ }else{ basCrnp.setTankQty(0); basCrnpService.update(basCrnp,new EntityWrapper<BasCrnp>().eq("crn_no",basCrnp.getCrnNo())); int xx=0; arr[i]=basCrnp.getLev1(); i++; int o=basCrnp.getCrnNo(); @@ -260,18 +349,27 @@ o=1; } basCrnp=basCrnpService.selectOne(new EntityWrapper<BasCrnp>().eq("crn_no",o)); if(q==1){ if(Cools.isEmpty(basCrnp)){ log.error(q+"号小车没有找到"); continue; } if(basCrnp.getCrnErr()>0||basCrnp.getCrnSts()!=1){ log.error(q+"号小车报警或者在充电跳过此车"); continue; } if(xx==0){ basCrnp.setTankQty(1); basCrnpService.update(basCrnp,new EntityWrapper<BasCrnp>().eq("crn_no",o)); } arr[i]=basCrnp.getLev1(); i++; xx++; } } for (int w=1;w<=7;w++){ boolean boo=true; for(int g=0;g<count;g++){ for(int g=0;g<i;g++){ if(arr[g]==w){ boo=false; break; @@ -281,6 +379,7 @@ arr[i]=w; i++; } if(i==7) break; } return arr; } src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -9,6 +9,9 @@ @Data public class SearchLocParam { @JSONField(name = "taskNo") private Integer taskNo; //托盘码 @JSONField(name = "BoxNo") private String boxNo; @@ -23,7 +26,7 @@ @JSONField(name = "WCSSourceStaNo") private Integer wcsSourceStaNo; //空板满板 //空板满板 1.满板 2.空板 @JSONField(name = "WCSIoType") private Integer wcsIoType; src/main/resources/application.yml
@@ -10,7 +10,7 @@ enabled: false datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://127.0.0.1:1433;databasename=lfdasrs-sxc url: jdbc:sqlserver://192.168.0.17:1433;databasename=lfdasrs-sxc username: sa password: sa@123 mvc: @@ -50,6 +50,16 @@ # 一个堆垛机负责的货架排数 groupCount: 4 #wcs对接 wcs: #地址 address: URL: http://127.0.0.1:9092/wcs #出库移库任务下发 outboundTaskSend: open/outboundTaskSend deviceStatus : open/deviceStatus #erp对接 erp: #地址 src/main/resources/mapper/LocDetlMapper.xml
@@ -120,6 +120,7 @@ and b.loc_sts = 'F' <include refid="stockOutCondition"></include> ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize}) </select> <select id="getStockOutPageCount" parameterType="java.util.Map" resultType="java.lang.Integer"> @@ -205,6 +206,7 @@ where 1=1 and b.loc_sts = 'F' and a.matnr = #{matnr} and b.loc_attribute = 1 <!-- <choose>--> <!-- <when test="batch != null and batch != ''">--> <!-- and a.batch = #{batch}--> src/main/resources/mapper/WrkMastMapper.xml
@@ -63,12 +63,13 @@ </resultMap> <select id="selectToBeCompleteData" resultMap="BaseResultMap"> select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 104 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no </select> <select id="selectToBeHistoryData" resultMap="BaseResultMap"> select * from asr_wrk_mast where wrk_sts=5 or wrk_sts=20 or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp)) or (wrk_sts=15 and dateadd(mi,15,crn_end_time) <= getdate() and wrk_no not in (select wrk_no from asr_bas_devp)) or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp)) src/main/webapp/static/image/logo.pngsrc/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@ var baseUrl = "/htwms"; var baseUrl = "/lfdsxkwms"; // 详情窗口-高度 var detailHeight = '80%';