package com.zy.asrs.task; import com.alibaba.fastjson.JSON; import com.zy.asrs.entity.BasArmRules; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.param.OrderToLine; import com.zy.asrs.service.BasArmRulesService; import com.zy.asrs.service.OrderDetlService; import com.zy.asrs.service.OrderService; import com.zy.asrs.service.impl.OrderDetlServiceImpl; import com.zy.asrs.task.core.ReturnT; import com.zy.asrs.task.handler.OrderToLineHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Slf4j @Component //订单下发至分拣线 public class OrderToSortLineScheduler { @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private BasArmRulesService basArmRulesService; @Autowired private OrderToLineHandler orderToLineHandler; @Scheduled(cron = "0/3 * * * * ? ") private void orderToSortLine() { //获取未下发单据 List orderNos = orderService.AllStatusSatisfyOrder(0); if(orderNos == null || orderNos.isEmpty()) { // log.info("未有新订单"); return; } //遍历单据 for (String orderNo : orderNos) { List orderDetls = orderDetlService.selectByOrderNo(orderNo); OrderToLine orderToLine = new OrderToLine(); orderToLine.setOrderNo(orderNo); //单据编号 orderToLine.setCreateTime(System.currentTimeMillis()); //创建时间 Long bindingTag = System.currentTimeMillis();//混搭标记 List matLists = new ArrayList<>(); List matListsRemainder = new ArrayList<>(); List orderDetlsRemainder = new ArrayList<>(); for (OrderDetl orderDetl : orderDetls) { Integer number = basArmRulesService.getNumber(orderDetl.getWeight(),orderDetl.getVolume(),orderDetl.getManLength(),orderDetl.getWidth(),orderDetl.getHeight()); if (number == null) { BasArmRules basArmRules = new BasArmRules(); basArmRules.setMaterialHeight(orderDetl.getHeight()); basArmRules.setMaterialWeight(orderDetl.getWeight()); basArmRules.setMaterialLength(orderDetl.getManLength()); basArmRules.setMaterialWidth(orderDetl.getWidth()); basArmRulesService.insert(basArmRules); return; } else if (number == 0){ return; } Double anfme = orderDetl.getAnfme(); Double remainder = anfme % number; //取余 余数混搭 if(remainder != 0){ // 组装物料信息 OrderToLine.MatList matMix = new OrderToLine.MatList( orderDetl.getMatnr(), // matnr -> sku orderDetl.getStandby1(), // supp -> po orderDetl.getAnfme(), // 余料 -> 剩余余料统一时间戳标记 orderDetl.getStandby2(), //barcode -> upc 条码 1, null, //origin -> supplier 货源 bindingTag //余料标记相同 ); // matListsRemainder.add(matMix); // orderDetlsRemainder.add(orderDetl); matLists.add(matMix); } else { Double ctns = anfme - remainder; // 组装物料信息 OrderToLine.MatList mat = new OrderToLine.MatList( orderDetl.getMatnr(), // matnr -> sku orderDetl.getStandby1(), // supp -> po orderDetl.getAnfme(), //整料 orderDetl.getStandby2(), //barcode -> upc 1, null, //origin -> supplier 货源 System.currentTimeMillis() ); matLists.add(mat); } } // // 智能分组余料 // if (matListsRemainder.size() > 0) { // groupRemainders(orderDetlsRemainder, orderDetlsRemainder.size(), orderDetls.size(), matLists); // } orderToLine.setMatList(matLists); try{ ReturnT returnT = orderToLineHandler.start(orderToLine); if (!returnT.isSuccess()) { log.error("下发单据失败===>"+ JSON.toJSON(orderToLine)); } } catch (Exception e){ log.error("下发单据异常===>"+e.getMessage()); } } } private void groupRemainders(List sameMaterialList, double totalRemainder, int number, List matLists) { // 策略1: 如果余料总量较大,尝试分成多个合理大小的组 if (totalRemainder > number * 0.6) { // 可以分成2组或更多组 int suggestedGroups = (int) Math.ceil(totalRemainder / (number * 0.8)); distributeRemainders(sameMaterialList, totalRemainder, suggestedGroups, matLists); } else { // 小余料单组处理 Long bindingTag = System.currentTimeMillis(); matLists.add(createMatListItem(sameMaterialList.get(0), totalRemainder, bindingTag, true)); } } private void distributeRemainders(List sameMaterialList, double totalRemainder, int groupCount, List matLists) { double average = totalRemainder / groupCount; for (int i = 0; i < groupCount; i++) { double groupQuantity; if (i == groupCount - 1) { // 最后一组取剩余所有 groupQuantity = totalRemainder - (average * (groupCount - 1)); } else { groupQuantity = average; } // 为每组生成唯一标记 Long groupTag = System.currentTimeMillis() + i; matLists.add(createMatListItem(sameMaterialList.get(0), groupQuantity, groupTag, true)); } } private OrderToLine.MatList createMatListItem(OrderDetl orderDetl, Double quantity, Long bindingTag, boolean isRemainder) { return new OrderToLine.MatList( orderDetl.getMatnr(), orderDetl.getSupp(), quantity, orderDetl.getBarcode(), 1, isRemainder ? null : orderDetl.getOrigin(), isRemainder ? bindingTag : System.currentTimeMillis() ); } }