自动化立体仓库 - WMS系统
zhangc
2025-01-15 f111076ba746238c20472121993495ac5df4b54b
添加订单视图及控制器,优化订单详情展示
9个文件已添加
3个文件已修改
3235 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OrderDetlController.java 163 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderViewController.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderView.java 542 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderViewParam.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderViewMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderViewMapper.xml 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderDetl/orderDetl.js 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderView/orderView.js 736 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderView/out.js 631 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderDetl/orderDetl.html 258 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderView/orderView.html 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/orderView/outView.html 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderDetlController.java
@@ -1,6 +1,5 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -49,15 +48,17 @@
    @RequestMapping(value = "/orderDetl/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){
    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<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        wrapper.eq("status", 1);
@@ -66,23 +67,25 @@
    @RequestMapping(value = "/orderDetl/pakout/list/auth")
    @ManagerAuth
    public R pakoutList(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam Map<String, Object> param){
    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)));
    }
    @RequestMapping(value = "/orderDetl/pakout/list/authV2")
    @ManagerAuth
    public R pakoutList2(@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){
    public R pakoutList2(@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<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        List<DocType> pakins = docTypeService.selectList(new EntityWrapper<DocType>().eq("pakout", 1));
@@ -91,28 +94,30 @@
            docIds.add(pakin.getDocId());
        }
        EntityWrapper<Order> orderEntityWrapper = new EntityWrapper<>();
        List<Order> orders = orderService.selectList(orderEntityWrapper.in("doc_type",docIds));
        List<Order> orders = orderService.selectList(orderEntityWrapper.in("doc_type", docIds));
        List<String> orderNos = new ArrayList<>();
        for (Order order : orders) {
            orderNos.add(order.getOrderNo());
        }
        wrapper.in("order_no",orderNos);
        wrapper.in("order_no", orderNos);
        return R.ok(orderDetlService.selectPage(new Page<>(curr, limit), wrapper));
    }
    @RequestMapping(value = "/orderDetl/pakout/list/authV193")
    @ManagerAuth
    public R pakoutList193(@RequestParam(defaultValue = "1")Integer curr,
                         @RequestParam(defaultValue = "10")Integer limit,
                         @RequestParam(required = false)String orderByField,
                         @RequestParam(required = false)String orderByType,
                         @RequestParam(required = false)Long docType,
                         @RequestParam Map<String, Object> param){
    public R pakoutList193(@RequestParam(defaultValue = "1") Integer curr,
                           @RequestParam(defaultValue = "10") Integer limit,
                           @RequestParam(required = false) String orderByField,
                           @RequestParam(required = false) String orderByType,
                           @RequestParam(required = false) Long docType,
                           @RequestParam Map<String, Object> param) {
        EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
        param.remove("docType");
        excludeTrash(param);
        convertLike(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        List<DocType> pakins = docTypeService.selectList(new EntityWrapper<DocType>().eq("pakout", 1));
@@ -133,13 +138,13 @@
        if (docIds.size() > 0) {
            if (docType > 0) {
                wrapper.in("source",docType);
                wrapper.in("source", docType);
            } else {
                wrapper.in("source",docIds);
                wrapper.in("source", docIds);
            }
        } else {
            wrapper.in("source",0);
            wrapper.in("source", 0);
        }
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        for (OrderDetl record : page.getRecords()) {
@@ -153,17 +158,19 @@
    @RequestMapping(value = "/orderDetl/pakout/list/authV3")
    @Synchronized
    @ManagerAuth
    public R pakoutList3(@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){
    public R pakoutList3(@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) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convertLike(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        List<DocType> pakins = docTypeService.selectList(new EntityWrapper<DocType>().eq("pakout", 1));
@@ -173,7 +180,7 @@
                docIds.add(pakin.getDocId());
            }
        }
        wrapper.in("source",docIds);
        wrapper.in("source", docIds);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        for (OrderDetl record : page.getRecords()) {
            Double sumAnfme = agvLocDetlService.getSumAnfme(record.getMatnr(), record.getThreeCode());
@@ -185,19 +192,21 @@
    }
    /*
    * 半成品加工单据
    * */
     * 半成品加工单据
     * */
    @RequestMapping(value = "/orderDetl/pakout/list/authV5")
    @ManagerAuth
    public R pakoutList5(@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){
    public R pakoutList5(@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<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convertLike(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        List<DocType> pakins = docTypeService.selectList(new EntityWrapper<DocType>().eq("pakout", 1));
@@ -207,8 +216,8 @@
                docIds.add(pakin.getDocId());
            }
        }
        wrapper.eq("process_sts",1);
        wrapper.in("source",docIds);
        wrapper.eq("process_sts", 1);
        wrapper.in("source", docIds);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        for (OrderDetl record : page.getRecords()) {
            Double sumAnfme = agvLocDetlService.getSumAnfmeProcess(record.getMatnr(), record.getThreeCode());
@@ -220,15 +229,17 @@
    @RequestMapping(value = "/orderDetl/pakout/list/authV4")
    @ManagerAuth
    public R pakoutList4(@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){
    public R pakoutList4(@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<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convertLike(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        List<DocType> pakins = docTypeService.selectList(new EntityWrapper<DocType>().eq("pakout", 1));
@@ -239,7 +250,7 @@
            }
        }
        wrapper.in("source",docIds);
        wrapper.in("source", docIds);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        for (OrderDetl record : page.getRecords()) {
            Double sumAnfme = agvLocDetlService.getSumAnfmeProcessed(record.getMatnr(), record.getThreeCode());
@@ -251,15 +262,17 @@
    @RequestMapping(value = "/orderDetl/pakout/list/authV6")
    @ManagerAuth
    public R pakoutList6(@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){
    public R pakoutList6(@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<OrderDetl> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convertLike(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        } else {
            wrapper.orderBy("create_time", false);
        }
        List<DocType> pakins = docTypeService.selectList(new EntityWrapper<DocType>().eq("pakout", 1));
@@ -270,7 +283,7 @@
            }
        }
        wrapper.in("source",docIds);
        wrapper.in("source", docIds);
        Page<OrderDetl> page = orderDetlService.selectPage(new Page<>(curr, limit), wrapper);
        for (OrderDetl record : page.getRecords()) {
            Double sumAnfme = agvLocDetlService.getSumAnfme(record.getMatnr(), record.getThreeCode());
@@ -280,23 +293,23 @@
        return R.ok(page);
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
    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)){
            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.eq(entry.getKey(), val);
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    private <T> void convertLike(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
    private <T> void convertLike(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)){
            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]));
@@ -313,10 +326,10 @@
        return R.ok();
    }
    @RequestMapping(value = "/orderDetl/update/auth")
    @ManagerAuth
    public R update(OrderDetl orderDetl){
        if (Cools.isEmpty(orderDetl) || null==orderDetl.getId()){
    @RequestMapping(value = "/orderDetl/update/auth")
    @ManagerAuth
    public R update(OrderDetl orderDetl) {
        if (Cools.isEmpty(orderDetl) || null == orderDetl.getId()) {
            return R.error("参数缺失");
        }
        orderDetlService.updateById(orderDetl);
@@ -325,8 +338,8 @@
    @RequestMapping(value = "/orderDetl/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
    public R delete(@RequestParam(value = "ids[]") Long[] ids) {
        for (Long id : ids) {
            orderDetlService.deleteById(id);
        }
        return R.ok();
@@ -334,7 +347,7 @@
    @RequestMapping(value = "/orderDetl/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
    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"));
@@ -350,7 +363,7 @@
        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()){
        for (OrderDetl orderDetl : page.getRecords()) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", orderDetl.getId());
            map.put("value", orderDetl.getId());
@@ -363,7 +376,7 @@
    @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)){
        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/OrderViewController.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.controller;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.R;
import com.zy.asrs.entity.OrderView;
import com.zy.asrs.entity.OrderViewParam;
import com.zy.asrs.mapper.OrderViewMapper;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j
@RestController
public class OrderViewController extends BaseController {
    @Autowired
    private OrderViewMapper orderViewMapper;
    @RequestMapping(value = "/orderView/list/auth")
    @ManagerAuth
    public R navList(OrderViewParam bean) {
        List<OrderView> orderViews = orderViewMapper.selectOrderView(bean);
        int count = orderViewMapper.countOrderView(bean);
        Page<OrderView> page = new Page<>();
        page.setRecords(orderViews);
        page.setTotal(count);
        return R.ok(page);
    }
}
src/main/java/com/zy/asrs/entity/OrderView.java
New file
@@ -0,0 +1,542 @@
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("agv_order_view")
public class OrderView 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;
    /**
     * setMemo
     */
    @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;
    @ApiModelProperty(value = "erp仓库编码")
    @TableField("plt_type")
    private Integer pltType;
    /**
     * 入库日期
     */
    @ApiModelProperty(value = "入库日期")
    @TableField("in_time")
    private String inTime;
    @TableField("Upstreamcode")
    private String Upstreamcode;
    /**
     * 数量
     */
    @ApiModelProperty(value= "数量")
    private Double anfme;
    /**
     * 作业数量
     *
     *  1. 入库 : qty 👆
     *  1. 出库 : qty 👆
     */
    @ApiModelProperty(value= "作业数量")
    private Double qty;
    /**
     * 物料号
     */
    @ApiModelProperty(value= "物料号")
    private String matnr;
    /**
     * 物料号
     */
    @ApiModelProperty(value= "物料号")
    private String maktx;
    /**
     * 三方编码
     */
    @ApiModelProperty(value= "三方编码")
    @TableField("three_code")
    private String threeCode;
    /**
     * 序列码
     */
    @ApiModelProperty(value= "序列码")
    private String batch;
    /**
     * 工序状态
     */
    @ApiModelProperty(value= "工序状态 1:待加工,2:已加工,3:无需加工")
    @TableField("process_sts")
    private Integer processSts;
    @TableField("report_qty")
    private Double reportQty;
    @TableField("dev_no")
    private String devNo;
    public OrderView() {
    }
    public OrderView(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$() {
        if (!Cools.isEmpty(this.createBy) && this.createBy == 9999L) {
            return "系统同步";
        }
        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 String getProcessSts$(){
        if (null == this.processSts){ return null; }
        switch (this.processSts){
            case 0:
                return "其他";
            case 1:
                return "待加工";
            case 2:
                return "已加工";
            case 3:
                return "无需加工";
            default:
                return String.valueOf(this.processSts);
        }
    }
}
src/main/java/com/zy/asrs/entity/OrderViewParam.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * 库存滞留时间实体类
 * @author admin
 * @date 2018年11月23日
 */
@Data
public class OrderViewParam implements Serializable {
    private int curr;
    private int limit;
    private String threeCode;
    @ApiModelProperty(value = "物料号")
    private String matnr;
    @ApiModelProperty(value = "物料名称")
    private String maktx;
    @ApiModelProperty(value = "单据编号")
    private String orderNo;
    private Long docType;
    private Long settle;
}
src/main/java/com/zy/asrs/mapper/OrderViewMapper.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.OrderView;
import com.zy.asrs.entity.OrderViewParam;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface OrderViewMapper extends BaseMapper<OrderView> {
    List<OrderView> selectOrderView(OrderViewParam bean);
    int countOrderView(OrderViewParam bean);
}
src/main/resources/mapper/OrderViewMapper.xml
New file
@@ -0,0 +1,93 @@
<?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.OrderViewMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.OrderView">
        <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"/>
        <result column="anfme" property="anfme"/>
        <result column="qty" property="qty"/>
        <result column="matnr" property="matnr"/>
        <result column="three_code" property="threeCode"/>
        <result column="maktx" property="maktx"/>
        <result column="batch" property="batch"/>
        <result column="process_sts" property="processSts"/>
        <result column="report_qty" property="reportQty"/>
        <result column="dev_no" property="devNo"/>
    </resultMap>
    <sql id="viewConditionSql">
        <if test="matnr!=null and matnr!='' ">
            and matnr like '%' + #{matnr} + '%'
        </if>
        <if test="maktx!=null and maktx!='' ">
            and maktx like '%' + #{maktx} + '%'
        </if>
        <if test="orderNo!=null and orderNo!='' ">
            and order_no like '%' + #{orderNo} + '%'
        </if>
        <if test="threeCode!=null and threeCode!='' ">
            and three_code like '%' + #{threeCode} + '%'
        </if>
        <if test="docType!=null  ">
            and doc_type = #{docType}
        </if>
        <if test="settle!=null ">
            and settle = #{settle}
        </if>
    </sql>
    <select id="selectOrderView" parameterType="com.zy.asrs.entity.OrderViewParam" resultMap="BaseResultMap">
        select * from ( select *,ROW_NUMBER() over (order by create_time desc) as row
        from agv_order_view aov
        where 1=1
        <include refid="viewConditionSql"></include>
        ) a
        where a.row between ((#{curr}-1)*#{limit}+1) and (#{curr}*#{limit})
    </select>
    <select id="countOrderView" parameterType="com.zy.asrs.entity.OrderViewParam" resultType="Integer">
        select count(1)
        from agv_order_view aov
        where 1=1
        <include refid="viewConditionSql"></include>
    </select>
</mapper>
src/main/webapp/static/js/orderDetl/orderDetl.js
@@ -21,29 +21,31 @@
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'id', align: 'center',title: 'ID'}
            ,{field: 'orderId$', align: 'center',title: '订单内码'}
            // {type: 'checkbox'}
            // ,{field: 'id', align: 'center',title: 'ID'}
            // ,{field: 'orderId$', align: 'center',title: '订单内码'}
            {field: 'orderNo', align: 'center',title: '订单编号', width: 100}
            ,{field: 'threeCode', align: 'center',title: '销售单号'}
            ,{field: 'anfme', align: 'center',title: '数量'}
            ,{field: 'qty', align: 'center',title: '作业数量'}
            ,{field: 'matnr', align: 'center',title: '物料号'}
            ,{field: 'maktx', align: 'center',title: '物料名称'}
            ,{field: 'name', align: 'center',title: '名称'}
            ,{field: 'specs', align: 'center',title: '规格'}
            ,{field: 'model', align: 'center',title: '通用型号'}
            ,{field: 'batch', align: 'center',title: '序列码'}
            ,{field: 'unit', align: 'center',title: '单位'}
            ,{field: 'barcode', align: 'center',title: '商品条码'}
            ,{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: '备注'}
            // ,{field: 'name', align: 'center',title: '名称'}
            // ,{field: 'specs', align: 'center',title: '规格'}
            // ,{field: 'model', align: 'center',title: '通用型号'}
            ,{field: 'batch', align: 'center',title: '批次'}
            // ,{field: 'unit', align: 'center',title: '单位'}
            // ,{field: 'barcode', 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:120}
        ]],
src/main/webapp/static/js/orderView/orderView.js
New file
@@ -0,0 +1,736 @@
var insTbCount = 0;
var admin;
var insTb
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;
    admin = layui.admin;
    var xmSelect = layui.xmSelect;
    var layDate = layui.laydate;
    var laytpl = layui.laytpl;
    // 渲染搜索模板
    $.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})
            }
        }
    })
    // 渲染表格
    insTb = table.render({
        elem: '#order',
        url: baseUrl+'/orderView/list/auth',
        headers: {token: localStorage.getItem('token')},
        page: true,
        cellMinWidth: 100,
        cols: [[
            {type: 'numbers'},
            {field: 'defNumber', align: 'center', title: '操作系统号', hide: true, width: 100},
            {field: '操作单据', align: 'center', title: '操作单据', hide: true},
            {field: '操作类型', align: 'center', title: '操作类型', hide: true},
            {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            //{field: 'itemName', align: 'center', title: '核算主体'},
            {field: 'docType$', align: 'center', title: '单据类型'},
            {field: 'threeCode', align: 'center',title: '销售单号'},
            {field: 'anfme', align: 'center',title: '数量'},
            {field: 'qty', align: 'center',title: '作业数量'},
            {field: 'matnr', align: 'center',title: '物料号'},
            {field: 'maktx', align: 'center',title: '物料名称'},
            {field: 'processSts$', title: '工序'},
            {field: 'reportQty', align: 'center',title: '上报数量'},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 140, width: 140},
            //{field: 'defNumber', align: 'center', title: '业务类型'},
            //{field: 'postFee', align: 'center', title: '总数量',  minWidth: 130, width: 130},
            //{align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160},
            {field: 'orderTime', align: 'center',title: '单据日期'},
            //{field: 'shipCode', align: 'center',title: '制单人'},
            {field: 'createBy$', title: '创建人'},
            {field: 'createTime$', title: '创建时间'},
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {field: 'cstmrName', align: 'center',title: '供应商/客户编码', hide: true},
            {field: 'tel', align: 'center',title: '仓库', hide: true},
            {field: 'operMemb', align: 'center',title: '出入库类别', hide: true},
            {field: 'salesman', align: 'center',title: '部门', hide: true},
            {align: 'center', title: '操作', 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) {
            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();
    });
    // 导入销售单
    $("#importOrder").click(function () {
        $("#importExcel").trigger("click");
    });
     $("#orderCheckBtn").click(function () {
            $("#importExcel2").trigger("click");
        });
    // 工具条点击事件
    table.on('tool(order)', function (obj) {
        var data = obj.data;
        var layEvent = obj.event;
        if (layEvent === 'edit') {
            showEditModel(data);
        } else if (layEvent === 'wrkTrace') {
            showWrkTrace(data.id);
        } else if (layEvent === 'del') {
            doDel(data.id);
        } else if (layEvent === 'complete') {
            doModify(data.id, 4);
        } else if (layEvent === 'report'){
            doReport(data.id);
        } 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: '1100px',
                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+'/orderDetl/list/auth',
                        where: {
                            order_id: data.id
                        },
                        page: true,
                        cellMinWidth: 100,
                        cols: [[
                            {type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 140},
                            {field: 'maktx', title: '商品名称', width: 150},
                            {field: 'batch', title: '批号'},
                            {field: 'anfme', title: '数量'},
                            {field: 'qty', title: '作业数量', style: 'font-weight: bold'},
                            // {field: 'unit', title: '单位'},
                            // {
                            //     field: 'createTime$', title: '创建时间', sort: true, templet: function (d) {
                            //         return util.toDateString(d.createTime);
                            //     },  width: 180
                            // },
                            // {field: 'inQty', title: '已入库量'},
                            // {field: 'color', title: '颜色'},
                            //{field: 'specs', title: '规格型号'},
                            {field: 'unit', title: '计量单位'},
                            //{field: 'manu', title: '行号'},
                            {field: 'threeCode', title: '销售单号'},
                            //{field: 'deadTime', title: '自由项'},
                            {field: 'processSts$', title: '工序'},
                            //{field: 'specs', title: '规格'},
                            {field: 'reportQty', title: '上报数量'},
                            //{field: 'itemNum', 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: ''
                    });
                }
            });
        }
    });
    // 显示表单弹窗
    function showEditModel(expTpe) {
        admin.open({
            type: 1,
            title: (expTpe ? '修改' : '添加') + '单据',
            content: $('#editDialog').html(),
            area: '1600px',
            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;
                        }
                    }
                    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,
                    css: [ // 设置单元格样式
                        // 取消默认的溢出隐藏,并设置适当高度
                        '.layui-table-cell{height: 50px; line-height: 40px;}',
                        '.layui-table-cell .layui-colorpicker{width: 38px; height: 38px;}',
                        '.layui-table-cell select{height: 36px; padding: 0 5px;}'
                    ].join(''),
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 160},
                        {field: 'batch', title: '序列码', edit: true},
                        {field: 'specs', title: '规格'},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'threeCode', title: '销售订单号(修改)', style: 'color: blue;font-weight: bold', edit: 'text', minWidth: 110, width: 110},
                        {field: 'deadTime', title: '销售订单行号(修改)', style: 'color: blue;font-weight: bold', edit: 'text', minWidth: 110, width: 110},
                        {field: 'processSts', title: '工序', templet: function (d) {
                            var select = `<select class="layui-select" name="processSts" data-state=${d.processSts} lay-filter="processStsSelect" data-value=${d.processSts} id=${d.id}>
                                            <option value="">选择状态</option>
                                            <option value="1">待加工</option>
                                            <option value="2">已加工</option>
                                            <option value="3">无需加工</option>
                                        </select>`;
                            return select;
                            }},
                        // {field: 'inQty', 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,curr, count) {
                        $(layero).find('.layui-table-view').css('margin', '0');
                        $(".layui-table-body").css('overflow','visible');
                        $(".layui-table-box").css('overflow','visible');
                        $(".layui-table-view").css('overflow','visible');
                        var tableElem = this.elem.next('.layui-table-view');
                        count || tableElem.find('.layui-table-header').css('overflow', 'auto');
                        layui.each(tableElem.find('select[name="processSts"]'), function (index, item) {
                            var elem = $(item);
                            elem.val(elem.data('state')).parents('div.layui-table-cell').css('overflow', 'visible');
                        });
                        form.render();//刷新表单
                    },
                    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') {
                        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}});
                        });
                    }
                });
                // 工具条点击事件
                form.on('select(processStsSelect)', function (obj) {
                    console.log(obj)
                    var id = obj.elem.id
                    var val = obj.value
                    for (let item of xxDataList) {
                        if (item.id == id) {
                            item.processSts = val
                        }
                    }
                });
                // 明细数据修改
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = 0;
                    for (let k in xxDataList) {
                        if (obj.data.id === xxDataList[k].id)
                            index = k
                    }
                    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});
                                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 doReport(orderId) {
        layer.confirm('确定要上传单据吗?', {
            shade: .1,
            skin: 'layui-layer-admin'
        }, function (i) {
            layer.close(i);
            layer.load(2);
            $.ajax({
                url: baseUrl+"/order/report/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, 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,
                    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});
                    }
                }
            })
        });
    }
    // 任务追溯
    function showWrkTrace(orderId) {
        let loadIndex = layer.msg('请求中...', {icon: 16, shade: 0.01, time: false});
        $.ajax({
            url: baseUrl+"/order/wrk/trace/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {
                orderId: orderId
            },
            method: 'POST',
            success: function (res) {
                layer.close(loadIndex);
                if (res.code === 200){
                    laytpl(wrkTraceDialog.innerHTML).render(res.data, function (html) {
                        admin.open({
                            type: 1,
                            title: '任务追溯',
                            area: ['800px', '450px'],
                            shadeClose: true,
                            content: html,
                            success: function (layero, dIndex) {
                                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                                /** 统计图表 */
                                var traceCharts = echarts.init(document.getElementById('wrkTraceCharts'));
                                var traceOptions = {
                                    title: {
                                        text: '作业/总量', x: 'center', y: '38%',
                                        textStyle: {fontSize: 18, color: '#262626', fontWeight: 'normal'},
                                        subtextStyle: {fontSize: 36, color: '#10B4E8'},
                                        itemGap: 20
                                    },
                                    color: ['#10B4E8', '#E0E0E0', '#FF0000'],
                                    tooltip: {trigger: 'item'},
                                    series: [{name: '数量', type: 'pie', radius: ['75%', '80%'], label: {normal: {show: false}}}]
                                };
                                traceCharts.setOption(traceOptions);
                                // 赋值
                                traceCharts.setOption({
                                    title: {
                                        subtext: res.data.wrkQty+"/"+res.data.totalQty
                                    },
                                    series: [
                                        {
                                            data: [
                                                {name: '已作业', value: res.data.wrkQty},
                                                {name: '未作业', value: res.data.totalQty-res.data.wrkQty-res.data.lackQty},
                                                {name: '库存不足', value: res.data.lackQty},
                                            ]
                                        }
                                    ]
                                });
                            }
                        });
                    });
                } 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 upload(obj){
    if(!obj.files) {
        return;
    }
    var file = obj.files[0];
    admin.confirm('确认导入 [' + file.name +'] 文件吗?', function (index) {
        layer.load(1, {shade: [0.1,'#fff']});
        var url = baseUrl + "/order/excel/import/auth";
        var form = new FormData();
        form.append("file", file);
        let xhr = new XMLHttpRequest();
        xhr.open("post", url, true);
        xhr.setRequestHeader('token', localStorage.getItem('token'));
        xhr.onload = uploadComplete;
        xhr.onerror =  uploadFailed;
        xhr.onloadend = function () {
            layer.closeAll('loading');
        };
        // xhr.upload.onprogress = progressFunction;
        xhr.upload.onloadstart = function(){
            ot = new Date().getTime();
            oloaded = 0;
        };
        xhr.send(form);
    }, function(index){
    });
}
function uploadComplete(evt) {
    let res = JSON.parse(evt.target.responseText);
    if(res.code === 200) {
        layer.msg(res.msg, {icon: 1});
        insTb.reload({page: {curr: 1}});
    } else {
        alert(res.msg);
        // layer.msg(res.msg, {icon: 2});
    }
}
function uploadFailed(evt) {
    let res = JSON.parse(evt.target.responseText);
    alert(res.msg);
    // layer.msg(res.msg, {icon: 2});
}
function upload2(obj){
    if(!obj.files) {
        return;
    }
    var file = obj.files[0];
    admin.confirm('确认导入 [' + file.name +'] 文件吗?', function (index) {
            layer.load(1, {shade: [0.1,'#fff']});
            var url = baseUrl + "/order/excel/import2/auth";
            var form = new FormData();
            form.append("file", file);
            let xhr = new XMLHttpRequest();
            xhr.open("post", url, true);
            xhr.setRequestHeader('token', localStorage.getItem('token'));
            xhr.onload = uploadComplete;
            xhr.onerror =  uploadFailed;
            xhr.onloadend = function () {
                layer.closeAll('loading');
            };
            // xhr.upload.onprogress = progressFunction;
            xhr.upload.onloadstart = function(){
                ot = new Date().getTime();
                oloaded = 0;
            };
            xhr.send(form);
        }, function(index){
        });
}
function uploadComplete(evt) {
    let res = JSON.parse(evt.target.responseText);
    if(res.code === 200) {
        layer.msg(res.msg, {icon: 1});
        insTb.reload({page: {curr: 1}});
    } else {
        alert(res.msg);
        // layer.msg(res.msg, {icon: 2});
    }
}
function uploadFailed(evt) {
    let res = JSON.parse(evt.target.responseText);
    alert(res.msg);
    // layer.msg(res.msg, {icon: 2});
}
src/main/webapp/static/js/orderView/out.js
New file
@@ -0,0 +1,631 @@
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'], 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;
    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: '数量'}
            // ,{field: 'qty', align: 'center',title: '作业数量', style: 'font-weight: bold'}
            ,{field: 'enableQty', align: 'center',title: '待出数量', style: 'font-weight: bold'}
            ,{field: 'threeCode', align: 'center',title: '销售订单号'}
            ,{field: 'deadTime', 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) {
        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);
                if (res.code === 200){
                    pakoutPreviewDialog(res.data)
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                } else {
                    layer.msg(res.msg, {icon: 2})
                }
            }
        })
    }
    function pakoutPreviewDialog(data) {
        for(var i=0; i<data.length; i++){
            if(!data[i].staNos){
                data[i].staNos = data[i].agvStaNos;
                data[i].staNo = data[i].agvStaNo;
            }
        }
        var tableCache;
        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){
                stoPreTabIdx = table.render({
                    elem: '#stoPreTab',
                    data: 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: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold', edit:true},
                        {field: 'locNo', title: '货位', align: 'center', templet: '#locNoTpl'},
                        {field: 'staNos', align: 'center', title: '出库站', merge: ['locNo'], templet: '#tbBasicTbStaNos'},
                        // {type: 'checkbox', merge: ['locNo']},
                    ]],
                    //cols: getCol(data),
                    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);
                            tableCache[i]['staNo'] = obj.elem.value;
                        }
                    }
                    obj.othis.children().find("input").css("color", "blue");
                    return false;
                });
                // 批量修改出库站
                form.on('submit(batchModifySta)', function () {
                    modifySta();
                });
                // 批量修改出库站 - 站点选择
                function modifySta() {
                    // 出库站取交集
                    let staBatchSelectVal = [];
                    for(let i = 0; i<tableCache.length; i++) {
                        let staNos = tableCache[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 batchSta = obj.field.batchSta;
                                let arr = [];
                                for (let i = 0; i<tableCache.length; i++) {
                                    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);
            }
            ,btn2: function(index, layero){
                //按钮【稍后处理】的回调
                layer.close(index)
                //return false 开启该代码可禁止点击该按钮关闭
            }
        });
    }
    function pakout(tableCache, layerIndex) {
        // let loadIndex = layer.load(2);
        for(var i=0; i<tableCache.length; i++){
            if(tableCache[i].agvStaNos){
                tableCache[i].agvStaNo = tableCache[i].staNo;
                tableCache[i].staNos = null;
                tableCache[i].staNo = null;
            }
        }
        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 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;
    // ----------------------------------------------------------------------------------------------------------------------------------
    // 合并出库
    form.on('submit(mergeOut)', function (data) {
        let checkStatus = layui.table.checkStatus('originTable').data;
        if (checkStatus.length < 2) {
            layer.msg("请至少选择两条以上合并数据", {icon: 7});
            return false;
        }
        showMerge(checkStatus.map(function (d) {
            return d.id;
        }));
    });
    // 订单合并窗口
    function showMerge(orderIds) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl+"/order/merge/preview/auth",
            headers: {'token': localStorage.getItem('token')},
            method: 'GET',
            data: {
                orderIds: orderIds
            },
            success: function (res) {
                layer.close(loadIndex);
                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: $('#mergeDialog').html()
                        , success: function (layero, index) {
                            orderMergeTabIdx = table.render({
                                elem: '#orderMergeTab',
                                data: res.data,
                                height: 550,
                                page: false,
                                limit: Number.MAX_VALUE,
                                cellMinWidth: 100,
                                cols: [[
                                    {type: 'checkbox'},
                                    {field: 'matnr', title: '物料号', align: 'center', width: 350},
                                    {field: 'maktx', title: '物料名称', align: 'center'},
                                    {field: 'specs', title: '规格', align: 'center'},
                                    {field: 'batch', title: '批号', align: 'center'},
                                    {field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'},
                                ]],
                                done: function (res) {
                                    $('.layui-table-body.layui-table-main').css("overflow", "auto");
                                }
                            });
                        }
                        , yes: function (index, layero) {
                            //按钮【确定】的回调
                            let checkStatus = layui.table.checkStatus('orderMergeTab').data;
                            if (checkStatus.length < 1) {
                                layer.msg("请至少选择一条数据", {icon: 7});
                                return false;
                            }
                            let loadIndex = layer.load(2);
                            $.ajax({
                                url: baseUrl + "/out/pakout/preview/merge/auth",
                                headers: {'token': localStorage.getItem('token')},
                                contentType: 'application/json;charset=UTF-8',
                                data: JSON.stringify(checkStatus),
                                method: 'POST',
                                success: function (res) {
                                    layer.close(loadIndex);
                                    if (res.code === 200){
                                        layer.close(index)
                                        pakoutPreviewMergeDialog(res.data)
                                    } else if (res.code === 403){
                                        top.location.href = baseUrl+"/";
                                    } else {
                                        layer.msg(res.msg, {icon: 2})
                                    }
                                }
                            })
                        }
                        , 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 pakoutPreviewMergeDialog(data) {
        for(var i=0; i<data.length; i++){
            if(!data[i].staNos){
                data[i].staNos = data[i].agvStaNos;
                data[i].staNo = data[i].agvStaNo;
            }
        }
        var mergeTabCache;
        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: $('#pakoutPreviewMergeBox').html()
            ,success: function(layero, index){
                stoPreTabMergeIdx = table.render({
                    elem: '#stoPreTabMerge',
                    data: data,
                    height: 520,
                    page: false,
                    limit: Number.MAX_VALUE,
                    cellMinWidth: 100,
                    cols: [[
                        // {type: 'checkbox', merge: ['orderNo']},
                        {field: 'title', title: '商品', merge: true, align: 'center', width: 350},
                        {field: 'specs', title: '规格', align: 'center'},
                        {field: 'batch', title: '序列码', align: 'center'},
                        {field: 'anfme', title: '数量', align: 'center', width: 90, style: 'font-weight: bold'},
                        {field: 'locNo', title: '货位', align: 'center', 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");
                        mergeTabCache = table.cache.stoPreTabMerge;
                    }
                });
                // 修改出库站
                form.on('select(tbBasicTbStaNos)', function (obj) {
                    let index  = obj.othis.parents('tr').attr("data-index");
                    let data = mergeTabCache[index];
                    for (let i = 0; i<mergeTabCache.length; i++) {
                        if (mergeTabCache[i].locNo === data.locNo) {
                            //mergeTabCache[i]['staNo'] = Number(obj.elem.value);
                            mergeTabCache[i]['staNo'] = obj.elem.value;
                        }
                    }
                    obj.othis.children().find("input").css("color", "blue");
                    return false;
                });
                // 批量修改出库站
                form.on('submit(batchModifySta)', function () {
                    modifySta();
                });
                // 批量修改出库站 - 站点选择
                function modifySta() {
                    // 出库站取交集
                    let staBatchSelectVal = [];
                    for(let i = 0; i<mergeTabCache.length; i++) {
                        let staNos = mergeTabCache[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 batchSta = obj.field.batchSta;
                                let arr = [];
                                for (let i = 0; i<mergeTabCache.length; i++) {
                                    mergeTabCache[i]['staNo'] = batchSta;
                                    arr.push(i);
                                }
                                console.log(mergeTabCache)
                                stoPreTabMergeIdx.reload({data: mergeTabCache});
                                arr.forEach(item => {
                                    $('div[lay-id=stoPreTabMerge] tr[data-index="' + item + '"] .order-sta-select').val(batchSta);
                                });
                                layui.form.render('select');
                                arr.forEach(item => {
                                    $('div[lay-id=stoPreTabMerge] 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(mergeTabCache, index);
            }
            ,btn2: function(index, layero){
                //按钮【稍后处理】的回调
                layer.close(index)
                //return false 开启该代码可禁止点击该按钮关闭
            }
        });
    }
});
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/views/orderDetl/orderDetl.html
@@ -17,10 +17,30 @@
        <div class="layui-card-body">
            <div class="layui-form toolbar" id="search-box">
                <div class="layui-form-item">
<!--                    <div class="layui-inline">-->
<!--                        <label class="layui-form-label">编号:</label>-->
<!--                        <div class="layui-input-inline">-->
<!--                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">-->
<!--                        </div>-->
<!--                    </div>-->
                    <div class="layui-inline">
                        <label class="layui-form-label">编号:</label>
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="id" placeholder="编号" autocomplete="off">
                        <div class="layui-input-inline mr0">
                            <input name="order_no" class="layui-input" type="text" placeholder="输入主订单号"/>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="three_code" class="layui-input" type="text" placeholder="输入销售单号"/>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="matnr" class="layui-input" type="text" placeholder="输入物料编号"/>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="maktx" class="layui-input" type="text" placeholder="输入物料名称"/>
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
@@ -40,9 +60,9 @@
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
<!--        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>-->
<!--        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>-->
<!--        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>-->
    </div>
</script>
@@ -55,7 +75,7 @@
<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/orderDetl/orderDetl.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/orderDetl/orderDetl.js?v=1" charset="utf-8"></script>
</body>
<!-- 表单弹窗 -->
<script type="text/html" id="editDialog">
@@ -63,18 +83,18 @@
        <input name="id" type="hidden">
        <div class="layui-row">
            <div class="layui-col-md12">
                <div class="layui-form-item">
                    <label class="layui-form-label">订单内码: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="orderId" placeholder="请输入订单内码" style="display: none">
                        <input id="orderId$" 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="orderQueryByorderId" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="orderQueryByorderIdSelect" 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 cool-auto-complete">-->
<!--                        <input class="layui-input" name="orderId" placeholder="请输入订单内码" style="display: none">-->
<!--                        <input id="orderId$" 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="orderQueryByorderId" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="orderQueryByorderIdSelect" 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">
@@ -93,26 +113,26 @@
                        <input class="layui-input" name="maktx" placeholder="请输入商品名称">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">名称: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="name" placeholder="请输入名称">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">规格: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="specs" placeholder="请输入规格">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">名称: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="name" placeholder="请输入名称">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">规格: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="specs" placeholder="请输入规格">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">批次: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="model" placeholder="请输入型号">-->
<!--                    </div>-->
<!--                </div>-->
                <div class="layui-form-item">
                    <label class="layui-form-label">批次: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="model" placeholder="请输入型号">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">序列码: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="batch" placeholder="请输入序列码">
                    </div>
@@ -123,94 +143,94 @@
                        <input class="layui-input" name="unit" placeholder="请输入单位">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">商品条码: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="barcode" placeholder="请输入商品条码">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">供应商: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="supplier" placeholder="请输入供应商">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">单价: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="unitPrice" placeholder="请输入单价">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">品项数: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="itemNum" placeholder="请输入品项数">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">数量: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="count" placeholder="请输入数量">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">重量: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="weight" placeholder="请输入重量">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">状态: </label>
                    <div class="layui-input-block">
                        <select name="status">
                            <option value="">请选择状态</option>
                            <option value="1">正常</option>
                            <option value="0">禁用</option>
                        </select>
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">添加人员: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="createBy" placeholder="请输入添加人员" style="display: none">
                        <input id="createBy$" 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="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" 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 class="layui-input" name="barcode" placeholder="请输入商品条码">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">供应商: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="supplier" placeholder="请输入供应商">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">单价: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="unitPrice" placeholder="请输入单价">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">品项数: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="itemNum" placeholder="请输入品项数">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">数量: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="count" placeholder="请输入数量">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">重量: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="weight" placeholder="请输入重量">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">状态: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <select name="status">-->
<!--                            <option value="">请选择状态</option>-->
<!--                            <option value="1">正常</option>-->
<!--                            <option value="0">禁用</option>-->
<!--                        </select>-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">添加人员: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="createBy" placeholder="请输入添加人员" style="display: none">-->
<!--                        <input id="createBy$" 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="userQueryBycreateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryBycreateBySelect" 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 class="layui-input" name="createTime" id="createTime$" placeholder="请输入添加时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">修改人员: </label>
                    <div class="layui-input-block cool-auto-complete">
                        <input class="layui-input" name="updateBy" placeholder="请输入修改人员" style="display: none">
                        <input id="updateBy$" 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="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">
                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" 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 class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">
                    </div>
                </div>
                <div class="layui-form-item">
                    <label class="layui-form-label">备注: </label>
                    <div class="layui-input-block">
                        <input class="layui-input" name="memo" placeholder="请输入备注">
                    </div>
                </div>
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">修改人员: </label>-->
<!--                    <div class="layui-input-block cool-auto-complete">-->
<!--                        <input class="layui-input" name="updateBy" placeholder="请输入修改人员" style="display: none">-->
<!--                        <input id="updateBy$" 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="userQueryByupdateBy" onkeyup="autoLoad(this.getAttribute('data-key'))">-->
<!--                            <select class="cool-auto-complete-window-select" data-key="userQueryByupdateBySelect" 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 class="layui-input" name="updateTime" id="updateTime$" placeholder="请输入修改时间">-->
<!--                    </div>-->
<!--                </div>-->
<!--                <div class="layui-form-item">-->
<!--                    <label class="layui-form-label">备注: </label>-->
<!--                    <div class="layui-input-block">-->
<!--                        <input class="layui-input" name="memo" placeholder="请输入备注">-->
<!--                    </div>-->
<!--                </div>-->
             </div>
        </div>
src/main/webapp/views/orderView/orderView.html
New file
@@ -0,0 +1,343 @@
<!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>
        .wrk-trace {
            color: green;
            cursor: pointer;
            margin-left: 6px;
            font-size: 18px;
        }
        .layui-timeline:first-child .layui-timeline-item {
            margin-top: 30px;
        }
        .btn-add {
            display: none;
        }
        .btn-edit {
            display: none;
        }
        .btn-complete {
            display: none;
        }
        .btn-delete {
            display: none;
        }
        .btn-report {
            display: none;
        }
        td .layui-form-select {
            margin-top: -9px;
            margin-left: -14px;
            margin-right: -14px;
        }
    </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="orderNo" class="layui-input" type="text" placeholder="输入主订单号"/>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="threeCode" class="layui-input" type="text" placeholder="输入销售单号"/>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="matnr" class="layui-input" type="text" placeholder="输入物料编号"/>
                        </div>
                    </div>
                    <div class="layui-inline">
                        <div class="layui-input-inline mr0">
                            <input name="maktx" 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>
                        <button id="importOrder" class="layui-btn icon-btn btn-add">
                            <i class="layui-icon layui-icon-upload"></i>&nbsp;导入单据
                        </button>
                        <button id="orderCheckBtn" class="layui-btn icon-btn btn-add">
                            <i class="layui-icon">&#xe654;</i>添加
                        </button>
                        <input style="display:none" id="importExcel" type="file" onchange="upload(this)" >
                        <input style="display:none" id="importExcel2" type="file" onchange="upload2(this)" >
                    </div>
                </div>
            </div>
            <table id="order" lay-filter="order"></table>
        </div>
    </div>
    <div class="layui-card">
        <div class="layui-card-body">
            入库通知单:由ERP提供单据编号、类型、单据时间及物料明细,生成入库作业单,为维护系统高可用,用户可自行添加入库通知单数据,完成独立的入库作业。
            <span class="text-danger">手动添加时,请检查单据编号是否在ERP系统中已存在,避免发生数据错误问题。</span>
        </div>
    </div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="operate">
    {{# if (d.settle == 1 || d.settle == 2) { }}
        <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</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-danger layui-btn-xs btn-delete" lay-event="del">删除</a>
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-report" lay-event="report">上报</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"
          {{# 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/html" id="process">
</script>
<!-- 订单任务追溯 -->
<script id="wrkTraceDialog" type="text/html" style="position: relative">
    <div style="position: absolute; top: 0; left: 0;">
        <div class="layui-card" style="overflow: hidden;">
            <div class="layui-card-header" style="text-align: center;width: 80%;font-weight: inherit;font-size: 18px">{{ d.orderNo }}</div>
            <div class="layui-card-body">
                <div id="wrkTraceCharts" style="height: 300px;width: 400px;transform: translateX(-10%);"></div>
            </div>
        </div>
    </div>
    <div class="layui-row" >
        <div class="layui-col-md5">
            <h1 style="opacity: 0;">Hello World</h1>
        </div>
        <div  class="layui-col-md7" style="">
            {{#  if(d.list.length > 0){ }}
            <ul class="layui-timeline" style="height: 400px; overflow: scroll;">
                {{#  layui.each(d.list, function(index, item){ }}
                <li class="layui-timeline-item">
                    <i class="layui-icon layui-timeline-axis">&#xe63f;</i>
                    <div class="layui-timeline-content layui-text">
                        <div class="layui-timeline-title">
                            <h3 class="inline-block">
                                {{ item.wrkNo }}&nbsp;
                                {{#  if(item.wrkMast.ioType < 100){ }}
                                <span class="layui-badge layui-bg-blue" style="line-height: 20px;">
                                 {{ item.wrkMast.ioType$ }}&nbsp;
                                </span>
                                {{#  } }}
                                {{#  if(item.wrkMast.ioType > 100){ }}
                                <span class="layui-badge layui-bg-orange" style="line-height: 20px;">
                                  {{ item.wrkMast.ioType$ }}&nbsp;
                                </span>
                                {{#  } }}
                                {{#  if(item.wrkMast.wrkSts < 14){ }}
                                <span class="layui-badge layui-bg-red" style="line-height: 20px;">
                                    {{ item.wrkMast.wrkSts$ }}&nbsp;
                                </span>
                                {{#  } }}
                                {{#  if(item.wrkMast.wrkSts >= 14){ }}
                                <span class="layui-badge layui-bg-green" style="line-height: 20px;">
                                    {{ item.wrkMast.wrkSts$ }}&nbsp;
                                </span>
                                {{#  } }}
                            </h3>&emsp;
                            {{ item.wrkMast.ioTime$ }}
                        </div>
                        <table class="layui-table" lay-skin="nob" style="width: 80%">
                            <thead>
                            <tr style="background: none">
                                <td>No.</td>
                                <td>物料号</td>
                                <td>数量</td>
                            </tr>
                            </thead>
                            <tbody>
                            {{#  layui.each(item.wrkDetls, function(idx, wrkDetl){ }}
                            <tr>
                                <td><span class="layui-badge layui-bg-cyan">{{ idx+1 }}</span></td>
                                <td>{{ wrkDetl.matnr }}</td>
                                <td style="font-weight: bold">{{ wrkDetl.anfme }}</td>
                            </tr>
                            {{#  }); }}
                            </tbody>
                        </table>
                        <hr class="layui-border-cyan" style="width: 90%; opacity: .6;">
                    </div>
                </li>
                {{#  }); }}
            </ul>
            {{#  } else { }}
            <div style="height: 350px;display: flex;justify-content: center;align-items: center;">
                <h2 style="font-weight: bold;letter-spacing: 2px">暂无任务</h2>
            </div>
            {{#  } }}
        </div>
    </div>
</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/echarts/echarts.min.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/orderView/orderView.js?v=8" charset="utf-8"></script>
<script type="text/template" id="docTypeTpl">
    <option value="">选择类型</option>
    {{#each records}}
    <option value="{{docId}}">{{docName}}</option>
    {{/each}}
</script>
</body>
</html>
src/main/webapp/views/orderView/outView.html
New file
@@ -0,0 +1,333 @@
<!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;margin-bottom: 5px">
                                <input name="orderNo" class="layui-input" placeholder="输入单据编号" autocomplete="off"/>
                            </div>
                            <div class="layui-inline" style="margin-bottom: 5px">
                                <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>
                    <button style="margin-bottom: 5px;line-height: 28px;height: 28px" class="layui-btn icon-btn layui-btn-danger" lay-filter="mergeOut" lay-submit>
                        <i class="layui-icon">&#xe656;</i>&nbsp;合并出库
                    </button>
                    <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">
        <button class="layui-btn layui-btn-sm layui-btn-danger btn-pakoutPreview" id="btn-pakoutPreview" lay-event="pakoutPreview">批量出库</button>
    </div>
</script>
<!-- 行工具栏 -->
<script type="text/html" id="operate">
    {{#if (d.anfme > d.qty){ }}
        <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="mergeDialog">
    <div style="padding: 25px; line-height: 22px; background-color: #1E9FFF; 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="orderMergeTab" lay-filter="orderMergeTab"></table>
        </div>
    </div>
</script>
<!-- 出库预览 【合并】 -->
<script type="text/html" id="pakoutPreviewMergeBox" 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="stoPreTabMerge" lay-filter="stoPreTabMerge"></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">
        <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/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/orderView/outView.js" charset="utf-8"></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>