| package com.zy.asrs.controller; | 
|   | 
| import com.core.annotations.ManagerAuth; | 
| import com.core.common.*; | 
| import com.core.exception.CoolException; | 
| import com.zy.asrs.entity.*; | 
| import com.zy.asrs.entity.param.StockOutParam; | 
| import com.zy.asrs.service.*; | 
| import com.zy.asrs.service.impl.WorkServiceImpl; | 
| import com.zy.asrs.utils.OutboundAllocationUtil; | 
| import com.zy.common.model.DetlDto; | 
| import com.zy.common.model.LocDto; | 
| import com.zy.common.model.TaskDto; | 
| import com.zy.common.web.BaseController; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.web.bind.annotation.PostMapping; | 
| import org.springframework.web.bind.annotation.RequestBody; | 
| import org.springframework.web.bind.annotation.RequestParam; | 
| import org.springframework.web.bind.annotation.RestController; | 
|   | 
| import java.util.*; | 
| import java.util.stream.Collectors; | 
|   | 
| /** | 
|  * Created by vincent on 2022/3/26 | 
|  */ | 
|   | 
| @RestController | 
| public class OutController extends BaseController { | 
|   | 
|     @Autowired | 
|     private OrderService orderService; | 
|     @Autowired | 
|     private OrderDetlService orderDetlService; | 
|     @Autowired | 
|     private LocDetlService locDetlService; | 
|     @Autowired | 
|     private LocMastService locMastService; | 
|     @Autowired | 
|     private StaDescService staDescService; | 
|     @Autowired | 
|     private WorkService workService; | 
|     @Autowired | 
|     private BasDevpService basDevpService; | 
|     @Autowired | 
|     private DocTypeService docTypeService; | 
|     @Autowired | 
|     private SnowflakeIdWorker snowflakeIdWorker; | 
|     @Autowired | 
|     private MatService matService; | 
|   | 
|   | 
|     @PostMapping("/out/pakout/orderDetlIds/auth") | 
|     @ManagerAuth | 
|     public R pakoutOrderDetlIds(@RequestParam Long orderId) throws InterruptedException { | 
|         Thread.sleep(200); | 
|         return R.ok().add(orderDetlService.selectByOrderId(orderId).stream().map(OrderDetl::getId).distinct().collect(Collectors.toList())); | 
|     } | 
|   | 
|     @PostMapping("/out/pakout/preview/auth") | 
|     @ManagerAuth | 
|     public R pakoutPreview(@RequestBody List<Long> ids) { | 
|         if (Cools.isEmpty(ids)) { | 
|             return R.parse(BaseRes.PARAM); | 
|         } | 
|         List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids); | 
|         List<LocDto> locDtos = new ArrayList<>(); | 
|         for (OrderDetl orderDetl : orderDetls) { | 
|             if (orderDetl.getAnfme()-orderDetl.getWorkQty()-orderDetl.getQty()==0.0){ | 
|                 continue; | 
|             } | 
|             LocDto locDto = new LocDto(orderDetl.getManu(), orderDetl.getMatnr(), orderDetl.getMaktx(),orderDetl.getModel(),orderDetl.getSpecs(), | 
|                     orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getBarcode(), orderDetl.getOrderNo(),orderDetl.getAnfme()); | 
|             locDto.setOrderDetlId(orderDetl.getId()); | 
|             locDto.setTkType(orderDetl.getTkType()); | 
|             locDtos.add(locDto); | 
|         } | 
|   | 
|   | 
|   | 
|   | 
| //        Set<String> exist = new HashSet<>(); | 
|   | 
| //        for (OrderDetl orderDetl : orderDetls) { | 
| //            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D); | 
| //            if (issued <= 0.0D) { continue; } | 
| //            List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null, exist); | 
| //            for (LocDetl locDetl : locDetls) { | 
| //                if (issued > 0) { | 
| //                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(), | 
| //                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued); | 
| //                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103); | 
| //                    locDto.setStaNos(staNos); | 
| //                    locDtos.add(locDto); | 
| //                    exist.add(locDetl.getLocNo()); | 
| //                    // 剩余待出数量递减 | 
| //                    issued = issued - locDetl.getAnfme(); | 
| //                } else { | 
| //                    break; | 
| //                } | 
| //            } | 
| //            if (issued > 0) { | 
| //                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued); | 
| //                locDto.setLack(Boolean.TRUE); | 
| //                locDtos.add(locDto); | 
| //            } | 
| //        } | 
|         return R.ok().add(locDtos); | 
|     } | 
|   | 
|     @PostMapping("/out/refund/loc/preview/auth") | 
|     @ManagerAuth | 
|     public R refundLocPreview(@RequestBody List<Long> ids) { | 
|         if (Cools.isEmpty(ids)) { | 
|             return R.parse(BaseRes.PARAM); | 
|         } | 
|         List<LocDto> locDtos = new ArrayList<>(); | 
|         for (Long id : ids){ | 
|             Order order = orderService.selectById(id); | 
|             List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId()); | 
|   | 
|             for (OrderDetl orderDetl : orderDetls) { | 
|                 LocDto locDto = new LocDto(orderDetl.getManu(), orderDetl.getMatnr(), orderDetl.getMaktx(),orderDetl.getModel(),orderDetl.getSpecs(), | 
|                         orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getBarcode(), orderDetl.getOrderNo(),orderDetl.getAnfme()); | 
|                 locDto.setOrderDetlId(orderDetl.getId()); | 
|                 locDto.setTkType(orderDetl.getTkType()); | 
|                 locDtos.add(locDto); | 
|             } | 
|         } | 
|   | 
|         return R.ok().add(locDtos); | 
|     } | 
|   | 
|     @PostMapping("/out/pakout/auth") | 
|     @ManagerAuth(memo = "订单出库") | 
|     public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException { | 
|         StockOutParam param = new StockOutParam(); | 
|         ArrayList<StockOutParam.LocDetl> locDetls = new ArrayList<>(); | 
|         for (LocDto locDto:locDtos){ | 
|             StockOutParam.LocDetl locDetl = new StockOutParam.LocDetl(); | 
|             locDetl.setBrand(locDto.getBrand()); | 
|             locDetl.setLocNo(locDto.getLocNo()); | 
|             locDetl.setAnfme(locDto.getAnfme()); | 
|             locDetl.setMatnr(locDto.getMatnr()); | 
|             locDetl.setBatch(locDto.getBatch()); | 
|             locDetl.setModel(locDto.getModel()); | 
|             locDetl.setSpecs(locDto.getSpecs()); | 
|             locDetl.setZpallet(locDto.getZpallet()); | 
|   | 
|             param.setOrderNo(locDto.getOrderNo()); | 
|   | 
|             locDetls.add(locDetl); | 
|         } | 
|         param.setLocDetls(locDetls); | 
|   | 
|         List<StockOutParam> stockOutParams = OutboundAllocationUtil.OutboundClassification(param); | 
|         for (StockOutParam stockOutParam : stockOutParams){ | 
|             workService.startupFullTakeStore(stockOutParam, getUserId()); | 
|         } | 
|   | 
|         for (LocDto locDto:locDtos){ | 
|             OrderDetl orderDetl = orderDetlService.selectById(locDto.getOrderDetlId()); | 
|             orderDetl.setWorkQty(locDto.getAnfme()); | 
|             orderDetlService.updateById(orderDetl); | 
|         } | 
|   | 
|         Order order = orderService.selectByNo(param.getOrderNo()); | 
|         order.setSettle(2L); | 
|         orderService.updateById(order); | 
|   | 
|   | 
| //        if (Cools.isEmpty(locDtos)) { | 
| //            return R.parse(BaseRes.PARAM); | 
| //        } | 
| //        boolean lack = true; | 
| //        for (LocDto locDto : locDtos) { | 
| //            if (!locDto.isLack()) { | 
| //                lack = false; | 
| //                break; | 
| //            } | 
| //        } | 
| //        if (lack) { | 
| //            return R.error("库存不足"); | 
| //        } | 
| // | 
| //        Thread.sleep(1000L); | 
| // | 
| //        List<TaskDto> taskDtos = new ArrayList<>(); | 
| //        // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务 | 
| //        for (LocDto locDto : locDtos) { | 
| //            if (locDto.isLack()) { continue; } | 
| //            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto); | 
| //            if (TaskDto.has(taskDtos, taskDto)) { | 
| //                TaskDto dto = TaskDto.find(taskDtos, taskDto); | 
| //                assert dto != null; | 
| //                dto.getLocDtos().addAll(taskDto.getLocDtos()); | 
| //            } else { | 
| //                taskDtos.add(taskDto); | 
| //            } | 
| //        } | 
| //        // ----------------------------------------------------------------------------------------------- | 
| //        for (TaskDto taskDto : taskDtos) { | 
| //            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo()); | 
| //            workService.stockOut(staNo, taskDto, getUserId()); | 
| //        } | 
|         return R.ok(); | 
|     } | 
|   | 
|   | 
|     @PostMapping("/out/refund/loc/auth") | 
|     @ManagerAuth(memo = "订单出库") | 
|     public synchronized R refundLoc(@RequestBody List<LocDto> locDtos) throws InterruptedException { | 
|         Long userId = getUserId(); | 
|         DocType docType = docTypeService.selectOrAdd("退货入库单", Boolean.TRUE); | 
|         Date now = new Date(); | 
|         long nowOrderNo = System.currentTimeMillis(); | 
|         Order order = new Order( | 
|                 String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空] | 
|                 "TK"+nowOrderNo,    // 订单编号 | 
|                 DateUtils.convert(now),    // 单据日期 | 
|                 docType.getDocId(),    // 单据类型 | 
|                 null,    // 项目编号 | 
|                 null,    // | 
|                 null,    // 调拨项目编号 | 
|                 null,    // 初始票据号 | 
|                 null,    // 票据号 | 
|                 null,    // 客户编号 | 
|                 null,    // 客户 | 
|                 null,    // 联系方式 | 
|                 null,    // 操作人员 | 
|                 null,    // 合计金额 | 
|                 null,    // 优惠率 | 
|                 null,    // 优惠金额 | 
|                 null,    // 销售或采购费用合计 | 
|                 null,    // 实付金额 | 
|                 null,    // 付款类型 | 
|                 null,    // 业务员 | 
|                 null,    // 结算天数 | 
|                 null,    // 邮费支付类型 | 
|                 null,    // 邮费 | 
|                 null,    // 付款时间 | 
|                 null,    // 发货时间 | 
|                 null,    // 物流名称 | 
|                 null,    // 物流单号 | 
| //                    2L,    // 订单状态 | 
|                 1L,    // 订单状态 | 
|                 1,    // 状态 | 
|                 userId,    // 添加人员 | 
|                 now,    // 添加时间 | 
|                 userId,    // 修改人员 | 
|                 now,    // 修改时间 | 
|                 null    // 备注 | 
|         ); | 
|         if (!orderService.insert(order)) { | 
|             throw new CoolException("保存订单主档失败"); | 
|         } | 
|         // 单据明细档 | 
|         int i=0; | 
|         for (LocDto locDto : locDtos) { | 
|             i++; | 
|             Mat mat = matService.selectByMatnr(locDto.getMatnr()); | 
|             if (Cools.isEmpty(mat)) { | 
|                 throw new CoolException(locDto.getMatnr() + "物料编码检索失败,请先添加商品"); | 
|             } | 
|             OrderDetl orderDetl = new OrderDetl(); | 
|             orderDetl.sync(mat); | 
|             orderDetl.setSuppCode(String.valueOf(i));  // 行号 | 
|             orderDetl.setManu(locDto.getLocNo());  //库位号 | 
|             orderDetl.setBatch(locDto.getBatch()); //木箱编码 | 
|             orderDetl.setAnfme(locDto.getAnfme());//出库数量 | 
|             orderDetl.setModel(locDto.getModel());//批次 | 
|             orderDetl.setSpecs(locDto.getSpecs());//规格 | 
|             orderDetl.setBrand(locDto.getBrand());//木箱类型 | 
|             orderDetl.setBarcode(locDto.getZpallet());//木箱类型 | 
| //                orderDetl.setWorkQty(locDetl.getAnfme()); | 
|             orderDetl.setWorkQty(0.0); | 
|             orderDetl.setOrderId(order.getId()); | 
|             orderDetl.setOrderNo(order.getOrderNo()); | 
|             orderDetl.setCreateBy(userId); | 
|             orderDetl.setCreateTime(now); | 
|             orderDetl.setUpdateBy(userId); | 
|             orderDetl.setUpdateTime(now); | 
|             orderDetl.setStatus(1); | 
|             orderDetl.setQty(0.0D); | 
|             if (!orderDetlService.insert(orderDetl)) { | 
|                 throw new CoolException("生成单据明细失败,请联系管理员"); | 
|             } | 
|   | 
|             OrderDetl orderDetl1 = orderDetlService.selectById(locDto.getOrderDetlId()); | 
|             orderDetl1.setTkType(1); | 
|             orderDetlService.updateById(orderDetl1); | 
|   | 
|         } | 
|   | 
|         return R.ok(); | 
|     } | 
|   | 
| } |