|  |  | 
 |  |  | package com.vincent.rsf.server.manager.controller; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.alibaba.fastjson.JSONArray; | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
 |  |  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | 
 |  |  | import com.vincent.rsf.framework.common.Cools; | 
 |  |  | import com.vincent.rsf.framework.common.R; | 
 |  |  | import com.vincent.rsf.server.api.entity.enums.OrderType; | 
 |  |  | import com.vincent.rsf.server.api.entity.enums.OrderWorkType; | 
 |  |  | import com.vincent.rsf.framework.exception.CoolException; | 
 |  |  | import com.vincent.rsf.server.manager.controller.params.GenWaveParams; | 
 |  |  | import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam; | 
 |  |  | import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams; | 
 |  |  | import com.vincent.rsf.server.manager.entity.DeliveryItem; | 
 |  |  | import com.vincent.rsf.server.manager.entity.WkOrder; | 
 |  |  | import com.vincent.rsf.server.manager.entity.WkOrderItem; | 
 |  |  | import com.vincent.rsf.server.manager.enums.OrderType; | 
 |  |  | import com.vincent.rsf.server.manager.enums.OrderWorkType; | 
 |  |  | import com.vincent.rsf.server.common.annotation.OperationLog; | 
 |  |  | import com.vincent.rsf.server.common.domain.BaseParam; | 
 |  |  | import com.vincent.rsf.server.common.domain.KeyValVo; | 
 |  |  | import com.vincent.rsf.server.common.domain.PageParam; | 
 |  |  | import com.vincent.rsf.server.common.utils.ExcelUtil; | 
 |  |  | import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams; | 
 |  |  | import com.vincent.rsf.server.manager.entity.AsnOrder; | 
 |  |  | import com.vincent.rsf.server.manager.entity.AsnOrderItem; | 
 |  |  | import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate; | 
 |  |  | import com.vincent.rsf.server.manager.enums.AsnExceStatus; | 
 |  |  | import com.vincent.rsf.server.manager.service.OutStockItemService; | 
 |  |  | 
 |  |  | import io.swagger.annotations.Api; | 
 |  |  | import io.swagger.annotations.ApiOperation; | 
 |  |  | import org.apache.commons.lang3.StringUtils; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | import org.slf4j.LoggerFactory; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.security.access.prepost.PreAuthorize; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  | 
 |  |  | @RestController | 
 |  |  | @Api(tags = "出库单据") | 
 |  |  | public class OutStockController extends BaseController { | 
 |  |  |     Logger logger = LoggerFactory.getLogger(OutStockController.class); | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private OutStockService outStockService; | 
 |  |  | 
 |  |  |     @PostMapping("/outStock/page") | 
 |  |  |     public R page(@RequestBody Map<String, Object> map) { | 
 |  |  |         BaseParam baseParam = buildParam(map, BaseParam.class); | 
 |  |  |         PageParam<AsnOrder, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrder.class); | 
 |  |  |         return R.ok().add(outStockService.page(pageParam, pageParam.buildWrapper(true))); | 
 |  |  |         PageParam<WkOrder, BaseParam> pageParam = new PageParam<>(baseParam, WkOrder.class); | 
 |  |  |         QueryWrapper<WkOrder> queryWrapper = pageParam.buildWrapper(true); | 
 |  |  | //        List<String> list = Arrays.asList(OrderType.ORDER_OUT.type); | 
 |  |  | //        queryWrapper.in("type", list); | 
 |  |  |         return R.ok().add(outStockService.page(pageParam, queryWrapper)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  |     @PostMapping("/outStock/dialog/page") | 
 |  |  |     public R dialogPage(@RequestBody Map<String, Object> map) { | 
 |  |  |         BaseParam baseParam = buildParam(map, BaseParam.class); | 
 |  |  |         PageParam<WkOrder, BaseParam> pageParam = new PageParam<>(baseParam, WkOrder.class); | 
 |  |  |         QueryWrapper<WkOrder> queryWrapper = pageParam.buildWrapper(true); | 
 |  |  |         List<String> list = Arrays.asList(OrderType.ORDER_OUT.type); | 
 |  |  |         queryWrapper.in("type", list); | 
 |  |  |         return R.ok().add(outStockService.page(pageParam, queryWrapper)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  |     @PostMapping("/outStock/list") | 
 |  |  |     public R list(@RequestBody Map<String, Object> map) { | 
 |  |  |         return R.ok().add(outStockService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getType, OrderType.ORDER_OUT.type))); | 
 |  |  |         return R.ok().add(outStockService.list(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getType, OrderType.ORDER_OUT.type))); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  | 
 |  |  |     @OperationLog("Create 出库单据") | 
 |  |  |     @PostMapping("/outStock/save") | 
 |  |  |     @ApiOperation("保存") | 
 |  |  |     public R save(@RequestBody AsnOrder asnOrder) { | 
 |  |  |         asnOrder.setCreateBy(getLoginUserId()) | 
 |  |  |     public R save(@RequestBody WkOrder wkOrder) { | 
 |  |  |         wkOrder.setCreateBy(getLoginUserId()) | 
 |  |  |                 .setUpdateBy(getLoginUserId()); | 
 |  |  |         if (Objects.isNull(asnOrder.getCode())) { | 
 |  |  |             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, asnOrder); | 
 |  |  |         if (Objects.isNull(wkOrder.getCode())) { | 
 |  |  |             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, wkOrder); | 
 |  |  |             if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) { | 
 |  |  |                 return R.error("编码规则错误:编码「SYS_OUT_STOCK_CODE」是未设置成功!!"); | 
 |  |  |             } | 
 |  |  |             asnOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) | 
 |  |  |             wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) | 
 |  |  |                     .setCode(ruleCode); | 
 |  |  |         } | 
 |  |  |         if (!outStockService.save(asnOrder)) { | 
 |  |  |         if (!outStockService.save(wkOrder)) { | 
 |  |  |             return R.error("Save Fail"); | 
 |  |  |         } | 
 |  |  |         return R.ok("Save Success").add(asnOrder); | 
 |  |  |         return R.ok("Save Success").add(wkOrder); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:update')") | 
 |  |  |     @OperationLog("Update ;出库单据") | 
 |  |  |     @PostMapping("/outStock/update") | 
 |  |  |     @ApiOperation("更新") | 
 |  |  |     public R update(@RequestBody AsnOrder asnOrder) { | 
 |  |  |         asnOrder.setType(OrderType.ORDER_OUT.type) | 
 |  |  |     public R update(@RequestBody WkOrder wkOrder) { | 
 |  |  |         wkOrder.setType(OrderType.ORDER_OUT.type) | 
 |  |  |                 .setUpdateBy(getLoginUserId()) | 
 |  |  |                 .setUpdateTime(new Date()); | 
 |  |  |         if (Objects.isNull(asnOrder.getCode())) { | 
 |  |  |             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, asnOrder); | 
 |  |  |             asnOrder.setCode(ruleCode); | 
 |  |  |         if (Objects.isNull(wkOrder.getCode())) { | 
 |  |  |             String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, wkOrder); | 
 |  |  |             wkOrder.setCode(ruleCode); | 
 |  |  |         } | 
 |  |  |         if (!outStockService.updateById(asnOrder)) { | 
 |  |  |         if (!outStockService.updateById(wkOrder)) { | 
 |  |  |             return R.error("Update Fail"); | 
 |  |  |         } | 
 |  |  |         return R.ok("Update Success").add(asnOrder); | 
 |  |  |         return R.ok("Update Success").add(wkOrder); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:remove')") | 
 |  |  | 
 |  |  |     @ApiOperation("查询") | 
 |  |  |     public R query(@RequestParam(required = false) String condition) { | 
 |  |  |         List<KeyValVo> vos = new ArrayList<>(); | 
 |  |  |         LambdaQueryWrapper<AsnOrder> wrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         LambdaQueryWrapper<WkOrder> wrapper = new LambdaQueryWrapper<>(); | 
 |  |  |         if (!Cools.isEmpty(condition)) { | 
 |  |  |             wrapper.like(AsnOrder::getCode, condition); | 
 |  |  |             wrapper.like(WkOrder::getCode, condition); | 
 |  |  |         } | 
 |  |  |         outStockService.page(new Page<>(1, 30), wrapper).getRecords().forEach( | 
 |  |  |                 item -> vos.add(new KeyValVo(item.getId(), item.getCode())) | 
 |  |  | 
 |  |  |         return outStockService.cancelOutOrder(id); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:update')") | 
 |  |  |     @ApiOperation("删除已生成明细") | 
 |  |  |     @GetMapping("/outStock/items/cancel/{ids}") | 
 |  |  |     public R cancel(@PathVariable Long[] ids) { | 
 |  |  |         List<Long> list = Arrays.asList(ids); | 
 |  |  |         if (list.isEmpty()) { | 
 |  |  |             return R.error("参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         List<WkOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<WkOrderItem>().in(WkOrderItem::getId, list)); | 
 |  |  |         if (orderItems.isEmpty()) { | 
 |  |  |             throw new CoolException("单据明细不存在!!"); | 
 |  |  |         } | 
 |  |  |         return outStockService.cancelOutOrderByItems(orderItems); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  |     @PostMapping("/outStock/export") | 
 |  |  |     @ApiOperation("导出") | 
 |  |  |     public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception { | 
 |  |  |         List<AsnOrder> orders = new ArrayList<>(); | 
 |  |  |         List<WkOrder> orders = new ArrayList<>(); | 
 |  |  |         if (!Objects.isNull(map.get("ids"))) { | 
 |  |  |             List<Long> ids = JSONArray.parseArray(JSONObject.toJSONString(map.get("ids")), Long.class); | 
 |  |  |             if (!ids.isEmpty()) { | 
 |  |  |                 orders = outStockService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, ids)); | 
 |  |  |                 orders = outStockService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, ids)); | 
 |  |  |             } else { | 
 |  |  |                 orders = outStockService.list(new LambdaQueryWrapper<>()); | 
 |  |  |             } | 
 |  |  | 
 |  |  |             orders = outStockService.list(); | 
 |  |  |         } | 
 |  |  |         List<AsnOrderTemplate> orderTemplates = new ArrayList<>(); | 
 |  |  |         for (AsnOrder order : orders) { | 
 |  |  |             List<AsnOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getAsnId, order.getId())); | 
 |  |  |             for (AsnOrderItem item : orderItems) { | 
 |  |  |         for (WkOrder order : orders) { | 
 |  |  |             List<WkOrderItem> orderItems = outStockItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId())); | 
 |  |  |             for (WkOrderItem item : orderItems) { | 
 |  |  |                 if (Objects.isNull(item)) { | 
 |  |  |                     continue; | 
 |  |  |                 } | 
 |  |  | 
 |  |  |                 template.setCode(order.getCode()) | 
 |  |  |                         .setType(OrderType.getValType(order.getType())) | 
 |  |  |                         .setWkType(OrderWorkType.getWorkDesc(order.getWkType())) | 
 |  |  |                         .setExceStatus(AsnExceStatus.getExceStatus(order.getExceStatus())) | 
 |  |  |                         .setAnfme(item.getAnfme() + "") | 
 |  |  |                         .setMaktx(item.getMaktx()) | 
 |  |  |                         .setMemo(item.getMemo()) | 
 |  |  |                         .setMatnrCode(item.getMatnrCode()) | 
 |  |  |                         .setPoCode(item.getPoCode()) | 
 |  |  |                         .setSplrName(item.getSplrName()) | 
 |  |  |                         .setPoId(order.getPoId() + "") | 
 |  |  |                         .setTrackCode(item.getTrackCode()) | 
 |  |  |                         .setBarcode(item.getBarcode()) | 
 |  |  |                         .setPackName(item.getPackName()) | 
 |  |  |                         .setPlatItemId(item.getPlatItemId()) | 
 |  |  |                         .setSplrBatch(item.getSplrBatch()) | 
 |  |  |                         .setSplrCode(item.getSplrCode()) | 
 |  |  |                         .setStockUnit(item.getStockUnit()) | 
 |  |  |                         .setPurQty(item.getPurQty() + "") | 
 |  |  |                         .setPurUnit(item.getPurUnit()); | 
 |  |  |                         .setSplrCode(item.getSplrCode()); | 
 |  |  |                 orderTemplates.add(template); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |         if (Objects.isNull(params.get("ids"))) { | 
 |  |  |             return R.error("参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         List<Long> ids = (List<Long>) params.get("ids"); | 
 |  |  |         return outStockService.genOutStock(ids); | 
 |  |  |         List<DeliveryItem> items = JSON.parseArray(JSONObject.toJSONString(params.get("ids")), DeliveryItem.class); | 
 |  |  |         return outStockService.genOutStock(items, getLoginUserId()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:update')") | 
 |  |  |     @ApiOperation("出库单生成波次") | 
 |  |  |     @PostMapping("/outStock/generate/wave") | 
 |  |  |     public R generateWave(@RequestBody Map<String, Object> params) { | 
 |  |  |     public R generateWave(@RequestBody GenWaveParams params) { | 
 |  |  |         if (Objects.isNull(params)) { | 
 |  |  |             return R.error("参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         List<Long> ids = (List<Long>) params.get("ids"); | 
 |  |  |         return outStockService.generateWaves(ids); | 
 |  |  |         return outStockService.generateWaves(params); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/outStock/items/save") | 
 |  |  |     @ApiOperation("保存主单及明细") | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:save')") | 
 |  |  |     public R orderAndItem(@RequestBody AsnOrderAndItemsParams params) throws Exception { | 
 |  |  |     public R saveOutStock(@RequestBody AsnOrderAndItemsParams params) throws Exception { | 
 |  |  |         if (Objects.isNull(params)) { | 
 |  |  |             return R.error("参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         return outStockService.saveOrderAndItems(params, getLoginUserId()); | 
 |  |  |         return outStockService.saveOutStock(params, getLoginUserId()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @ApiOperation("单据信息修改") | 
 |  |  | 
 |  |  |         return outStockService.updateOrderItem(params, getLoginUserId()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @PostMapping("/outStock/order/getOutTaskItems") | 
 |  |  |     @ApiOperation("出库单库位预览") | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  |     public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param) { | 
 |  |  |         if (Cools.isEmpty(param)) { | 
 |  |  |             return R.error("参数不能为空"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         return outStockService.getOrderOutTaskItem(param); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 出库单生成出库任务 | 
 |  |  |      * @param params | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @PostMapping("/outStock/generate/tasks") | 
 |  |  |     @ApiOperation("出库单生成出库任务") | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  |     public R genOutStockTask( @RequestBody Map<String, Object> params) { | 
 |  |  |         if (Cools.isEmpty()) { | 
 |  |  |             return R.error("参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         if (Objects.isNull(params.get("outId"))) { | 
 |  |  |             return R.error("出库参数不能为空!!"); | 
 |  |  |         } | 
 |  |  |         List<OutStockToTaskParams> taskParams = JSONArray.parseArray(JSONArray.toJSONString(params.get("items")), OutStockToTaskParams.class); | 
 |  |  |         List<OutStockToTaskParams> tasks = new ArrayList<>(); | 
 |  |  |         for (OutStockToTaskParams taskParam : taskParams) { | 
 |  |  |             if (StringUtils.isNotBlank(taskParam.getLocCode())) { | 
 |  |  |                 tasks.add(taskParam); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return  outStockService.genOutStockTask(tasks, getLoginUserId(), Long.parseLong(params.get("outId").toString())); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取出库站点 | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     @GetMapping("/outStock/tasks/sites") | 
 |  |  |     @ApiOperation("获取出库库口") | 
 |  |  |     @PreAuthorize("hasAuthority('manager:outStock:list')") | 
 |  |  |     public R getSiteNos() { | 
 |  |  |         return outStockService.getSiteNos(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |