package com.zy.asrs.task; import com.alibaba.fastjson.JSON; import com.zy.asrs.entity.BasArmMastSign; import com.zy.asrs.entity.BasArmRules; import com.zy.asrs.entity.OrderDetl; import com.zy.asrs.entity.param.OrderToLine; import com.zy.asrs.service.BasArmMastSignService; 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 com.zy.asrs.utils.GroupedLockerOptimizerUtils; import com.zy.asrs.utils.ToSortLineUtils; 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; @Autowired private BasArmMastSignService basArmMastSignService; @Scheduled(cron = "0/3 * * * * ? ") private void orderToSortLine() { //获取未下发单据 List orderNos = orderService.AllStatusSatisfyOrder(0); if(orderNos == null || orderNos.isEmpty()) { // log.info("未有新订单"); return; } //遍历单据 for (String orderNo : orderNos) { try{ List orderDetls = orderDetlService.selectByOrderNo(orderNo); List items = 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; } String name = ToSortLineUtils.MergerParameter(orderDetl.getMatnr(),orderDetl.getStandby1(),orderDetl.getStandby2()); int maxCapacity = number; int stock = orderDetl.getAnfme().intValue(); items.add(new GroupedLockerOptimizerUtils.Item(name, maxCapacity, stock)); } OrderToLine orderToLine = new OrderToLine(); orderToLine.setOrderNo(orderNo); //单据编号 orderToLine.setCreateTime(System.currentTimeMillis()); //创建时间 OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLine(items, orderToLine); try{ ReturnT returnT = orderToLineHandler.start(orderToLineR); if (!returnT.isSuccess()) { log.error("下发单据失败===>"+ JSON.toJSON(orderToLineR)); } else { try{ for (OrderToLine.MatList matList:orderToLineR.getMatList()){ BasArmMastSign basArmMastSign = new BasArmMastSign(); basArmMastSign.setMatnr(matList.getSku()); basArmMastSign.setOrderNo(orderToLineR.getOrderNo()); basArmMastSign.setSku(matList.getSku()); basArmMastSign.setPo(matList.getPo()); basArmMastSign.setUpc(matList.getUpc()); basArmMastSign.setSupplier(matList.getSupplier()); basArmMastSign.setStatus(0); basArmMastSign.setCreateTime(matList.getBindingTags()); basArmMastSignService.insert(basArmMastSign); } }catch (Exception e){} } } catch (Exception e){ log.error("下发单据异常===>"+e.getMessage()); } } 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() ); } }