| | |
| | | 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.*; |
| | | 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.OptimizedLockerPackingUtils; |
| | | import com.zy.asrs.utils.OrderInAndOutUtil; |
| | | import com.zy.asrs.utils.ToSortLineUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | //订单下发至分拣线 |
| | | 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<OrderDetlPakin> orderDetlPakinList = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_no",orderNo)); |
| | | // List<GroupedLockerOptimizerUtils.Item> items = new ArrayList<>(); |
| | | if (orderDetls.size()<1){ |
| | | if (orderDetlPakinList.size()<1){ |
| | | continue; |
| | | } |
| | | |
| | | |
| | | List<OptimizedLockerPackingUtils.Item> items = new ArrayList<>(); |
| | | for (OrderDetl orderDetl:orderDetls){ |
| | | 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(); |
| | |
| | | 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() |
| | | ); |
| | | } |
| | | |
| | | } |