| src/main/java/com/zy/asrs/entity/DocType.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/entity/param/OrderMesXGHYParam.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/mapper/WrkMastMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/WrkMastService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/task/OrderSyncScheduler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/OrderMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/WrkMastMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/zy/asrs/entity/DocType.java
@@ -189,5 +189,30 @@ } public String getDocName$(String outOrIn){ if (Cools.isEmpty(this.docName)){ if (outOrIn.equals("out")){ return "成品出库"; } else { return "成品入库"; } }else { switch (this.docName){ case "拆包装检出库": case "退货入库": return this.docName; case "组货单": return "成品出库"; default: if (outOrIn.equals("out")){ return "成品出库"; } else { return "成品入库"; } } } } } src/main/java/com/zy/asrs/entity/param/OrderMesXGHYParam.java
New file @@ -0,0 +1,195 @@ package com.zy.asrs.entity.param; import com.core.common.DateUtils; import com.zy.asrs.entity.WrkDetl; import lombok.Data; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /* * Created by Monkey D. Luffy on 2025.10.28 * */ @Data public class OrderMesXGHYParam { private String barcode ; //托盘条码(徐工时间戳) = snowflakeIdWorker.nextId() zpallet private int palletizingNo; //码垛位编号(位置) private List<Box> matList; //木箱集合 @Data public static class Box { private String packageGroupNo; //包装组号(徐工没有,只有箱号卷号一对一) //null private String outOrIn; //out 出;in入; /* * 接口1=》不合格品出库二楼: 不合格品出库 * 接口2=》正常出库二楼: 拆包装检出库 * 2楼机械臂入库:成品入库 * 1楼退库:退货入库 * 盘点出库:盘点出库 * 盘点入库:盘点入库 * 1楼手动出库:成品出库 * 组货单出:成品出库 * */ private String stockType; //单据类型 private String boxNo; //箱号 private String boxPos; //位置 1 2 3 origin 木箱位置 private String boxType; //木箱类型 木箱类型 brand brand$ private String wideInWidth; // 4.5μm×588mm matnr 中的 4.5 private String thickness; //4.5μm×588mm matnr 中的 588 private String rollType = "纸轴"; //木箱类型 brand brand$ private List<Roll> rolls; //卷集合 @Data public static class Roll { private String boxNo; //箱号 batch private String rollNo; //卷号 model private String specs; //规格 4.5μm×588mm matnr private String length; //长度 price private String splices; //接头 specs private String netWeight; //净重 weight private String grossWeight; //毛重 volume private String fqTime = DateUtils.convert(new Date(), DateUtils.yyyyMMddHHmmss_F); // private String orderSerialNumber; //WMS流水号 ERP无需理会 private String orderSerialNumberMsg = "orderSerialNumber为WMS流水号===ERP无需理会"; // public Roll() { } public Roll(WrkDetl sampleWrkDetl) { this.boxNo = sampleWrkDetl.getBatch(); this.rollNo = sampleWrkDetl.getModel(); this.specs = sampleWrkDetl.getMatnr(); this.length = sampleWrkDetl.getPrice().toString(); this.splices = sampleWrkDetl.getSpecs(); this.netWeight = sampleWrkDetl.getWeight().toString(); this.grossWeight = sampleWrkDetl.getVolume().toString(); this.orderSerialNumber = sampleWrkDetl.getOrderNo(); } @Override public String toString() { return String.format( "\tRoll(rollNo=%s, specs=%s, length=%s, splices=%s, netWeight=%s, grossWeight=%s, fqTime=%s, boxNo=%s, orderSerialNumber=%s, orderSerialNumberMsg=%s)\n", rollNo, specs, length, splices, netWeight, grossWeight, fqTime, boxNo, orderSerialNumber, orderSerialNumberMsg ); } } @Override public String toString() { return String.format( "Box(boxNo=%s, boxPos=%s, packageGroupNo=%s, outOrIn=%s, stockType=%s, boxType=%s, rollType=%s, wideInWidth=%s, thickness=%s, rolls=\n%s)", boxNo, boxPos, packageGroupNo, outOrIn, stockType, boxType, rollType, wideInWidth, thickness, rolls.toString() ); } } public OrderMesXGHYParam() { } public OrderMesXGHYParam(List<WrkDetl> wrkDetls,String outOrIn) { // 按batch字段分组,每个batch对应一个Box Map<String, List<WrkDetl>> batchGroup = wrkDetls.stream() .collect(Collectors.groupingBy(WrkDetl::getBatch)); List<OrderMesXGHYParam.Box> boxList = new ArrayList<>(); // 处理每个batch分组 for (Map.Entry<String, List<WrkDetl>> entry : batchGroup.entrySet()) { String batch = entry.getKey(); List<WrkDetl> batchWrkDetls = entry.getValue(); // 创建Box对象 OrderMesXGHYParam.Box box = new OrderMesXGHYParam.Box(); box.setBoxNo(batch); // batch对应boxNo box.setOutOrIn(outOrIn); // batch对应boxNo // 按model字段分组,每个model对应一个roll Map<String, List<WrkDetl>> modelGroup = batchWrkDetls.stream() .collect(Collectors.groupingBy(WrkDetl::getModel)); List<OrderMesXGHYParam.Box.Roll> rollList = new ArrayList<>(); String wideInWidth = null; String thickness = null; String boxPos = null; String boxType = null; String stockType = null; //单据类型 String packageGroupNo = null; //包装组号(徐工没有,只有箱号卷号一对一) //null // 处理每个model分组 for (Map.Entry<String, List<WrkDetl>> modelEntry : modelGroup.entrySet()) { List<WrkDetl> modelWrkDetls = modelEntry.getValue(); // 取第一个WrkDetl来创建roll(因为同一个model的roll信息应该相同) WrkDetl sampleWrkDetl = modelWrkDetls.get(0); String matnr = sampleWrkDetl.getMatnr(); // 使用正则表达式提取数字部分 // 先按"μm×"分割,再按"mm"分割 String[] firstSplit = matnr.split("μm×"); if (firstSplit.length == 2) { wideInWidth = firstSplit[0]; // 5.2 String[] secondSplit = firstSplit[1].split("mm"); if (secondSplit.length > 0) { thickness = secondSplit[0]; // 834.1 } } boxPos = sampleWrkDetl.getOrigin(); boxType = sampleWrkDetl.getBrand$(); stockType = sampleWrkDetl.getManu(); packageGroupNo = sampleWrkDetl.getDeadTime(); OrderMesXGHYParam.Box.Roll roll = new OrderMesXGHYParam.Box.Roll(sampleWrkDetl); rollList.add(roll); } box.setWideInWidth(wideInWidth); box.setThickness(thickness); box.setBoxPos(boxPos); box.setBoxType(boxType); box.setStockType(stockType); box.setPackageGroupNo(packageGroupNo); box.setRolls(rollList); boxList.add(box); } // 设置到主对象中 this.matList = boxList; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("OrderMesXGHYParam(\n"); sb.append(" barcode=").append(barcode).append(",\n"); sb.append(" palletizingNo=").append(palletizingNo).append(",\n"); sb.append(" matList=[\n"); if (matList != null) { for (int i = 0; i < matList.size(); i++) { sb.append("\t").append(matList.get(i).toString().replace("\n", "\n\t")); if (i < matList.size() - 1) { sb.append(",\n"); } else { sb.append("\n"); } } } sb.append(" ]\n"); sb.append(")"); return sb.toString(); } } src/main/java/com/zy/asrs/mapper/WrkMastMapper.java
@@ -18,6 +18,7 @@ List<WrkMast> selectToBeCompleteData202(); List<WrkMast> selectToBeHistoryData(); List<WrkMast> selectToBeHistoryDataV1(); List<WrkMast> selectToBeHistoryData2(); int orderAddPri(@Param("orderNo") String orderNo); src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -13,6 +13,7 @@ List<WrkMast> selectToBeCompleteData202(); List<WrkMast> selectToBeHistoryData(); List<WrkMast> selectToBeHistoryDataV1(); List<WrkMast> selectToBeHistoryData2(); WrkMast selectByBarcode(String barcode); src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -36,6 +36,11 @@ } @Override public List<WrkMast> selectToBeHistoryDataV1() { return this.baseMapper.selectToBeHistoryDataV1(); } @Override public List<WrkMast> selectToBeHistoryData2() { return this.baseMapper.selectToBeHistoryData2(); } src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -1,9 +1,15 @@ package com.zy.asrs.task; 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.service.ApiLogService; import com.zy.asrs.service.OrderService; import com.zy.asrs.service.WrkDetlService; import com.zy.asrs.service.WrkMastService; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.OrderSyncHandler; import com.zy.common.entity.Parameter; @@ -13,6 +19,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; /** @@ -28,6 +35,10 @@ private OrderService orderService; @Autowired private ApiLogService apiLogService; @Autowired private WrkDetlService wrkDetlService; @Autowired private WrkMastService wrkMastService; @Scheduled(cron = "0 0 1 * * ? ") public void clearApiLog(){ @@ -39,7 +50,7 @@ } // @Scheduled(cron = "0/5 * * * * ? ") @Async("orderThreadPool") // @Async("orderThreadPool") public void completeAndReport(){ String erpReport = Parameter.get().getErpReport(); if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) { @@ -58,4 +69,48 @@ } } @Scheduled(cron = "0 0 * * * *") public void completeAndReport2(){ List<Order> orders = orderService.selectComplete(); for (Order order : orders) { try{ if (!Cools.isEmpty(order.getOrderNo())) { int selectCount = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("order_no", order.getOrderNo())); if (selectCount > 0) { // 修改订单状态 4.完成 ===>> 6.已上报 orderService.updateSettle(order.getId(), 6L, null); continue; } } order.setCreateTime(new Date()); orderService.updateById(order); }catch (Exception e){ log.error("单据[orderNo={}]上报erp失败", order.getOrderNo()); log.error("订单"+order+"处理失败,异常信息:"+e); } } } @Scheduled(cron = "0/5 * * * * ? ") private void executeV1(){ List<WrkMast> wrkMasts = wrkMastService.selectToBeHistoryDataV1(); if (Cools.isEmpty(wrkMasts) || wrkMasts.size()==0) { return; } for (WrkMast wrkMast : wrkMasts) { try{ ReturnT<String> result = orderSyncHandler.startV1(wrkMast); if (!result.isSuccess()) { log.error("工作档[workNo={}]历史档处理失败", wrkMast.getWrkNo()); } else { wrkMast.setLogMk("Y"); wrkMastService.updateById(wrkMast); } }catch (Exception e){ log.error("工作档[workNo={}]历史档处理失败", wrkMast.getWrkNo()); log.error("处理失败,异常信息:"+e); } } } } src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -2,16 +2,18 @@ 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.exception.CoolException; import com.zy.asrs.entity.DocType; import com.zy.asrs.entity.Order; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.OrderMesXGHYParam; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.service.DocTypeService; import com.zy.asrs.service.OrderDetlService; import com.zy.asrs.service.OrderService; import com.zy.asrs.service.impl.WrkDetlServiceImpl; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.common.constant.MesConstant; @@ -24,6 +26,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; /** @@ -43,6 +46,10 @@ private ApiLogService apiLogService; @Autowired private DocTypeService docTypeService; @Autowired private WrkDetlServiceImpl wrkDetlService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Transactional public ReturnT<String> start(Order order) { @@ -157,4 +164,89 @@ return SUCCESS; } @Transactional public ReturnT<String> startV1(WrkMast wrkMast) { // List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo()); List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<>()); if (wrkDetls.isEmpty()) { return SUCCESS; } String packageGroupNo; //包装组号(徐工没有,只有箱号卷号一对一) //null String outOrIn; //out 出;in入; /* * 接口1=》不合格品出库二楼: 不合格品出库 * 盘点出库:盘点出库 * 盘点入库:盘点入库 * * * 接口2=》正常出库二楼: 拆包装检出库 * 1楼退库:退货入库 * * 组货单出:成品出库 * * 2楼机械臂入库:成品入库 * 1楼手动出库:成品出库 * */ String stockType = null; //单据类型 // and (wrk_sts=5 or wrk_sts=15 or (wrk_sts!=5 and (io_type = 53 or io_type = 57)) or io_type = 107) if (wrkMast.getIoType()==1){ outOrIn = "in"; } else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==53) { outOrIn = "out"; } else if (wrkMast.getIoType()==107) { outOrIn = "out"; stockType = "盘点出库"; } else if (wrkMast.getIoType()==57) { outOrIn = "in"; stockType = "盘点入库"; } else { return SUCCESS; } for (WrkDetl wrkDetl : wrkDetls) { if (outOrIn.equals("out")){ if (!Cools.isEmpty(stockType) && stockType.equals("盘点出库")){ wrkDetl.setManu("盘点出库"); } else if (!Cools.isEmpty(wrkDetl.getOrderNo()) && !wrkDetl.getOrderNo().equals("不合格品出库")){ Order order = orderService.selectByNo(wrkDetl.getOrderNo()); if (!Cools.isEmpty(order)){ DocType docType = docTypeService.selectById(order.getDocType()); if (!Cools.isEmpty(docType)) { if (docType.getDocName().equals("组货单")){ // packageGroupNo = order.getItemName(); wrkDetl.setDeadTime(order.getItemName()); } wrkDetl.setManu(docType.getDocName$()); } else { wrkDetl.setManu("成品出库"); } } else { wrkDetl.setManu("成品出库"); } } else if (wrkDetl.getOrderNo().equals("不合格品出库")){ wrkDetl.setManu("不合格品出库"); } } else { wrkDetl.setManu("成品入库"); if (!Cools.isEmpty(stockType) && stockType.equals("盘点入库")){ wrkDetl.setManu("盘点入库"); } else if (!Cools.isEmpty(wrkDetl.getOrderNo())){ Order order = orderService.selectByNo(wrkDetl.getOrderNo()); if (!Cools.isEmpty(order)){ DocType docType = docTypeService.selectById(order.getDocType()); if (!Cools.isEmpty(docType)) { wrkDetl.setManu(docType.getDocName$()); } } } } } OrderMesXGHYParam orderMesXGHYParam = new OrderMesXGHYParam(wrkDetls,outOrIn); orderMesXGHYParam.setBarcode(String.valueOf(snowflakeIdWorker.nextId())); orderMesXGHYParam.setPalletizingNo(1); System.out.println(orderMesXGHYParam.toString()); return SUCCESS; } } src/main/resources/mapper/OrderMapper.xml
@@ -54,7 +54,7 @@ </update> <select id="selectComplete" resultMap="BaseResultMap"> select top 5 * select top 10 * from man_order where 1=1 and settle = 4 src/main/resources/mapper/WrkMastMapper.xml
@@ -72,13 +72,23 @@ <select id="selectToBeHistoryData" resultMap="BaseResultMap"> select * from asr_wrk_mast where wrk_sts=5 or wrk_sts=44 or wrk_sts=64 or (wrk_sts=57 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)) 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)) where 1=1 and (wrk_sts=5 or wrk_sts=44 or wrk_sts=64 or (wrk_sts=57 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)) 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))) and log_mk = 'Y' order by io_time,wrk_no asc </select> <select id="selectToBeHistoryDataV1" resultMap="BaseResultMap"> select * from asr_wrk_mast where 1=1 and (wrk_sts=5 or wrk_sts=15 or io_type = 107 or (wrk_sts!=5 and (io_type = 53 or io_type = 57))) and log_mk != 'Y' order by io_time,wrk_no asc </select>