|  |  |  | 
|---|
|  |  |  | 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.baomidou.mybatisplus.mapper.EntityWrapper; | 
|---|
|  |  |  | import com.zy.asrs.entity.*; | 
|---|
|  |  |  | 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.service.*; | 
|---|
|  |  |  | 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 com.zy.asrs.utils.param.ItemUtilParam; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.scheduling.annotation.Scheduled; | 
|---|
|  |  |  | 
|---|
|  |  |  | //订单下发至分拣线 | 
|---|
|  |  |  | public class OrderToSortLineScheduler { | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private OrderService orderService; | 
|---|
|  |  |  | private OrderPakinService orderPakinService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private OrderDetlService orderDetlService; | 
|---|
|  |  |  | private OrderDetlPakinService orderDetlPakinService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private BasArmRulesService basArmRulesService; | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | 
|---|
|  |  |  | @Scheduled(cron = "0/3 * * * * ? ") | 
|---|
|  |  |  | private void orderToSortLine() { | 
|---|
|  |  |  | //获取未下发单据 | 
|---|
|  |  |  | List<String> orderNos = orderService.AllStatusSatisfyOrder(0); | 
|---|
|  |  |  | List<String> orderNos = orderPakinService.AllStatusSatisfyOrder(0); | 
|---|
|  |  |  | if(orderNos == null || orderNos.isEmpty()) { | 
|---|
|  |  |  | //            log.info("未有新订单"); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | 
|---|
|  |  |  | //遍历单据 | 
|---|
|  |  |  | for (String orderNo : orderNos) { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | List<OrderDetl> orderDetls = orderDetlService.selectByOrderNo(orderNo); | 
|---|
|  |  |  | List<GroupedLockerOptimizerUtils.Item> items = new ArrayList<>(); | 
|---|
|  |  |  | for (OrderDetl orderDetl:orderDetls){ | 
|---|
|  |  |  | List<OrderDetlPakin> orderDetlPakinList = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_no",orderNo)); | 
|---|
|  |  |  | if (orderDetlPakinList.size()<1){ | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<ItemUtilParam.Item> items = new ArrayList<>(); | 
|---|
|  |  |  | for (OrderDetlPakin orderDetl:orderDetlPakinList){ | 
|---|
|  |  |  | Integer number =  basArmRulesService.getNumber(orderDetl.getWeight(),orderDetl.getVolume(),orderDetl.getManLength(),orderDetl.getWidth(),orderDetl.getHeight()); | 
|---|
|  |  |  | if (number == null) { | 
|---|
|  |  |  | BasArmRules basArmRules = new BasArmRules(); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | items.add(new ItemUtilParam.Item(name, maxCapacity, stock)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | OrderToLine orderToLine = new OrderToLine(); | 
|---|
|  |  |  | orderToLine.setOrderNo(orderNo);  //单据编号 | 
|---|
|  |  |  | orderToLine.setCreateTime(System.currentTimeMillis());  //创建时间 | 
|---|
|  |  |  | OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLine(items, orderToLine); | 
|---|
|  |  |  | OrderToLine orderToLineR = ToSortLineUtils.GetOrderToLine(items, orderToLine,"Opt3"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | ReturnT<String> returnT = orderToLineHandler.start(orderToLineR); | 
|---|
|  |  |  | if (!returnT.isSuccess()) { | 
|---|
|  |  |  | log.error("下发单据失败===>"+ JSON.toJSON(orderToLineR)); | 
|---|
|  |  |  | //                        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.setOrderNo(orderNo); | 
|---|
|  |  |  | basArmMastSign.setSku(matList.getSku()); | 
|---|
|  |  |  | basArmMastSign.setPo(matList.getPo()); | 
|---|
|  |  |  | basArmMastSign.setUpc(matList.getUpc()); | 
|---|
|  |  |  | basArmMastSign.setSupplier(matList.getSupplier()); | 
|---|
|  |  |  | basArmMastSign.setStatus(0); | 
|---|
|  |  |  | basArmMastSign.setAnfme(matList.getCtns()); | 
|---|
|  |  |  | basArmMastSign.setCreateTime(matList.getBindingTags()); | 
|---|
|  |  |  | basArmMastSignService.insert(basArmMastSign); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | log.error("下发单据异常,跳转下一个订单===>"+e.getMessage()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void groupRemainders(List<OrderDetl> sameMaterialList, double totalRemainder, | 
|---|
|  |  |  | int number, List<OrderToLine.MatList> 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<OrderDetl> sameMaterialList, double totalRemainder, | 
|---|
|  |  |  | int groupCount, List<OrderToLine.MatList> 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() | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|