package com.zy.asrs.wms.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zy.asrs.common.domain.dto.DetlDto; import com.zy.asrs.common.domain.dto.WrkTraceVo; import com.zy.asrs.common.domain.param.OrderDomainParam; import com.zy.asrs.common.wms.entity.*; import com.zy.asrs.common.wms.service.*; import com.zy.asrs.framework.annotations.ManagerAuth; import com.zy.asrs.framework.common.Cools; import com.zy.asrs.framework.common.R; import com.zy.asrs.framework.common.SnowflakeIdWorker; import com.zy.asrs.framework.domain.KeyValueVo; import com.zy.asrs.framework.common.DateUtils; import com.zy.asrs.common.web.BaseController; import com.zy.asrs.framework.exception.CoolException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.*; @RestController public class OrderController extends BaseController { @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private LocDetlService locDetlService; @Autowired private WrkDetlService wrkDetlService; @Autowired private WrkMastService wrkMastService; @Autowired private WrkMastLogService wrkMastLogService; @Autowired private JdbcTemplate jdbcTemplate; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Autowired private DocTypeService docTypeService; @RequestMapping(value = "/order/{id}/auth") @ManagerAuth public R get(@PathVariable("id") String id) { return R.ok(orderService.getById(String.valueOf(id))); } @RequestMapping(value = "/order/page/auth") @ManagerAuth public R page(@RequestParam(defaultValue = "1") Integer curr, @RequestParam(defaultValue = "10") Integer limit, @RequestParam(required = false) String condition, @RequestParam(required = false) String timeRange, @RequestParam Map param) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Order::getHostId, getHostId()); if (!Cools.isEmpty(condition)) { wrapper.like(Order::getId, condition); } if (!Cools.isEmpty(timeRange)) { String[] range = timeRange.split(RANGE_TIME_LINK); wrapper.ge(Order::getCreateTime, DateUtils.convert(range[0])); wrapper.le(Order::getCreateTime, DateUtils.convert(range[1])); } return R.ok(orderService.page(new Page<>(curr, limit), wrapper)); } @RequestMapping(value = "/order/head/page/auth") @ManagerAuth public R head(@RequestParam(defaultValue = "1")Integer curr, @RequestParam(defaultValue = "10")Integer limit, @RequestParam(required = false)String orderByField, @RequestParam(required = false)String orderByType, @RequestParam Map param){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); excludeTrash(param); wrapper.eq(Order::getStatus, 1); wrapper.eq(Order::getHostId, getHostId()); if (!Cools.isEmpty(param.get("order_no"))) { wrapper.eq(Order::getOrderNo, param.get("order_no")); } if (!Cools.isEmpty(param.get("create_time"))) { String[] range = param.get("create_time").toString().split(RANGE_TIME_LINK); wrapper.ge(Order::getCreateTime, DateUtils.convert(range[0])); wrapper.le(Order::getCreateTime, DateUtils.convert(range[1])); } if (!Cools.isEmpty(param.get("doc_type"))) { wrapper.eq(Order::getDocType, param.get("doc_type")); } if (!Cools.isEmpty(param.get("settle"))) { wrapper.eq(Order::getSettle, param.get("settle")); } return R.ok(orderService.page(new Page<>(curr, limit), wrapper)); } @RequestMapping(value = "/order/detl/all/auth") @ManagerAuth public R head(@RequestParam Long orderId){ return R.ok().add(orderDetlService.list(new LambdaQueryWrapper().eq(OrderDetl::getOrderId, orderId).eq(OrderDetl::getHostId, getHostId()))); } @RequestMapping(value = "/order/add/auth") @ManagerAuth public R add(Order order) { order.setHostId(getHostId()); orderService.save(order); return R.ok(); } @RequestMapping(value = "/order/update/auth") @ManagerAuth public R update(Order order){ if (Cools.isEmpty(order) || null==order.getId()){ return R.error(); } orderService.updateById(order); return R.ok(); } @RequestMapping(value = "/order/delete/auth") @ManagerAuth(memo = "手动删除订单") @Transactional public R delete(@RequestParam Long orderId){ if (!orderService.removeById(orderId)) { throw new CoolException("删除单据失败"); } if (!orderDetlService.remove(new LambdaQueryWrapper().eq(OrderDetl::getOrderId, orderId))) { throw new CoolException("删除单据明细失败"); } return R.ok(); } @RequestMapping(value = "/orderQuery/auth") @ManagerAuth public R query(String condition) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.like(Order::getId, condition); wrapper.eq(Order::getHostId, getHostId()); Page page = orderService.page(new Page<>(0, 10), wrapper); List> result = new ArrayList<>(); for (Order order : page.getRecords()){ Map map = new HashMap<>(); map.put("id", order.getId()); map.put("value", order.getId()); result.add(map); } return R.ok(result); } @RequestMapping("/order/all/get/kv") @ManagerAuth public R getDataKV(@RequestParam(required = false) String condition) { List vos = new ArrayList<>(); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Order::getHostId, getHostId()); if (!Cools.isEmpty(condition)) { wrapper.like(Order::getId, condition); } orderService.page(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getId()), item.getId()))); return R.ok().add(vos); } @PostMapping(value = "/order/wrk/trace/auth") @ManagerAuth public R orderWrkTrace(@RequestParam("orderId") Long orderId) { Long hostId = getHostId(); Order order = orderService.getOne(new LambdaQueryWrapper().eq(Order::getId, orderId).eq(Order::getHostId, hostId)); if (null == order) { return R.error("单据不存在"); } // 数量统计 List orderDetls = orderDetlService.list(new LambdaQueryWrapper().eq(OrderDetl::getOrderId, orderId).eq(OrderDetl::getHostId, hostId)); double totalQty = 0; double wrkQty = 0; double lackQty = 0; for (OrderDetl orderDetl : orderDetls) { totalQty = totalQty + orderDetl.getAnfme(); wrkQty = wrkQty + orderDetl.getQty(); double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty()).orElse(0.0D); if (issued > 0.0) { List locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getOrigin(), null); for (LocDetl locDetl : locDetls) { if (issued > 0) { issued = issued - locDetl.getAnfme(); } else { break; } } } if (issued > 0.0) { lackQty = lackQty + issued; } } // 任务追溯 List wrkTraceVos = new ArrayList<>(); List wrkDetls = wrkDetlService.selectAndLogByOrderNoGroupByMatnrOfSum(order.getOrderNo()); for (WrkDetl wrkDetl : wrkDetls) { WrkMast wrkMast = wrkMastService.getOne(new LambdaQueryWrapper().eq(WrkMast::getWrkNo, wrkDetl.getWrkNo()).eq(WrkMast::getIoTime, wrkDetl.getIoTime())); if (wrkMast == null) { WrkMastLog wrkMastLog = wrkMastLogService.getOne(new LambdaQueryWrapper().eq(WrkMastLog::getWrkNo, wrkDetl.getWrkNo()).eq(WrkMastLog::getIoTime, wrkDetl.getIoTime())); if (wrkMastLog != null) { wrkMast = new WrkMast(); BeanUtils.copyProperties(wrkMastLog, wrkMast); } else { continue; } } boolean exist = false; for (WrkTraceVo vo : wrkTraceVos) { if (vo.getWrkNo().equals(wrkMast.getWrkNo()) && vo.getIoTimeStr().equals(DateUtils.convert(wrkMast.getIoTime()))) { vo.getWrkDetls().add(wrkDetl); exist = true; } } if (!exist) { WrkTraceVo vo = new WrkTraceVo(wrkMast.getWrkNo(), DateUtils.convert(wrkMast.getIoTime()), wrkMast, wrkDetl); wrkTraceVos.add(vo); } } if (!Cools.isEmpty(wrkTraceVos) && wrkTraceVos.size() > 1) { wrkTraceVos.sort((o1, o2) -> (int) (o2.getWrkMast().getIoTime().getTime() - o1.getWrkMast().getIoTime().getTime())); } return R.ok().add(Cools .add("list", wrkTraceVos) .add("orderNo", order.getOrderNo()) .add("totalQty", totalQty) .add("wrkQty", wrkQty) .add("lackQty", lackQty) ); } @RequestMapping(value = "/order/form/add/auth") @ManagerAuth(memo = "手动添加订单") @Transactional public R formAdd(@RequestBody OrderDomainParam param){ Order order = orderService.selectByNo(param.getOrderNo(), getHostId()); if (order != null) { return R.error("单据编号已存在"); } // 判断重复订单号 Integer orderCount = Optional.ofNullable(jdbcTemplate.queryForObject("select count(1) from man_order where order_no = '" + param.getOrderNo() + "'", Integer.class)).orElse(0); Integer orderLogCount = Optional.ofNullable(jdbcTemplate.queryForObject("select count(1) from man_order_log where order_no = '" + param.getOrderNo() + "'", Integer.class)).orElse(0); if (orderCount > 0 || orderLogCount > 0) { return R.error("单据编号已存在"); } Date now = new Date(); order = new Order( String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] param.getOrderNo(), // 订单编号 DateUtils.convert(now), // 单据日期 param.getDocType(), // 单据类型 null, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 null, // 客户编号 null, // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 getUserId(), // 添加人员 now, // 添加时间 getUserId(), // 修改人员 now, // 修改时间 null, // 备注 getHostId() ); if (!orderService.save(order)) { throw new CoolException("保存订单主档失败"); } List list = new ArrayList<>(); for (OrderDetl orderDetl : param.getOrderDetlList()) { DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch()); if (DetlDto.has(list, dto)) { OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch()); item.setAnfme(item.getAnfme() + orderDetl.getAnfme()); if (!orderDetlService.updateById(item)) { throw new CoolException("保存订单明细档失败"); } } else { list.add(dto); orderDetl.setOrderId(order.getId()); orderDetl.setOrderNo(order.getOrderNo()); orderDetl.setCreateBy(getUserId()); orderDetl.setCreateTime(now); orderDetl.setUpdateBy(getUserId()); orderDetl.setUpdateTime(now); orderDetl.setStatus(1); orderDetl.setQty(0.0D); if (!orderDetlService.save(orderDetl)) { throw new CoolException("保存订单明细档失败"); } } } return R.ok("订单添加成功"); } @RequestMapping(value = "/order/nav/list/auth") @ManagerAuth public R navList(@RequestParam(required = false) String orderNo){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Order::getHostId, getHostId()); if (!Cools.isEmpty(orderNo)) { wrapper.like(Order::getOrderNo, orderNo); } wrapper.le(Order::getSettle, 2).eq(Order::getStatus, 1); wrapper.orderByDesc(Order::getCreateTime); List orders = orderService.list(wrapper); // 保留出库单 if (!Cools.isEmpty(orders)) { Iterator iterator = orders.iterator(); while (iterator.hasNext()) { Order order = iterator.next(); if (order.getDocType() != null) { DocType docType = docTypeService.getById(order.getDocType()); if (docType != null) { if (docType.getPakout() == 0) { iterator.remove(); } } } } } return R.ok().add(orders); } }