|  |  | 
 |  |  | package com.zy.asrs.controller; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.core.annotations.ManagerAuth; | 
 |  |  | import com.core.common.BaseRes; | 
 |  |  | import com.core.common.Cools; | 
 |  |  | import com.core.common.R; | 
 |  |  | import com.zy.asrs.entity.BasDevp; | 
 |  |  | import com.zy.asrs.entity.LocDetl; | 
 |  |  | import com.zy.asrs.entity.OrderDetl; | 
 |  |  | import com.zy.asrs.entity.result.StoPreTab; | 
 |  |  | 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 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 | 
 |  |  | 
 |  |  |     private WorkService workService; | 
 |  |  |     @Autowired | 
 |  |  |     private BasDevpService basDevpService; | 
 |  |  |     @Autowired | 
 |  |  |     private DocTypeService docTypeService; | 
 |  |  |     @Autowired | 
 |  |  |     private SnowflakeIdWorker snowflakeIdWorker; | 
 |  |  |     @Autowired | 
 |  |  |     private MatService matService; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //    @PostMapping("/out/pakout/preview/auth") | 
 |  |  | //    public R pakoutPreview(@RequestBody List<Long> ids) { | 
 |  |  | //        if (Cools.isEmpty(ids)) { | 
 |  |  | //            return R.parse(BaseRes.PARAM); | 
 |  |  | //        } | 
 |  |  | //        List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids); | 
 |  |  | //        Set<DetlDto> detlDtos = new HashSet<>(); | 
 |  |  | //        for (OrderDetl orderDetl : orderDetls) { | 
 |  |  | //            if (DetlDto.hasList(detlDtos, orderDetl)) { | 
 |  |  | //                DetlDto detlDto = DetlDto.find(detlDtos, orderDetl.getMatnr(), orderDetl.getBatch()); | 
 |  |  | //                assert detlDto != null; | 
 |  |  | //                detlDto.setAnfme(detlDto.getAnfme() + orderDetl.getAnfme()); | 
 |  |  | //            } else { | 
 |  |  | //                detlDtos.add(new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getAnfme())); | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  | //        List<LocDto> locDtos = new ArrayList<>(); | 
 |  |  | //        for (DetlDto detlDto : detlDtos) { | 
 |  |  | //            double issued = Optional.ofNullable(detlDto.getAnfme()).orElse(0.0D) ; | 
 |  |  | //            List<LocDetl> locDetls = locDetlService.queryStock(detlDto.getMatnr(), detlDto.getBatch(), null); | 
 |  |  | //            for (LocDetl locDetl : locDetls) { | 
 |  |  | //                if (issued > 0) { | 
 |  |  | //                    locDtos.add(new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getBatch(), issued>=locDetl.getAnfme()?locDetl.getAnfme():issued)); | 
 |  |  | //                    // 剩余待出数量递减 | 
 |  |  | //                    issued = issued - locDetl.getAnfme(); | 
 |  |  | //                } else { | 
 |  |  | //                    break; | 
 |  |  | //                } | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  | //        return R.ok().add(locDtos); | 
 |  |  | //    } | 
 |  |  |     @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 | 
 |  |  | 
 |  |  |         List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids); | 
 |  |  |         List<LocDto> locDtos = new ArrayList<>(); | 
 |  |  |         for (OrderDetl orderDetl : orderDetls) { | 
 |  |  |             double issued = Optional.ofNullable(orderDetl.getAnfme()).orElse(0.0D) ; | 
 |  |  |             List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null); | 
 |  |  |             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); | 
 |  |  |                     // 剩余待出数量递减 | 
 |  |  |                     issued = issued - locDetl.getAnfme(); | 
 |  |  |                 } else { | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |             if (orderDetl.getAnfme()-orderDetl.getWorkQty()-orderDetl.getQty()==0.0){ | 
 |  |  |                 continue; | 
 |  |  |             } | 
 |  |  |             if (issued > 0) { | 
 |  |  |                 LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued); | 
 |  |  |                 locDto.setLack(Boolean.TRUE); | 
 |  |  |             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) { | 
 |  |  |         if (Cools.isEmpty(locDtos)) { | 
 |  |  |             return R.parse(BaseRes.PARAM); | 
 |  |  |     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); | 
 |  |  |         } | 
 |  |  |         List<TaskDto> taskDtos = new ArrayList<>(); | 
 |  |  |         // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务 | 
 |  |  |         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) { | 
 |  |  |             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); | 
 |  |  |             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); | 
 |  |  |  | 
 |  |  |         } | 
 |  |  |         // ----------------------------------------------------------------------------------------------- | 
 |  |  |         for (TaskDto taskDto : taskDtos) { | 
 |  |  |             BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo()); | 
 |  |  |             workService.stockOut(staNo, taskDto, getUserId()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return R.ok(); | 
 |  |  |     } | 
 |  |  |  |