src/main/java/com/zy/asrs/controller/OpenController.java
@@ -3,12 +3,19 @@ import com.alibaba.fastjson.JSON; 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.*; import com.zy.asrs.entity.param.*; import com.zy.asrs.service.LocDetlService; import com.zy.asrs.service.OpenService; import com.zy.asrs.service.WaitPakinService; import com.zy.asrs.service.WrkDetlService; import com.zy.common.model.DetlDto; import com.zy.common.model.LocDetlDto; import com.zy.common.model.enums.WorkNoType; import com.zy.common.web.BaseController; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +42,12 @@ @Autowired private OpenService openService; @Autowired private LocDetlService locDetlService; @Autowired private WaitPakinService waitPakinService; @Autowired private WrkDetlService wrkDetlService; // @PostMapping("/order/matSync/default/v1") //// @AppAuth(memo = "商品信息同步接口") @@ -398,14 +411,17 @@ public synchronized R syncMatInfoV2(@RequestBody(required = false) List<MatSyncParam.MatParam> param){ System.out.println(param); // if (Cools.isEmpty(param)) { // return R.parse(BaseRes.PARAM); // } // MatSyncParam matSyncParam = new MatSyncParam(); // List<MatSyncParam.MatParam> objects = new ArrayList<>(); // objects.add(param); // matSyncParam.matDetails = objects; // openService.syncMat(matSyncParam); if (Cools.isEmpty(param)) { return R.parse(BaseRes.PARAM); } MatSyncParam matSyncParam = new MatSyncParam(); List<MatSyncParam.MatParam> objects = new ArrayList<>(); for (MatSyncParam.MatParam matParam : param) { objects.add(matParam); } matSyncParam.matDetails = objects; openService.syncMat(matSyncParam); return R.ok(); } @@ -419,41 +435,7 @@ */ @PostMapping("/station/all") public synchronized R stationAll(){ List<LinkedHashMap<String,Object>> list =new ArrayList<>(); LinkedHashMap<String,Object> map = new LinkedHashMap<>(); map.put("stationId","101"); map.put("stationType","3"); map.put("stationName","101"); list.add(map); System.out.println(); // try { // //获取Cookie值 // HashMap<String, Object> headers = new HashMap<>(); // headers.put("accesstoken", erpSecret.getAccessToken()); // headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 // response = new HttpHandler.Builder() // .setHeaders(headers) // .setUri(URL) // .setPath(path) // .setJson(add) // .build() // .doPost(); // JSONObject jsonResponse = JSON.parseObject(response); // if (jsonResponse.getString("errorCode").equals("401")) { // // } // }catch (Exception e){ // e.printStackTrace(); // } // if (Cools.isEmpty(param)) { // return R.parse(BaseRes.PARAM); // } // MatSyncParam matSyncParam = new MatSyncParam(); // List<MatSyncParam.MatParam> objects = new ArrayList<>(); // objects.add(param); // matSyncParam.matDetails = objects; // openService.syncMat(matSyncParam); return R.ok().add(list); return openService.stationAll(); } /** @@ -461,16 +443,32 @@ * return */ @PostMapping("/comb/auth") public synchronized R comb(@RequestBody ArrayList<HashMap<String,Object>> param){ System.out.println(param); // if (Cools.isEmpty(param)) { // return R.parse(BaseRes.PARAM); public synchronized R comb(@RequestBody ArrayList<MesToCombParam> param){ for (MesToCombParam mesToCombParam : param) { // 判断是否有相同条码的数据 if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>(). eq("zpallet", mesToCombParam.getPalletId()).eq("io_status", "N")) > 0) { return R.error(mesToCombParam.getPalletId()+"-该托盘码已经存在组托档中"); } if (mesToCombParam.getPalletId().length() != 8) { return R.error(mesToCombParam.getPalletId()+"-该托盘码不为8位"); } // if (param.getCombMats().size()>1){ // throw new CoolException("不允许混料===>>" + param.getBarcode()); // } // MatSyncParam matSyncParam = new MatSyncParam(); // List<MatSyncParam.MatParam> objects = new ArrayList<>(); // objects.add(param); // matSyncParam.matDetails = objects; // openService.syncMat(matSyncParam); int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", mesToCombParam.getPalletId())); int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet", mesToCombParam.getPalletId())); // int countwait = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("zpallet",param.getPalletId())); if (countLoc > 0 || countWrk > 0) { return R.error(mesToCombParam.getPalletId()+"-工作档/库存条码数据已存在"); } } for (MesToCombParam mesToCombParam : param) { openService.mesToComb(mesToCombParam); } return R.ok(); } @@ -479,8 +477,10 @@ */ @PostMapping("/outOrder") public synchronized R outOrder (@RequestBody ArrayList<HashMap<String,Object>> param){ System.out.println(param); public synchronized R outOrder (@RequestBody ArrayList<OutTaskParam> params){ for (OutTaskParam outTaskParam : params) { openService.outOrder(outTaskParam); } return R.ok(); } src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -44,6 +44,12 @@ @TableField("order_no") private String orderNo; @ApiModelProperty(value= "建议入库区域:堆垛机号") private String origin; @ApiModelProperty(value= "库位编码,若有,则存储到指定库位。为后续分区预留") private String manu; @ApiModelProperty(value= "规格") private String specs; @@ -70,12 +76,6 @@ @ApiModelProperty(value= "条码") private String barcode; @ApiModelProperty(value= "产地") private String origin; @ApiModelProperty(value= "厂家") private String manu; @ApiModelProperty(value= "生产日期") @TableField("manu_date") src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -112,6 +112,14 @@ @TableField("loc_sts") private String locSts; @ApiModelProperty(value= "订单号") @TableField("user_no") private String userNo; @ApiModelProperty(value= "出库顺序") @TableField("plt_type") private Integer pltType; /** * 拣料 */ @@ -137,9 +145,6 @@ @TableField("exit_mk") private String exitMk; @ApiModelProperty(value= "") @TableField("plt_type") private Integer pltType; /** * 空板 @@ -169,10 +174,6 @@ @ApiModelProperty(value= "") @TableField("mtn_type") private Double mtnType; @ApiModelProperty(value= "") @TableField("user_no") private String userNo; /** * 堆垛机启动时间 src/main/java/com/zy/asrs/entity/param/MesToCombParam.java
New file @@ -0,0 +1,32 @@ package com.zy.asrs.entity.param; import io.swagger.models.auth.In; import lombok.Data; @Data public class MesToCombParam { //托盘编码 private String palletId; //物料编号 private String matnr; //入库数量 private Double anfme; //进仓编号 private String entryWmsCode; //po单号 private String orderId; //批号 private String batchId; //货物状态,枚举:0 正常;1 异常; private Integer status; //是否满板,0 空板;1 满板;2 半板; private Integer full; //建议入库区域,枚举,1 A库;2 B库;3 C库;或某个巷道; private String storageArea; //库位编码,若有,则存储到指定库位。为后续分区预留 private String locId; //操作类型,1 组托;2 组托解绑; private Integer operateType; //唯一码 private String BizNo; } src/main/java/com/zy/asrs/entity/param/OutTaskParam.java
New file @@ -0,0 +1,21 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class OutTaskParam { //出库顺序,从1开始 private Integer seq; //托盘编码 private String palletId; //出库口编码 private String stationId; //物料编码 private String matnr; //入库数量 private double anfme; //进仓编号 private String entryWmsCode; //出库单号 private String orderId; } src/main/java/com/zy/asrs/entity/param/StationParam.java
New file @@ -0,0 +1,15 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class StationParam { //站点编号 private String stationId; //站点进出类型 private String stationType; //站点名称 private String stationName; //操作类型:1 新增;2 修改;3 禁用;4 反禁用; private Integer operateType; } src/main/java/com/zy/asrs/service/OpenService.java
@@ -1,5 +1,6 @@ package com.zy.asrs.service; import com.core.common.R; import com.zy.asrs.entity.WrkDetl; import com.zy.asrs.entity.param.*; import com.zy.asrs.entity.result.OpenOrderCompeteResult; @@ -60,4 +61,19 @@ boolean agvBindAndBin(String taskNo); boolean taskArmOrderResult(OrderArmEndParam param); List<PickWrkDetlListParam> getPickList(PdaPickListParam param); /** * 输出所有入库站和出库站站点 * @return */ R stationAll (); /** * mes发组托档给到wms */ R mesToComb(MesToCombParam param); /** * */ R outOrder(OutTaskParam param); } src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -3,10 +3,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SnowflakeIdWorker; import com.core.common.SpringUtils; import com.core.common.*; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.*; @@ -21,20 +18,20 @@ import com.zy.common.constant.AgvConstant; import com.zy.common.constant.ArmConstant; import com.zy.common.model.DetlDto; import com.zy.common.model.LocDetlDto; import com.zy.common.model.enums.WorkNoType; import com.zy.common.service.CommonService; import com.zy.common.utils.HttpHandler; import com.zy.common.utils.NodeUtils; import com.zy.erp.kingdee.utils.PostMesDataUtils; 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 javax.rmi.CORBA.Util; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.*; /** * Created by vincent on 2022/4/9 @@ -79,6 +76,19 @@ private LocMastServiceImpl locMastService; @Autowired private WrkDetlService wrkDetlService; @Autowired private BasDevpServiceImpl basDevpService; @Autowired private StaDescServiceImpl staDescService; @Value("${mes.url}") private String mesUrl; @Value("${mes.stationaddress}") private String stationAddress; @Autowired private WaitPakinService waitPakinService; @Autowired private WrkMastService wrkMastService; @Override @Transactional public void pakinOrderCreate(OpenOrderPakinParam param) { @@ -914,6 +924,7 @@ throw new CoolException("未能绑定"); } } @Override @Transactional public List<PickWrkDetlListParam> getPickList(PdaPickListParam param) { @@ -952,6 +963,7 @@ return result; } @Override @Transactional @@ -1043,11 +1055,10 @@ } catch (Exception e) { throw new CoolException(e.getMessage()); } } else {} } else { } return true; } @Override @@ -1124,7 +1135,8 @@ agvBindCtnrAndBinTwoParam.setReqCode(String.valueOf(snowflakeIdWorker.nextId())); agvBindCtnrAndBinTwoParam.setPodcode(basAgvMast.getBarcode()); agvBindCtnrAndBinTwoParam.setPositionCode(basAgvMast.getStaNo().toString()); agvBindCtnrAndBinTwoParam.setIndBind("0");; agvBindCtnrAndBinTwoParam.setIndBind("0"); ; ReturnT<String> resultBind = new PostMesDataUtils().postMesDataArmGrating("AGV容器解绑", AgvConstant.AGV_URL+"/"+AgvConstant.AGV_hikRpcService,AgvConstant.getAGVADAPTOR(2), agvBindCtnrAndBinTwoParam); if (resultBind.getCode()!=1){ @@ -1138,6 +1150,176 @@ } @Override @Transactional public R stationAll() { List<StationParam> stationParams = new ArrayList<>(); List<BasDevp> basDevps = basDevpService.selectList(new EntityWrapper<BasDevp>()); for (BasDevp basDevp : basDevps) { StationParam stationParam = new StationParam(); Boolean boo1 = false; Boolean boo2 = false; StaDesc staDescIn = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("stn_no", basDevp.getDevNo()).eq("type_no", 1)); if (!Cools.isEmpty(staDescIn)) { stationParam.setStationId(basDevp.getDevNo() + ""); stationParam.setStationType("1"); stationParam.setStationName(basDevp.getDevNo() + ""); stationParam.setOperateType(1); boo1 = true; } StaDesc staDescOut = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("stn_no", basDevp.getDevNo()).eq("type_no", 101)); if (!Cools.isEmpty(staDescOut)) { stationParam.setStationId(basDevp.getDevNo() + ""); stationParam.setStationType("1"); stationParam.setStationName(basDevp.getDevNo() + ""); stationParam.setOperateType(2); if (boo1) { stationParam.setOperateType(3); } boo2 = true; } if (boo1 || boo2) { stationParams.add(stationParam); } } String response = ""; try { //获取Cookie值 HashMap<String, Object> headers = new HashMap<>(); // headers.put("accesstoken", erpSecret.getAccessToken()); // headers.put("x-acgw-identity", xAcfwIdentity); // 自定义请求头 response = new HttpHandler.Builder() .setHeaders(headers) .setUri(mesUrl) .setPath(stationAddress) .setJson(JSON.toJSONString(stationParams)) .build() .doPost(); JSONObject jsonResponse = JSON.parseObject(response); if (jsonResponse.getInteger("code") == 200) { } else { return R.error(); } } catch (Exception e) { e.printStackTrace(); } return R.ok(); } @Override public R mesToComb(MesToCombParam param) { if (Cools.isEmpty(param.getPalletId())) { throw new CoolException(BaseRes.PARAM); } Date now = new Date(); Mat mat = matService.selectByMatnr(param.getMatnr()); if (Cools.isEmpty(mat)) { if (param.getFull()==1){ //满托盘 mat = matService.selectByMatnr("1"); }else if (param.getFull()==0){ //空托盘 mat = matService.selectByMatnr("0"); } } WaitPakin waitPakin = new WaitPakin(); waitPakin.sync(mat); waitPakin.setBatch(String.valueOf(param.getBatchId())); waitPakin.setZpallet(param.getPalletId()); // 托盘码 waitPakin.setIoStatus("N"); // 入出状态 waitPakin.setAnfme(param.getAnfme()); // 数量 waitPakin.setStatus("Y"); // 状态 waitPakin.setAppeUser(9995L); waitPakin.setAppeTime(now); waitPakin.setModiUser(9995L); waitPakin.setModiTime(now); waitPakin.setOrderNo(String.valueOf(param.getOrderId())); waitPakin.setOrigin(String.valueOf(param.getStorageArea()));//建议入库区域 waitPakin.setManu(String.valueOf(param.getLocId()));//mes具体库位编号 waitPakin.setThreeCode(param.getBizNo()); if (!waitPakinService.insert(waitPakin)) { throw new CoolException("保存入库通知档失败"); } return null; } @Override public R outOrder(OutTaskParam param) { LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "F").eq("barcode", param.getPalletId())); if (locMast == null) { return R.error("没有找到托盘码="+param.getPalletId()+"对应的库位"); } Integer ioType = 101; // 获取路径 StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), Integer.valueOf(param.getStationId())); Date now = new Date(); // 生成工作号 int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType)); // 生成工作档 WrkMast wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(now); wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID wrkMast.setIoType(ioType); // 入出库状态 wrkMast.setIoPri(13D); // 优先级:13 wrkMast.setCrnNo(locMast.getCrnNo()); wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站 wrkMast.setStaNo(staDesc.getStnNo()); // 目标站 wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位 wrkMast.setBarcode(locMast.getBarcode()); wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); wrkMast.setUserNo(param.getOrderId());//订单号 wrkMast.setPltType(param.getSeq());//出库顺序,从1开始 wrkMast.setTakeNone("0"); //0非自动 wrkMast.setAppeUser(9995L); // 操作人员数据 wrkMast.setAppeTime(now); wrkMast.setModiUser(9995L); wrkMast.setModiTime(now); if (!wrkMastService.insert(wrkMast)) { throw new CoolException("保存工作档失败,出库库位号:"+locMast.getLocNo()); } List<LocDetl> locNo = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo())); if (locNo == null || locNo.size() == 0) { throw new CoolException("查询库存明细失败,出库库位号:"+locMast.getLocNo()); } // 生成工作档明细 for (LocDetl locDetl : locNo) { WrkDetl wrkDetl = new WrkDetl(); wrkDetl.sync(locDetl); wrkDetl.setOrderNo(param.getOrderId()); // 手动出库不需要带出库存中的单据编号 wrkDetl.setWrkNo(workNo); wrkDetl.setIoTime(now); Double anfme = locDetl.getAnfme(); wrkDetl.setAnfme(anfme); // 数量 wrkDetl.setAppeTime(now); wrkDetl.setAppeUser(9995L); wrkDetl.setModiTime(now); wrkDetl.setModiUser(9995L); if (!wrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作档明细失败"); } } // 修改库位状态: F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中 locMast = locMastService.selectById(locMast.getLocNo()); if (locMast.getLocSts().equals("F")) { locMast.setLocSts("R"); locMast.setModiUser(9995L); locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("预约库位状态失败,库位号:"+locMast.getLocNo()); } } else { log.error(locMast.getLocNo() + "库位不是在库状态"); throw new CoolException(locMast.getLocNo() + "库位不是在库状态"); } return R.ok(); } } src/main/java/com/zy/asrs/task/ArmRulesScheduler.java
File was deleted src/main/java/com/zy/asrs/task/AutomaticallyIssueWCSTasksScheduler.java
New file @@ -0,0 +1,42 @@ package com.zy.asrs.task; 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.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.Date; import java.util.List; @Component public class AutomaticallyIssueWCSTasksScheduler { private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class); @Autowired private WrkMastService wrkMastService; @Autowired private WorkMastHandler workMastHandler; @Scheduled(cron = "0/3 * * * * ? ") private void execute(){ List<WrkMast> wrkMasts = wrkMastService.selectToBeCompleteData(); if (wrkMasts.isEmpty()) { return; } for (WrkMast wrkMast : wrkMasts) { ReturnT<String> returnT = workMastHandler.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/OrderToSortLineScheduler.java
@@ -1,13 +1,11 @@ package com.zy.asrs.task; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.OrderToLine; import com.zy.asrs.service.*; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.OrderToLineHandler; import com.zy.asrs.utils.ToSortLineUtils; import com.zy.asrs.utils.param.ItemUtilParam; import lombok.extern.slf4j.Slf4j; src/main/java/com/zy/asrs/task/WorkLogScheduler.java
@@ -41,14 +41,6 @@ return; } for (WrkMast wrkMast : wrkMasts) { if(wrkMast.getIoType() != 11 && wrkMast.getStaNo() < 4000 && wrkMast.getWrkNo() != 9997 && wrkMast.getWrkNo() != 9996){ if(Cools.isEmpty(wrkMast.getSheetNo()) || !wrkMast.getSheetNo().equals("2")){ continue; } } if (!Cools.isEmpty(wrkMast.getTakeNone()) && wrkMast.getTakeNone().equals("1")){ continue; } ReturnT<String> result = workLogHandler.start(wrkMast); if (!result.isSuccess()) { log.error("工作档[workNo={}]历史档处理失败", wrkMast.getWrkNo()); src/main/java/com/zy/asrs/task/WrkMastAgvScheduler.java
File was deleted src/main/java/com/zy/asrs/task/WrkMastStaInItScheduler.java
File was deleted src/main/java/com/zy/asrs/task/WrkMastStaLogScheduler.java
File was deleted src/main/java/com/zy/asrs/task/handler/ArmRulesHandler.java
File was deleted src/main/java/com/zy/asrs/task/handler/AutomaticallyIssueWCSTasksHandler.java
New file @@ -0,0 +1,20 @@ package com.zy.asrs.task.handler; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Slf4j @Service @Transactional public class AutomaticallyIssueWCSTasksHandler extends AbstractHandler<String> { public ReturnT<String> start(WrkMast wrkMast) { return SUCCESS; } } src/main/java/com/zy/asrs/task/handler/OrderToLineHandler.java
File was deleted src/main/java/com/zy/asrs/task/handler/WrkMastAgvHandler.java
File was deleted src/main/java/com/zy/asrs/task/handler/WrkMastStaInItHandler.java
File was deleted src/main/java/com/zy/asrs/task/handler/WrkMastStaLogHandler.java
File was deleted src/main/resources/application.yml
@@ -79,19 +79,11 @@ comb: limit: 5000 #arm对接 arm: # 地址 address: URL: http://10.10.10.171:7002 #根据参数获取码垛数量 QuantityOfPalletizing: adaptor/api/wcs/getPalletizingNumber #分拣线对接 line: # 地址 address: URL: http://10.10.10.244:8080 PATH: orderPakInAll #mes对接 mes: url: 127.0.0.1:8080 #站点获取接口 stationaddress: 123 #erp对接 erp: