package com.zy.asrs.controller; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.baomidou.mybatisplus.mapper.EntityWrapper; 
 | 
import com.baomidou.mybatisplus.mapper.Wrapper; 
 | 
import com.baomidou.mybatisplus.plugins.Page; 
 | 
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.OrderDomainParam; 
 | 
  
 | 
import com.zy.asrs.entity.result.WrkTraceVo; 
 | 
import com.zy.asrs.service.*; 
 | 
import com.zy.common.model.DetlDto; 
 | 
import com.zy.common.web.BaseController; 
 | 
import org.springframework.beans.BeanUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
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 SnowflakeIdWorker snowflakeIdWorker; 
 | 
    @Autowired 
 | 
    private DocTypeService docTypeService; 
 | 
    @Autowired 
 | 
    private WrkDetlService wrkDetlService; 
 | 
    @Autowired 
 | 
    private WaitPakinService waitPakinService; 
 | 
    @Autowired 
 | 
    private LocDetlService locDetlService; 
 | 
    @Autowired 
 | 
    private WrkMastService wrkMastService; 
 | 
    @Autowired 
 | 
    private WrkMastLogService wrkMastLogService; 
 | 
  
 | 
    @RequestMapping(value = "/order/nav/list/auth") 
 | 
    @ManagerAuth 
 | 
    public R navList(@RequestParam(required = false) String orderNo){ 
 | 
        EntityWrapper<Order> wrapper = new EntityWrapper<>(); 
 | 
        if (!Cools.isEmpty(orderNo)) { 
 | 
            wrapper.like("order_no", orderNo); 
 | 
        } 
 | 
        wrapper.le("settle", 2).eq("status", 1); 
 | 
        wrapper.orderBy("create_time", false); 
 | 
        List<Order> orders = orderService.selectList(wrapper); 
 | 
        // 保留出库单 
 | 
        if (!Cools.isEmpty(orders)) { 
 | 
            Iterator<Order> iterator = orders.iterator(); 
 | 
            while (iterator.hasNext()) { 
 | 
                Order order = iterator.next(); 
 | 
                if (order.getDocType() != null) { 
 | 
                    DocType docType = docTypeService.selectById(order.getDocType()); 
 | 
                    if (docType != null) { 
 | 
                        if (docType.getPakout() == 0) { 
 | 
                            iterator.remove(); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return R.ok().add(orders); 
 | 
    } 
 | 
  
 | 
    @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<String, Object> param){ 
 | 
        EntityWrapper<Order> wrapper = new EntityWrapper<>(); 
 | 
        excludeTrash(param); 
 | 
        convert(param, wrapper); 
 | 
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else { 
 | 
            wrapper.orderBy("settle").orderBy("create_time", false); 
 | 
        } 
 | 
        wrapper.eq("status", 1); 
 | 
        return R.ok(orderService.selectPage(new Page<>(curr, limit), wrapper)); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/detl/all/auth") 
 | 
    @ManagerAuth 
 | 
    public R head(@RequestParam Long orderId){ 
 | 
        return R.ok().add(orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_id", orderId))); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/form/add/auth") 
 | 
    @ManagerAuth(memo = "手动添加订单") 
 | 
    @Transactional 
 | 
    public R formAdd(@RequestBody OrderDomainParam param){ 
 | 
        int status = 0; 
 | 
        if(Cools.isEmpty(param.getOrderNo())){ 
 | 
            String prefix = ""; 
 | 
            DocType docType = docTypeService.selectById(param.getDocType()); 
 | 
            if(!Cools.isEmpty(docType)){ 
 | 
                prefix = docType.getPakin() == 1 ? "RK" : "CK"; 
 | 
                status = (prefix.equals("RK") ? 1 : (prefix.equals("CK") ? 2 : 0)); 
 | 
            } 
 | 
            param.setOrderNo(prefix + snowflakeIdWorker.nextId()); 
 | 
        } else { 
 | 
            DocType docType = docTypeService.selectById(param.getDocType()); 
 | 
            if(!Cools.isEmpty(docType)){ 
 | 
                status = (docType.getPakin() == 1 ? 1 :  2 ); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        Order order = orderService.selectByNo(param.getOrderNo()); 
 | 
        if (order != null) { 
 | 
            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,    // 备注 
 | 
                status 
 | 
        ); 
 | 
        if (!orderService.insert(order)) { 
 | 
            throw new CoolException("保存订单主档失败"); 
 | 
        } 
 | 
        List<DetlDto> list = new ArrayList<>(); 
 | 
        for (OrderDetl orderDetl : param.getOrderDetlList()) { 
 | 
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getBrand(), 
 | 
                    orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(), 
 | 
                    orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3()); 
 | 
            if (DetlDto.has(list, dto)) { 
 | 
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(), 
 | 
                        orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3()); 
 | 
                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); 
 | 
                orderDetl.setPakinPakoutStatus(status); 
 | 
                if (!orderDetlService.insert(orderDetl)) { 
 | 
                    throw new CoolException("保存订单明细档失败"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return R.ok("订单添加成功"); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/form/modify/auth") 
 | 
    @ManagerAuth(memo = "手动修改订单") 
 | 
    @Transactional 
 | 
    public R formModify(@RequestBody OrderDomainParam param){ 
 | 
        Order order = orderService.selectById(param.getOrderId()); 
 | 
        if (order == null || order.getStatus() == 0) { 
 | 
            return R.error("订单不存在"); 
 | 
        } 
 | 
        Date now = new Date(); 
 | 
        Long userId = getUserId(); 
 | 
        // 修改主档 
 | 
        if (!param.getDocType().equals(order.getDocType())) { 
 | 
            order.setDocType(param.getDocType()); 
 | 
            order.setUpdateBy(userId); 
 | 
            order.setUpdateTime(now); 
 | 
            if (!orderService.updateById(order)) { 
 | 
                throw new CoolException("修改订单类型失败"); 
 | 
            } 
 | 
        } 
 | 
        // 修改明细档 
 | 
//        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId()); 
 | 
        // 1.清空明细档 
 | 
        if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()))) { 
 | 
            throw new CoolException("清空订单明细失败"); 
 | 
        } 
 | 
        // 2.重组数据 
 | 
        List<DetlDto> list = new ArrayList<>(); 
 | 
        for (OrderDetl orderDetl : param.getOrderDetlList()) { 
 | 
            DetlDto dto = new DetlDto(orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(), 
 | 
                    orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(), 
 | 
                    orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3()); 
 | 
            if (DetlDto.has(list, dto)) { 
 | 
                OrderDetl item = orderDetlService.selectItem(order.getId(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(), 
 | 
                        orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(), 
 | 
                        orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3()); 
 | 
                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.insert(orderDetl)) { 
 | 
                    throw new CoolException("保存订单明细档失败"); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return R.ok("订单修改成功"); 
 | 
    } 
 | 
  
 | 
    @PostMapping(value = "/order/wrk/trace/auth") 
 | 
    @ManagerAuth 
 | 
    public R orderWrkTrace(@RequestParam("orderId") Long orderId) { 
 | 
        Order order = orderService.selectById(orderId); 
 | 
        if (null == order) { 
 | 
            return R.error("单据不存在"); 
 | 
        } 
 | 
        // 数量统计 
 | 
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(orderId); 
 | 
        double totalQty = 0; 
 | 
        double wrkQty = 0; 
 | 
        double lackQty = 0; 
 | 
        double endQty = 0; 
 | 
        for (OrderDetl orderDetl : orderDetls) { 
 | 
            totalQty = totalQty + orderDetl.getAnfme(); 
 | 
            wrkQty = wrkQty + orderDetl.getWorkQty(); 
 | 
            endQty = endQty + orderDetl.getQty(); 
 | 
            if (!Cools.isEmpty(order.getPakinPakoutStatus$()) && order.getPakinPakoutStatus$().equals("N")){ 
 | 
                double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D); 
 | 
                if (issued > 0.0) { 
 | 
                    List<LocDetl> 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<WrkTraceVo> wrkTraceVos = new ArrayList<>(); 
 | 
        List<WrkDetl> wrkDetls = wrkDetlService.selectAndLogByOrderNoGroupByMatnrOfSum(order.getOrderNo()); 
 | 
        for (WrkDetl wrkDetl : wrkDetls) { 
 | 
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", wrkDetl.getWrkNo()).eq("io_time", wrkDetl.getIoTime())); 
 | 
            if (wrkMast == null) { 
 | 
                WrkMastLog wrkMastLog = wrkMastLogService.selectOne(new EntityWrapper<WrkMastLog>().eq("wrk_no", wrkDetl.getWrkNo()).eq("io_time", wrkDetl.getIoTime())); 
 | 
                if (wrkMastLog.getIoType()==103){ 
 | 
                    wrkMastLog = wrkMastLogService.selectOne(new EntityWrapper<WrkMastLog>().eq("wrk_no", wrkDetl.getWrkNo()).eq("io_time", wrkDetl.getIoTime()).eq("io_type",53)); 
 | 
                } 
 | 
                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+endQty) 
 | 
                .add("lackQty", lackQty) 
 | 
                .add("endQty",endQty) 
 | 
        ); 
 | 
    } 
 | 
  
 | 
  
 | 
    // ------------------------------------------------------------------------------------------------ 
 | 
  
 | 
    @RequestMapping(value = "/order/{id}/auth") 
 | 
    @ManagerAuth 
 | 
    public R get(@PathVariable("id") String id) { 
 | 
        return R.ok(orderService.selectById(String.valueOf(id))); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/list/auth") 
 | 
    @ManagerAuth 
 | 
    public R list(@RequestParam(defaultValue = "1")Integer curr, 
 | 
                  @RequestParam(defaultValue = "10")Integer limit, 
 | 
                  @RequestParam(required = false)String orderByField, 
 | 
                  @RequestParam(required = false)String orderByType, 
 | 
                  @RequestParam Map<String, Object> param){ 
 | 
        EntityWrapper<Order> wrapper = new EntityWrapper<>(); 
 | 
        excludeTrash(param); 
 | 
        convert(param, wrapper); 
 | 
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} 
 | 
        return R.ok(orderService.selectPage(new Page<>(curr, limit), wrapper)); 
 | 
    } 
 | 
  
 | 
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){ 
 | 
        for (Map.Entry<String, Object> entry : map.entrySet()){ 
 | 
            String val = String.valueOf(entry.getValue()); 
 | 
            if (val.contains(RANGE_TIME_LINK)){ 
 | 
                String[] dates = val.split(RANGE_TIME_LINK); 
 | 
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0])); 
 | 
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1])); 
 | 
            } else { 
 | 
                wrapper.like(entry.getKey(), val); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/update/auth") 
 | 
    @ManagerAuth 
 | 
    public R update(Order order){ 
 | 
        if (Cools.isEmpty(order) || null == order.getId()){ 
 | 
            return R.error(); 
 | 
        } 
 | 
  
 | 
        //订单完结前,判断是否存在作业中数据,存在则不能完结 
 | 
        if(order.getSettle() == 4){ 
 | 
            int wrkCount = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("order_no",order.getOrderNo())); 
 | 
            int pakinCount = waitPakinService.selectCount(new EntityWrapper<WaitPakin>().eq("order_no",order.getOrderNo())); 
 | 
            if (wrkCount > 0 || pakinCount > 0) { 
 | 
                throw new CoolException("存在作业中数据,不能完结。请检查入库通知档和工作档"); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        order.setUpdateBy(getUserId()); 
 | 
        order.setUpdateTime(new Date()); 
 | 
        if (!orderService.updateById(order)) { 
 | 
            throw new CoolException("修改订单失败"); 
 | 
        } 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/delete/auth") 
 | 
    @ManagerAuth(memo = "手动删除订单") 
 | 
    @Transactional 
 | 
    public R delete(@RequestParam Long orderId){ 
 | 
        orderService.remove(orderId); 
 | 
//        Order order = orderService.selectById(orderId); 
 | 
//        if (order != null) { 
 | 
//            order.setStatus(0); 
 | 
//        } 
 | 
//        if (!orderService.updateById(order)) { 
 | 
//            throw new CoolException("删除订单失败"); 
 | 
//        } 
 | 
//        orderDetlService.modifyStatus(orderId, 0); 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/export/auth") 
 | 
    @ManagerAuth 
 | 
    public R export(@RequestBody JSONObject param){ 
 | 
        EntityWrapper<Order> wrapper = new EntityWrapper<>(); 
 | 
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class); 
 | 
        Map<String, Object> map = excludeTrash(param.getJSONObject("order")); 
 | 
        convert(map, wrapper); 
 | 
        List<Order> list = orderService.selectList(wrapper); 
 | 
        return R.ok(exportSupport(list, fields)); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/orderQuery/auth") 
 | 
    @ManagerAuth 
 | 
    public R query(String condition) { 
 | 
        EntityWrapper<Order> wrapper = new EntityWrapper<>(); 
 | 
        wrapper.like("id", condition); 
 | 
        Page<Order> page = orderService.selectPage(new Page<>(0, 10), wrapper); 
 | 
        List<Map<String, Object>> result = new ArrayList<>(); 
 | 
        for (Order order : page.getRecords()){ 
 | 
            Map<String, Object> map = new HashMap<>(); 
 | 
            map.put("id", order.getId()); 
 | 
            map.put("value", order.getOrderNo()); 
 | 
            result.add(map); 
 | 
        } 
 | 
        return R.ok(result); 
 | 
    } 
 | 
  
 | 
    @RequestMapping(value = "/order/check/column/auth") 
 | 
    @ManagerAuth 
 | 
    public R query(@RequestBody JSONObject param) { 
 | 
        Wrapper<Order> wrapper = new EntityWrapper<Order>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val")); 
 | 
        if (null != orderService.selectOne(wrapper)){ 
 | 
            return R.parse(BaseRes.REPEAT).add(getComment(Order.class, String.valueOf(param.get("key")))); 
 | 
        } 
 | 
        return R.ok(); 
 | 
    } 
 | 
  
 | 
} 
 |