自动化立体仓库 - WMS系统
zjj
2023-05-26 ee332179e2e6f6aaa8c420b2f8fc8f44e6e971cc
#订单历史档完成
15个文件已修改
28个文件已添加
5627 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/LocCheckController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderCheckController.java 383 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderDetlLogController.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderLogController.java 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocCheck.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ManLocDetl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderCheck.java 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetlLog.java 447 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderLog.java 441 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CheckDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OrderCheckParam.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocCheckMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderCheckMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlLogMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderLogMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocCheckService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderCheckService.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderDetlLogService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderLogService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocCheckServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderCheckServiceImpl.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlLogServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderLogServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderLogScheduler.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderLogHandler.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/orderLog.sql 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocCheckMapper.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderCheckMapper.xml 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderLogMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locCheck/locCheck.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderCheck/orderCheck.js 596 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderDetl/outLog.js 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderLog/orderLog.js 550 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/locCheck/locCheck.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderCheck/orderCheck.html 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderLog/orderLog.html 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderLog/outLog.html 342 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocCheckController.java
@@ -7,22 +7,29 @@
import com.baomidou.mybatisplus.plugins.Page;
import com.core.common.DateUtils;
import com.zy.asrs.entity.LocCheck;
import com.zy.asrs.entity.ManLocDetl;
import com.zy.asrs.service.LocCheckService;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.service.ManLocDetlService;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.*;
@Slf4j
@RestController
public class LocCheckController extends BaseController {
    @Autowired
    private LocCheckService locCheckService;
    @Autowired
    private ManLocDetlService manLocDetlService;
    @RequestMapping(value = "/locCheck/{id}/auth")
    @ManagerAuth
@@ -121,9 +128,42 @@
    }
    @RequestMapping("/locCheck/create/auth")
    public R autoCreate(String prec){
        locCheckService.autoCreatePick(prec);
        return R.ok("创建拣货单成功");
    @ManagerAuth
    public R autoCreate(@RequestParam(value = "prec") String prec){
        int precInt = Integer.parseInt(prec);
        EntityWrapper<ManLocDetl> manLocDetlEntityWrapper = new EntityWrapper<>();
        int count = manLocDetlService.selectCount(manLocDetlEntityWrapper);
        List<ManLocDetl> countLocDetl;
        switch (precInt){
            case 100:
                break;
            case 80:
                count = (int)(count * 0.8); break;
            case 60:
                count = (int)(count * 0.6); break;
            case 40:
                count = (int)(count * 0.4); break;
            case 10:
                count = (int)(count * 0.1); break;
            default:
                return R.ok("数量");
        }
        countLocDetl = locCheckService.getCountLocDetl(count);
        locCheckService.deleteAll();
        for (ManLocDetl manLocDetl :countLocDetl){
            LocCheck locCheck = new LocCheck();
            locCheck.setLocNo(manLocDetl.getLocNo());
            locCheck.setType(1);
            locCheck.setMatnr(manLocDetl.getMatnr());
            locCheck.setAnfme(manLocDetl.getAnfme());
            if (!locCheckService.insert(locCheck)){
                return R.error("插入失败");
            }
        }
        return R.ok("插入成功");
    }
}
src/main/java/com/zy/asrs/controller/OrderCheckController.java
New file
@@ -0,0 +1,383 @@
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.CheckDTO;
import com.zy.asrs.entity.param.MatnrDto;
import com.zy.asrs.entity.param.OrderCheckParam;
import com.zy.asrs.entity.param.OrderDomainParam;
import com.zy.asrs.service.*;
import com.zy.common.CodeRes;
import com.zy.common.config.AdminInterceptor;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.BarcodeUtils;
import com.zy.common.utils.QrCode;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.*;
@RestController
public class OrderCheckController 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 OrderLogService orderLogService;
    @Autowired
    private OrderCheckService orderCheckService;
    @Autowired
    private LocCheckService locCheckService;
    @Autowired
    private ManLocDetlService manLocDetlService;
    @RequestMapping(value = "/orderCheck/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 = "/orderCheck/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<OrderCheck> 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);
        }
        return R.ok(orderCheckService.selectPage(new Page<>(curr, limit), wrapper));
    }
    @RequestMapping(value = "/orderCheck/detl/all/auth")
    @ManagerAuth
    public R head(@RequestParam String orderNo){
        List<LocCheck> orderNo1 = locCheckService.selectList(new EntityWrapper<LocCheck>().eq("order_no", orderNo));
        return R.ok().add(orderNo1);
    }
    @RequestMapping(value = "/orderCheck/form/add/auth")
    @ManagerAuth(memo = "手动添加订单")
    @Transactional
    public R formAdd(@RequestBody OrderCheckParam param){
        OrderCheck orderCheck1 = orderCheckService.selectByNo(param.getOrderNo());
        OrderLog orderLog = orderLogService.selectByNo(param.getOrderNo());
        if (orderCheck1 != null) {
            return R.error("盘点单单据编号已存在");
        }
        if (orderLog != null) {
            return R.error("盘点单单据编号在历史档中已存在");
        }
        Date now = new Date();
        OrderCheck orderCheck = new OrderCheck();
        orderCheck.setOrderNo(param.getOrderNo());
        orderCheck.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        orderCheck.setOrderTime(DateUtils.convert(now));
        orderCheck.setStatus(1);
        orderCheck.setSettle(1L);
        orderCheck.setDocType(23L);
        orderCheck.setCreateTime(now);
        orderCheck.setUpdateTime(now);
        if (!orderCheckService.insert(orderCheck)) {
            throw new CoolException("保存盘点单主档失败");
        }
        for (ManLocDetl manLocDetl : param.getOrderDetlList()){
            LocCheck locCheck = new LocCheck();
            locCheck.setLocNo(manLocDetl.getLocNo());
            locCheck.setMaktx(manLocDetl.getMaktx());
            locCheck.setType(1);
            locCheck.setMatnr(manLocDetl.getMatnr());
            locCheck.setAnfme(manLocDetl.getAnfme());
            locCheck.setRealAnfme(0.0);
            locCheck.setDiffAnfme(0.0);
            locCheck.setCreateTime(now);
            locCheck.setUpdateTime(now);
            locCheck.setOrderNo(param.getOrderNo());
            if (!locCheckService.insert(locCheck)){
                return R.error("插入失败");
            }
        }
        return R.ok("盘点单添加成功");
    }
    @RequestMapping(value = "/orderCheck/form/modify/auth")
    @ManagerAuth(memo = "手动修改订单")
    @Transactional
    public R formModify(@RequestBody OrderCheckParam param){
        OrderCheck orderCheck = orderCheckService.selectByNo(param.getOrderNo());
        if (orderCheck == null || orderCheck.getStatus() == 0) {
            return R.error("盘点单不存在");
        }
        Date now = new Date();
        Long userId = getUserId();
        // 修改主档
        orderCheck.setUpdateBy(userId);
        orderCheck.setUpdateTime(now);
        if (!orderCheckService.updateById(orderCheck)) {
            throw new CoolException("修改盘点单类型失败");
        }
        // 修改明细档
//        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
        // 1.清空明细档
        if (!locCheckService.delete(new EntityWrapper<LocCheck>().eq("order_no",orderCheck.getOrderNo())) ) {
            throw new CoolException("清空盘点单明细失败");
        }
        for (ManLocDetl manLocDetl : param.getOrderDetlList()){
            LocCheck locCheck = new LocCheck();
            locCheck.setLocNo(manLocDetl.getLocNo());
            locCheck.setMaktx(manLocDetl.getMaktx());
            locCheck.setType(1);
            locCheck.setMatnr(manLocDetl.getMatnr());
            locCheck.setAnfme(manLocDetl.getAnfme());
            locCheck.setRealAnfme(0.0);
            locCheck.setDiffAnfme(0.0);
            locCheck.setCreateTime(now);
            locCheck.setUpdateTime(now);
            locCheck.setOrderNo(param.getOrderNo());
            if (!locCheckService.insert(locCheck)){
                return R.error("插入失败");
            }
        }
        return R.ok("盘点单修改成功");
    }
    // ------------------------------------------------------------------------------------------------
    @RequestMapping(value = "/orderCheck/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(orderService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/orderCheck/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<LocCheck> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        Object orderNo = param.get("order_no");
        wrapper.eq("order_no",orderNo);
        Page<LocCheck> manLocDetlPage = locCheckService.selectPage(new Page<>(curr, limit), wrapper);
        return R.ok(manLocDetlPage);
    }
    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 = "/orderCheck/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 = "/orderCheck/delete/auth")
    @ManagerAuth(memo = "手动删除订单")
    @Transactional
    public R delete(@RequestParam String orderNo){
        orderCheckService.remove(orderNo);
//        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 = "/orderCheck/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 = "/orderCheckQuery/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 = "/orderCheck/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();
    }
    @RequestMapping("/orderCheck/in")
    public R in(@RequestBody JSONObject param){
        System.out.println("111 = " + 111);
        return R.ok();
    }
    @RequestMapping("/orderCheck/create/auth")
    @ManagerAuth
    public R autoCreate(@RequestBody CheckDTO checkDTO){
        Double prec = Double.valueOf(checkDTO.getPrec());
        List<CheckDTO.data> data = checkDTO.getData();
        EntityWrapper<ManLocDetl> manLocDetlEntityWrapper = new EntityWrapper<>();
        int count = manLocDetlService.selectCount(manLocDetlEntityWrapper);
        List<ManLocDetl> countLocDetl = new ArrayList<>();
        double precDpuble = prec / 100;
        count = (int)(count * precDpuble);
        if (checkDTO.getData() == null){
            countLocDetl = locCheckService.getCountLocDetl(count);
        }else {
            for (CheckDTO.data a :data){
                String matnr = a.getValue();
                EntityWrapper<ManLocDetl> manLocDetlEntityWrapper2 = new EntityWrapper<>();
                manLocDetlEntityWrapper2.eq("matnr",matnr);
                int countfor = manLocDetlService.selectCount(manLocDetlEntityWrapper2);
                countfor = (countfor * precDpuble)>1? Math.round((float)(countfor * precDpuble)) : 1 ;
                for (ManLocDetl manLocDetl: locCheckService.getMatnrCountLocDetl(countfor,a.getValue())){
                    countLocDetl.add(manLocDetl);
                }
            }
        }
        return R.ok().add(countLocDetl);
    }
    @RequestMapping(value = "/orderCheck/print/auth")
    @ManagerAuth(memo = "订单编码打印")
    public R manPakOutPrint(@RequestParam(value = "param[]") String[] param) {
        if(Cools.isEmpty(param)) {
            return R.parse(CodeRes.EMPTY);
        }
        List<LocCheck> res = new ArrayList<>();
        for (String orderNo : param){
            res = locCheckService.selectList(new EntityWrapper<LocCheck>().eq("order_no", orderNo));
        }
        return R.ok().add(res);
    }
    @RequestMapping(value = "/orderCheck/code/auth")
