src/main/java/com/zy/asrs/controller/OpenController.java
@@ -192,6 +192,23 @@ return R.ok(openService.emptyOutLoc(param)); } @PostMapping("/zpckdw") @AppAuth(memo = "组盘桁架gwcs告诉zwms货物到位,zmws告诉gwcs怎么拆") public synchronized R zphjDw(@RequestHeader(required = false) String appkey, @RequestBody ZphjckdwParam param, HttpServletRequest request) { auth(appkey, param, request); return openService.zphjDw(param); } @PostMapping("/cdwc") @AppAuth(memo = "组盘桁架拆垛完成gwcs请求zwms") public synchronized R zphjCdwc(@RequestHeader(required = false) String appkey, @RequestBody ZphjcdwcParam param, HttpServletRequest request) { auth(appkey, param, request); return openService.zphjCdwc(param); } // @PostMapping("/cpjck") // @AppAuth(memo = "物料信息获取") // public synchronized R emptyOutLoc(@RequestHeader(required = false) String appkey, src/main/java/com/zy/asrs/entity/param/ZphjcdwcParam.java
New file @@ -0,0 +1,15 @@ package com.zy.asrs.entity.param; import lombok.Data; /** * @author pang.jiabao * @description 组盘桁架拆垛完成 * @createDate 2024/7/16 9:37 */ @Data public class ZphjcdwcParam { private Integer workNo; // 工作号 } src/main/java/com/zy/asrs/entity/param/ZphjckdwParam.java
New file @@ -0,0 +1,15 @@ package com.zy.asrs.entity.param; import lombok.Data; /** * @author pang.jiabao * @description 组盘桁架出库到位 * @createDate 2024/7/16 9:36 */ @Data public class ZphjckdwParam { private Integer workNo; // 工作号 } src/main/java/com/zy/asrs/entity/result/ZphjcdgzVo.java
New file @@ -0,0 +1,17 @@ package com.zy.asrs.entity.result; import lombok.Data; /** * @author pang.jiabao * @description 返回组盘桁架拆垛规则 * @createDate 2024/7/16 9:37 */ @Data public class ZphjcdgzVo { private Integer workNo; // 工作号 private String position; // 要拆的位置,左或右 } src/main/java/com/zy/asrs/entity/result/ZphjcdwcVo.java
New file @@ -0,0 +1,21 @@ package com.zy.asrs.entity.result; import lombok.Data; /** * @author pang.jiabao * @description 拆垛完成,返回给gwcs执行命令(回库和出库) * @createDate 2024/7/16 13:46 */ @Data public class ZphjcdwcVo { private int workNo; // 任务号 private int sourceStaNo; // 源站点 private int staNo; // 目标站点 private int descFlag; // 拆垛出来托盘出库路径 } src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -27,6 +27,10 @@ int updateAnfme(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch); int deleteItem2(@Param("locNo")String locNo, @Param("model")String model, @Param("batch")String batch); int updateAnfme2(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("model")String model, @Param("batch")String batch); List<LocDetl> getStockOutPage(Map<String, Object> map); Integer getStockOutPageCount(Map<String, Object> map); src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -6,7 +6,6 @@ import com.zy.asrs.entity.result.StockVo; import java.util.List; import java.util.Map; import java.util.Set; public interface LocDetlService extends IService<LocDetl> { @@ -21,6 +20,10 @@ * 修改库存明细数量,如果数量为0,则删除记录 */ boolean updateAnfme(Double anfme, String locNo, String matnr, String batch); /** * 修改库存明细数量,如果数量为0,则删除记录 */ boolean updateAnfme2(Double anfme, String locNo, String model, String batch); boolean updateLocNo(String newLocNo, String oldLocNo); src/main/java/com/zy/asrs/service/OpenService.java
@@ -85,4 +85,14 @@ * 拆盘机出库接口(空托盘出库) */ String emptyOutLoc(GhjtApiParam param); /** * 组盘桁架gwcs告诉zwms货物到位,zmws告诉gwcs怎么拆 */ R zphjDw(ZphjckdwParam param); /** * 组盘桁架拆垛完成gwcs请求zwms */ R zphjCdwc(ZphjcdwcParam param); } src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -37,6 +37,14 @@ } } @Override public boolean updateAnfme2(Double anfme, String locNo, String model, String batch) { if (anfme <= 0) { return this.baseMapper.deleteItem2(locNo, model, batch) > 0; } else { return baseMapper.updateAnfme2(anfme, locNo, model, batch) > 0; } } @Override public boolean updateLocNo(String newLocNo, String oldLocNo) { src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -11,6 +11,8 @@ import com.zy.asrs.entity.param.*; import com.zy.asrs.entity.result.OpenOrderCompeteResult; import com.zy.asrs.entity.result.StockVo; import com.zy.asrs.entity.result.ZphjcdgzVo; import com.zy.asrs.entity.result.ZphjcdwcVo; import com.zy.asrs.mapper.TagMapper; import com.zy.asrs.service.*; import com.zy.asrs.utils.MatUtils; @@ -28,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; import java.util.stream.Collectors; /** * Created by vincent on 2022/4/9 @@ -69,6 +72,8 @@ @Autowired private WrkDetlSingleService wrkDetlSingleService; @Autowired private WrkMastLogService wrkMastLogService; @Autowired private WrkMastStaService wrkMastStaService; @Autowired private WrkMastStaLogService wrkMastStaLogService; @@ -76,6 +81,8 @@ private StaDescService staDescService; @Autowired private LocMastService locMastService; @Autowired private ApiLogService apiLogService; @Override @Transactional @@ -1295,8 +1302,120 @@ return "出库成功"; } @Autowired private ApiLogService apiLogService; @Override @Transactional public R zphjDw(ZphjckdwParam param) { // 根据任务号得到工作主档 if (Cools.isEmpty(param.getWorkNo())) { throw new CoolException("工作号不能为空!"); } WrkMast wrkMast = wrkMastService.selectById(param.getWorkNo()); if (wrkMast == null) { throw new CoolException("工作档不存在!"); } if (wrkMast.getWrkSts() != 2 || wrkMast.getIoType() != 103) { throw new CoolException("工作档当前状态不为2/出库类型不为拣料!"); } // 更新工作档状态2.设备上走->42.等待码垛 wrkMast.setWrkSts(42L); wrkMastService.updateById(wrkMast); // 查询要拆的位置,只有一个 List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); List<String> collect = wrkDetls.stream().map(WrkDetl::getOrigin).distinct().collect(Collectors.toList()); String position = collect.get(0); // 返回拆垛规则 ZphjcdgzVo zphjcdgzVo = new ZphjcdgzVo(); zphjcdgzVo.setWorkNo(wrkMast.getWrkNo()); zphjcdgzVo.setPosition(position); return R.ok(zphjcdgzVo); } @Override @Transactional public R zphjCdwc(ZphjcdwcParam param) { if (Cools.isEmpty(param.getWorkNo())) { throw new CoolException("工作号不能为空!"); } WrkMast wrkMast = wrkMastService.selectById(param.getWorkNo()); if (wrkMast == null) { throw new CoolException("工作档不存在!"); } if (wrkMast.getWrkSts() != 42 || wrkMast.getIoType() != 103) { throw new CoolException("工作档当前状态不为42/出库类型不为拣料!"); } // 保存工作主档历史档 if (!wrkMastLogService.save(wrkMast.getWrkNo())) { throw new CoolException("保存工作主档历史档失败"); } // 更新工作类型103->53 wrkMast.setIoType(53); wrkMast.setWrkSts(52L); // 工作状态42->52.设备上走(拆垛完成) Integer staNo = wrkMast.getStaNo(); // 目标站点源站点转换 wrkMast.setStaNo(wrkMast.getSourceStaNo()); wrkMast.setSourceStaNo(staNo); // 目标库位=源库位 wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 源库位清除 wrkMast.setSourceLocNo(""); wrkMast.setModiTime(new Date()); int outStaNo = 0; // 出库源站点 if (staNo == 3044 || staNo == 3045) { outStaNo = 3046; } else if(staNo == 3040 || staNo == 3041) { outStaNo = 3042; } if (outStaNo == 0) { throw new CoolException("出库源站点转换有误:" + staNo); } // 获取出库物料 List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); int descFlag = getType(wrkDetls); // get0原托盘回流信息,get1拆垛出来物料出库信息 List<ZphjcdwcVo> zphjcdwcVos = new ArrayList<>(); ZphjcdwcVo zphjcdwcVo1 = new ZphjcdwcVo(); zphjcdwcVo1.setWorkNo(wrkMast.getWrkNo()); zphjcdwcVo1.setStaNo(wrkMast.getStaNo()); zphjcdwcVo1.setSourceStaNo(wrkMast.getSourceStaNo()); zphjcdwcVos.add(zphjcdwcVo1); ZphjcdwcVo zphjcdwcVo2 = new ZphjcdwcVo(); zphjcdwcVo2.setSourceStaNo(outStaNo); zphjcdwcVo2.setStaNo(3106); // 3106/3077 zphjcdwcVo2.setDescFlag(descFlag); zphjcdwcVos.add(zphjcdwcVo2); // 更新工作主档 wrkMastService.updateById(wrkMast); // 修改库位状态 Q.拣料/盘点/并板再入库 LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); locMast.setLocSts("Q"); locMast.setModiTime(new Date()); if (!locMastService.updateById(locMast)) { throw new CoolException("修改库位状态失败"); } // 下发回库的目标站点和拆垛的出库目标站点给gwcs return R.ok(zphjcdwcVos); } /** * 根据出库物料明细判断是否去贴标(单卷贴标,多卷不贴标) * @param wrkDetls 物料明细 * @return 0.多卷不贴标路径,1.单卷贴标路径 */ private int getType(List<WrkDetl> wrkDetls) { return wrkDetls.size() > 1 ? 0 : 1; // 一条记录就是一卷 } private void pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo) { boolean success = false; src/main/java/com/zy/asrs/task/GhjtScheduler.java
@@ -7,6 +7,7 @@ import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.task.handler.GhjtHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -31,10 +32,10 @@ private OrderMapper orderMapper; // 下发出库任务给GWCS(从出库码头到出库口) // @Scheduled(cron = "0/2 * * * * ? ") @Scheduled(cron = "0/2 * * * * ? ") public void ckrwPushGwcs() { // 查询状态为13的工作档 List<WrkMast> wrkMasts = wrkMastMapper.selectList(new EntityWrapper<WrkMast>().eq("io_type", 101).eq("wrk_sts", 13)); List<WrkMast> wrkMasts = wrkMastMapper.selectList(new EntityWrapper<WrkMast>().in("io_type", 101,103,107,110).eq("wrk_sts", 13)); for (WrkMast wrkMast : wrkMasts) { try { ghjtHandler.startCkrwPushGwcs(wrkMast); src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -61,7 +61,7 @@ } } @Scheduled(cron = "0/3 * * * * ? ") // @Scheduled(cron = "0/3 * * * * ? ") private void execute202(){ BasDevp basDevp = basDevpService.selectById(144); if (basDevp.getWrkNo()!=0 && basDevp.getLoading().equals("Y")){ src/main/java/com/zy/asrs/task/handler/GhjtHandler.java
@@ -1,13 +1,16 @@ package com.zy.asrs.task.handler; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.WrkDetl; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.OrderMapper; import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.WrkDetlService; import com.zy.common.constant.MesConstant; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; @@ -17,7 +20,9 @@ import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * @author pang.jiabao @@ -37,6 +42,9 @@ @Resource private WrkMastMapper wrkMastMapper; @Resource private WrkDetlService wrkDetlService; @Transactional public void startCkrwPushGwcs(WrkMast wrkMast) { @@ -44,11 +52,15 @@ Map<String, Object> headers = new HashMap<>(); headers.put("Content-Type", "application/json;charset=UTF-8"); // 下发给gwcs要走的路径标识 int descFlag = getDescToGwcs(wrkMast); // 构造请求体 JSONObject jsonObject = new JSONObject(); jsonObject.put("workNo", wrkMast.getWrkNo()); jsonObject.put("staNo", wrkMast.getStaNo()); jsonObject.put("sourceStaNo", wrkMast.getSourceStaNo()); jsonObject.put("descFlag", descFlag); // 101出库时用,0只有一条路径,1理货贴标路径,2贴标打带路径 String body = jsonObject.toJSONString(); boolean success = false; @@ -89,6 +101,30 @@ } } /** * 全板出库到3077或3106的任务,判断出库要走的路径 * @param wrkMast 工作主档 * @return 0.只有一条路径,1.理货贴标出库路径,2.贴标打带出库路径 */ private int getDescToGwcs(WrkMast wrkMast) { int flag = 0; if (wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 3077 || wrkMast.getStaNo() == 3106)) { List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo())); // 出的物料有几个位置 List<String> collect = wrkDetls.stream().map(WrkDetl::getOrigin).distinct().collect(Collectors.toList()); if (collect.size() == 1) { // 一箱 if (wrkDetls.size() == 1) { // 一卷去贴标 flag = 1; } else { // 多卷直接出 } } else if(collect.size() == 2) { // 两箱去贴标打带 flag = 2; } } return flag; } @Transactional public void OutBoundCompleteReport(Order order) { src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -157,9 +157,14 @@ } for (WrkDetl wrkDetl : wrkDetls53) { LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch()); // LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch()); // 箱号+卷号 LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("batch",wrkDetl.getBatch()) .eq("model",wrkDetl.getModel())); if (null != locDetl) { if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) { // if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) { if (!locDetlService.updateAnfme2(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getModel(), wrkDetl.getBatch())) { // exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo()); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg("拣料入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]"); src/main/resources/mapper/LocDetlMapper.xml
@@ -84,6 +84,23 @@ and matnr = #{matnr} <include refid="batchSeq"></include> </update> <delete id="deleteItem2"> delete from asr_loc_detl where 1=1 and loc_no = #{locNo} and model = #{model} <include refid="batchSeq"></include> </delete> <update id="updateAnfme2"> update asr_loc_detl set anfme = #{anfme} , modi_time = getdate() where 1=1 and loc_no = #{locNo} and model = #{model} <include refid="batchSeq"></include> </update> <sql id="stockOutCondition"> <if test="loc_no!=null and loc_no!='' ">