src/main/java/com/zy/asrs/controller/MobileController.java
@@ -18,6 +18,8 @@ import com.zy.common.model.LocDto; import com.zy.common.model.TaskDto; import com.zy.common.model.WrkDto; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; @@ -55,6 +57,10 @@ private PackService packService; @Autowired private ManLocDetlMapper manLocDetlMapper; @Autowired private CommonService commonService; @Autowired private StaDescService staDescService; // 商品上架 @@ -174,6 +180,149 @@ return R.ok(); } /** * 出库确认完成 * @param list * @return */ @RequestMapping("/pakout/confirm/auth") @ManagerAuth @Transactional public R pakoutConfirm(@RequestBody List<WrkDetl> list) { if (Cools.isEmpty(list)) { return R.ok(); } Set<Integer> wrkNos = new HashSet<>(); List<WrkDto> dtos = new ArrayList<>(); for (WrkDetl wrkDetl : list) { if (wrkNos.contains(wrkDetl.getWrkNo())) { for (WrkDto dto : dtos) { if (dto.getWrkNo().equals(wrkDetl.getWrkNo())) { dto.getWrkDetls().add(wrkDetl); break; } } } else { wrkNos.add(wrkDetl.getWrkNo()); dtos.add(new WrkDto(wrkDetl.getWrkNo(), wrkDetl)); } } for (WrkDto dto : dtos) { WrkMast wrkMast = wrkMastService.selectById(dto.getWrkNo()); if (wrkMast != null) { // 101 if (wrkMast.getIoType() == 101) { for (WrkDetl wrkDetl : dto.getWrkDetls()) { wrkDetlService.updateInspect(wrkDetl.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch()); } } // 103 if (wrkMast.getIoType() == 103) { if (!wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()))) { throw new CoolException("拣料出库确认失败"); } for (WrkDetl wrkDetl : dto.getWrkDetls()) { wrkDetl.setInspect(1); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("拣料出库确认失败"); } } } } } for (Integer wrkNo : wrkNos) { WrkMast wrkMast = wrkMastService.selectById(wrkNo); if (wrkMast.getWrkSts() == 15 && (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N"))) { List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkNo); boolean complete = true; for (WrkDetl wrkDetl : wrkDetls) { if (wrkDetl.getInspect() == null || wrkDetl.getInspect() == 0) { complete = false; break; } } if (complete) { wrkMast.setInvWh("Y"); wrkMast.setModiTime(new Date()); if (!wrkMastService.updateById(wrkMast)) { throw new CoolException("修改工作档" + wrkNo + "失败"); } } } } return R.ok("完成确认"); } /** * 补空托盘到入库缓存位 * @param map * @return */ @RequestMapping("/supplementEmpty") @ManagerAuth @Transactional public R supplementEmpty(@RequestBody HashMap<String,Object> map){ if (Cools.isEmpty(map)) { return R.error("补空托盘库位为空"); } List<LocMast> locMastList=locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D")); if (locMastList.isEmpty()) { return R.error("立库里没有空托盘"); } // 获取工作号 int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type); // 获取源站 Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() .eq("type_no", 110) .eq("stn_no", 102) .eq("crn_no", locMastList.get(0).getCrnNo()); StaDesc staDesc = staDescService.selectOne(wrapper); Integer sourceStaNo = staDesc.getCrnStn(); if (Cools.isEmpty(sourceStaNo)) { throw new CoolException("检索源站失败"); } Date now = new Date(); // 保存工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(110); // 入出库状态: 110.空板出库 wrkMast.setIoPri(10D); wrkMast.setSourceStaNo(sourceStaNo); // 源站 wrkMast.setStaNo(102); // 目标站 wrkMast.setCrnNo(locMastList.get(0).getCrnNo()); wrkMast.setSourceLocNo(locMastList.get(0).getLocNo()); // 源库位 wrkMast.setFullPlt("N"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("Y"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setAppeUser(getUserId()); wrkMast.setAppeTime(now); wrkMast.setModiUser(getUserId()); wrkMast.setModiTime(now); wrkMast.setMemo((String) map.get("locNo"));//agv放货位 boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); } // 更新库位状态 D.空板 -> R.出库预约 if (locMastList.get(0).getLocSts().equals("D")){ locMastList.get(0).setLocSts("R"); locMastList.get(0).setModiUser(getUserId()); locMastList.get(0).setModiTime(now); if (!locMastService.updateById(locMastList.get(0))) { throw new CoolException("更新库位状态失败"); } } return R.ok(); } // 根据库位码和商品码搜索商品 @RequestMapping("/mat/find/auth") public R find(@RequestParam(required = false) String locNo @@ -227,75 +376,7 @@ } @RequestMapping("/pakout/confirm/auth") @ManagerAuth @Transactional public R pakoutConfirm(@RequestBody List<WrkDetl> list) { if (Cools.isEmpty(list)) { return R.ok(); } Set<Integer> wrkNos = new HashSet<>(); List<WrkDto> dtos = new ArrayList<>(); for (WrkDetl wrkDetl : list) { if (wrkNos.contains(wrkDetl.getWrkNo())) { for (WrkDto dto : dtos) { if (dto.getWrkNo().equals(wrkDetl.getWrkNo())) { dto.getWrkDetls().add(wrkDetl); break; } } } else { wrkNos.add(wrkDetl.getWrkNo()); dtos.add(new WrkDto(wrkDetl.getWrkNo(), wrkDetl)); } } for (WrkDto dto : dtos) { WrkMast wrkMast = wrkMastService.selectById(dto.getWrkNo()); if (wrkMast != null) { // 101 if (wrkMast.getIoType() == 101) { for (WrkDetl wrkDetl : dto.getWrkDetls()) { wrkDetlService.updateInspect(wrkDetl.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch()); } } // 103 if (wrkMast.getIoType() == 103) { if (!wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()))) { throw new CoolException("拣料出库确认失败"); } for (WrkDetl wrkDetl : dto.getWrkDetls()) { wrkDetl.setInspect(1); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("拣料出库确认失败"); } } } } } for (Integer wrkNo : wrkNos) { WrkMast wrkMast = wrkMastService.selectById(wrkNo); if (wrkMast.getWrkSts() == 14 && (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N"))) { List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkNo); boolean complete = true; for (WrkDetl wrkDetl : wrkDetls) { if (wrkDetl.getInspect() == null || wrkDetl.getInspect() == 0) { complete = false; break; } } if (complete) { wrkMast.setInvWh("Y"); wrkMast.setModiTime(new Date()); if (!wrkMastService.updateById(wrkMast)) { throw new CoolException("修改工作档" + wrkNo + "失败"); } } } } return R.ok("完成确认"); } // 盘点 ---------------------------------------------------------------------------------------------------- src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,11 +1,15 @@ package com.zy.asrs.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.annotations.AppAuth; import com.core.common.*; import com.core.exception.CoolException; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.param.*; import com.zy.asrs.service.OpenService; import com.zy.asrs.service.WrkMastService; import com.zy.common.model.DetlDto; import com.zy.common.web.BaseController; import lombok.extern.slf4j.Slf4j; @@ -13,9 +17,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.*; /** * Created by vincent on 2022/4/8 @@ -32,6 +34,8 @@ @Autowired private OpenService openService; @Autowired private WrkMastService wrkMastService; @PostMapping("/order/matSync/default/v1") @AppAuth(memo = "商品信息同步接口") @@ -206,5 +210,36 @@ /*********************************同步物料档案和订单****************************************************/ /*********************************RCS任务结束接口****************************************************/ /** * 库存统计 */ @RequestMapping("/taskOver") public HashMap taskOver(@RequestBody HashMap<String,Object> param) { HashMap map = new HashMap(); Map<String ,Object > map1 = (Map<String, Object>)param.get("Data"); String id = (String) map1.get("Id"); String status = (String) map1.get("Status"); if (!status.equals("finished_manual")){ map.put("IsSuccess", true); return map; } WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no",Integer.valueOf(id))); if (wrkMast == null) { map.put("IsSuccess", false); map.put("ErrorCode","1"); map.put("Message","没有找到该任务号:"+id); return map; } if(wrkMast.getIoType()==101||wrkMast.getIoType()==110){ wrkMast.setWrkSts(15L);//搬运完成,任务转历史档 }else if(wrkMast.getIoType()==103||wrkMast.getIoType()==107){ wrkMast.setWrkSts(14L);//搬运完成,任务状态回到14 } wrkMastService.updateById(wrkMast); map.put("IsSuccess", true); return map; } } src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -264,9 +264,9 @@ private String manuType; /** * 备注 * agv放货位 */ @ApiModelProperty(value= "备注") @ApiModelProperty(value= "agv放货位") private String memo; @ApiModelProperty(value= "") src/main/java/com/zy/asrs/entity/param/RCSParam.java
New file @@ -0,0 +1,52 @@ package com.zy.asrs.entity.param; import lombok.Data; import java.util.Date; import java.util.List; @Data public class RCSParam { /** * 网络流水号 */ private String ReqId; /** * 应用表示 wms */ private String ClientId; /** * 通知时间 */ private String ReqTime; /** * 数据 */ private DataBody Data; @Data public static class DataBody { /** * 任务号 */ private String Id; private List<TaskBody> tasks; } @Data public static class TaskBody { /** * 任务类型 : * load 取货 ; unload 放货 ; */ private String Type; /** * 目标库位 */ private String Station; } } src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -223,7 +223,7 @@ // } // 获取路径 StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta); StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), 102); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); // 生成工作档 @@ -235,7 +235,7 @@ wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 wrkMast.setStaNo(102); // 目标站 wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 @@ -247,6 +247,9 @@ wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if(outSta==2000){ wrkMast.setMemo("2000"); } if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:"+dto.getLocNo()); } @@ -446,7 +449,7 @@ // 获取源站 Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() .eq("type_no", 110) .eq("stn_no", param.getOutSite()) .eq("stn_no", 102) .eq("crn_no", locMast.getCrnNo()); StaDesc staDesc = staDescService.selectOne(wrapper); Integer sourceStaNo = staDesc.getCrnStn(); @@ -462,7 +465,7 @@ wrkMast.setIoType(110); // 入出库状态: 110.空板出库 wrkMast.setIoPri(10D); wrkMast.setSourceStaNo(sourceStaNo); // 源站 wrkMast.setStaNo(param.getOutSite()); // 目标站 wrkMast.setStaNo(102); // 目标站 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceLocNo(locNo); // 源库位 wrkMast.setFullPlt("N"); // 满板:Y @@ -474,6 +477,9 @@ wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if(param.getOutSite()==1000){ wrkMast.setMemo("1000"); } boolean res = wrkMastService.insert(wrkMast); if (!res) { throw new CoolException("保存工作档失败"); src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -1,9 +1,14 @@ package com.zy.asrs.task; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.WorkMastHandler; import com.zy.asrs.task.newWay.handler.AssignTasksToRCSHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -25,11 +30,28 @@ private WrkMastService wrkMastService; @Autowired private WorkMastHandler workMastHandler; @Autowired private BasDevpService basDevpService; @Scheduled(cron = "0/3 * * * * ? ") private void execute(){ private void execute() { List<WrkMast> wrkMasts = wrkMastService.selectToBeCompleteData(); if (wrkMasts.isEmpty()) { List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>() .eq("wrk_sts", 14) .eq("io_type", 103)); for (WrkMast wrkMast : wrkMasts1) { BasDevp basDevp=basDevpService.selectOne(new EntityWrapper<BasDevp>() .eq("dev_no",wrkMast.getStaNo()) .eq("wrk_no",wrkMast.getWrkNo())); if(basDevp==null){ continue; } if (!Cools.isEmpty(wrkMast.getMemo())) { wrkMast.setWrkSts(30L); wrkMastService.updateById(wrkMast); } } return; } for (WrkMast wrkMast : wrkMasts) { src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -383,6 +383,14 @@ return FAIL.setMsg("全板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); } } if(Cools.isEmpty(wrkMast.getMemo())){ // 修改工作主档状态 wrkMast.setWrkSts(15L); }else{ //有agv放货点 // 修改工作主档状态 wrkMast.setWrkSts(30L); } break; // 空板出库 case 110: @@ -398,12 +406,20 @@ return FAIL.setMsg("空板出库 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]"); } } if(Cools.isEmpty(wrkMast.getMemo())){ // 修改工作主档状态 wrkMast.setWrkSts(15L); }else{ //有agv放货点 // 修改工作主档状态 wrkMast.setWrkSts(30L); } break; default: break; } // 修改工作主档状态 wrkMast.setWrkSts(15L); wrkMast.setModiTime(now); if (!wrkMastService.updateById(wrkMast)) { // exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo()); src/main/java/com/zy/asrs/task/newWay/AssignTasksToRCSScheduler.java
New file @@ -0,0 +1,53 @@ package com.zy.asrs.task.newWay; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.task.WorkMastScheduler; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.newWay.handler.AssignTasksToRCSHandler; 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.Date; import java.util.List; @Component public class AssignTasksToRCSScheduler { private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class); @Autowired private WrkMastService wrkMastService; @Autowired private AssignTasksToRCSHandler assignTasksToRCSHandler; /** * 下发任务给RCS */ @Scheduled(cron = "0/3 * * * * ? ") private void execute(){ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts",30)); if (wrkMasts.isEmpty()) { return; } for (WrkMast wrkMast : wrkMasts) { if(Cools.isEmpty(wrkMast.getMemo())){ continue; } ReturnT<String> returnT = assignTasksToRCSHandler.start(wrkMast); if (!returnT.isSuccess()) { wrkMast.setUpdMk("X"); wrkMast.setErrorMemo(returnT.getMsg()); wrkMast.setErrorTime(new Date()); if (!wrkMastService.updateById(wrkMast)) { log.error("工作档[workNo={}]标记待处理失败", wrkMast.getWrkNo()); } } } } } src/main/java/com/zy/asrs/task/newWay/AutoSupplementEmptyBoardScheduler.java
File was deleted src/main/java/com/zy/asrs/task/newWay/handler/AssignTasksToRCSHandler.java
New file @@ -0,0 +1,99 @@ package com.zy.asrs.task.newWay.handler; import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.entity.param.RCSParam; import com.zy.asrs.service.*; 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.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j @Service @Transactional public class AssignTasksToRCSHandler extends AbstractHandler<String> { @Autowired private WrkMastService wrkMastService; @Autowired private ApiLogService apiLogService; @Value("${rcs.address.url}") private String url; @Value("${rcs.address.attrcs}") private String attrcs; public ReturnT<String> start(WrkMast wrkMast) { RCSParam rcsParam = new RCSParam(); LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"); String formattedDate = now.format(formatter); // 格式化日期时间 //网络流水号 rcsParam.setReqId(now.toString()); //应用标识 rcsParam.setClientId("WMS"); //通知时间 rcsParam.setReqTime(formattedDate); RCSParam.DataBody dataBody=new RCSParam.DataBody(); //任务号 dataBody.setId(wrkMast.getWrkNo()+""); List<RCSParam.TaskBody> taskBodyList=new ArrayList<>(); RCSParam.TaskBody taskBody=new RCSParam.TaskBody(); //取货类型 taskBody.setType("load"); taskBody.setStation(wrkMast.getStaNo()+""); taskBodyList.add(taskBody); RCSParam.TaskBody taskBody1=new RCSParam.TaskBody(); //放货类型 taskBody1.setType("unload"); taskBody1.setStation(wrkMast.getMemo()); taskBodyList.add(taskBody1); dataBody.setTasks(taskBodyList); rcsParam.setData(dataBody); String response =""; Boolean bool =false; try { log.info("wms派发搬运任务给RCS出库={}", rcsParam); response = new HttpHandler.Builder() // .setHeaders(headParam) .setUri(url) .setPath(attrcs) .setJson(JSON.toJSONString(rcsParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); if(jsonObject.getBoolean("IsSuccess")){ wrkMast.setWrkSts(31L);//WMS下发搬运任务给RCS成功 wrkMastService.updateById(wrkMast); bool = true; } } catch (Exception e) { log.error("wcs派发任务给RCS出库失败{},返回值={}", wrkMast, response); } finally { apiLogService.save("WMS派发搬运任务给RCS" , url + attrcs , null , "127.0.0.1" , JSON.toJSONString(rcsParam) , response , bool ); } return SUCCESS; } } src/main/resources/application.yml
@@ -66,4 +66,11 @@ acctID: "67af18a2bc317c" username: "立库" password: "123456" lcid: 2052 lcid: 2052 #RCS rcs: address: url: http://192.168.3.102:16001 #任务下发地址 attrcs: 3CLOUD/Kingdee.BOS.WebApi.ServicesStub. src/main/resources/mapper/WrkMastMapper.xml
@@ -69,9 +69,9 @@ <select id="selectToBeHistoryData" resultMap="BaseResultMap"> select * from asr_wrk_mast where wrk_sts=5 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)) or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp) and inv_wh = 'Y') or (wrk_sts=15 and dateadd(mi,15,crn_end_time) <= getdate() and wrk_no not in (select wrk_no from asr_bas_devp) and inv_wh = 'Y') or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp) and inv_wh = 'Y') order by io_time,wrk_no asc </select>