//    @ManagerAuth(memo = "物料编码条形码获取(type:1(条形码);2(二维码)")
    public R manPakOutCodeBarcode(@RequestParam(defaultValue = "2") Integer type
            , @RequestParam String param
            , HttpServletResponse response) throws Exception {
        AdminInterceptor.cors(response);
        if (Cools.isEmpty(param)){
            return R.parse(BaseRes.EMPTY);
        }
        BufferedImage img;
        if (type == 1) {
            img = BarcodeUtils.encode(param);
        } else {
            img = QrCode.createImg(param);
        }
        if (!ImageIO.write(img, "jpg", response.getOutputStream())) {
            throw new IOException("Could not write an image of format jpg");
        }
        response.getOutputStream().flush();
        response.getOutputStream().close();
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/OrderController.java
@@ -36,6 +36,8 @@
    private WaitPakinService waitPakinService;
    @Autowired
    private LocOwnerService locOwnerService;
    @Autowired
    private OrderLogService orderLogService;
    @RequestMapping(value = "/order/nav/list/auth")
    @ManagerAuth
@@ -105,9 +107,13 @@
            param.setOrderNo(prefix + snowflakeIdWorker.nextId());
        }
        Order order = orderService.selectByNo(param.getOrderNo());
        OrderLog orderLog = orderLogService.selectByNo(param.getOrderNo());
        if (order != null) {
            return R.error("单据编号已存在");
        }
        if (orderLog != null) {
            return R.error("单据编号在历史档中已存在");
        }
        Date now = new Date();
        order = new Order(
                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
src/main/java/com/zy/asrs/controller/OrderDetlLogController.java
New file
@@ -0,0 +1,140 @@
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.BaseRes;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.OrderDetlLog;
import com.zy.asrs.service.OrderDetlLogService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class OrderDetlLogController extends BaseController {
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private OrderDetlLogService orderDetlLogService;
    @RequestMapping(value = "/orderDetlLog/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(orderDetlService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/orderDetlLog/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<OrderDetlLog> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
            wrapper.orderBy("create_time", false);
        }
        wrapper.eq("status", 1);
        return R.ok(orderDetlLogService.selectPage(new Page<>(curr, limit), wrapper));
    }
    @RequestMapping(value = "/orderDetlLog/pakout/list/auth")
    @ManagerAuth
    public R pakoutList(@RequestParam(defaultValue = "1")Integer curr,
                        @RequestParam(defaultValue = "10")Integer limit,
                        @RequestParam Map<String, Object> param){
        return R.ok(orderDetlService.getPakoutPage(toPage(curr, limit, param, OrderDetl.class)));
    }
    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 = "/orderDetlLog/add/auth")
    @ManagerAuth
    public R add(OrderDetl orderDetl) {
        orderDetlService.insert(orderDetl);
        return R.ok();
    }
    @RequestMapping(value = "/orderDetlLog/update/auth")
    @ManagerAuth
    public R update(OrderDetl orderDetl){
        if (Cools.isEmpty(orderDetl) || null==orderDetl.getId()){
            return R.error();
        }
        orderDetlService.updateById(orderDetl);
        return R.ok();
    }
    @RequestMapping(value = "/orderDetlLog/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
        for (Long id : ids){
            orderDetlService.deleteById(id);
        }
        return R.ok();
    }
    @RequestMapping(value = "/orderDetlLog/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
        EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("orderDetl"));
        convert(map, wrapper);
        List<OrderDetl> list = orderDetlService.selectList(wrapper);
        return R.ok(exportSupport(list, fields));
    }
    @RequestMapping(value = "/orderDetlLogQuery/auth")
    @ManagerAuth
    public R query(String condition) {
        EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
        wrapper.like("id", condition);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (OrderDetl orderDetl : page.getRecords()){
            Map<String, Object> map = new HashMap<>();
            map.put("id", orderDetl.getId());
            map.put("value", orderDetl.getId());
            result.add(map);
        }
        return R.ok(result);
    }
    @RequestMapping(value = "/orderDetlLog/check/column/auth")
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<OrderDetl> wrapper = new EntityWrapper<OrderDetl>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != orderDetlService.selectOne(wrapper)){
            return R.parse(BaseRes.REPEAT).add(getComment(OrderDetl.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/OrderLogController.java
New file
@@ -0,0 +1,350 @@
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.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.web.BaseController;
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 OrderLogController 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 OrderLogService orderLogService;
    @Autowired
    private OrderDetlLogService orderDetlLogService;
    @RequestMapping(value = "/orderLog/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 = "/orderLog/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<OrderLog> 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(orderLogService.selectPage(new Page<>(curr, limit), wrapper));
    }
    @RequestMapping(value = "/orderLog/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 = "/orderLog/form/add/auth")
    @ManagerAuth(memo = "手动添加订单")
    @Transactional
    public R formAdd(@RequestBody OrderDomainParam param){
        if(Cools.isEmpty(param.getOrderNo())){
            String prefix = "";
            DocType docType = docTypeService.selectById(param.getDocType());
            if(!Cools.isEmpty(docType)){
                prefix = docType.getPakin() == 1 ? "RK" : "CK";
            }
            param.setOrderNo(prefix + snowflakeIdWorker.nextId());
        }
        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    // 备注
        );
        if (!orderService.insert(order)) {
            throw new CoolException("保存订单主档失败");
        }
        List<DetlDto> list = new ArrayList<>();
        for (OrderDetl orderDetl : param.getOrderDetlList()) {
            if (orderDetl.getBatch() == null) {
                orderDetl.setBatch("");
            }
            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.insert(orderDetl)) {
                    throw new CoolException("保存订单明细档失败");
                }
            }
        }
        return R.ok("订单添加成功");
    }
    @RequestMapping(value = "/orderLog/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());
            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.insert(orderDetl)) {
                    throw new CoolException("保存订单明细档失败");
                }
            }
        }
        return R.ok("订单修改成功");
    }
    // ------------------------------------------------------------------------------------------------
    @RequestMapping(value = "/orderLog/{id}/auth")
    @ManagerAuth
    public R get(@PathVariable("id") String id) {
        return R.ok(orderService.selectById(String.valueOf(id)));
    }
    @RequestMapping(value = "/orderLog/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 = "/orderLog/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 = "/orderLog/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 = "/orderLog/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 = "/orderLogQuery/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 = "/orderLog/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();
    }
    @RequestMapping("/orderLog/in")
    public R in(@RequestBody JSONObject param){
        System.out.println("111 = " + 111);
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/LocCheck.java
@@ -47,11 +47,17 @@
    private String matnr;
    /**
     * 物料号
     */
    @ApiModelProperty(value= "物料名")
    private String maktx;
    /**
     * 盘点前数量
     */
    @ApiModelProperty(value= "盘点前数量")
    @TableField("origin_anfme")
    private Double originAnfme;
    @TableField("anfme")
    private Double anfme;
    /**
     * 真实数量
@@ -96,20 +102,17 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    public LocCheck() {}
    @ApiModelProperty(value= "差异量")
    @TableField("diff_anfme")
    private Double diffAnfme;
    public LocCheck(Integer type,String locNo,String matnr,Double originAnfme,Double realAnfme,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.type = type;
        this.locNo = locNo;
        this.matnr = matnr;
        this.originAnfme = originAnfme;
        this.realAnfme = realAnfme;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
    @ApiModelProperty(value= "单据号")
    @TableField("order_no")
    private String orderNo;
//    LocCheck locCheck = new LocCheck(
//            null,    // 状态
src/main/java/com/zy/asrs/entity/ManLocDetl.java
@@ -37,7 +37,6 @@
     * 货位编号
     */
    @ApiModelProperty(value= "货位编号")
    @TableId(value = "loc_no", type = IdType.INPUT)
    @TableField("loc_no")
    private String locNo;
@@ -223,36 +222,7 @@
    @TableField("uuid")
    private String uuid;
    public ManLocDetl() {}
    public ManLocDetl(Long hostId, String locNo,Long nodeId,String zpallet,Double anfme,String matnr,String maktx,String name,String specs,String model,String batch,String unit,String barcode,Long docId,String docNum,String custName,Integer itemNum,Integer count,Double weight,Integer status,Long createBy,Date createTime,Long updateBy,Date modiTime,String memo,int owner ,int payment,String uuid) {
        this.hostId = hostId;
        this.nodeId = nodeId;
        this.zpallet = zpallet;
        this.anfme = anfme;
        this.maktx = maktx;
        this.name = name;
        this.specs = specs;
        this.model = model;
        this.batch = batch;
        this.unit = unit;
        this.barcode = barcode;
        this.docId = docId;
        this.docNum = docNum;
        this.custName = custName;
        this.itemNum = itemNum;
        this.count = count;
        this.weight = weight;
        this.status = status;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.modiTime = modiTime;
        this.memo = memo;
        this.owner = owner;
        this.payment = payment;
        this.uuid = uuid;
    }
//    LocDetl locDetl = new LocDetl(
//            null,    // 货位编号[非空]
src/main/java/com/zy/asrs/entity/OrderCheck.java
New file
@@ -0,0 +1,443 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.OrderSettle;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderSettleService;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
@TableName("man_order_check")
public class OrderCheck implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 编号
     */
    @ApiModelProperty(value= "编号")
    private String uuid;
    /**
     * 订单编号
     */
    @ApiModelProperty(value= "订单编号")
    @TableField("order_no")
    private String orderNo;
    /**
     * 单据日期
     */
    @ApiModelProperty(value= "单据日期")
    @TableField("order_time")
    private String orderTime;
    /**
     * 单据类型
     */
    @ApiModelProperty(value= "单据类型")
    @TableField("doc_type")
    private Long docType;
    /**
     * 项目编号
     */
    @ApiModelProperty(value= "项目编号")
    @TableField("item_id")
    private Long itemId;
    @ApiModelProperty(value= "")
    @TableField("item_name")
    private String itemName;
    /**
     * 调拨项目编号
     */
    @ApiModelProperty(value= "调拨项目编号")
    @TableField("allot_item_id")
    private Long allotItemId;
    /**
     * 初始票据号
     */
    @ApiModelProperty(value= "初始票据号")
    @TableField("def_number")
    private String defNumber;
    /**
     * 票据号
     */
    @ApiModelProperty(value= "票据号")
    private String number;
    /**
     * 客户编号
     */
    @ApiModelProperty(value= "客户编号")
    private Long cstmr;
    /**
     * 客户
     */
    @ApiModelProperty(value= "客户")
    @TableField("cstmr_name")
    private String cstmrName;
    /**
     * 联系方式
     */
    @ApiModelProperty(value= "联系方式")
    private String tel;
    /**
     * 操作人员
     */
    @ApiModelProperty(value= "操作人员")
    @TableField("oper_memb")
    private String operMemb;
    /**
     * 合计金额
     */
    @ApiModelProperty(value= "合计金额")
    @TableField("total_fee")
    private Double totalFee;
    /**
     * 优惠率
     */
    @ApiModelProperty(value= "优惠率")
    private Double discount;
    /**
     * 优惠金额
     */
    @ApiModelProperty(value= "优惠金额")
    @TableField("discount_fee")
    private Double discountFee;
    /**
     * 销售或采购费用合计
     */
    @ApiModelProperty(value= "销售或采购费用合计")
    @TableField("other_fee")
    private Double otherFee;
    /**
     * 实付金额
     */
    @ApiModelProperty(value= "实付金额")
    @TableField("act_fee")
    private Double actFee;
    /**
     * 付款类型 1: 现金  2: 记账
     */
    @ApiModelProperty(value= "付款类型 1: 现金  2: 记账  ")
    @TableField("pay_type")
    private Integer payType;
    /**
     * 业务员
     */
    @ApiModelProperty(value= "业务员")
    private String salesman;
    /**
     * 结算天数
     */
    @ApiModelProperty(value= "结算天数")
    @TableField("account_day")
    private Integer accountDay;
    /**
     * 邮费支付类型 1: 在线支付  2: 货到付款
     */
    @ApiModelProperty(value= "邮费支付类型 1: 在线支付  2: 货到付款  ")
    @TableField("post_fee_type")
    private Integer postFeeType;
    /**
     * 邮费
     */
    @ApiModelProperty(value= "邮费")
    @TableField("post_fee")
    private Double postFee;
    /**
     * 付款时间
     */
    @ApiModelProperty(value= "付款时间")
    @TableField("pay_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date payTime;
    /**
     * 发货时间
     */
    @ApiModelProperty(value= "发货时间")
    @TableField("send_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date sendTime;
    /**
     * 物流名称
     */
    @ApiModelProperty(value= "物流名称")
    @TableField("ship_name")
    private String shipName;
    /**
     * 物流单号
     */
    @ApiModelProperty(value= "物流单号")
    @TableField("ship_code")
    private String shipCode;
    /**
     * 订单状态
     */
    @ApiModelProperty(value= "订单状态")
    private Long settle;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    private Integer status;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    public OrderCheck() {}
    public OrderCheck(String uuid, String orderNo, String orderTime, Long docType, Long itemId, String itemName, Long allotItemId, String defNumber, String number, Long cstmr, String cstmrName, String tel, String operMemb, Double totalFee, Double discount, Double discountFee, Double otherFee, Double actFee, Integer payType, String salesman, Integer accountDay, Integer postFeeType, Double postFee, Date payTime, Date sendTime, String shipName, String shipCode, Long settle, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
        this.uuid = uuid;
        this.orderNo = orderNo;
        this.orderTime = orderTime;
        this.docType = docType;
        this.itemId = itemId;
        this.itemName = itemName;
        this.allotItemId = allotItemId;
        this.defNumber = defNumber;
        this.number = number;
        this.cstmr = cstmr;
        this.cstmrName = cstmrName;
        this.tel = tel;
        this.operMemb = operMemb;
        this.totalFee = totalFee;
        this.discount = discount;
        this.discountFee = discountFee;
        this.otherFee = otherFee;
        this.actFee = actFee;
        this.payType = payType;
        this.salesman = salesman;
        this.accountDay = accountDay;
        this.postFeeType = postFeeType;
        this.postFee = postFee;
        this.payTime = payTime;
        this.sendTime = sendTime;
        this.shipName = shipName;
        this.shipCode = shipCode;
        this.settle = settle;
        this.status = status;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
//    Order order = new Order(
//            null,    // 编号[非空]
//            null,    // 订单编号
//            null,    // 单据日期
//            null,    // 单据类型
//            null,    // 项目编号
//            null,    //
//            null,    // 调拨项目编号
//            null,    // 初始票据号
//            null,    // 票据号
//            null,    // 客户编号
//            null,    // 客户
//            null,    // 联系方式
//            null,    // 操作人员
//            null,    // 合计金额
//            null,    // 优惠率
//            null,    // 优惠金额
//            null,    // 销售或采购费用合计
//            null,    // 实付金额
//            null,    // 付款类型
//            null,    // 业务员
//            null,    // 结算天数
//            null,    // 邮费支付类型
//            null,    // 邮费
//            null,    // 付款时间
//            null,    // 发货时间
//            null,    // 物流名称
//            null,    // 物流单号
//            null,    // 订单状态
//            null,    // 状态
//            null,    // 添加人员
//            null,    // 添加时间
//            null,    // 修改人员
//            null,    // 修改时间
//            null    // 备注
//    );
    public String getDocType$(){
        DocTypeService service = SpringUtils.getBean(DocTypeService.class);
        DocType docType = service.selectById(this.docType);
        if (!Cools.isEmpty(docType)){
            return String.valueOf(docType.getDocName());
        }
        return null;
    }
    public String getPayType$(){
        if (null == this.payType){ return null; }
        switch (this.payType){
            case 1:
                return "现金";
            case 2:
                return "记账";
            default:
                return String.valueOf(this.payType);
        }
    }
    public String getPostFeeType$(){
        if (null == this.postFeeType){ return null; }
        switch (this.postFeeType){
            case 1:
                return "在线支付";
            case 2:
                return "货到付款";
            default:
                return String.valueOf(this.postFeeType);
        }
    }
    public String getPayTime$(){
        if (Cools.isEmpty(this.payTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.payTime);
    }
    public String getSendTime$(){
        if (Cools.isEmpty(this.sendTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
    }
    public String getSettle$(){
        OrderSettleService service = SpringUtils.getBean(OrderSettleService.class);
        OrderSettle orderSettle = service.selectById(this.settle);
        if (!Cools.isEmpty(orderSettle)){
            return String.valueOf(orderSettle.getSettleName());
        }
        return null;
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            case 0:
                return "禁用";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.createBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
}
src/main/java/com/zy/asrs/entity/OrderDetlLog.java
New file
@@ -0,0 +1,447 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.service.LocOwnerService;
import com.zy.asrs.service.OrderService;
import com.zy.common.utils.Synchro;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
@TableName("man_order_detl_log")
public class OrderDetlLog implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 订单内码
     */
    @ApiModelProperty(value= "订单内码")
    @TableField("order_id")
    private Long orderId;
    /**
     * 单据编号
     */
    @ApiModelProperty(value= "单据编号")
    @TableField("order_no")
    private String orderNo;
    /**
     * 数量
     */
    @ApiModelProperty(value= "数量")
    private Double anfme;
    /**
     * 作业数量
     *
     *  入库 : 组托完成,组托档、工作档、入库完成数量
     *  出库 : 工作档、出库完成数量
     */
    @ApiModelProperty(value= "作业数量")
    @TableField("work_qty")
    private Double workQty;
    /**
     * 完成数量
     *
     *  入库 : qty 👆
     *  出库 : qty 👆
     */
    @ApiModelProperty(value= "完成数量")
    private Double qty;
    /**
     * 商品编码
     */
    @ApiModelProperty(value= "商品编码")
    private String matnr;
    /**
     * 商品名称
     */
    @ApiModelProperty(value= "商品名称")
    private String maktx;
    /**
     * 批号
     */
    @ApiModelProperty(value= "批号")
    private String batch;
    /**
     * 规格
     */
    @ApiModelProperty(value= "规格")
    private String specs;
    /**
     * 型号
     */
    @ApiModelProperty(value= "型号")
    private String model;
    /**
     * 颜色
     */
    @ApiModelProperty(value= "颜色")
    private String color;
    /**
     * 品牌
     */
    @ApiModelProperty(value= "品牌")
    private String brand;
    /**
     * 单位
     */
    @ApiModelProperty(value= "单位")
    private String unit;
    /**
     * 单价
     */
    @ApiModelProperty(value= "单价")
    private Double price;
    /**
     * sku
     */
    @ApiModelProperty(value= "sku")
    private String sku;
    /**
     * 单位量
     */
    @ApiModelProperty(value= "单位量")
    private Double units;
    /**
     * 条码
     */
    @ApiModelProperty(value= "条码")
    private String barcode;
    /**
     * 产地
     */
    @ApiModelProperty(value= "产地")
    private String origin;
    /**
     * 厂家
     */
    @ApiModelProperty(value= "厂家")
    private String manu;
    /**
     * 生产日期
     */
    @ApiModelProperty(value= "生产日期")
    @TableField("manu_date")
    private String manuDate;
    /**
     * 品项数
     */
    @ApiModelProperty(value= "品项数")
    @TableField("item_num")
    private String itemNum;
    /**
     * 安全库存量
     */
    @ApiModelProperty(value= "安全库存量")
    @TableField("safe_qty")
    private Double safeQty;
    /**
     * 重量
     */
    @ApiModelProperty(value= "重量")
    private Double weight;
    /**
     * 长度
     */
    @ApiModelProperty(value= "长度")
    private Double length;
    /**
     * 体积
     */
    @ApiModelProperty(value= "体积")
    private Double volume;
    /**
     * 三方编码
     */
    @ApiModelProperty(value= "三方编码")
    @TableField("three_code")
    private String threeCode;
    /**
     * 供应商
     */
    @ApiModelProperty(value= "供应商")
    private String supp;
    /**
     * 供应商编码
     */
    @ApiModelProperty(value= "供应商编码")
    @TableField("supp_code")
    private String suppCode;
    /**
     * 是否批次 1: 是  0: 否
     */
    @ApiModelProperty(value= "是否批次 1: 是  0: 否  ")
    @TableField("be_batch")
    private Integer beBatch;
    /**
     * 保质期
     */
    @ApiModelProperty(value= "保质期")
    @TableField("dead_time")
    private String deadTime;
    /**
     * 预警天数
     */
    @ApiModelProperty(value= "预警天数")
    @TableField("dead_warn")
    private Integer deadWarn;
    /**
     * 制购 1: 制造  2: 采购  3: 外协
     */
    @ApiModelProperty(value= "制购 1: 制造  2: 采购  3: 外协  ")
    private Integer source;
    /**
     * 要求检验 1: 是  0: 否
     */
    @ApiModelProperty(value= "要求检验 1: 是  0: 否  ")
    private Integer inspect;
    /**
     * 危险品 1: 是  0: 否
     */
    @ApiModelProperty(value= "危险品 1: 是  0: 否  ")
    private Integer danger;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    private Integer status;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    @ApiModelProperty(value= "拥有者 1: 杰克   ")
    private Integer owner;
    /**
     * 货物形态:0:代采、1:仓储
     */
    @ApiModelProperty(value= "货物形态:0:代采、1:仓储")
    private Integer payment;
    public String getOwner$(){
        LocOwnerService service = SpringUtils.getBean(LocOwnerService.class);
        LocOwner locOwner = service.selectById(this.owner);
        if (!Cools.isEmpty(locOwner)){
            return String.valueOf(locOwner.getOwner());
        }
        return null;
    }
    public String getPayment$(){
        if (null == this.payment){ return null; }
        switch (this.payment){
            case 1:
                return "仓储";
            case 0:
                return "代采";
            default:
                return String.valueOf(this.payment);
        }
    }
    public String getOrderId$(){
        OrderService service = SpringUtils.getBean(OrderService.class);
        Order order = service.selectById(this.orderId);
        if (!Cools.isEmpty(order)){
            return String.valueOf(order.getId());
        }
        return null;
    }
    public String getBeBatch$(){
        if (null == this.beBatch){ return null; }
        switch (this.beBatch){
            case 1:
                return "是";
            case 0:
                return "否";
            default:
                return String.valueOf(this.beBatch);
        }
    }
    public String getSource$(){
        if (null == this.source){ return null; }
        switch (this.source){
            case 1:
                return "制造";
            case 2:
                return "采购";
            case 3:
                return "外协";
            default:
                return String.valueOf(this.source);
        }
    }
    public String getInspect$(){
        if (null == this.inspect){ return null; }
        switch (this.inspect){
            case 1:
                return "是";
            case 0:
                return "否";
            default:
                return String.valueOf(this.inspect);
        }
    }
    public String getDanger$(){
        if (null == this.danger){ return null; }
        switch (this.danger){
            case 1:
                return "是";
            case 0:
                return "否";
            default:
                return String.valueOf(this.danger);
        }
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            case 0:
                return "禁用";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.createBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public Double getEnableQty() {
        if (null != this.anfme && this.qty != null) {
            return this.anfme - this.qty;
        }
        return null;
    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
}
src/main/java/com/zy/asrs/entity/OrderLog.java
New file
@@ -0,0 +1,441 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderSettleService;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
@TableName("man_order_log")
public class OrderLog implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 编号
     */
    @ApiModelProperty(value= "编号")
    private String uuid;
    /**
     * 订单编号
     */
    @ApiModelProperty(value= "订单编号")
    @TableField("order_no")
    private String orderNo;
    /**
     * 单据日期
     */
    @ApiModelProperty(value= "单据日期")
    @TableField("order_time")
    private String orderTime;
    /**
     * 单据类型
     */
    @ApiModelProperty(value= "单据类型")
    @TableField("doc_type")
    private Long docType;
    /**
     * 项目编号
     */
    @ApiModelProperty(value= "项目编号")
    @TableField("item_id")
    private Long itemId;
    @ApiModelProperty(value= "")
    @TableField("item_name")
    private String itemName;
    /**
     * 调拨项目编号
     */
    @ApiModelProperty(value= "调拨项目编号")
    @TableField("allot_item_id")
    private Long allotItemId;
    /**
     * 初始票据号
     */
    @ApiModelProperty(value= "初始票据号")
    @TableField("def_number")
    private String defNumber;
    /**
     * 票据号
     */
    @ApiModelProperty(value= "票据号")
    private String number;
    /**
     * 客户编号
     */
    @ApiModelProperty(value= "客户编号")
    private Long cstmr;
    /**
     * 客户
     */
    @ApiModelProperty(value= "客户")
    @TableField("cstmr_name")
    private String cstmrName;
    /**
     * 联系方式
     */
    @ApiModelProperty(value= "联系方式")
    private String tel;
    /**
     * 操作人员
     */
    @ApiModelProperty(value= "操作人员")
    @TableField("oper_memb")
    private String operMemb;
    /**
     * 合计金额
     */
    @ApiModelProperty(value= "合计金额")
    @TableField("total_fee")
    private Double totalFee;
    /**
     * 优惠率
     */
    @ApiModelProperty(value= "优惠率")
    private Double discount;
    /**
     * 优惠金额
     */
    @ApiModelProperty(value= "优惠金额")
    @TableField("discount_fee")
    private Double discountFee;
    /**
     * 销售或采购费用合计
     */
    @ApiModelProperty(value= "销售或采购费用合计")
    @TableField("other_fee")
    private Double otherFee;
    /**
     * 实付金额
     */
    @ApiModelProperty(value= "实付金额")
    @TableField("act_fee")
    private Double actFee;
    /**
     * 付款类型 1: 现金  2: 记账
     */
    @ApiModelProperty(value= "付款类型 1: 现金  2: 记账  ")
    @TableField("pay_type")
    private Integer payType;
    /**
     * 业务员
     */
    @ApiModelProperty(value= "业务员")
    private String salesman;
    /**
     * 结算天数
     */
    @ApiModelProperty(value= "结算天数")
    @TableField("account_day")
    private Integer accountDay;
    /**
     * 邮费支付类型 1: 在线支付  2: 货到付款
     */
    @ApiModelProperty(value= "邮费支付类型 1: 在线支付  2: 货到付款  ")
    @TableField("post_fee_type")
    private Integer postFeeType;
    /**
     * 邮费
     */
    @ApiModelProperty(value= "邮费")
    @TableField("post_fee")
    private Double postFee;
    /**
     * 付款时间
     */
    @ApiModelProperty(value= "付款时间")
    @TableField("pay_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date payTime;
    /**
     * 发货时间
     */
    @ApiModelProperty(value= "发货时间")
    @TableField("send_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date sendTime;
    /**
     * 物流名称
     */
    @ApiModelProperty(value= "物流名称")
    @TableField("ship_name")
    private String shipName;
    /**
     * 物流单号
     */
    @ApiModelProperty(value= "物流单号")
    @TableField("ship_code")
    private String shipCode;
    /**
     * 订单状态
     */
    @ApiModelProperty(value= "订单状态")
    private Long settle;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    private Integer status;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    public OrderLog() {}
    public OrderLog(String uuid, String orderNo, String orderTime, Long docType, Long itemId, String itemName, Long allotItemId, String defNumber, String number, Long cstmr, String cstmrName, String tel, String operMemb, Double totalFee, Double discount, Double discountFee, Double otherFee, Double actFee, Integer payType, String salesman, Integer accountDay, Integer postFeeType, Double postFee, Date payTime, Date sendTime, String shipName, String shipCode, Long settle, Integer status, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
        this.uuid = uuid;
        this.orderNo = orderNo;
        this.orderTime = orderTime;
        this.docType = docType;
        this.itemId = itemId;
        this.itemName = itemName;
        this.allotItemId = allotItemId;
        this.defNumber = defNumber;
        this.number = number;
        this.cstmr = cstmr;
        this.cstmrName = cstmrName;
        this.tel = tel;
        this.operMemb = operMemb;
        this.totalFee = totalFee;
        this.discount = discount;
        this.discountFee = discountFee;
        this.otherFee = otherFee;
        this.actFee = actFee;
        this.payType = payType;
        this.salesman = salesman;
        this.accountDay = accountDay;
        this.postFeeType = postFeeType;
        this.postFee = postFee;
        this.payTime = payTime;
        this.sendTime = sendTime;
        this.shipName = shipName;
        this.shipCode = shipCode;
        this.settle = settle;
        this.status = status;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
//    Order order = new Order(
//            null,    // 编号[非空]
//            null,    // 订单编号
//            null,    // 单据日期
//            null,    // 单据类型
//            null,    // 项目编号
//            null,    //
//            null,    // 调拨项目编号
//            null,    // 初始票据号
//            null,    // 票据号
//            null,    // 客户编号
//            null,    // 客户
//            null,    // 联系方式
//            null,    // 操作人员
//            null,    // 合计金额
//            null,    // 优惠率
//            null,    // 优惠金额
//            null,    // 销售或采购费用合计
//            null,    // 实付金额
//            null,    // 付款类型
//            null,    // 业务员
//            null,    // 结算天数
//            null,    // 邮费支付类型
//            null,    // 邮费
//            null,    // 付款时间
//            null,    // 发货时间
//            null,    // 物流名称
//            null,    // 物流单号
//            null,    // 订单状态
//            null,    // 状态
//            null,    // 添加人员
//            null,    // 添加时间
//            null,    // 修改人员
//            null,    // 修改时间
//            null    // 备注
//    );
    public String getDocType$(){
        DocTypeService service = SpringUtils.getBean(DocTypeService.class);
        DocType docType = service.selectById(this.docType);
        if (!Cools.isEmpty(docType)){
            return String.valueOf(docType.getDocName());
        }
        return null;
    }
    public String getPayType$(){
        if (null == this.payType){ return null; }
        switch (this.payType){
            case 1:
                return "现金";
            case 2:
                return "记账";
            default:
                return String.valueOf(this.payType);
        }
    }
    public String getPostFeeType$(){
        if (null == this.postFeeType){ return null; }
        switch (this.postFeeType){
            case 1:
                return "在线支付";
            case 2:
                return "货到付款";
            default:
                return String.valueOf(this.postFeeType);
        }
    }
    public String getPayTime$(){
        if (Cools.isEmpty(this.payTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.payTime);
    }
    public String getSendTime$(){
        if (Cools.isEmpty(this.sendTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
    }
    public String getSettle$(){
        OrderSettleService service = SpringUtils.getBean(OrderSettleService.class);
        OrderSettle orderSettle = service.selectById(this.settle);
        if (!Cools.isEmpty(orderSettle)){
            return String.valueOf(orderSettle.getSettleName());
        }
        return null;
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            case 0:
                return "禁用";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.createBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
}
src/main/java/com/zy/asrs/entity/param/CheckDTO.java
New file
@@ -0,0 +1,22 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class CheckDTO {
    private String prec;
    private List<data> data;
    @Data
    public static class data{
        private String name;
        private String value;
        private String children;
    }
}
src/main/java/com/zy/asrs/entity/param/OrderCheckParam.java
New file
@@ -0,0 +1,25 @@
package com.zy.asrs.entity.param;
import com.zy.asrs.entity.ManLocDetl;
import com.zy.asrs.entity.OrderDetl;
import lombok.Data;
import java.util.List;
@Data
public class OrderCheckParam {
    private Long orderId;
    private Long docType;
    private String checkType;
    private String orderNo;
    private List<ManLocDetl> orderDetlList;
}
src/main/java/com/zy/asrs/mapper/LocCheckMapper.java
@@ -2,11 +2,25 @@
import com.zy.asrs.entity.LocCheck;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.ManLocDetl;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface LocCheckMapper extends BaseMapper<LocCheck> {
    List<ManLocDetl> getAutoLocDetl();
    List<ManLocDetl> getCountLocDetl(@Param("count") int count);
    List<ManLocDetl> getMatnrCountLocDetl(@Param("count") int count,@Param("matnr") String matnr);
    @Delete("DELETE FROM man_loc_check")
    boolean deleteAll();
}
src/main/java/com/zy/asrs/mapper/OrderCheckMapper.java
New file
@@ -0,0 +1,29 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderCheck;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface OrderCheckMapper extends BaseMapper<OrderCheck> {
    int updateSettle(@Param("orderId")Long orderId, @Param("settle")Long settle, @Param("userId")Long userId);
    List<OrderCheck> selectComplete();
    int addToLogTable(OrderCheck orderCheck);
    Integer checkDetlWorkQtyLess0(@Param("orderNo") String orderNo);
    void updateSettleTo1(@Param("orderNo")String orderNo);
    List<OrderCheck> selectToBeHistoryOrder(@Param("settle")int settle);
}
src/main/java/com/zy/asrs/mapper/OrderDetlLogMapper.java
New file
@@ -0,0 +1,16 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.AdjDetl;
import com.zy.asrs.entity.OrderDetlLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface OrderDetlLogMapper extends BaseMapper<OrderDetlLog> {
    @Insert("insert into man_order_detl_log select * from man_order_detl where order_no=#{orderNo}")
    int save(String orderNo);
}
src/main/java/com/zy/asrs/mapper/OrderLogMapper.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.OrderLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface OrderLogMapper extends BaseMapper<OrderLog> {
    @Insert("insert into man_order_log select * from man_order where order_no=#{orderNo}")
    int save(String orderNo);
}
src/main/java/com/zy/asrs/mapper/OrderMapper.java
@@ -24,4 +24,6 @@
    List<Order> selectInOrOutOrders(@Param("flag") Integer flag);
    List<Order> selectToBeHistoryOrder(@Param("settle")int settle);
}
src/main/java/com/zy/asrs/service/LocCheckService.java
@@ -2,8 +2,17 @@
import com.zy.asrs.entity.LocCheck;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.ManLocDetl;
import java.util.List;
public interface LocCheckService extends IService<LocCheck> {
    void autoCreatePick(String prec);
    List<ManLocDetl> autoCreatePick();
    List<ManLocDetl> getCountLocDetl(int count);
    List<ManLocDetl> getMatnrCountLocDetl(int count,String matnr);
    boolean deleteAll();
}
src/main/java/com/zy/asrs/service/OrderCheckService.java
New file
@@ -0,0 +1,32 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.*;
import java.util.List;
public interface OrderCheckService extends IService<OrderCheck> {
    OrderCheck selectByNo(String orderNo);
    List<OrderDetl> selectWorkingDetls(Long orderId);
    boolean updateSettle(Long orderId, Long settle, Long userId);
    void checkComplete(String orderNo);
    boolean saveHandlerOrder(Boolean pakin, WrkMast wrkMast, List<WrkDetl> wrkDetls);
    List<OrderCheck> selectComplete();
    boolean addToLogTable(OrderCheck order);
    void BackToInit(String orderNo);
    List<OrderCheck> selectToBeHistoryOrder(boolean isERP);
    void remove(String orderNo);
}
src/main/java/com/zy/asrs/service/OrderDetlLogService.java
New file
@@ -0,0 +1,9 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.OrderDetlLog;
public interface OrderDetlLogService extends IService<OrderDetlLog> {
    boolean save(String orderNo);
}
src/main/java/com/zy/asrs/service/OrderLogService.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.OrderLog;
public interface OrderLogService extends IService<OrderLog> {
    boolean save(String orderNo);
    OrderLog selectByNo(String orderNo);
}
src/main/java/com/zy/asrs/service/OrderService.java
@@ -31,4 +31,6 @@
    List<Order> selectInOrOutOrders(boolean inOrders);
    void checkSettleUpdate(Long orderId);
    List<Order> selectToBeHistoryOrder(boolean isERP);
}
src/main/java/com/zy/asrs/service/impl/LocCheckServiceImpl.java
@@ -11,14 +11,28 @@
import java.util.List;
@Service("locCheckService")
@Service("LocCheckService")
public class LocCheckServiceImpl extends ServiceImpl<LocCheckMapper, LocCheck> implements LocCheckService {
    @Autowired
    private ManLocDetlService manLocDetlService;
    @Override
    public void autoCreatePick(String prec) {
        List<ManLocDetl> manLocDetls = manLocDetlService.selectList(null);
    public List<ManLocDetl> autoCreatePick() {
        return  this.baseMapper.getAutoLocDetl();
    }
    @Override
    public List<ManLocDetl> getCountLocDetl(int count) {
        return this.baseMapper.getCountLocDetl(count);
    }
    @Override
    public List<ManLocDetl> getMatnrCountLocDetl(int count, String matnr) {
        return this.baseMapper.getMatnrCountLocDetl(count,matnr);
    }
    @Override
    public boolean deleteAll() {
        return this.baseMapper.deleteAll();
    }
}
src/main/java/com/zy/asrs/service/impl/OrderCheckServiceImpl.java
New file
@@ -0,0 +1,183 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.OpenOrderPakoutParam;
import com.zy.asrs.mapper.OrderCheckMapper;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service("orderCheckService")
public class OrderCheckServiceImpl extends ServiceImpl<OrderCheckMapper, OrderCheck> implements OrderCheckService {
    @Autowired
    private OrderDetlMapper orderDetlMapper;
    @Autowired
    private OpenService openService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private LocCheckService locCheckService;
    @Override
    public OrderCheck selectByNo(String orderNo) {
        List<OrderCheck> orderList = this.selectList(new EntityWrapper<OrderCheck>().eq("order_no", orderNo));
        if (Cools.isEmpty(orderList)) {
            return null;
        }
        return orderList.get(0);
    }
    @Override
    public List<OrderDetl> selectWorkingDetls(Long orderId) {
        return orderDetlMapper.selectWorkingDetls(orderId);
    }
    @Override
    public boolean updateSettle(Long orderId, Long settle, Long userId) {
        return this.baseMapper.updateSettle(orderId, settle, userId) > 0;
    }
    @Override
    public void checkComplete(String orderNo) {
        OrderCheck order = this.selectByNo(orderNo);
        if (Cools.isEmpty(order) || order.getSettle() >= 4L) {
            return;
        }
        List<OrderDetl> orderDetls = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()));
        boolean complete = true;
        for (OrderDetl orderDetl : orderDetls) {
            if (orderDetl.getAnfme() > orderDetl.getQty()) {
                complete = false;
                break;
            }
        }
        if (complete) {
            for (OrderDetl orderDetl : orderDetls) {
                //生成单据和入库通知档时,给batch为空的明细赋了一个 ="", 现在改为null,回传用
                if (orderDetl.getBatch().equals("")){
                    orderDetl.setBatch(null);
                    orderDetlService.updateById(orderDetl);
                }
            }
            if (!this.updateSettle(order.getId(), 4L, null)) {
                throw new CoolException("修改订单【orderNo = " + order.getOrderNo() + "】状态为已完成失败");
            }
        }
    }
    @Override
    public boolean saveHandlerOrder(Boolean pakin, WrkMast wrkMast, List<WrkDetl> wrkDetls) {
        try {
            List<DetlDto> detlDtos = new ArrayList<>();
            wrkDetls.forEach(wrkDetl -> {
                detlDtos.add(new DetlDto(wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme()));
            });
            String orderNo = "HAND" + snowflakeIdWorker.nextId();
            if (pakin) {
                // 生成入库单据
                OpenOrderPakinParam openParam = new OpenOrderPakinParam();
                openParam.setOrderNo(orderNo);
                openParam.setOrderTime(DateUtils.convert(wrkMast.getModiTime()));
                openParam.setOrderType("手动入库单");
                openParam.setOrderDetails(detlDtos);
                openService.pakinOrderCreate(openParam);
            } else {
                // 生成出库单据
                OpenOrderPakoutParam openParam = new OpenOrderPakoutParam();
                openParam.setOrderNo(orderNo);
                openParam.setOrderTime(DateUtils.convert(wrkMast.getModiTime()));
                openParam.setOrderType("手动出库单");
                openParam.setOrderDetails(detlDtos);
                openService.pakoutOrderCreate(openParam);
            }
            OrderCheck order = this.selectByNo(orderNo);
            if (null == order) {
                throw new CoolException("生成单据失败");
            }
            if (!this.updateSettle(order.getId(), 4L, null)) {
                throw new CoolException("修改单据状态失败");
            }
            for (DetlDto detlDto : detlDtos) {
                // 修改订单明细数量
                if (!orderDetlService.increase(order.getId(), detlDto.getMatnr(), detlDto.getBatch(), detlDto.getAnfme())) {
                    throw new CoolException("修改单据明细数量失败");
                }
                // 修改订单作业数量
                if (!orderDetlService.increaseWorkQty(order.getId(), detlDto.getMatnr(), detlDto.getBatch(), detlDto.getAnfme())) {
                    throw new CoolException("修改单据作业数量失败");
                }
            }
        } catch (Exception e) {
            log.error("saveHandlerOrder===>>", e);
            return false;
        }
        return true;
    }
    @Override
    public List<OrderCheck> selectComplete() {
        return this.baseMapper.selectComplete();
    }
    @Override
    public boolean addToLogTable(OrderCheck order) {
        return this.baseMapper.addToLogTable(order) > 0;
    }
    /**
     *
     * @param orderNo
     *
     */
    @Override
    public void BackToInit(String orderNo) {
        Integer count = this.baseMapper.checkDetlWorkQtyLess0(orderNo);
        //如果所有明细的工作数量和完成量都小于等于0, 那么将主档更新为“待处理”状态
        if (count == 0 ){
            this.baseMapper.updateSettleTo1(orderNo);
        }
    }
    @Override
    public List<OrderCheck> selectToBeHistoryOrder(boolean isERP) {
        int settle = isERP ? 6 : 4;
        return this.baseMapper.selectToBeHistoryOrder(settle);
    }
    @Override
    public void remove(String orderNo) {
        if (!this.delete(new EntityWrapper<OrderCheck>().eq("order_no",orderNo))) {
            throw new CoolException("删除单据失败");
        }
        locCheckService.delete(new EntityWrapper<LocCheck>().eq("order_no", orderNo));
    }
}
src/main/java/com/zy/asrs/service/impl/OrderDetlLogServiceImpl.java
New file
@@ -0,0 +1,18 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.OrderDetlLog;
import com.zy.asrs.mapper.OrderDetlLogMapper;
import com.zy.asrs.service.OrderDetlLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service("OrderDetlLogService")
public class OrderDetlLogServiceImpl extends ServiceImpl<OrderDetlLogMapper, OrderDetlLog> implements OrderDetlLogService {
    @Override
    public boolean save(String orderNo) {
        return this.baseMapper.save(orderNo)>0;
    }
}
src/main/java/com/zy/asrs/service/impl/OrderLogServiceImpl.java
New file
@@ -0,0 +1,31 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.OrderLog;
import com.zy.asrs.mapper.OrderLogMapper;
import com.zy.asrs.service.OrderLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service("OrderLogService")
public class OrderLogServiceImpl extends ServiceImpl<OrderLogMapper, OrderLog> implements OrderLogService {
    @Override
    public boolean save(String orderNo) {
        return this.baseMapper.save(orderNo) >0;
    }
    @Override
    public OrderLog selectByNo(String orderNo) {
        List<OrderLog> orderList = this.selectList(new EntityWrapper<OrderLog>().eq("order_no", orderNo));
        if (Cools.isEmpty(orderList)) {
            return null;
        }
        return orderList.get(0);
    }
}
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -202,4 +202,10 @@
        updateSettle(orderId,settle,1L);
    }
    @Override
    public List<Order> selectToBeHistoryOrder(boolean isERP) {
        int settle = isERP ? 6 : 4;
        return this.baseMapper.selectToBeHistoryOrder(settle);
    }
}
src/main/java/com/zy/asrs/task/OrderLogScheduler.java
New file
@@ -0,0 +1,39 @@
package com.zy.asrs.task;
import com.zy.asrs.entity.Order;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.OrderLogHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component
public class OrderLogScheduler {
    @Autowired
    private OrderLogHandler orderLogHandler;
    @Autowired
    private OrderService orderService;
    @Value("${erp.enable}")
    private boolean isERP;
    @Scheduled(cron = "0/10 * * * * ? ")
    private void execute(){
        List<Order> orders = orderService.selectToBeHistoryOrder(isERP);
        if (orders.isEmpty()) {
            return;
        }
        for (Order order : orders) {
            ReturnT<String> result = orderLogHandler.start(order);
            if (!result.isSuccess()) {
                log.error("单据档[orderNo={}]历史档处理失败", order.getOrderNo());
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/OrderLogHandler.java
New file
@@ -0,0 +1,59 @@
package com.zy.asrs.task.handler;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.OrderDetlLogService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderLogService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@Slf4j
@Service
public class OrderLogHandler extends AbstractHandler<String> {
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private OrderLogService orderLogService;
    @Autowired
    private OrderDetlLogService orderDetlLogService;
    @Transactional
    public ReturnT<String> start(Order order) {
        try {
            // 保存单据主档历史档
            if (!orderLogService.save(order.getOrderNo())) {
                exceptionHandle("保存单据历史档[orderNo={0}]失败", order.getOrderNo());
            }
            // 删除单据主档
            if (!orderService.deleteById(order)) {
                exceptionHandle("删除单据主档[orderNo={0}]失败", order.getOrderNo());
            }
            // 保存单据明细档历史档
            if (!orderDetlLogService.save(order.getOrderNo())) {
                exceptionHandle("保存单据明细历史档[orderNo={0}]失败", order.getOrderNo());
            }
            // 删除工作明细档
            if (!orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_no", order.getOrderNo()))) {
                exceptionHandle("删除单据明细档[orderNo={0}]失败", order.getOrderNo());
            }
        } catch (Exception e) {
            log.error("fail", e);
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
        generator.url="192.168.4.15:1433;databasename=stasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="bas_loc_owner";
        generator.table="man_order_log";
        generator.packagePath="com.zy.asrs";
        generator.build();
    }
src/main/java/orderLog.sql
New file
@@ -0,0 +1,18 @@
-- save orderLog record
-- mysql
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderLog/orderLog.html', 'orderLog管理', null , '2', null , '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderLog#view', '查询', '', '3', '0', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderLog#btn-add', '新增', '', '3', '1', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderLog#btn-edit', '编辑', '', '3', '2', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderLog#btn-delete', '删除', '', '3', '3', '1');
insert into `sys_resource` ( `code`, `name`, `resource_id`, `level`, `sort`, `status`) values ( 'orderLog#btn-export', '导出', '', '3', '4', '1');
-- sqlserver
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderLog/orderLog.html', N'orderLog管理', null, '2', null, '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderLog#view', N'查询', '', '3', '0', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderLog#btn-add', N'新增', '', '3', '1', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderLog#btn-edit', N'编辑', '', '3', '2', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderLog#btn-delete', N'删除', '', '3', '3', '1');
insert [dbo].[sys_resource] ( [code], [name], [resource_id], [level], [sort], [status]) values ( N'orderLog#btn-export', N'导出', '', '3', '4', '1');
src/main/resources/mapper/LocCheckMapper.xml
@@ -8,7 +8,7 @@
        <result column="type" property="type" />
        <result column="loc_no" property="locNo" />
        <result column="matnr" property="matnr" />
        <result column="origin_anfme" property="originAnfme" />
        <result column="anfme" property="anfme" />
        <result column="real_anfme" property="realAnfme" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
@@ -17,5 +17,68 @@
        <result column="memo" property="memo" />
    </resultMap>
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap2" type="com.zy.asrs.entity.ManLocDetl">
        <result column="host_id" property="hostId" />
        <result column="loc_no" property="locNo" />
        <result column="node_id" property="nodeId" />
        <result column="zpallet" property="zpallet" />
        <result column="anfme" property="anfme" />
        <result column="matnr" property="matnr" />
        <result column="maktx" property="maktx" />
        <result column="name" property="name" />
        <result column="specs" property="specs" />
        <result column="model" property="model" />
        <result column="batch" property="batch" />
        <result column="unit" property="unit" />
        <result column="barcode" property="barcode" />
        <result column="doc_id" property="docId" />
        <result column="doc_num" property="docNum" />
        <result column="cust_name" property="custName" />
        <result column="item_num" property="itemNum" />
        <result column="count" property="count" />
        <result column="price" property="price" />
        <result column="weight" property="weight" />
        <result column="status" property="status" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="modi_time" property="modiTime" />
        <result column="memo" property="memo" />
        <result column="uuid" property="uuid" />
    </resultMap>
    <select id="getAutoLocDetl" resultMap="BaseResultMap2">
        SELECT
            *
        FROM
            man_loc_detl
        WHERE
            1 = 1
        ORDER BY NEWID()
    </select>
    <select id="getCountLocDetl" resultMap="BaseResultMap2">
        SELECT TOP ${count}
            *
        FROM
            man_loc_detl
        WHERE
            1 = 1
        ORDER BY NEWID()
    </select>
    <select id="getMatnrCountLocDetl" resultMap="BaseResultMap2">
        SELECT TOP ${count}
            *
        FROM
            man_loc_detl
        WHERE
            1 = 1
          and matnr = #{matnr}
        ORDER BY NEWID()
    </select>
</mapper>
src/main/resources/mapper/OrderCheckMapper.xml
New file
@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.OrderCheckMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.Order">
        <id column="id" property="id" />
        <result column="uuid" property="uuid" />
        <result column="order_no" property="orderNo" />
        <result column="order_time" property="orderTime" />
        <result column="doc_type" property="docType" />
        <result column="item_id" property="itemId" />
        <result column="item_name" property="itemName" />
        <result column="allot_item_id" property="allotItemId" />
        <result column="def_number" property="defNumber" />
        <result column="number" property="number" />
        <result column="cstmr" property="cstmr" />
        <result column="cstmr_name" property="cstmrName" />
        <result column="tel" property="tel" />
        <result column="oper_memb" property="operMemb" />
        <result column="total_fee" property="totalFee" />
        <result column="discount" property="discount" />
        <result column="discount_fee" property="discountFee" />
        <result column="other_fee" property="otherFee" />
        <result column="act_fee" property="actFee" />
        <result column="pay_type" property="payType" />
        <result column="salesman" property="salesman" />
        <result column="account_day" property="accountDay" />
        <result column="post_fee_type" property="postFeeType" />
        <result column="post_fee" property="postFee" />
        <result column="pay_time" property="payTime" />
        <result column="send_time" property="sendTime" />
        <result column="ship_name" property="shipName" />
        <result column="ship_code" property="shipCode" />
        <result column="settle" property="settle" />
        <result column="status" property="status" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="memo" property="memo" />
    </resultMap>
    <update id="updateSettle">
        update man_order
        set settle = #{settle}
        ,update_time = getdate()
        <if test="userId != null">
            ,update_by = #{userId}
        </if>
        where 1=1
        and id = #{orderId}
    </update>
    <update id="updateSettleTo1">
        UPDATE man_order set settle = 1 WHERE order_no = #{orderNo}
    </update>
    <select id="checkDetlWorkQtyLess0" resultType="integer">
        select count(*) FROM man_order_detl WHERE order_no = #{orderNo} and (work_qty > 0 or qty > 0)
    </select>
    <select id="selectComplete" resultMap="BaseResultMap">
        select top 5 *
        from man_order
        where 1=1
        and settle = 4
        and status = 1
        order by create_time asc
    </select>
    <select id="selectToBeHistoryOrder" resultMap="BaseResultMap">
        select *
        from man_order
        where 1=1
        and settle = #{settle}
        order by create_time asc
    </select>
    <insert id="addToLogTable">
        INSERT INTO man_order_log SELECT * FROM man_order WHERE id = #{id}
    </insert>
</mapper>
src/main/resources/mapper/OrderLogMapper.xml
New file
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.OrderLogMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.OrderLog">
        <result column="id" property="id" />
        <result column="uuid" property="uuid" />
        <result column="order_no" property="orderNo" />
        <result column="order_time" property="orderTime" />
        <result column="doc_type" property="docType" />
        <result column="item_id" property="itemId" />
        <result column="item_name" property="itemName" />
        <result column="allot_item_id" property="allotItemId" />
        <result column="def_number" property="defNumber" />
        <result column="number" property="number" />
        <result column="cstmr" property="cstmr" />
        <result column="cstmr_name" property="cstmrName" />
        <result column="tel" property="tel" />
        <result column="oper_memb" property="operMemb" />
        <result column="total_fee" property="totalFee" />
        <result column="discount" property="discount" />
        <result column="discount_fee" property="discountFee" />
        <result column="other_fee" property="otherFee" />
        <result column="act_fee" property="actFee" />
        <result column="pay_type" property="payType" />
        <result column="salesman" property="salesman" />
        <result column="account_day" property="accountDay" />
        <result column="post_fee_type" property="postFeeType" />
        <result column="post_fee" property="postFee" />
        <result column="pay_time" property="payTime" />
        <result column="send_time" property="sendTime" />
        <result column="ship_name" property="shipName" />
        <result column="ship_code" property="shipCode" />
        <result column="settle" property="settle" />
        <result column="status" property="status" />
        <result column="create_by" property="createBy" />
        <result column="create_time" property="createTime" />
        <result column="update_by" property="updateBy" />
        <result column="update_time" property="updateTime" />
        <result column="memo" property="memo" />
    </resultMap>
</mapper>
src/main/resources/mapper/OrderMapper.xml
@@ -71,6 +71,14 @@
        SELECT * FROM man_order o left join man_doc_type d on o.doc_type = d.doc_id WHERE d.pakin = #{flag} and o.settle in (1,2)
    </select>
    <select id="selectToBeHistoryOrder" resultMap="BaseResultMap">
        select *
        from man_order
        where 1=1
          and settle = #{settle}
        order by create_time asc
    </select>
    <insert id="addToLogTable">
        INSERT INTO man_order_log SELECT * FROM man_order WHERE id = #{id}
    </insert>
src/main/webapp/static/js/locCheck/locCheck.js
@@ -224,7 +224,7 @@
                    $.ajax({
                        url: baseUrl + "/locCheck/create/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: {'prec': prec},
                        data: {prec: prec},
                        method: 'POST',
                        success: function (res) {
                            console.log(res);
src/main/webapp/static/js/orderCheck/orderCheck.js
New file
@@ -0,0 +1,596 @@
var insTbCount = 0;
var printMatCodeNos = [];
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['layer', 'form', 'table', 'util', 'admin', 'xmSelect', 'laydate'], function () {
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    var table = layui.table;
    var util = layui.util;
    var admin = layui.admin;
    var xmSelect = layui.xmSelect;
    var layDate = layui.laydate;
    // 渲染搜索模板
    $.ajax({
        url: baseUrl+"/docType/list/auth",
        headers: {'token': localStorage.getItem('token')},
        data: {
            limit: 9999
        },
        method: 'POST',
        success: function (res) {
            if (res.code === 200){
                let template = Handlebars.compile($('#docTypeTpl').html());
                $('#docType-query').html(template(res.data));
                layui.form.render('select');
            } else if (res.code === 403){
                top.location.href = baseUrl+"/";
            } else {
                layer.msg(res.msg, {icon: 2})
            }
        }
    })
    // 渲染表格
    var insTb = table.render({
        elem: '#order',
        url: baseUrl+'/orderCheck/head/page/auth',
        headers: {token: localStorage.getItem('token')},
        page: true,
        cellMinWidth: 100,
        cols: [[
            {type: 'numbers'},
            // {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            {field: 'orderNo', title: '单据编号',  minWidth: 160},
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160},
            {field: 'createTime$', title: '创建时间', minWidth: 200},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160},
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {align: 'center', title: '操作', toolbar: '#operate'}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function (res, curr, count) {
            limit();
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            insTbCount = count;
        }
    });
    // 搜索
    form.on('submit(tbSearch)', function (data) {
        insTb.reload({where: data.field, page: {curr: 1}});
    });
    // 添加
    $("#orderAddBtn").click(function () {
        showEditModel();
    });
    // 工具条点击事件
    table.on('tool(order)', function (obj) {
        var data = obj.data;
        var layEvent = obj.event;
        if (layEvent === 'edit') {
            showEditModel(data);
        } else if (layEvent === 'del') {
            doDel(data.orderNo);
        } else if (layEvent === 'complete') {
            doModify(data.id, data.orderNo, 4);
        } else if (layEvent === 'btnPrint') {
            btnPrint(data.id, data.orderNo, 4);
        } else if (layEvent === 'manPrint') {
            addPakOut(data.orderNo);
        }else if (layEvent === 'examine'){
            examine(data);
        }else if (layEvent === 'look') {
            var $a = $(obj.tr).find('a[lay-event="look"]');
            var offset = $a.offset();
            var top = offset.top;
            var left = offset.left;
            layer.open({
                type: 1,
                title: false,
                area: '900px',
                offset: [top + 'px', (left - 530 + $a.outerWidth()) + 'px'],
                shade: .01,
                shadeClose: true,
                fixed: false,
                content: '<table id="lookSSXMTable" lay-filter="lookSSXMTable"></table>',
                success: function (layero) {
                    table.render({
                        elem: '#lookSSXMTable',
                        headers: {token: localStorage.getItem('token')},
                        url: baseUrl+'/orderCheck/list/auth',
                        where: {
                            order_id: data.id,
                            order_no: data.orderNo
                        },
                        page: true,
                        cellMinWidth: 100,
                        cols: [[   //工具条明细
                            {type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 160},
                            {field: 'maktx', title: '商品名称', width: 160},
                            {field: 'locNo', title: '库位号'},
                            {field: 'anfme', title: '数量'},
                            {field: 'realAnfme', title: '真实数量'},
                            {field: 'diffAnfme', title: '差异数量', style: 'font-weight: bold'},
                            {field: 'type$', title: '状态'},
                            {align: 'center', title: '操作', toolbar: '#formSSXMTableBar3', minWidth: 80, width: 80, fixed: 'right'}
                        ]],
                        request: {
                            pageName: 'curr',
                            pageSize: 'limit'
                        },
                        parseData: function (res) {
                            return {
                                'code': res.code,
                                'msg': res.msg,
                                'count': res.data.total,
                                'data': res.data.records
                            }
                        },
                        response: {
                            statusCode: 200
                        },
                        done: function () {
                            $(layero).find('.layui-table-view').css('margin', '0');
                        },
                        size: ''
                    });
                }
            });
        }else if (layEvent === 'wrkTrace'){
            showWrkTrace(data.id);
        }
    });
    function showWrkTrace(orderId) {
        console.log(orderId);
    }
    // 显示表单弹窗
    function showEditModel(expTpe) {
        admin.open({
            type: 1,
            title: (expTpe ? '修改' : '添加') + '盘点单',
            content: $('#editDialog').html(),
            area: '1300px',
            success: function (layero, dIndex) {
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                var isExpAdd = !expTpe;
                // 回显数据
                form.val('editForm', expTpe);
                if (expTpe) {
                    $('#orderNo').attr("disabled", "disabled");
                }
                // 表单提交事件
                form.on('submit(orderEditSubmit)', function (data) {
                    // 组装数据
                    if (xxDataList.length <= 0) {
                        layer.tips('请添加单据明细', '#matAddBtnComment', {tips: [1, '#ff4c4c']});
                        return false;
                    }
                    let nList = admin.util.deepClone(xxDataList);
                    // for (let xi = 0; xi < nList.length; xi++) {
                    //     if (nList[xi].anfme <= 0){
                    //         layer.msg('明细修改数量不合法', {icon: 2});
                    //         return false;
                    //     }
                    //     if (nList[xi].anfme < nList[xi].workQty){
                    //         layer.msg('数量不能小于已作业数量', {icon: 2});
                    //         return false;
                    //     }
                    // }
                    layer.load(2);
                    console.log(data);
                    $.ajax({
                        url: baseUrl+"/orderCheck/form/" + (isExpAdd?"add":"modify") + "/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify({
                            orderId: Number(data.field.id),
                            docType: Number(data.field.docType),
                            orderNo: data.field.orderNo,
                            orderDetlList: nList
                        }),
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll('loading');
                            if (res.code === 200){
                                layer.close(dIndex);
                                $(".layui-laypage-btn")[0].click();
                                layer.msg(res.msg, {icon: 1});
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                // 明细表格
                var xxDataList = [];
                var tbOptions = {
                    elem: '#formSSXMTable',
                    headers: {token: localStorage.getItem('token')},
                    data: xxDataList,
                    page: true,
                    height: '350px;',
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 160},
                        {field: 'locNo', title: '库位号'},
                        {field: 'anfme', title: '库存数量'},
                        {field: 'realAnfme', title: '真实数量'},
                        {field: 'diffAnfme', title: '差异数量', style: 'font-weight: bold'},
                        {field: 'type$', title: '状态'},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBarr', minWidth: 80, width: 80, fixed: 'right'}
                    ]],
                    done: function (res) {
                        $(layero).find('.layui-table-view').css('margin', '0');
                    },
                    size: ''
                };
                if (!isExpAdd) {
                    $.ajax({
                        url: baseUrl+"/orderCheck/detl/all/auth?orderNo=" + expTpe.orderNo,
                        headers: {'token': localStorage.getItem('token')},
                        method: 'GET',
                        async: false,
                        success: function (res) {
                            if (res.code === 200){
                                console.log(res.data);
                                xxDataList = res.data;
                                tbOptions.data = xxDataList;
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    })
                }
                var insTbSSXM = table.render(tbOptions);
                // 工具条点击事件
                table.on('tool(formSSXMTable)', function (obj) {
                    var data = obj.data;
                    var layEvent = obj.event;
                    if (layEvent === 'edit') {
                        showEditModel2(data);
                    } else if (layEvent === 'del') {
                        if(data.workQty > 0){
                            layer.msg("已存在作业数量,不能删除", {icon: 2});
                            return;
                        }
                        layer.confirm('确定要删除吗?', {
                            shade: .1,
                            skin: 'layui-layer-admin'
                        }, function (i) {
                            layer.close(i);
                            for (var j = 0; j < xxDataList.length; j++) {
                                if (xxDataList[j].matnr === data.matnr && xxDataList[j].batch === data.batch) {
                                    xxDataList.splice(j, 1);
                                    break;
                                }
                            }
                            insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                        });
                    }
                });
                // 明细数据修改
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = obj.tr.attr("data-index");
                    let data = xxDataList[index];
                    if (obj.field === 'anfme'){
                        let vle = Number(obj.value);
                        if (isNaN(vle)) {
                            layer.msg("请输入数字", {icon: 2});
                            return false;
                        } else {
                            if (vle <= 0) {
                                layer.msg("数量必须大于零", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                            if(obj.value < data.workQty){
                                layer.msg("输入数量不能小于作业中数量", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                        }
                    }
                    data[obj.field] = obj.value;
                    insTbSSXM.reload({data: xxDataList});
                });
                $('#matAddBtnComment').click(function () {
                    showEditModel2();
                });
                // 显示添加明细表单弹窗
                function showEditModel2(exp) {
                    var checkType = $("#checkType option:selected").val();
                    var tp = '';
                    if (checkType == 'loc'){
                        tp = 2;
                    }
                    if (checkType == 'matnr'){
                        tp = 3;
                    }
                    admin.open({
                        type: 1,
                        offset: '150px',
                        area: '680px',
                        title: (exp ? '修改' : '添加') + '明细',
                        content: $('#matEditDialog'+tp).html(),
                        success: function (layero, dIndex) {
                            // 回显数据
                            form.val('matEditForm', exp);
                            // 表单提交事件
                            form.on('submit(matEditSubmit)', function (data) {
                                var prec = $("#selectPerc option:selected").val();
                                var selectList;
                                if (tp == 3){
                                    prec = $("#selectPerc3 option:selected").val();
                                    selectList = matXmSelect.getValue();
                                    console.log(selectList);
                                    for (let i = 0; i<selectList.length; i++) {
                                        selectList[i].children="";
                                    }
                                }
                                var json = {
                                    prec:prec,
                                    data:{
                                    }
                                }
                                json.data = selectList;
                                console.log(json);
                                $.ajax({
                                    url: baseUrl+"/orderCheck/create/auth",
                                    headers: {'token': localStorage.getItem('token')},
                                    contentType:'application/json;charset=UTF-8',
                                    data: JSON.stringify(json),
                                    method: 'POST',
                                    async: false,
                                    success: function (res) {
                                        if (res.code === 200){
                                            for (var i =0;i<res.data.length;i++){
                                                xxDataList.push(res.data[i]);
                                                console.log(xxDataList);
                                                insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                                            }
                                        } else if (res.code === 403){
                                            top.location.href = baseUrl+"/";
                                        }else {
                                            layer.msg(res.msg, {icon: 2})
                                        }
                                    }
                                })
                                layer.close(dIndex);
                                return false;
                            });
                            // 渲染物料选择
                            var matXmSelect = xmSelect.render({
                                el: '#mat3',
                                style: {
                                    width: '340px',
                                },
                                autoRow: true,
                                toolbar: { show: true },
                                filterable: true,
                                remoteSearch: true,
                                remoteMethod: function(val, cb, show){
                                    $.ajax({
                                        url: baseUrl+"/mat/all/get/kv",
                                        headers: {'token': localStorage.getItem('token')},
                                        data: {
                                            condition: val
                                        },
                                        method: 'POST',
                                        success: function (res) {
                                            if (res.code === 200){
                                                cb(res.data)
                                            } else {
                                                cb([]);
                                                layer.msg(res.msg, {icon: 2});
                                            }
                                        }
                                    });
                                }
                            })
                            // 弹窗不出现滚动条
                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            layui.form.render('select');
                        }
                    });
                }
            }
        });
    }
    // 删除单据
    function doDel(orderNo) {
        layer.confirm('确定要删除吗?', {
            shade: .1,
            skin: 'layui-layer-admin'
        }, function (i) {
            layer.close(i);
            layer.load(2);
            $.ajax({
                url: baseUrl+"/orderCheck/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {
                    orderNo: orderNo
                },
                method: 'POST',
                success: function (res) {
                    layer.closeAll('loading');
                    if (res.code === 200){
                        if (insTbCount === 0) {
                            insTb.reload({page: {curr: 1}});
                        } else {
                            $(".layui-laypage-btn")[0].click();
                        }
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 修改订单状态
    function doModify(orderId, orderNo, settle) {
        layer.confirm('确定要手动完结吗?', {
            shade: .1,
            skin: 'layui-layer-admin'
        }, function (i) {
            layer.close(i);
            layer.load(2);
            console.log(orderId);
            console.log(settle);
            $.ajax({
                url: baseUrl+"/order/update/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {
                    id: orderId,
                    orderNo: orderNo,
                    settle: settle
                },
                method: 'POST',
                success: function (res) {
                    layer.closeAll('loading');
                    if (res.code === 200){
                        if (insTbCount === 0) {
                            insTb.reload({page: {curr: 1}});
                        } else {
                            $(".layui-laypage-btn")[0].click();
                        }
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    layDate.render({
        elem: '.layui-laydate-range'
        ,type: 'datetime'
        ,range: true
    });
    // 生成拣货单
    function addPakOut(expTpe) {
        $.ajax({
            url: baseUrl+"/ManPakOut/add/auth",
            headers: {'token': localStorage.getItem('token')},
            data: JSON.stringify({
                docType: Number(20),
                orderNo: expTpe,
            }),
            contentType:'application/json;charset=UTF-8',
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    layer.msg("生成拣货单:ok");
                } else if (res.code === 403){
                    layer.msg("生成拣货单失败:403");
                }else {
                    layer.msg("生成拣货单失败:未知异常");
                }
            }
        })
    }
    // 打印
    function btnPrint(orderId, orderNo, settle) {
        console.log(orderId);
        console.log(orderNo);
        console.log(settle);
        printMatCodeNos.push(orderNo)
        var templateNo = 3;
        $.ajax({
            url: baseUrl+"/orderCheck/print/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {param: printMatCodeNos},
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200){
                    layer.closeAll();
                    console.log(res);
                    for (let i=0;i<res.data.length;i++){
                        var templateDom = $("#templatePreview"+templateNo);
                        var className = templateDom.attr("class");
                        if (className === 'template-barcode') {
                            res.data[i]["barcodeUrl"]=baseUrl+"/orderCheck/code/auth?type=1&param="+res.data[i].orderNo+
                                ";"+res.data[i].matnr+";"+res.data[i].batch;
                        } else {
                            res.data[i]["barcodeUrl"]=baseUrl+"/orderCheck/code/auth?type=2&param="+res.data[i].orderNo+
                                ";"+res.data[i].matnr+";"+res.data[i].batch;
                        }
                    }
                    var tpl = templateDom.html();
                    var template = Handlebars.compile(tpl);
                    var html = template(res);
                    var box = $("#box");
                    box.html(html);box.show();
                    box.print({mediaPrint:true});
                    box.hide();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg)
                }
            }
        })
    }
});
src/main/webapp/static/js/orderDetl/outLog.js
New file
@@ -0,0 +1,416 @@
var pageCurr;
var insTb2;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).extend({
    notice: 'notice/notice',
}).use(['table','laydate', 'form', 'util', 'admin', 'notice', 'treeTable', 'xmSelect', 'tableMerge', 'tableX' , 'laytpl'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    var util = layui.util;
    var notice = layui.notice;
    var treeTable = layui.treeTable;
    var xmSelect = layui.xmSelect;
    var tableMerge = layui.tableMerge;
    var tableX = layui.tableX;
    var laytpl = layui.laytpl;
    insTb2 = table.render({
        elem: '#orderDetlTable',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/orderDetl/pakout/list/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        toolbar: '#orderDetToolbar',
        height: 'full-120',
        where: {order_id: 9999999999},
        cols: [[
            {type: 'checkbox'}
            ,{type: 'numbers', title: '#'}
            ,{field: 'orderNo', align: 'center',title: '单据编号', templet: '#orderNoTpl', width: 160}
            ,{field: 'matnr', align: 'center',title: '商品编码', width: 160}
            ,{field: 'maktx', align: 'center',title: '商品名称', width: 200}
            ,{field: 'batch', align: 'center',title: '序列码'}
            ,{field: 'specs', align: 'center',title: '规格'}
            ,{field: 'anfme', align: 'center',title: '总数量', style: 'font-weight: bold'}
            ,{field: 'workQty', align: 'center',title: '作业数量', style: 'font-weight: bold'}
            ,{field: 'qty', align: 'center',title: '完成数量'}
            // ,{field: 'name', align: 'center',title: '名称'}
            // ,{field: 'model', align: 'center',title: '型号'}
            ,{field: 'unit', align: 'center',title: '单位', hide: true}
            ,{field: 'barcode', align: 'center',title: '商品条码', hide: true}
            // ,{field: 'supplier', align: 'center',title: '供应商'}
            // ,{field: 'unitPrice', align: 'center',title: '单价'}
            // ,{field: 'itemNum', align: 'center',title: '品项数'}
            // ,{field: 'count', align: 'center',title: '数量'}
            // ,{field: 'weight', align: 'center',title: '重量'}
            // ,{field: 'status$', align: 'center',title: '状态'}
            // ,{field: 'createBy$', align: 'center',title: '添加人员'}
            // ,{field: 'createTime$', align: 'center',title: '添加时间'}
            // ,{field: 'updateBy$', align: 'center',title: '修改人员'}
            // ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            // ,{field: 'memo', align: 'center',title: '备注'}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 160}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function(res, curr, count) {
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            pageCurr=curr;
            limit();
        }
    });
    /* 表格2搜索 */
    form.on('submit(sensorTbSearch)', function (data) {
        insTb2.reload({where: data.field, page: {curr: 1}});
        return false;
    });
    /* 表格2头工具栏点击事件 */
    table.on('toolbar(orderDetlTable)', function (obj) {
        var checkStatus = table.checkStatus(obj.config.id).data;
        if (obj.event === 'pakoutPreview') { // 添加
            if (checkStatus.length === 0) {
                layer.msg('请选择至少一条出库明细', {icon: 2});
                return;
            }
            pakoutPreview(checkStatus.map(function (d) {
                return d.id;
            }));
        } else if (obj.event === 'del') { // 删除
            var checkRows = table.checkStatus('sensorTable');
            if (checkRows.data.length === 0) {
                layer.msg('请选择要删除的数据', {icon: 2});
                return;
            }
            var ids = checkRows.data.map(function (d) {
                return d.id;
            });
            doDelSensor({ids: ids});
        }
    });
    /* 表格2工具条点击事件 */
    table.on('tool(orderDetlTable)', function (obj) {
        console.log(obj);
        var data = obj.data;
        switch (obj.event) {
            // 出库
            case 'pakoutPreview':
                pakoutPreview([data.id])
                break;
        }
    });
    function pakoutPreview(ids) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl + "/out/pakout/preview/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(ids),
            method: 'POST',
            success: function (res) {
                layer.close(loadIndex);
                var tableCache;
                if (res.code === 200){
                    layer.open({
                        type: 1
                        ,title: false
                        ,closeBtn: false
                        ,offset: '50px'
                        ,area: ['1200px', '700px']
                        ,shade: 0.5
                        ,shadeClose: false
                        ,btn: ['立即出库&生成拣货单', '稍后处理']
                        ,btnAlign: 'c'
                        ,moveType: 1 //拖拽模式,0或者1
                        ,content: $('#pakoutPreviewBox').html()
                        ,success: function(layero, index){
                            console.log(res.data);
                            stoPreTabIdx = table.render({
                                elem: '#stoPreTab',
                                data: res.data,
                                height: 520,
                                page: false,
                                limit: Number.MAX_VALUE,
                                cellMinWidth: 100,
                                cols: [[
                                    // {type: 'checkbox', merge: ['orderNo']},
                                    {field: 'orderNo', title: '单据编号', merge: true, align: 'center'},
                                    {field: 'title', title: '商品', merge: true, align: 'center', width: 350},
                                    {field: 'batch', title: '序列码', align: 'center'},
                                    {field: 'manu', title: '仓库', align: 'center'},
                                    // { title: '剩余需求量', align: 'center' , width: 120, toolbar: '#checkNeedQty'},
                                    // {field: 'anfme', title: '实际数量', align: 'center', width: 90, style: 'font-weight: bold'},
                                    { title: '出库数量', align: 'center',field: 'anfme', width: 90, style: 'font-weight: bold; color: red'},
                                    {field: 'locNo', title: '货位', align: 'center', width: 100, templet: '#locNoTpl'},
                                    {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
                                    // {type: 'checkbox', merge: ['locNo']},
                                ]],
                                done: function (res) {
                                    tableMerge.render(this);
                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
                                    tableCache = tableData = table.cache.stoPreTab;
                                }
                            });
                            // 修改出库站
                            form.on('select(tbBasicTbStaNos)', function (obj) {
                                let index  = obj.othis.parents('tr').attr("data-index");
                                let data = tableCache[index];
                                for (let i = 0; i<tableCache.length; i++) {
                                    if (tableCache[i].locNo === data.locNo) {
                                        tableCache[i]['staNo'] = Number(obj.elem.value);
                                    }
                                }
                                obj.othis.children().find("input").css("color", "blue");
                                return false;
                            });
                            // // 批量修改出库站
                            // form.on('submit(batchModifySta)', function () {
                            //     let stoPreTabData = layui.table.checkStatus('stoPreTab').data;
                            //     if (stoPreTabData.length < 1) {
                            //         layer.msg("请至少选择一条以上合并数据", {icon: 7});
                            //         return false;
                            //     }
                            //     modifySta(stoPreTabData);
                            // });
                            // // 批量修改出库站 - 站点选择
                            // function modifySta(stoPreTabData) {
                            //     // 出库站取交集
                            //     let staBatchSelectVal = [];
                            //     for(let i = 0; i<stoPreTabData.length; i++) {
                            //         let staNos = stoPreTabData[i].staNos;
                            //         if (staNos !== null) {
                            //             if (staBatchSelectVal.length === 0) {
                            //                 staBatchSelectVal = staNos;
                            //             } else {
                            //                 staBatchSelectVal = staBatchSelectVal.filter(val =>
                            //                     {
                            //                         return new Set(staNos).has(val)
                            //                     }
                            //                 )
                            //             }
                            //         }
                            //     }
                            //     if (staBatchSelectVal.length === 0) {
                            //         layer.msg("出库站没有交集,无法批量修改", {icon: 2});
                            //         return;
                            //     }
                            //     admin.open({
                            //         type: 1,
                            //         area: '300px',
                            //         offset: 'auto',
                            //         title: '请选择站点',
                            //         content: $('#staBatchSelectDialog').html(),
                            //         success: function (layero, ddIndex) {
                            //             // 渲染下拉框
                            //             let template = Handlebars.compile($('#batchStaSelectTpl').html());
                            //             $('#batchSelectStaBox').html(template({list: staBatchSelectVal}));
                            //             // 确认
                            //             form.on('submit(staBatchSelectConfirm)', function (obj) {
                            //                 let loadIdx = layer.load(2);
                            //                 let batchSta = Number(obj.field.batchSta);
                            //                 let arr = [];
                            //                 for (let j = 0; j<stoPreTabData.length; j++) {
                            //                     for (let i = 0; i<tableCache.length; i++) {
                            //                         if (tableCache[i].orderNo === stoPreTabData[j].orderNo
                            //                             && tableCache[i].matnr === stoPreTabData[j].matnr
                            //                             && tableCache[i].locNo === stoPreTabData[j].locNo) {
                            //                             tableCache[i]['staNo'] = batchSta;
                            //                             arr.push(i);
                            //                         }
                            //                     }
                            //                 }
                            //                 stoPreTabIdx.reload({data: tableCache});
                            //                 arr.forEach(item => {
                            //                     $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
                            //                 });
                            //                 layui.form.render('select');
                            //                 arr.forEach(item => {
                            //                     $('div[lay-id=stoPreTab] tr[data-index="' + item + '"] .layui-select-title').find("input").css("color", "blue");
                            //                 });
                            //                 layer.close(loadIdx); layer.close(ddIndex);
                            //                 return false;
                            //             });
                            //             // 弹窗不出现滚动条
                            //             $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            //             layui.form.render('select');
                            //         },
                            //     })
                            // }
                        }
                        ,yes: function(index, layero){
                            //按钮【立即出库&生成拣货单】的回调
                            pakout(tableCache, index);
                            //按钮【生成拣货单】的回调
                            pakout2(tableCache, index);
                        }
                        ,btn2: function(index, layero){
                            //按钮【稍后处理】的回调
                            layer.close(index)
                            //return false 开启该代码可禁止点击该按钮关闭
                        }
                    });
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        })
    }
    function pakout(tableCache, layerIndex) {
        // let loadIndex = layer.load(2);
        notice.msg('正在生成出库任务......', {icon: 4});
        $.ajax({
            url: baseUrl + "/out/pakout/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(tableCache),
            method: 'POST',
            success: function (res) {
                notice.destroy();
                if (res.code === 200) {
                    layer.close(layerIndex);
                    layer.msg(res.msg, {icon: 1});
                    insTb.reload({where: null});
                    insTb2.reload({where: null, page: {curr: 1}});
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        });
    }
    function pakout2(tableCache, layerIndex) {
        // let loadIndex = layer.load(2);
        notice.msg('正在生成拣货单......', {icon: 4});
        $.ajax({
            url: baseUrl + "/out/pakout2/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(tableCache),
            method: 'POST',
            success: function (res) {
                notice.destroy();
                if (res.code === 200) {
                    layer.close(layerIndex);
                    layer.msg(res.msg, {icon: 1});
                    insTb.reload({where: null});
                    insTb2.reload({where: null, page: {curr: 1}});
                } else if (res.code === 403) {
                    top.location.href = baseUrl + "/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        });
    }
    /* 删除订单 */
    function doDelSensor(obj) {
        layer.confirm('确定要删除选中数据吗?', {
            skin: 'layui-layer-admin',
            shade: .1
        }, function (i) {
            layer.close(i);
            var loadIndex = layer.load(2);
            $.ajax({
                url: baseUrl+"/sensor/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {ids: obj.ids},
                method: 'POST',
                success: function (res) {
                    layer.close(loadIndex);
                    if (res.code === 200){
                        layer.msg(res.msg, {icon: 1});
                        $(".layui-laypage-btn")[0].click();
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 修改状态
    form.on('switch(statusSwitch)', function (obj) {
        var index  = obj.othis.parents('tr').attr("data-index");
        var data = tableData[index];
        data[this.name] = obj.elem.checked?1:0;
        http.post(baseUrl+"/sensor/edit/auth", {id: data.id, status: data[this.name]}, function (res) {
            layer.msg(res.msg, {icon: 1});
        })
    })
    window.pakoutPreview = pakoutPreview;
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    (child ? parent.tableIns : tableIns).reload({
        where: searchData,
        page: {
            curr: pageCurr
        }
    });
}
/**
 * 一键出库
 */
function autoOut(orderId) {
    let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false});
    $.ajax({
        url: baseUrl + "/out/pakout/orderDetlIds/auth",
        headers: {'token': localStorage.getItem('token')},
        data: { orderId : orderId },
        method: 'POST',
        success: function (res) {
            layer.close(loadIndex);
            if (res.code === 200){
                pakoutPreview(res.data);
            } else if (res.code === 403){
                top.location.href = baseUrl+"/";
            } else {
                layer.msg(res.msg, {icon: 2});
            }
        }
    })
}
src/main/webapp/static/js/orderLog/orderLog.js
New file
@@ -0,0 +1,550 @@
var insTbCount = 0;
var printMatCodeNos = [];
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['layer', 'form', 'table', 'util', 'admin', 'xmSelect', 'laydate'], function () {
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    var table = layui.table;
    var util = layui.util;
    var admin = layui.admin;
    var xmSelect = layui.xmSelect;
    var layDate = layui.laydate;
    // 渲染搜索模板
    $.ajax({
        url: baseUrl+"/docType/list/auth",
        headers: {'token': localStorage.getItem('token')},
        data: {
            limit: 9999
        },
        method: 'POST',
        success: function (res) {
            if (res.code === 200){
                let template = Handlebars.compile($('#docTypeTpl').html());
                $('#docType-query').html(template(res.data));
                layui.form.render('select');
            } else if (res.code === 403){
                top.location.href = baseUrl+"/";
            } else {
                layer.msg(res.msg, {icon: 2})
            }
        }
    })
    // 渲染表格
    var insTb = table.render({
        elem: '#order',
        url: baseUrl+'/orderLog/head/page/auth',
        headers: {token: localStorage.getItem('token')},
        page: true,
        cellMinWidth: 100,
        cols: [[
            {type: 'numbers'},
            // {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            {field: 'orderNo', title: '单据编号',  minWidth: 160},
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160},
            {field: 'createTime$', title: '创建时间', minWidth: 200},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160},
            {field: 'memo', align: 'center',title: '备注', hide: true}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            return {
                'code': res.code,
                'msg': res.msg,
                'count': res.data.total,
                'data': res.data.records
            }
        },
        response: {
            statusCode: 200
        },
        done: function (res, curr, count) {
            limit();
            if (res.code === 403) {
                top.location.href = baseUrl+"/";
            }
            insTbCount = count;
        }
    });
    // 搜索
    form.on('submit(tbSearch)', function (data) {
        insTb.reload({where: data.field, page: {curr: 1}});
    });
    // 添加
    $("#orderAddBtn").click(function () {
        showEditModel();
    });
    // 工具条点击事件
    table.on('tool(order)', function (obj) {
        var data = obj.data;
        var layEvent = obj.event;
        if (layEvent === 'edit') {
            showEditModel(data);
        } else if (layEvent === 'del') {
            doDel(data.id);
        } else if (layEvent === 'complete') {
            doModify(data.id, data.orderNo, 4);
        } else if (layEvent === 'btnPrint') {
            btnPrint(data.id, data.orderNo, 4);
        } else if (layEvent === 'manPrint') {
            addPakOut(data.orderNo);
        } else if (layEvent === 'look') {
            var $a = $(obj.tr).find('a[lay-event="look"]');
            var offset = $a.offset();
            var top = offset.top;
            var left = offset.left;
            layer.open({
                type: 1,
                title: false,
                area: '900px',
                offset: [top + 'px', (left - 530 + $a.outerWidth()) + 'px'],
                shade: .01,
                shadeClose: true,
                fixed: false,
                content: '<table id="lookSSXMTable" lay-filter="lookSSXMTable"></table>',
                success: function (layero) {
                    table.render({
                        elem: '#lookSSXMTable',
                        headers: {token: localStorage.getItem('token')},
                        url: baseUrl+'/orderDetlLog/list/auth',
                        where: {
                            order_id: data.id
                        },
                        page: true,
                        cellMinWidth: 100,
                        cols: [[
                            {type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 160},
                            {field: 'maktx', title: '商品名称', width: 160},
                            {field: 'anfme', title: '数量'},
                            {field: 'workQty', title: '作业数量'},
                            {field: 'qty', title: '完成数量', style: 'font-weight: bold'},
                            {field: 'owner$', title: '规格'},
                            {field: 'payment$', title: '规格'}
                        ]],
                        request: {
                            pageName: 'curr',
                            pageSize: 'limit'
                        },
                        parseData: function (res) {
                            return {
                                'code': res.code,
                                'msg': res.msg,
                                'count': res.data.total,
                                'data': res.data.records
                            }
                        },
                        response: {
                            statusCode: 200
                        },
                        done: function () {
                            $(layero).find('.layui-table-view').css('margin', '0');
                        },
                        size: ''
                    });
                }
            });
        }else if (layEvent === 'wrkTrace'){
            showWrkTrace(data.id);
        }
    });
    function showWrkTrace(orderId) {
        console.log(orderId);
    }
    // 显示表单弹窗
    function showEditModel(expTpe) {
        admin.open({
            type: 1,
            title: (expTpe ? '修改' : '添加') + '单据',
            content: $('#editDialog').html(),
            area: '1300px',
            success: function (layero, dIndex) {
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                var isExpAdd = !expTpe;
                // 回显数据
                form.val('editForm', expTpe);
                if (expTpe) {
                    $('#orderNo').attr("disabled", "disabled");
                }
                // 表单提交事件
                form.on('submit(orderEditSubmit)', function (data) {
                    // 组装数据
                    if (xxDataList.length <= 0) {
                        layer.tips('请添加单据明细', '#matAddBtnComment', {tips: [1, '#ff4c4c']});
                        return false;
                    }
                    let nList = admin.util.deepClone(xxDataList);
                    for (let xi = 0; xi < nList.length; xi++) {
                        if (nList[xi].anfme <= 0){
                            layer.msg('明细修改数量不合法', {icon: 2});
                            return false;
                        }
                        if (nList[xi].anfme < nList[xi].workQty){
                            layer.msg('数量不能小于已作业数量', {icon: 2});
                            return false;
                        }
                    }
                    layer.load(2);
                    $.ajax({
                        url: baseUrl+"/order/form/" + (isExpAdd?"add":"modify") + "/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify({
                            orderId: Number(data.field.id),
                            docType: Number(data.field.docType),
                            orderNo: data.field.orderNo,
                            orderDetlList: nList
                        }),
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll('loading');
                            if (res.code === 200){
                                layer.close(dIndex);
                                $(".layui-laypage-btn")[0].click();
                                layer.msg(res.msg, {icon: 1});
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                // 明细表格
                var xxDataList = [];
                var tbOptions = {
                    elem: '#formSSXMTable',
                    headers: {token: localStorage.getItem('token')},
                    data: xxDataList,
                    page: true,
                    height: '350px;',
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 200},
                        {field: 'batch', title: '批号', edit: true},
                        {field: 'specs', title: '规格'},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        // {field: 'workQty', title: '作业数量',  minWidth: 100, width: 100},
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
                    ]],
                    done: function (res) {
                        $(layero).find('.layui-table-view').css('margin', '0');
                    },
                    size: ''
                };
                if (!isExpAdd) {
                    $.ajax({
                        url: baseUrl+"/order/detl/all/auth?orderId=" + expTpe.id,
                        headers: {'token': localStorage.getItem('token')},
                        method: 'GET',
                        async: false,
                        success: function (res) {
                            if (res.code === 200){
                                xxDataList = res.data;
                                tbOptions.data = xxDataList;
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    })
                }
                var insTbSSXM = table.render(tbOptions);
                // 工具条点击事件
                table.on('tool(formSSXMTable)', function (obj) {
                    var data = obj.data;
                    var layEvent = obj.event;
                    if (layEvent === 'edit') {
                        showEditModel2(data);
                    } else if (layEvent === 'del') {
                        if(data.workQty > 0){
                            layer.msg("已存在作业数量,不能删除", {icon: 2});
                            return;
                        }
                        layer.confirm('确定要删除吗?', {
                            shade: .1,
                            skin: 'layui-layer-admin'
                        }, function (i) {
                            layer.close(i);
                            for (var j = 0; j < xxDataList.length; j++) {
                                if (xxDataList[j].matnr === data.matnr && xxDataList[j].batch === data.batch) {
                                    xxDataList.splice(j, 1);
                                    break;
                                }
                            }
                            insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                        });
                    }
                });
                // 明细数据修改
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = obj.tr.attr("data-index");
                    let data = xxDataList[index];
                    if (obj.field === 'anfme'){
                        let vle = Number(obj.value);
                        if (isNaN(vle)) {
                            layer.msg("请输入数字", {icon: 2});
                            return false;
                        } else {
                            if (vle <= 0) {
                                layer.msg("数量必须大于零", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                            if(obj.value < data.workQty){
                                layer.msg("输入数量不能小于作业中数量", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                        }
                    }
                    data[obj.field] = obj.value;
                    insTbSSXM.reload({data: xxDataList});
                });
                $('#matAddBtnComment').click(function () {
                    showEditModel2();
                });
                // 显示添加明细表单弹窗
                function showEditModel2(exp) {
                    admin.open({
                        type: 1,
                        offset: '150px',
                        area: '680px',
                        title: (exp ? '修改' : '添加') + '明细',
                        content: $('#matEditDialog').html(),
                        success: function (layero, dIndex) {
                            // 回显数据
                            form.val('matEditForm', exp);
                            // 表单提交事件
                            form.on('submit(matEditSubmit)', function (data) {
                                let selectList = matXmSelect.getValue();
                                for (let i = 0; i<selectList.length; i++) {
                                    let item = selectList[i];
                                    // 查询物料详情
                                    $.ajax({
                                        url: baseUrl+"/mat/covert/"+item.value+"/auth",
                                        headers: {'token': localStorage.getItem('token')},
                                        method: 'GET',
                                        async: false,
                                        success: function (res) {
                                            if (res.code === 200){
                                                xxDataList.push(res.data);
                                                insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                                            } else if (res.code === 403){
                                                top.location.href = baseUrl+"/";
                                            }else {
                                                layer.msg(res.msg, {icon: 2})
                                            }
                                        }
                                    })
                                }
                                layer.close(dIndex);
                                return false;
                            });
                            // 渲染物料选择
                            var matXmSelect = xmSelect.render({
                                el: '#mat',
                                style: {
                                    width: '340px',
                                },
                                autoRow: true,
                                toolbar: { show: true },
                                filterable: true,
                                remoteSearch: true,
                                remoteMethod: function(val, cb, show){
                                    $.ajax({
                                        url: baseUrl+"/mat/all/get/kv",
                                        headers: {'token': localStorage.getItem('token')},
                                        data: {
                                            condition: val
                                        },
                                        method: 'POST',
                                        success: function (res) {
                                            if (res.code === 200){
                                                cb(res.data)
                                            } else {
                                                cb([]);
                                                layer.msg(res.msg, {icon: 2});
                                            }
                                        }
                                    });
                                }
                            })
                            // 弹窗不出现滚动条
                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            layui.form.render('select');
                        }
                    });
                }
            }
        });
    }
    // 删除单据
    function doDel(orderId) {
        layer.confirm('确定要删除吗?', {
            shade: .1,
            skin: 'layui-layer-admin'
        }, function (i) {
            layer.close(i);
            layer.load(2);
            $.ajax({
                url: baseUrl+"/order/delete/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {
                    orderId: orderId
                },
                method: 'POST',
                success: function (res) {
                    layer.closeAll('loading');
                    if (res.code === 200){
                        if (insTbCount === 0) {
                            insTb.reload({page: {curr: 1}});
                        } else {
                            $(".layui-laypage-btn")[0].click();
                        }
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 修改订单状态
    function doModify(orderId, orderNo, settle) {
        layer.confirm('确定要手动完结吗?', {
            shade: .1,
            skin: 'layui-layer-admin'
        }, function (i) {
            layer.close(i);
            layer.load(2);
            console.log(orderId);
            console.log(settle);
            $.ajax({
                url: baseUrl+"/order/update/auth",
                headers: {'token': localStorage.getItem('token')},
                data: {
                    id: orderId,
                    orderNo: orderNo,
                    settle: settle
                },
                method: 'POST',
                success: function (res) {
                    layer.closeAll('loading');
                    if (res.code === 200){
                        if (insTbCount === 0) {
                            insTb.reload({page: {curr: 1}});
                        } else {
                            $(".layui-laypage-btn")[0].click();
                        }
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    layDate.render({
        elem: '.layui-laydate-range'
        ,type: 'datetime'
        ,range: true
    });
    // 生成拣货单
    function addPakOut(expTpe) {
        $.ajax({
            url: baseUrl+"/ManPakOut/add/auth",
            headers: {'token': localStorage.getItem('token')},
            data: JSON.stringify({
                docType: Number(20),
                orderNo: expTpe,
            }),
            contentType:'application/json;charset=UTF-8',
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    layer.msg("生成拣货单:ok");
                } else if (res.code === 403){
                    layer.msg("生成拣货单失败:403");
                }else {
                    layer.msg("生成拣货单失败:未知异常");
                }
            }
        })
    }
    // 打印
    function btnPrint(orderId, orderNo, settle) {
        console.log(orderId);
        console.log(orderNo);
        console.log(settle);
        printMatCodeNos.push(orderNo)
        var templateNo = 3;
        $.ajax({
            url: baseUrl+"/order/print/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {param: printMatCodeNos},
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200){
                    layer.closeAll();
                    console.log(res);
                    for (let i=0;i<res.data.length;i++){
                        var templateDom = $("#templatePreview"+templateNo);
                        var className = templateDom.attr("class");
                        if (className === 'template-barcode') {
                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=1&param="+res.data[i].orderNo+
                                ";"+res.data[i].matnr+";"+res.data[i].batch;
                        } else {
                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=2&param="+res.data[i].orderNo+
                                ";"+res.data[i].matnr+";"+res.data[i].batch;
                        }
                    }
                    var tpl = templateDom.html();
                    var template = Handlebars.compile(tpl);
                    var html = template(res);
                    var box = $("#box");
                    box.html(html);box.show();
                    box.print({mediaPrint:true});
                    box.hide();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg)
                }
            }
        })
    }
});
src/main/webapp/views/locCheck/locCheck.html
@@ -142,7 +142,7 @@
</script>
<script type="text/html" id="nodeSelect">
    <form id=detailSelect lay-filter="detailSelect" class="layui-form">
        <div class="layui-form-item">
        <div class="layui-form-item" style="height: 300px;">
            <label class="layui-form-label">选择盘点率:</label>
            <div class="layui-input-block">
                <select id="selectPerc" name="selectPerc" lay-filter="selectPerc">
@@ -155,7 +155,7 @@
            </div>
        </div>
        <div class="layui-form-item text-right">
            <button class="layui-btn" lay-filter="pakin" lay-submit="">生成盘点</button>
            <button class="layui-btn" lay-filter="pakin" lay-submit>生成盘点</button>
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
        </div>
    </form>
src/main/webapp/views/orderCheck/orderCheck.html
New file
@@ -0,0 +1,347 @@
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title></title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
  <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
  <link rel="stylesheet" href="../../static/css/cool.css" media="all">
  <!--    <link rel="stylesheet" href="../../static/css/common.css" media="all">-->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
  <style>
    .btn-add {
      display: none;
    }
    .btn-edit {
      display: none;
    }
    .btn-complete {
      display: none;
    }
    .btn-delete {
      display: none;
    }
    .contain td {
      border: 1px solid #000;
      /*font-family: 黑体;*/
      /*font-weight: bold;*/
      /*color: #000000;*/
    }
    .wrk-trace {
      color: green;
      cursor: pointer;
      margin-left: 6px;
      font-size: 18px;
    }
  </style>
</head>
<body>
<!-- 正文开始 -->
<div class="layui-fluid">
  <div class="layui-card">
    <div class="layui-card-body">
      <!-- 表格顶部工具栏 -->
      <div class="layui-form toolbar">
        <div class="layui-form-item">
          <div class="layui-inline">
            <div class="layui-input-inline mr0">
              <input name="order_no" class="layui-input" type="text" placeholder="输入单据编号"/>
            </div>
          </div>
          <div class="layui-inline" style="width: 300px">
            <div class="layui-input-inline">
              <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
            </div>
          </div>
          <div class="layui-inline">
            <div class="layui-input-inline">
              <select name="doc_type" id="docType-query">
              </select>
            </div>
          </div>
          <div class="layui-inline">
            <div class="layui-input-inline">
              <select name="settle">
                <option value="">选择状态</option>
                <option value="1">待处理</option>
                <option value="2">作业中</option>
                <option value="4">已完成</option>
                <option value="6">上报完成</option>
              </select>
            </div>
          </div>
          <div class="layui-inline">
            <button class="layui-btn icon-btn" lay-filter="tbSearch" lay-submit>
              <i class="layui-icon">&#xe615;</i>搜索
            </button>
            <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon">&#xe654;</i>添加
            </button>
          </div>
        </div>
      </div>
      <table id="order" lay-filter="order"></table>
    </div>
  </div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="operate">
  <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="btnPrint">打印</a>
  {{# if (d.settle == 0 || d.settle == 1) { }}
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">删除</a>
  {{# } }}
  <!--    {{# if ((d.settle == 0 || d.settle == 1) && (d.docType == 21 || d.docType == 11 || d.docType == 12)) { }}-->
  <!--    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="manPrint">生成拣货单</a>-->
  <!--    {{# } }}-->
  {{# if (d.settle == 2) { }}
  <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">完结</a>
  {{# } }}
</script>
<!-- 表格操作列 -->
<script type="text/html" id="tbLook">
  <span class="layui-text">
        <a href="javascript:;" lay-event="look">
            <i class="layui-icon" style="font-size: 12px;">&#xe61a;</i> 查看单据明细
        </a>
    </span>
</script>
<script type="text/html" id="orderNoTpl">
  {{d.orderNo}}
  {{# if(d.settle > 1 && d.settle !== 3){ }}
  {{# } }}
  <i class="layui-icon layui-icon-about wrk-trace" lay-tips="查看二维码" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i>
</script>
<!--<script type="text/html" id="settleTpl">-->
<!--    <span name="settle" class="layui-badge layui-badge-gray">{{d.settle$}}</span>-->
<!--</script>-->
<script type="text/html" id="settleTpl">
  <span name="settle"
        {{# if( d.settle === 1){ }}
        class="layui-badge layui-badge-red"
        {{# }else if(d.settle === 2){ }}
        class="layui-badge layui-badge-green"
        {{# }else if(d.settle === 3){ }}
        class="layui-badge layui-badge-gray"
        {{# }else if(d.settle === 4){ }}
        class="layui-badge layui-badge-blue"
        {{# }else if(d.settle === 5){ }}
        class="layui-badge layui-badge-gray"
        {{# }else if(d.settle === 6){ }}
        class="layui-badge layui-badge-gray"
        {{# } }}
  >{{d.settle$}}</span>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
  <form id="editForm" lay-filter="editForm" class="layui-form model-form">
    <input name="id" type="hidden"/>
    <div class="layui-form-item">
      <label class="layui-form-label">盘点类型:</label>
      <div class="layui-input-block" >
        <select id="checkType" name="checkType" lay-filter="checkType">
          <option value="all" selected="">全部物料</option>
          <option value="matnr">物料号</option>
        </select>
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">盘点单编号:</label>
      <div class="layui-input-block">
        <input id="orderNo" name="orderNo" placeholder="输入单据编号" type="text" class="layui-input" maxlength="20" lay-verType="tips" />
        <!--                lay-verify="required"-->
      </div>
    </div>
    <div class="layui-form-item" style="position: relative;">
      <label class="layui-form-label">单据明细:</label>
      <div class="layui-input-block">
        <table id="formSSXMTable" lay-filter="formSSXMTable"></table>
      </div>
      <button class="layui-btn layui-btn-sm icon-btn" id="matAddBtnComment"
              style="position: absolute; left: 20px;top: 60px;padding: 0 5px;" type="button">
        <i class="layui-icon">&#xe654;</i>添加明细
      </button>
    </div>
    <div class="layui-form-item text-right">
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
      <button class="layui-btn" lay-filter="orderEditSubmit" lay-submit>保存</button>
    </div>
  </form>
</script>
<!-- 表格操作列 -->
<script type="text/html" id="formSSXMTableBar">
  {{# if (d.settle == 0 || d.settle == 1) { }}
  <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
  <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">删除</a>
  {{# } }}
  {{# if ((d.settle == 0 || d.settle == 1) && (d.docType == 21 || d.docType == 11 || d.docType == 12)) { }}
  <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="manPrint">生成拣货单</a>
  {{# } }}
  {{# if (d.settle == 2) { }}
  <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">完结</a>
  {{# } }}
  <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="btnPrint">打印</a>
</script>
<!-- 表格操作列 -->
<script type="text/html" id="formSSXMTableBarr">
  <!--    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>-->
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script type="text/html" id="formSSXMTableBar3">
  <!--    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>-->
  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="examine">审核</a>
</script>
<!-- 表单弹窗1 -->
<script type="text/html" id="matEditDialog">
  <form id="matEditForm" lay-filter="matEditForm" class="layui-form model-form">
    <input name="experimentId" type="hidden"/>
    <div class="layui-form-item" style="float: left">
      <label class="layui-form-label"style="margin-top: 15px;">盘点率:</label>
      <div class="layui-input-block" style="margin-top: 15px;">
        <select id="selectPerc" name="selectPerc" lay-filter="selectPerc">
          <option value="100" selected="">100%</option>
          <option value="80">80%</option>
          <option value="60">60%</option>
          <option value="40">40%</option>
          <option value="10">10%</option>
        </select>
      </div>
    </div>
    <div class="layui-form-item text-right" style="margin-left: 35px">
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
      <button class="layui-btn" lay-filter="matEditSubmit" lay-submit>保存</button>
    </div>
  </form>
</script>
<!-- 表单弹窗3 -->
<script type="text/html" id="matEditDialog3">
  <form id="matEditForm3" lay-filter="matEditForm3" class="layui-form model-form">
    <input name="experimentId" type="hidden"/>
    <div class="layui-form-item" style="float: left">
      <label class="layui-form-label">物料 - 多选</label>
      <div class="layui-input-block">
        <div id="mat3" name="mat">
        </div>
      </div>
      <label class="layui-form-label"style="margin-top: 15px;">盘点率:</label>
      <div class="layui-input-block" style="margin-top: 15px;">
        <select id="selectPerc3" name="selectPerc3" lay-filter="selectPerc3">
          <option value="100" selected="">100%</option>
          <option value="80">80%</option>
          <option value="60">60%</option>
          <option value="40">40%</option>
          <option value="10">10%</option>
        </select>
      </div>
    </div>
    <div class="layui-form-item text-right" style="margin-left: 35px">
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
      <button class="layui-btn" lay-filter="matEditSubmit" lay-submit>保存</button>
    </div>
  </form>
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/orderCheck/orderCheck.js" charset="utf-8"></script>
<script type="text/template" id="docTypeTpl">
  <option value="">选择类型</option>
  {{#each records}}
  <option value="{{docId}}">{{docName}}</option>
  {{/each}}
</script>
<!-- 打印操作弹窗 -->
<div id="printDataDiv" style="display: none;padding: 20px">
  <div class="layui-form" style="text-align: center">
    <hr>
    <!--单选框-->
    <div class="layui-form-item" style="display: inline-block; margin-bottom: 10px">
      <input type="radio" name="selectTemplate" value="3" title="模板三" lay-filter="selectTemplateRadio" checked="">
    </div>
    <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;text-align: left;">
      <legend>打印预览</legend>
      <div id="template-container" style="margin: 20px;text-align: center">
        <!-- 预览图 3 -->
        <div id="template-preview-3" class="template-preview" style="display: inline-block">
          <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
          </table>
        </div>
      </div>
    </fieldset>
  </div>
</div>
<div id="box" style="display: block"></div>
<!-- 初始化打印模板的条形码 -->
<script type="text/javascript">
  // $('.template-barcode').attr("src", baseUrl+"/mac/code/auth?type=1&param=123");
  $('.template-qrcode').attr("src", baseUrl+"/mac/code/auth?type=2&param=123");
</script>
<!-- 模板引擎 -->
<!-- 模板3 -->
<script type="text/template" id="templatePreview3" class="template-qrcode">
  {{#each data}}
  <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
    <thead></thead>
    <tbody style="font-weight: bold">
    <tr style="height: 30px;">
      <td align="center" scope="col" colspan="1">料号</td>
      <td align="lift" colspan="4" style="padding-left: 8px;overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.matnr}}</td>
      <td align="center" scope="col" colspan="3" rowspan="3">
        <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" width="80%">
      </td>
    </tr>
    <tr style="height: 30px">
      <td align="center" scope="col" colspan="1">商品</td>
      <!--            overflow:hidden; 溢出隐藏 white-space:nowrap; text-overflow:ellipsis;-->
      <!--             word-break : break-all;  超出自动换行-->
      <td align="lift" colspan="4" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.maktx}}</td>
    </tr>
    <tr style="height: 30px">
      <td align="center" scope="col" colspan="1">批号</td>
      <td align="lift" colspan="4" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.batch}}</td>
    </tr>
    <tr style="height: 30px">
      <td align="center" scope="col" colspan="1">规格</td>
      <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.specs}}</td>
      <td align="center" scope="col" colspan="1">数量</td>
      <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.anfme}}</td>
    </tr>
    <tr style="height: 30px">
      <td align="center" scope="col" colspan="1">日期</td>
      <td align="lift" colspan="7  " style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.createTime$}}</td>
    </tr>
    </tbody>
  </table>
  <div style="height: 20px">
  </div>
  {{/each}}
</script>
</body>
</html>
src/main/webapp/views/orderLog/orderLog.html
New file
@@ -0,0 +1,281 @@
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title></title>
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
    <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
    <link rel="stylesheet" href="../../static/css/cool.css" media="all">
    <!--    <link rel="stylesheet" href="../../static/css/common.css" media="all">-->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <style>
        .btn-add {
            display: none;
        }
        .btn-edit {
            display: none;
        }
        .btn-complete {
            display: none;
        }
        .btn-delete {
            display: none;
        }
        .contain td {
            border: 1px solid #000;
            /*font-family: 黑体;*/
            /*font-weight: bold;*/
            /*color: #000000;*/
        }
        .wrk-trace {
            color: green;
            cursor: pointer;
            margin-left: 6px;
            font-size: 18px;
        }
    </style>
</head>
<body>
<!-- 正文开始 -->
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <!-- 表格顶部工具栏 -->
            <div class="layui-form toolbar">
                <div class="layui-form-item">
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="order_no" class="layui-input" type="text" placeholder="输入单据编号"/>
                        </div>
                    </div>
                    <div class="layui-inline" style="width: 300px">
                        <div class="layui-input-inline">
                            <input class="layui-input layui-laydate-range" name="create_time" type="text" placeholder="起始时间 - 终止时间" autocomplete="off" style="width: 300px">
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline">
                            <select name="doc_type" id="docType-query">
                            </select>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <button class="layui-btn icon-btn" lay-filter="tbSearch" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                    </div>
                </div>
            </div>
            <table id="order" lay-filter="order"></table>
        </div>
    </div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="operate">
    {{# if (d.settle == 0 || d.settle == 1) { }}
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">删除</a>
    {{# } }}
    {{# if ((d.settle == 0 || d.settle == 1) && (d.docType == 21 || d.docType == 11 || d.docType == 12)) { }}
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="manPrint">生成拣货单</a>
    {{# } }}
    {{# if (d.settle == 2) { }}
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">完结</a>
    {{# } }}
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="btnPrint">打印</a>
</script>
<!-- 表格操作列 -->
<script type="text/html" id="tbLook">
    <span class="layui-text">
        <a href="javascript:;" lay-event="look">
            <i class="layui-icon" style="font-size: 12px;">&#xe61a;</i> 查看单据明细
        </a>
    </span>
</script>
<script type="text/html" id="orderNoTpl">
    {{d.orderNo}}
    {{# if(d.settle > 1 && d.settle !== 3){ }}
    {{# } }}
    <i class="layui-icon layui-icon-about wrk-trace" lay-tips="查看二维码" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i>
</script>
<!--<script type="text/html" id="settleTpl">-->
<!--    <span name="settle" class="layui-badge layui-badge-gray">{{d.settle$}}</span>-->
<!--</script>-->
<script type="text/html" id="settleTpl">
    <span name="settle"
          {{# if( d.settle === 1){ }}
          class="layui-badge layui-badge-red"
          {{# }else if(d.settle === 2){ }}
          class="layui-badge layui-badge-green"
          {{# }else if(d.settle === 3){ }}
          class="layui-badge layui-badge-gray"
          {{# }else if(d.settle === 4){ }}
          class="layui-badge layui-badge-blue"
          {{# }else if(d.settle === 5){ }}
          class="layui-badge layui-badge-gray"
          {{# }else if(d.settle === 6){ }}
          class="layui-badge layui-badge-gray"
          {{# } }}
    >{{d.settle$}}</span>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
    <form id="editForm" lay-filter="editForm" class="layui-form model-form">
        <input name="id" type="hidden"/>
        <div class="layui-form-item">
            <label class="layui-form-label">单据类型:</label>
            <div class="layui-input-block cool-auto-complete">
                <input class="layui-input" name="docType" placeholder="请输入单据类型" style="display: none">
                <input id="docType$" name="docType$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请输入单据类型" onfocus=this.blur() lay-verType="tips" lay-verify="required">
                <div class="cool-auto-complete-window">
                    <input class="cool-auto-complete-window-input" data-key="docTypeQueryBydocType" onkeyup="autoLoad(this.getAttribute('data-key'))">
                    <select class="cool-auto-complete-window-select" data-key="docTypeQueryBydocTypeSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
                    </select>
                </div>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">单据编号:</label>
            <div class="layui-input-block">
                <input id="orderNo" name="orderNo" placeholder="输入单据编号" type="text" class="layui-input" maxlength="20" lay-verType="tips" />
                <!--                lay-verify="required"-->
            </div>
        </div>
        <div class="layui-form-item" style="position: relative;">
            <label class="layui-form-label">单据明细:</label>
            <div class="layui-input-block">
                <table id="formSSXMTable" lay-filter="formSSXMTable"></table>
            </div>
            <button class="layui-btn layui-btn-sm icon-btn" id="matAddBtnComment"
                    style="position: absolute; left: 20px;top: 60px;padding: 0 5px;" type="button">
                <i class="layui-icon">&#xe654;</i>添加明细
            </button>
        </div>
        <div class="layui-form-item text-right">
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
            <button class="layui-btn" lay-filter="orderEditSubmit" lay-submit>保存</button>
        </div>
    </form>
</script>
<!-- 表格操作列 -->
<script type="text/html" id="formSSXMTableBar">
    <!--    <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">修改</a>-->
    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="matEditDialog">
    <form id="matEditForm" lay-filter="matEditForm" class="layui-form model-form">
        <input name="experimentId" type="hidden"/>
        <div class="layui-form-item" style="float: left">
            <label class="layui-form-label">物料 - 多选</label>
            <div class="layui-input-block">
                <div id="mat" name="mat">
                </div>
            </div>
        </div>
        <div class="layui-form-item text-right" style="display: inline-block; margin-left: 35px">
            <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
            <button class="layui-btn" lay-filter="matEditSubmit" lay-submit>保存</button>
        </div>
    </form>
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/orderLog/orderLog.js" charset="utf-8"></script>
<script type="text/template" id="docTypeTpl">
    <option value="">选择类型</option>
    {{#each records}}
    <option value="{{docId}}">{{docName}}</option>
    {{/each}}
</script>
<!-- 打印操作弹窗 -->
<div id="printDataDiv" style="display: none;padding: 20px">
    <div class="layui-form" style="text-align: center">
        <hr>
        <!--单选框-->
        <div class="layui-form-item" style="display: inline-block; margin-bottom: 10px">
            <input type="radio" name="selectTemplate" value="3" title="模板三" lay-filter="selectTemplateRadio" checked="">
        </div>
        <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;text-align: left;">
            <legend>打印预览</legend>
            <div id="template-container" style="margin: 20px;text-align: center">
                <!-- 预览图 3 -->
                <div id="template-preview-3" class="template-preview" style="display: inline-block">
                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
                    </table>
                </div>
            </div>
        </fieldset>
    </div>
</div>
<div id="box" style="display: block"></div>
<!-- 初始化打印模板的条形码 -->
<script type="text/javascript">
    // $('.template-barcode').attr("src", baseUrl+"/mac/code/auth?type=1&param=123");
    $('.template-qrcode').attr("src", baseUrl+"/mac/code/auth?type=2&param=123");
</script>
<!-- 模板引擎 -->
<!-- 模板3 -->
<script type="text/template" id="templatePreview3" class="template-qrcode">
    {{#each data}}
    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
        <thead></thead>
        <tbody style="font-weight: bold">
        <tr style="height: 30px;">
            <td align="center" scope="col" colspan="1">料号</td>
            <td align="lift" colspan="4" style="padding-left: 8px;overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.matnr}}</td>
            <td align="center" scope="col" colspan="3" rowspan="3">
                <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" width="80%">
            </td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">商品</td>
            <!--            overflow:hidden; 溢出隐藏 white-space:nowrap; text-overflow:ellipsis;-->
            <!--             word-break : break-all;  超出自动换行-->
            <td align="lift" colspan="4" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.maktx}}</td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">批号</td>
            <td align="lift" colspan="4" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.batch}}</td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">规格</td>
            <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.specs}}</td>
            <td align="center" scope="col" colspan="1">数量</td>
            <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.anfme}}</td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">日期</td>
            <td align="lift" colspan="7  " style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.createTime$}}</td>
        </tr>
        </tbody>
    </table>
    <div style="height: 20px">
    </div>
    {{/each}}
</script>
</body>
</html>
src/main/webapp/views/orderLog/outLog.html
New file
@@ -0,0 +1,342 @@
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title></title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <link rel="stylesheet" href="../../static/layui/css/layui.css" media="all">
  <link rel="stylesheet" href="../../static/css/admin.css?v=318" media="all">
  <link rel="stylesheet" href="../../static/css/cool.css" media="all">
  <link rel="stylesheet" href="../../static/css/originTable.css" media="all">
  <style>
    body {
      color: #595959;
      background-color: #f5f7f9;
    }
    .admin-form {
      padding: 25px 30px 0 0 !important;
      margin: 0 !important;
    }
    .layui-table-view .layui-table-cell .layui-select-title .layui-input {
      height: 28px;
      line-height: 28px;
    }
    .layui-table-view [lay-size="lg"] .layui-table-cell .layui-select-title .layui-input {
      height: 40px;
      line-height: 40px;
    }
    .layui-table-view [lay-size="lg"] .layui-table-cell .layui-select-title .layui-input {
      height: 40px;
      line-height: 40px;
    }
    .layui-table-view [lay-size="sm"] .layui-table-cell .layui-select-title .layui-input {
      height: 20px;
      line-height: 20px;
    }
    .layui-table-view [lay-size="sm"] .layui-table-cell .layui-btn-xs {
      height: 18px;
      line-height: 18px;
    }
    /* 权限控制 */
    #btn-pakoutPreview {
      display: none;
    }
    /*#btn-delete {*/
    /*    display: none;*/
    /*}*/
    /*.btn-edit {*/
    /*    display: none;*/
    /*}*/
    /*.btn-more {*/
    /*    display: none;*/
    /*}*/
  </style>
</head>
<body>
<!-- 正文开始 -->
<div class="layui-fluid" style="padding-bottom: 0;">
  <div class="layui-row layui-col-space15">
    <!-- 左 -->
    <div class="layui-col-md3" id="left-table">
      <div class="layui-card">
        <div class="layui-card-body" style="padding: 10px;">
          <form class="layui-form toolbar">
            <div class="layui-form-item">
              <div class="layui-inline" style="max-width: 300px;">
                <input name="orderNo" class="layui-input" placeholder="输入单据编号" autocomplete="off"/>
              </div>
              <div class="layui-inline">
                <button class="layui-btn icon-btn" lay-filter="originTableSearch" lay-submit>
                  <i class="layui-icon">&#xe615;</i>搜索
                </button>
                <button class="layui-btn icon-btn" lay-filter="originTbReset" lay-submit>
                  <i class="layui-icon">&#xe666;</i>重置
                </button>
              </div>
            </div>
          </form>
          <table id="originTable" lay-filter="originTable"></table>
        </div>
      </div>
    </div>
    <!-- 右 -->
    <div class="layui-col-md9">
      <div class="layui-card">
        <div class="layui-card-body" style="padding: 10px;">
          <form class="layui-form toolbar">
            <div class="layui-form-item">
              <div class="layui-inline">
                <label class="layui-form-label">商品编码:</label>
                <div class="layui-input-inline">
                  <input name="matnr" class="layui-input" placeholder="商品编码"/>
                </div>
              </div>
              <div class="layui-inline">
                <label class="layui-form-label">商品名称:</label>
                <div class="layui-input-inline">
                  <input name="maktx" class="layui-input" placeholder="商品名称"/>
                </div>
              </div>
              <div class="layui-inline">
                <label class="layui-form-label">序列码:</label>
                <div class="layui-input-inline">
                  <input name="batch" class="layui-input" placeholder="序列码"/>
                </div>
              </div>
              <!--                            <div class="layui-inline">-->
              <!--                                <label class="layui-form-label">状态:</label>-->
              <!--                                <div class="layui-input-inline">-->
              <!--                                    <select name="isOnline">-->
              <!--                                        <option value="1">充电中</option>-->
              <!--                                        <option value="1">充电中</option>-->
              <!--                                        <option value="0">不在充电</option>-->
              <!--                                    </select>-->
              <!--                                </div>-->
              <!--                            </div>-->
              <div class="layui-inline">&emsp;
                <button class="layui-btn icon-btn" lay-filter="sensorTbSearch" lay-submit>
                  <i class="layui-icon">&#xe615;</i>搜索
                </button>
              </div>
            </div>
          </form>
          <table id="orderDetlTable" lay-filter="orderDetlTable"></table>
        </div>
      </div>
    </div>
  </div>
</div>
<!-- 头工具栏 -->
<script type="text/html" id="orderDetToolbar">
  <!--    <div class="layui-btn-container">-->
  <!--        <div class="layui-col-md3">-->
  <!--            <select id="staNoSelect" lay-verify="required">-->
  <!--                <option value="">请选择站点</option>-->
  <!--            </select>-->
  <!--        </div>-->
  <!--    </div>-->
  <button class="layui-btn layui-btn-sm layui-btn-danger btn-pakoutPreview" id="btn-pakoutPreview" lay-event="pakoutPreview">批量出库</button>
</script>
<!-- 行工具栏 -->
<script type="text/html" id="operate">
  {{#if (d.anfme > d.workQty){ }}
  <a class="layui-btn layui-btn-xs layui-btn-danger btn-pakoutPreview" lay-event="pakoutPreview"><i class="layui-icon layui-icon-prev-circle"></i>出库</a>
  {{# } }}
</script>
<!-- 出库预览 -->
<script type="text/html" id="pakoutPreviewBox" style="display: none">
  <div style="padding: 25px; line-height: 22px; background-color: #393D49; color: #fff; font-weight: 300;">
    <span style="font-size: large; font-weight: bold">出库预览</span>
  </div>
  <div class="layui-card">
    <div class="layui-card-body" style="padding: 10px">
      <table id="stoPreTab" lay-filter="stoPreTab"></table>
    </div>
    <!--        <button class="layui-btn layui-btn-primary layui-border-black layui-btn-sm" lay-filter="batchModifySta" lay-submit style="display: block;float: right;margin-right: 1rem">-->
    <!--            批量修改-->
    <!--        </button>-->
  </div>
</script>
<script type="text/html" id="tbBasicTbStaNos">
  <div class="ew-select-fixed">
    {{#if (d.manu == '立库') {}}
    <select class="order-sta-select" lay-filter="tbBasicTbStaNos">
      {{#if (d.staNos!=null) {}}
      {{# for(let i=0; i<d.staNos.length; i++) { }}
      <option value="{{d.staNos[i]}}">{{d.staNos[i]}}</option>
      {{# } }}
      {{# } }}
    </select>
    {{# } }}
  </div>
</script>
<script type="text/html" id="staBatchSelectDialog">
  <form class="layui-form" style="padding: 25px 50px 30px 50px;text-align: center">
    <select id="batchSelectStaBox" name="batchSta" lay-vertype="tips" lay-verify="required" required="">
    </select>
    <button style="margin-top: 30px" class="layui-btn" lay-filter="staBatchSelectConfirm" lay-submit="">确定</button>
  </form>
</script>
<script type="text/html" id="locNoTpl">
  <span name="locNo"
        {{# if( d.lack === false){ }}
        class="layui-badge layui-badge-green" >{{d.locNo}}</span>
  {{# } else { }}
  class="layui-badge layui-badge-red" >库存不足</span>
  {{# } }}
</script>
<!-- 行样式 -->
<script type="text/html" id="orderNoTpl">
  <span name="orderNo" class="layui-badge layui-badge-gray">{{d.orderNo}}</span>
</script>
<script type="text/html" id="statusTpl">
  <input type="checkbox" name="status" value="{{d.status}}" lay-skin="switch" lay-text="正常|禁用" lay-filter="statusSwitch" {{ d.status === 1 ? 'checked' : '' }}>
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
  <form id="detail" lay-filter="detail" class="layui-form admin-form">
    <input name="id" type="hidden">
    <input name="status" type="hidden">
    <div class="layui-row">
      <div class="layui-col-md4">
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">设备编号</label>
          <div class="layui-input-block">
            <input name="uuid" placeholder="请输入设备编号" class="layui-input" lay-vertype="tips" lay-verify="required" required="">
          </div>
        </div>
      </div>
      <div class="layui-col-md4">
        <div class="layui-form-item">
          <label class="layui-form-label">设备类型:</label>
          <div class="layui-input-block">
            <div id="modelSel" class="ew-xmselect-tree"></div>
          </div>
        </div>
      </div>
      <div class="layui-col-md4">
        <div class="layui-form-item">
          <label class="layui-form-label layui-form-required">所属项目: </label>
          <div class="layui-input-block cool-auto-complete">
            <input name="hostId" class="layui-input" style="display: none">
            <input id="hostId$" name="hostId$" class="layui-input cool-auto-complete-div" onclick="autoShow(this.id)" type="text" placeholder="请选择所属项目" onfocus=this.blur()>
            <div class="cool-auto-complete-window">
              <input class="cool-auto-complete-window-input" data-key="hostQueryByhostId" onkeyup="autoLoad(this.getAttribute('data-key'))">
              <select class="cool-auto-complete-window-select" data-key="hostQueryByhostIdSelect" onchange="confirmed(this.getAttribute('data-key'))" multiple="multiple">
              </select>
            </div>
          </div>
        </div>
      </div>
      <div class="layui-col-md12">
        <div class="layui-form-item">
          <label class="layui-form-label">详细地址</label>
          <div class="layui-input-block">
            <input name="addr" placeholder="请输入详细地址" class="layui-input">
          </div>
        </div>
      </div>
      <hr class="layui-bg-gray">
      <div class="layui-col-md12" style="text-align: center">
        <iframe id="mapIframe" src="map.html" scrolling="no" frameborder="0"
                style="display: inline-block; width: 90%;height: 400px;margin: auto">
        </iframe>
      </div>
    </div>
    <hr class="layui-bg-gray">
    <div class="layui-form-item text-right">
      <button class="layui-btn" lay-filter="editSubmit" lay-submit="">保存</button>
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
    </div>
  </form>
</script>
<!--根据需求出库量和实际出库量做对比,展示不同颜色-->
<script type="text/html" id="checkAnfme">
  {{#  if(d.needQty < d.anfme){ }}
  <span style="color: red; font-weight: bold;" >{{d.anfme}}</span>
  {{#  } }}
  {{#  if(d.needQty == d.anfme){ }}
  <span style="font-weight: bold;" >{{d.anfme}}</span>
  {{#  } }}
  {{#  if(d.needQty > d.anfme){ }}
  <span style="color: red;font-weight: bold;" >{{d.anfme}}</span>
  {{#  } }}
</script>
<script type="text/html" id="checkNeedQty">
  {{#  if(d.needQty < d.anfme){ }}
  <span style="color: red; font-weight: bold;" >{{d.needQty}}</span>
  {{#  } }}
  {{#  if(d.needQty == d.anfme){ }}
  <span style="font-weight: bold;" >{{d.needQty}}</span>
  {{#  } }}
  {{#  if(d.needQty > d.anfme){ }}
  <span style="color: red;font-weight: bold;" >{{d.needQty}}</span>
  {{#  } }}
</script>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/tools/md5.js"></script>
<script type="text/javascript" src="../../static/js/orderTable.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/order/out.js" charset="utf-8"></script>
<!--<script type="text/template" id="takeSiteSelectTemplate">-->
<!--    {{#each data}}-->
<!--    <option value="{{siteId}}">{{desc}}</option>-->
<!--    {{/each}}-->
<!--</script>-->
<!-- 项目编辑窗口 -->
<script type="text/html" id="hostEditDialog">
  <form id="hostEditForm" lay-filter="hostEditForm" class="layui-form model-form">
    <input name="id" type="hidden"/>
    <div class="layui-form-item">
      <label class="layui-form-label layui-form-required">项目名称:</label>
      <div class="layui-input-block">
        <input name="name" placeholder="请输入类型名称" class="layui-input"
               lay-verType="tips" lay-verify="required" required/>
      </div>
    </div>
    <div class="layui-form-item text-right">
      <button class="layui-btn" lay-filter="hostEditSubmit" lay-submit>保存</button>
      <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
    </div>
  </form>
</script>
</body>
<script type="text/template" id="batchStaSelectTpl">
  <option value="">选择出库站</option>
  {{#each list}}
  <option value="{{this}}">{{this}}</option>
  {{/each}}
</script>
</html>