src/main/java/com/zy/asrs/controller/MobileController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/entity/param/PdckqrParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/MobileService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -554,4 +554,13 @@ return R.ok("复核确认成功"); } @PostMapping("/pdckqr/auth") @ManagerAuth(memo = "盘点出库确认") public synchronized R pdckqr(@RequestBody PdckqrParam param) { // 根据工作号确认复核 if(Cools.isEmpty(param) || Cools.isEmpty(param.getWorkNo()) || Cools.isEmpty(param.getMaterials())){ return R.parse(BaseRes.PARAM); } return mobileService.pdckqr(param); } } src/main/java/com/zy/asrs/entity/param/PdckqrParam.java
New file @@ -0,0 +1,31 @@ package com.zy.asrs.entity.param; import lombok.Data; import java.util.List; /** * @author pang.jiabao * @description 盘点出库确认 * @createDate 2024/7/18 16:23 */ @Data public class PdckqrParam { private Integer workNo; private List<Material> materials; @Data public static class Material { /** * 卷号 */ private String rollNo; /** * 箱号 */ private String boxNo; } } src/main/java/com/zy/asrs/service/MobileService.java
@@ -1,6 +1,7 @@ package com.zy.asrs.service; import com.alibaba.fastjson.JSONObject; import com.core.common.R; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.LocDetl; import com.zy.asrs.entity.OrderDetl; @@ -48,4 +49,11 @@ * 出库复核确认 */ void pakoutFhqr(Integer workNo, Integer check); /** * 盘点出库确认 * @param param 扫描信息 * @return 200成功,其他失败 */ R pdckqr(PdckqrParam param); } src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -4,10 +4,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.BaseRes; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SnowflakeIdWorker; import com.core.common.*; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.*; @@ -27,6 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; /** @@ -85,7 +83,11 @@ private TagService tagService; @Autowired private BasBoxTypeService basBoxTypeService; @Autowired private WrkMastLogService wrkMastLogService; @Resource private OpenServiceImpl openServiceImpl; @Override @Transactional @@ -1185,6 +1187,98 @@ @Override @Transactional public R pdckqr(PdckqrParam param) { WrkMast wrkMast = wrkMastService.selectById(param.getWorkNo()); if (wrkMast == null) { throw new CoolException("工作档不存在:" + param.getWorkNo()); } if (wrkMast.getIoType() != 107 || wrkMast.getWrkSts() != 2) { throw new CoolException(param.getWorkNo() + "工作档类型:" + wrkMast.getIoType() + "工作状态:" + wrkMast.getWrkSts() + ",不匹配"); } List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(param.getWorkNo()); List<PdckqrParam.Material> materials = param.getMaterials(); boolean isFullyCancelled = compareAndCheckCancellation(wrkDetls, materials); if (isFullyCancelled) { // 盘点物料确成功,工作档转换 盘点出库->盘点再入库,下发回库命令 // 保存工作主档历史档 if (!wrkMastLogService.save(wrkMast.getWrkNo())) { throw new CoolException("保存工作主档历史档失败"); } // 获取目标站 Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() .eq("type_no", wrkMast.getIoType() - 50) .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站 .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 StaDesc staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)) { throw new CoolException("入库路径不存在"); } Date now = new Date(); // 堆垛机站点(目标站) Integer staNo = staDesc.getCrnStn(); // 更新工作档数据状态 wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57 wrkMast.setWrkSts(14L); // 工作状态: 14.已出库未确认 wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站 wrkMast.setStaNo(staNo); // 目标站 wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位 wrkMast.setSourceLocNo(""); // 源库位清空 wrkMast.setModiTime(now); if (!wrkMastService.updateById(wrkMast)) { throw new CoolException("更新工作档数据状态失败"); } // 修改库位状态 Q.拣料/盘点/并板再入库 LocMast locMast = locMastService.selectById(wrkMast.getLocNo()); locMast.setLocSts("Q"); locMast.setModiTime(now); if (!locMastService.updateById(locMast)) { throw new CoolException("修改库位状态失败"); } // 推送给gwcs执行命令 openServiceImpl.pushStaNoToGwcs(wrkMast.getSourceStaNo(),wrkMast.getStaNo(),wrkMast.getWrkNo()); return R.ok("盘点确认成功"); } else { // 物料不一致 // todo 不一致的处理处理方法待定 } return R.error("盘点确认异常"); } /** * 比较两个集合的类的属性,相同则抵消,最后判断两个集合是否完全抵消 */ public boolean compareAndCheckCancellation(List<WrkDetl> list1, List<PdckqrParam.Material> list2) { if (list1.size() != list2.size()) { return false; // If lists are not of the same size, cancellation is not possible } List<PdckqrParam.Material> remainingList2 = new ArrayList<>(list2); // Compare and cancel out elements for (WrkDetl p1 : list1) { boolean cancelled = false; for (PdckqrParam.Material p2 : remainingList2) { if (p1.getBatch().equals(p2.getBoxNo()) && p1.getModel().equals(p2.getRollNo())) { // 卷号和箱号相同 remainingList2.remove(p2); cancelled = true; break; } } if (!cancelled) { return false; // If any element in list1 cannot be cancelled, return false } } return remainingList2.isEmpty(); // Return true if all elements in list1 were cancelled out } @Override @Transactional public List<Map<String, Object>> boxTypeComb() { EntityWrapper<BasBoxType> wrapper = new EntityWrapper<>(); List<Map<String, Object>> result = new ArrayList<>(); src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.R; @@ -1352,14 +1353,23 @@ if (!wrkMastLogService.save(wrkMast.getWrkNo())) { throw new CoolException("保存工作主档历史档失败"); } // 获取目标站 Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>() .eq("type_no", wrkMast.getIoType() - 50) .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站 .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号 StaDesc staDesc = staDescService.selectOne(wrapper); if (Cools.isEmpty(staDesc)) { throw new CoolException("入库路径不存在"); } // 堆垛机站点(目标站) Integer staNo = staDesc.getCrnStn(); // 更新工作类型103->53 wrkMast.setIoType(53); wrkMast.setWrkSts(52L); // 工作状态42->52.设备上走(拆垛完成) Integer staNo = wrkMast.getStaNo(); // 目标站点源站点转换 wrkMast.setStaNo(wrkMast.getSourceStaNo()); wrkMast.setSourceStaNo(staNo); wrkMast.setSourceStaNo(wrkMast.getStaNo()); wrkMast.setStaNo(staNo); // 目标库位=源库位 wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 源库位清除 @@ -1417,7 +1427,7 @@ return wrkDetls.size() > 1 ? 0 : 1; // 一条记录就是一卷 } private void pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo) { public void pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo) { boolean success = false; // 获取请求头 Map<String, Object> headers = getHeaders(); @@ -1456,10 +1466,10 @@ // 保存接口日志 apiLogService.save( "入库", MesConstant.URL + MesConstant.PAKIN_URL, MesConstant.GWCS_IP_PORT + MesConstant.GWCS_FPKW_URL, null, "127.0.0.1", jsonObject.toJSONString(), body, response, success );