自动化立体仓库 - WMS系统
野心家
2023-02-24 74de2a0aca74f427b529833a25a655556522be17
修改logo
5个文件已修改
10个文件已添加
2021 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/ManPakOutController.java 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MatController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ManPakOut.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ManPakOutMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/ManPakOutService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/ManPakOutServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 94 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ManPakOutMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/picking/picking.js 247 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/picking/pickingOrder.js 495 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/order.html 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/picking/picking.html 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/picking/pickingOrder.html 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ManPakOutController.java
New file
@@ -0,0 +1,398 @@
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;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.OrderDomainParam;
import com.zy.asrs.service.*;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@RestController
public class ManPakOutController extends BaseController {
    @Autowired
    private ManPakOutService manPakOutService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private ManLocDetlService manLocDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private DocTypeService docTypeService;
    @RequestMapping(value = "/ManPakOut/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
        EntityWrapper<ManPakOut> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
            wrapper.orderBy("create_time",false);
        }
        return R.ok(manPakOutService.selectPage(new Page<>(curr, limit), wrapper));
    }
    @RequestMapping(value = "/ManPakOut/detailed/auth")
    @ManagerAuth
    public R detailed(@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<ManPakOut> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));} else {
            wrapper.orderBy("create_time",false);
        }
        wrapper.isNotNull("name");
        Page<ManPakOut> manPakOutPage = manPakOutService.selectPage(new Page<>(curr, limit), wrapper);
        return R.ok(manPakOutPage);
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
            }
        }
    }
    @RequestMapping(value = "/ManPakOut/add/auth")
    @ManagerAuth(memo = "生成拣货单")
    @Transactional
    public R manPakOutAdd(@RequestBody OrderDomainParam param){
        if (Cools.isEmpty(param)){
            return R.error("数据异常");
        }
        if (!Cools.isEmpty(param.getOrderNo())){
            Order order = orderService.selectOne(new EntityWrapper<Order>()
                    .eq("order_no", param.getOrderNo())
            );
            if (Cools.isEmpty(order)){
                return R.error("单据不存在");
            }
            List<OrderDetl> orderDetls =orderDetlService.selectList(new EntityWrapper<OrderDetl>()
                    .eq("order_no", param.getOrderNo())
            );
            if (Cools.isEmpty(orderDetls)){
                return R.error("单据明细为空");
            }
            for (OrderDetl orderDetl : orderDetls){
                List<ManLocDetl> manLocDetls=null;
                try{
                    if (Cools.isEmpty(orderDetl.getBatch())){
                        manLocDetls = manLocDetlService.selectList(new EntityWrapper<ManLocDetl>()
                                .eq("matnr",orderDetl.getMatnr())
                        );
                    }else {
                        manLocDetls = manLocDetlService.selectList(new EntityWrapper<ManLocDetl>()
                                .eq("matnr",orderDetl.getMatnr())
                                .eq("batch",orderDetl.getBatch())
                        );
                    }
                }catch (Exception e){
                    return R.error("添加拣货单失败");
                }
                if (!Cools.isEmpty(manLocDetls)){
                    for (ManLocDetl manLocDetl:manLocDetls){
                        Double statusAnfme = 0.0;
                        if (Cools.isEmpty(manLocDetl.getStatus())){
                            manLocDetl.setStatus(1);
                        }
                        try{
                            if (manLocDetl.getStatus$().equals("禁用")){
                                if (Cools.isEmpty(manLocDetl.getBatch())){
                                    List<ManPakOut> manPakOuts = manPakOutService.selectList(new EntityWrapper<ManPakOut>()
                                            .eq("loc_no", manLocDetl.getLocNo())
                                            .eq("matnr", manLocDetl.getMatnr())
                                            .eq("status",0)
                                    );
                                    if (!Cools.isEmpty(manPakOuts)){
                                        for (ManPakOut manPakOut:manPakOuts){
                                            statusAnfme=statusAnfme+manPakOut.getAnfme();
                                        }
                                    }
                                }else {
                                    List<ManPakOut> manPakOuts = manPakOutService.selectList(new EntityWrapper<ManPakOut>()
                                            .eq("loc_no", manLocDetl.getLocNo())
                                            .eq("matnr", manLocDetl.getMatnr())
                                            .eq("batch",manLocDetl.getBatch())
                                            .eq("status",0)
                                    );
                                    if (!Cools.isEmpty(manPakOuts)){
                                        for (ManPakOut manPakOut:manPakOuts){
                                            statusAnfme=statusAnfme+manPakOut.getAnfme();
                                        }
                                    }
                                }
                            }
                        }catch (Exception e){
                            return R.error("查询库存禁用数量失败");
                        }
                        Wrapper<ManLocDetl> wrapper = new EntityWrapper<ManLocDetl>()
                                .eq("loc_no", manLocDetl.getLocNo())
                                .eq("matnr", manLocDetl.getMatnr());
                        if (orderDetl.getAnfme() > manLocDetl.getAnfme()-statusAnfme){
                            if (addPakOUT(manLocDetl,param.getOrderNo()).equals(R.ok())){
                                manLocDetl.setStatus(0);
                                try{
                                    if (Cools.isEmpty(manLocDetl.getBatch())){
                                        manLocDetlService.update(manLocDetl,wrapper.eq("modi_time",manLocDetl.getModiTime()));
                                    }else {
                                        manLocDetlService.update(manLocDetl,wrapper.eq("batch",manLocDetl.getBatch()));
                                    }
                                }catch (Exception e){
                                    return R.error("更新库存失败");
                                }
                                orderDetl.setAnfme(orderDetl.getAnfme()-manLocDetl.getAnfme());
                            }else {
                                return R.error("添加拣货单失败");
                            }
                        }else if (orderDetl.getAnfme()-manLocDetl.getAnfme()-statusAnfme==0){
                            if (addPakOUT(manLocDetl,param.getOrderNo()).equals(R.ok())){
                                manLocDetl.setStatus(0);
                                try{
                                    if (Cools.isEmpty(manLocDetl.getBatch())){
                                        manLocDetlService.update(manLocDetl,wrapper.eq("modi_time",manLocDetl.getModiTime()));
                                    }else {
                                        manLocDetlService.update(manLocDetl,wrapper.eq("batch",manLocDetl.getBatch()));
                                    }
                                }catch (Exception e){
                                    return R.error("更新库存失败");
                                }
                                orderDetl.setAnfme(orderDetl.getAnfme()-manLocDetl.getAnfme());
                            }else {
                                return R.error("添加拣货单失败");
                            }
                        }else if (orderDetl.getAnfme()<manLocDetl.getAnfme()-statusAnfme){
                            Double a=manLocDetl.getAnfme();
                            manLocDetl.setAnfme(orderDetl.getAnfme());
                            if (addPakOUT(manLocDetl,param.getOrderNo()).equals(R.ok())){
                                orderDetl.setAnfme(orderDetl.getAnfme()-manLocDetl.getAnfme());
                                manLocDetl.setStatus(0);
                                manLocDetl.setAnfme(a);
                                try{
                                    if (Cools.isEmpty(manLocDetl.getBatch())){
                                        manLocDetlService.update(manLocDetl,wrapper.eq("modi_time",manLocDetl.getModiTime()));
                                    }else {
                                        manLocDetlService.update(manLocDetl,wrapper.eq("batch",manLocDetl.getBatch()));
                                    }
                                }catch (Exception e){
                                    return R.error("更新库存失败");
                                }
                            }else {
                                return R.error("添加拣货单失败");
                            }
                        }else {
                            return R.error("系统出错,请联系管理员");
                        }
                        if (orderDetl.getAnfme()==0){
                            break;
                        }
                    }
                    if (orderDetl.getAnfme()!=0){
                        ManLocDetl manLocDetl=new ManLocDetl();
                        manLocDetl.setAnfme(0.0);
                        manLocDetl.setMatnr(orderDetl.getMatnr());
                        manLocDetl.setMaktx(orderDetl.getMaktx());
                        manLocDetl.setMemo(orderDetl.getMemo()+"库存不足");
                        if (addPakOUT(manLocDetl,param.getOrderNo()).equals(R.ok())){
                            continue;
                        }else {
                            return R.error("添加拣货单失败");
                        }
                    }
                }else {
                    ManLocDetl manLocDetl=new ManLocDetl();
                    manLocDetl.setAnfme(0.0);
                    manLocDetl.setMatnr(orderDetl.getMatnr());
                    manLocDetl.setMaktx(orderDetl.getMaktx());
                    manLocDetl.setMemo(orderDetl.getMemo()+"无库存");
                    if (addPakOUT(manLocDetl,param.getOrderNo()).equals(R.ok())){
                        continue;
                    }else {
                        return R.error("添加拣货单失败");
                    }
                }
            }
            orderService.updateSettle(order.getId(),(long)2,null);
        }else {
            return R.error("单据编号异常");
        }
        return R.ok("拣货单添加成功");
    }
    private R addPakOUT(ManLocDetl manLocDetl,String OrderNo){
        ManPakOut manPakOut=new ManPakOut();
        manPakOut.setWrkNo(OrderNo+"-"+System.currentTimeMillis());
        manPakOut.setWrkSts((long)1);
        manPakOut.setAnfme(manLocDetl.getAnfme());
        manPakOut.setLocNo(manLocDetl.getLocNo());
        manPakOut.setNodeId(manLocDetl.getNodeId());
        manPakOut.setMatnr(manLocDetl.getMatnr());
        manPakOut.setMaktx(manLocDetl.getMaktx());
        manPakOut.setSpecs(manLocDetl.getSpecs());
        manPakOut.setUnit(manLocDetl.getUnit());
        manPakOut.setBarcode(manLocDetl.getBarcode());
        manPakOut.setDocNum(OrderNo);
        manPakOut.setStatus(0);
        manPakOut.setCreateTime(new Date());
        if (!Cools.isEmpty(manLocDetl.getBatch())){
            manPakOut.setBatch(manLocDetl.getBatch());
            manPakOut.setUpdateTime(new Date());
        }else {
            manPakOut.setUpdateTime(manLocDetl.getModiTime());//用于识别货物
        }
        manPakOut.setMemo(manLocDetl.getMemo());
        if (Cools.isEmpty(manPakOutService.selectOne(new EntityWrapper<ManPakOut>().eq("doc_num",OrderNo)))){
            manPakOut.setName(manLocDetl.getMaktx());
        }
        try{
            if (!manPakOutService.insert(manPakOut)){
                return R.error("添加拣货明细失败,请联系管理员");
            }
        }catch (Exception e){
            return R.error("添加拣货明细失败,请联系管理员");
        }
        return R.ok();
    }
    @RequestMapping("/manPakOut/finish")
    public R finish(@RequestBody ManPakOut manPakOut){
        Wrapper<ManLocDetl> wrapper = new EntityWrapper<ManLocDetl>()
                .eq("loc_no", manPakOut.getLocNo())
                .eq("matnr", manPakOut.getMatnr());
        try{
            if (Cools.isEmpty(manPakOut.getBatch())){
                List<ManLocDetl> manLocDetls = manLocDetlService.selectList(wrapper);
                Double anfme=manPakOut.getAnfme();
                for (ManLocDetl manLocDetl:manLocDetls){
                    if (anfme<manLocDetl.getAnfme()){
                        manLocDetl.setAnfme(manLocDetl.getAnfme()-anfme);
                        manLocDetlService.update(manLocDetl,wrapper.eq("batch",manLocDetl.getBatch()));
                        anfme=0.0;
                    }else if (anfme>=manLocDetl.getAnfme()){
                        manLocDetlService.delete(wrapper.eq("batch",manLocDetl.getBatch()));
                        anfme=anfme-manLocDetl.getAnfme();
                    }
                    if (anfme==0.0){
                        break;
                    }
                }
            }else {
                ManLocDetl manLocDetl = manLocDetlService.selectOne(wrapper.eq("batch", manPakOut.getBatch()));
                if (manPakOut.getAnfme()<manLocDetl.getAnfme()){
                    manLocDetl.setAnfme(manLocDetl.getAnfme()-manPakOut.getAnfme());
                    manLocDetlService.update(manLocDetl,wrapper.eq("batch",manLocDetl.getBatch()));
                }else if (manPakOut.getAnfme()-manLocDetl.getAnfme()==0){
                    manLocDetlService.delete(wrapper.eq("batch",manLocDetl.getBatch()));
                }
            }
        }catch (Exception e){
            return R.error("更新库存数量失败");
        }
        ManPakOut out = Cools.isEmpty(manPakOut.getBatch())? manPakOutService.selectOne(new EntityWrapper<ManPakOut>()
                .eq("wrk_no", manPakOut.getWrkNo())
                .eq("matnr", manPakOut.getMatnr()))
                :manPakOutService.selectOne(new EntityWrapper<ManPakOut>()
                .eq("wrk_no", manPakOut.getWrkNo())
                .eq("matnr", manPakOut.getMatnr())
                .eq("batch",manPakOut.getBatch()));
        out.setWrkSts(manPakOut.getWrkSts());
        out.setZpallet(manPakOut.getZpallet());
        out.setAnfme(manPakOut.getAnfme());
        out.setNodeId(manPakOut.getNodeId());
        out.setLocNo(manPakOut.getLocNo());
        out.setMatnr(manPakOut.getMatnr());
        out.setMaktx(manPakOut.getMaktx());
        out.setBatch(manPakOut.getBatch());
        out.setStatus(manPakOut.getStatus());
        boolean update =Cools.isEmpty(manPakOut.getBatch())? manPakOutService.update(out, new EntityWrapper<ManPakOut>()
                .eq("wrk_no", manPakOut.getWrkNo())
                .eq("matnr", manPakOut.getMatnr()))
                :manPakOutService.update(out, new EntityWrapper<ManPakOut>()
                .eq("wrk_no", manPakOut.getWrkNo())
                .eq("matnr", manPakOut.getMatnr())
                .eq("batch",manPakOut.getBatch()));
        try {
            Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", manPakOut.getDocNum()));
            List<ManPakOut> pakOuts = manPakOutService.selectList(new EntityWrapper<ManPakOut>().eq("doc_num", order.getOrderNo()));
            if (Cools.isEmpty(pakOuts)){
                return R.error("查询拣货单明细失败");
            }else {
                Long settle = order.getSettle();
                for (ManPakOut pakOut:pakOuts){
                    if (pakOut.getStatus()==0 || pakOut.getStatus()==8){
                        order.setSettle(settle);
                        break;
                    }else {
                        order.setSettle(4L);
                    }
                }
            }
            orderService.updateSettle(order.getId(),order.getSettle(),(long)9527);
        }catch (Exception e){
            return R.error("更新订单状态失败");
        }
        return update? R.ok("更新成功") : R.error("更新失败");
    }
    @RequestMapping("/manPakOut/notIssued")
    public R notIssued(){
        List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 1L).or().eq("settle", 2L));
        List<Order> orders1=new ArrayList<Order>();
        try {
            for (Order order:orders){
                DocType docType = docTypeService.selectById(order.getDocType());
                if (docType.getPakout()==1){
                    orders1.add(order);
                }
            }
        }catch (Exception e){
            return R.error("获取订单状态失败");
        }
        return R.ok(orders1);
    }
    public static void main(String[] args) {
        ManPakOutService bean = SpringUtils.getBean(ManPakOutService.class);
        ManPakOut out = bean.selectOne(null);
        System.out.println("JSON.toJSONString(out) = " + JSON.toJSONString(out));
    }
}
src/main/java/com/zy/asrs/controller/MatController.java
@@ -10,11 +10,14 @@
import com.core.annotations.ManagerAuth;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.ManPakOut;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.MatPrint;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.result.KeyValueVo;
import com.zy.asrs.service.ManPakOutService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.utils.MatExcelListener;
import com.zy.common.CodeRes;
import com.zy.common.config.AdminInterceptor;
@@ -40,7 +43,11 @@
    @Autowired
    private MatService matService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private ManPakOutService manPakOutService;
    @RequestMapping(value = "/mat/auto/matnr/auth")
    public R autoMatnr(){
@@ -256,6 +263,40 @@
        return R.ok().add(res);
    }
    @RequestMapping(value = "/order/print/auth")
    @ManagerAuth(memo = "订单编码打印")
    public R orderPrint(@RequestParam(value = "param[]") String[] param) {
        if(Cools.isEmpty(param)) {
            return R.parse(CodeRes.EMPTY);
        }
        List<OrderDetl> res = new ArrayList<>();
        for (String orderNo : param){
            res = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no", orderNo));
        }
        return R.ok().add(res);
    }
    @RequestMapping(value = "/pakOut/print/auth")
    @ManagerAuth(memo = "拣货单编码打印")
    public R pakOutPrint(@RequestParam(value = "param[]") String[] param) {
        if(Cools.isEmpty(param)) {
            return R.parse(CodeRes.EMPTY);
        }
        List<ManPakOut> res = new ArrayList<>();
        for (String docNum : param){
            ManPakOut manPakOut = manPakOutService.selectOne(new EntityWrapper<ManPakOut>().eq("doc_num", docNum));
            res.add(manPakOut);
            break;
        }
        return R.ok().add(res);
    }
    @RequestMapping(value = "/pakOut/show")
    public R showQR(){
        List<ManPakOut> manPakOuts = manPakOutService.selectList(null);
        return R.ok(manPakOuts);
    }
    /*************************************** 数据相关 ***********************************************/
src/main/java/com/zy/asrs/entity/ManPakOut.java
New file
@@ -0,0 +1,220 @@
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 io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
@TableName("man_pakout")
public class ManPakOut {
    private static final long serialVersionUID = 1L;
    /**
     * 任务号
     */
    @ApiModelProperty(value= "任务号")
    @TableId(value = "wrk_no", type = IdType.INPUT)
    @TableField("wrk_no")
    private String wrkNo;
    /**
     * 工作状态
     */
    @ApiModelProperty(value= "工作状态")
    @TableField("wrk_sts")
    private Long wrkSts;
    /**
     * 托盘号
     */
    @ApiModelProperty(value= "托盘号")
    private String zpallet;
    /**
     * 出库数量
     */
    @ApiModelProperty(value= "出库数量")
    private Double anfme;
    /**
     * 关联货位
     */
    @ApiModelProperty(value= "关联货位")
    @TableField("node_id")
    private Long nodeId;
    /**
     * 货位
     */
    @ApiModelProperty(value= "货位")
    @TableField("loc_no")
    private String locNo;
    /**
     * 商品编码
     */
    @ApiModelProperty(value= "商品编码")
    private String matnr;
    /**
     * 商品名称
     */
    @ApiModelProperty(value= "商品名称")
    private String maktx;
    /**
     * 名称
     */
    @ApiModelProperty(value= "名称")
    private String name;
    /**
     * 规格
     */
    @ApiModelProperty(value= "规格")
    private String specs;
    /**
     * 型号
     */
    @ApiModelProperty(value= "型号")
    private String model;
    /**
     * 批号
     */
    @ApiModelProperty(value= "批号")
    private String batch;
    /**
     * 单位
     */
    @ApiModelProperty(value= "单位")
    private String unit;
    /**
     * 货物条码
     */
    @ApiModelProperty(value= "货物条码")
    private String barcode;
    /**
     * 单据类型
     */
    @ApiModelProperty(value= "单据类型")
    @TableField("doc_id")
    private Long docId;
    /**
     * 单据编号
     */
    @ApiModelProperty(value= "单据编号")
    @TableField("doc_num")
    private String docNum;
    /**
     * 客户名称
     */
    @ApiModelProperty(value= "客户名称")
    @TableField("cust_name")
    private String custName;
    /**
     * 品项数
     */
    @ApiModelProperty(value= "品项数")
    @TableField("item_num")
    private Integer itemNum;
    /**
     * 数量
     */
    @ApiModelProperty(value= "数量")
    private Integer count;
    /**
     * 重量
     */
    @ApiModelProperty(value= "重量")
    private Double weight;
    /**
     * 状态 1: 正常  0: 禁用
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    private Integer status;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    @TableField("create_by")
    private Long createBy;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @TableField("create_time")
    private Date createTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    @TableField("update_by")
    private Long updateBy;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @TableField("update_time")
    private Date updateTime;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "已出库";
            case 0:
                return "未出库";
            case 8:
                return "未完全出库";
            case 9:
                return "全部完成出库";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
}
src/main/java/com/zy/asrs/mapper/ManPakOutMapper.java
New file
@@ -0,0 +1,11 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.ManPakOut;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface ManPakOutMapper extends BaseMapper<ManPakOut> {
}
src/main/java/com/zy/asrs/service/ManPakOutService.java
New file
@@ -0,0 +1,7 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.ManPakOut;
public interface ManPakOutService extends IService<ManPakOut> {
}
src/main/java/com/zy/asrs/service/impl/ManPakOutServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.ManPakOut;
import com.zy.asrs.mapper.ManPakOutMapper;
import com.zy.asrs.service.ManPakOutService;
import org.springframework.stereotype.Service;
@Service("manPakOutService")
public class ManPakOutServiceImpl extends ServiceImpl<ManPakOutMapper, ManPakOut> implements ManPakOutService {
}
src/main/java/com/zy/common/service/CommonService.java
@@ -118,57 +118,57 @@
        // 目标库位
        LocMast locMast = null;
        // 靠近摆放规则 --- 同天同规格物料
        if (!Cools.isEmpty(matNos)) {
            List<String> locNos = locDetlService.getSameDetlToday(matNos.get(0), sRow, eRow);
            for (String locNo : locNos) {
                if (Utils.isShallowLoc(slaveProperties, locNo)) {
                    continue;
                }
                String shallowLocNo = Utils.getShallowLoc(slaveProperties, locNo);
                // 检测目标库位是否为空库位
                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
                    if (VersionUtils.locMoveCheckLocType(shallowLoc, locTypeDto)) {
                        if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
                            locMast = shallowLoc;
                            crnNo = locMast.getCrnNo();
                            break;
                        }
                    }
                }
            }
        }
        // 靠近摆放规则 --- 空托
        if (staDescId == 10) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow));
            if (locMasts.size() > 0) {
                for (LocMast loc : locMasts) {
                    if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) {
                        continue;
                    }
                    String shallowLocNo = Utils.getShallowLoc(slaveProperties,  loc.getLocNo());
                    // 检测目标库位是否为空库位
                    LocMast shallowLoc = locMastService.selectById(shallowLocNo);
                    if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
                        if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
                            locMast = shallowLoc;
                            crnNo = locMast.getCrnNo();
                            break;
                        }
                    }
                }
            }
        }
//        // 靠近摆放规则 --- 同天同规格物料
//        if (!Cools.isEmpty(matNos)) {
//            List<String> locNos = locDetlService.getSameDetlToday(matNos.get(0), sRow, eRow);
//            for (String locNo : locNos) {
//                if (Utils.isShallowLoc(slaveProperties, locNo)) {
//                    continue;
//                }
//                String shallowLocNo = Utils.getShallowLoc(slaveProperties, locNo);
//                // 检测目标库位是否为空库位
//                LocMast shallowLoc = locMastService.selectById(shallowLocNo);
//                if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
//                    if (VersionUtils.locMoveCheckLocType(shallowLoc, locTypeDto)) {
//                        if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
//                            locMast = shallowLoc;
//                            crnNo = locMast.getCrnNo();
//                            break;
//                        }
//                    }
//                }
//            }
//        }
//
//        // 靠近摆放规则 --- 空托
//        if (staDescId == 10) {
//            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "D").ge("row1", sRow).le("row1", eRow));
//            if (locMasts.size() > 0) {
//                for (LocMast loc : locMasts) {
//                    if (Utils.isShallowLoc(slaveProperties, loc.getLocNo())) {
//                        continue;
//                    }
//                    String shallowLocNo = Utils.getShallowLoc(slaveProperties,  loc.getLocNo());
//                    // 检测目标库位是否为空库位
//                    LocMast shallowLoc = locMastService.selectById(shallowLocNo);
//                    if (shallowLoc != null && shallowLoc.getLocSts().equals("O")) {
//                        if (basCrnpService.checkSiteError(shallowLoc.getCrnNo(), true)) {
//                            locMast = shallowLoc;
//                            crnNo = locMast.getCrnNo();
//                            break;
//                        }
//                    }
//                }
//            }
//        }
        // 如果没有相近物料,则按规则轮询货架
        if (null == locMast) {
            Shelves shelves = new Shelves(rowCount, crn_qty);
            int divides = (int) Arith.divides(1, curRow - 1, 4);
            curRow = (int) Arith.remainder(curRow, 4);
            int divides = (int) Arith.divides(1, curRow - 1, 2);
            curRow = (int) Arith.remainder(curRow, 2);
            if (curRow == 0) {
                curRow = 4;
                curRow = 2;
            }
            for (int i = 0; i < shelves.group; i ++) {
                curRow = shelves.start(curRow);
@@ -179,7 +179,7 @@
                crnNo1 = crnNo1 + divides*1;
                if (basCrnpService.checkSiteError(crnNo1, true)) {
                    crnNo = crnNo1;
                    curRow = curRow + divides*4;
                    curRow = curRow + divides*2;
                    break;
                }
            }
src/main/resources/application.yml
@@ -45,11 +45,11 @@
# 下位机配置
wcs-slave:
  # 双深
  doubleDeep: true
  doubleDeep: false
  # 双深库位排号
  doubleLocs: 1,4,5,8,9,12,13,16
  doubleLocs:
  # 一个堆垛机负责的货架排数
  groupCount: 4
  groupCount: 2
#erp
erp:
src/main/resources/mapper/ManPakOutMapper.xml
New file
@@ -0,0 +1,5 @@
<?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.ManPakOutMapper">
</mapper>
src/main/webapp/static/js/order/order.js
@@ -1,4 +1,5 @@
var insTbCount = 0;
var printMatCodeNos = [];
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['layer', 'form', 'table', 'util', 'admin', 'xmSelect', 'laydate'], function () {
@@ -41,13 +42,14 @@
        cellMinWidth: 100,
        cols: [[
            {type: 'numbers'},
            {field: 'orderNo', title: '单据编号'},
            // {field: 'orderNo', title: '单据编号', templet: '#orderNoTpl'},
            {field: 'orderNo', title: '单据编号',  minWidth: 160, width: 300},
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160, width: 160},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160},
            {field: 'createTime$', title: '创建时间', minWidth: 200, width: 200},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160, width: 160},
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {align: 'center', title: '操作', toolbar: '#operate', width: 180}
            {align: 'center', title: '操作', toolbar: '#operate'}
        ]],
        request: {
            pageName: 'curr',
@@ -93,6 +95,10 @@
            doDel(data.id);
        } else if (layEvent === 'complete') {
            doModify(data.id, data.orderNo, 4);
        } else if (layEvent === 'btnPrint') {
            btnPrint(data.id, data.orderNo, 4);
        } else if (layEvent === 'manPrint') {
            addPakOut(data.orderNo);
        } else if (layEvent === 'look') {
            var $a = $(obj.tr).find('a[lay-event="look"]');
            var offset = $a.offset();
@@ -157,8 +163,14 @@
                    });
                }
            });
        }else if (layEvent === 'wrkTrace'){
            showWrkTrace(data.id);
        }
    });
    function showWrkTrace(orderId) {
        console.log(orderId);
    }
    // 显示表单弹窗
    function showEditModel(expTpe) {
@@ -236,7 +248,7 @@
                        {field: 'batch', title: '批号', edit: true},
                        {field: 'specs', title: '规格'},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'qty', title: '作业数量',  minWidth: 100, width: 100},
                        // {field: 'workQty', title: '作业数量',  minWidth: 100, width: 100},
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
@@ -307,7 +319,7 @@
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                            if(obj.value < data.qty){
                            if(obj.value < data.workQty){
                                layer.msg("输入数量不能小于作业中数量", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
@@ -477,4 +489,70 @@
        ,type: 'datetime'
        ,range: true
    });
    // 生成拣货单
    function addPakOut(expTpe) {
        $.ajax({
            url: baseUrl+"/ManPakOut/add/auth",
            headers: {'token': localStorage.getItem('token')},
            data: JSON.stringify({
                docType: Number(20),
                orderNo: expTpe,
            }),
            contentType:'application/json;charset=UTF-8',
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    layer.msg("生成拣货单:ok");
                } else if (res.code === 403){
                    layer.msg("生成拣货单失败:403");
                }else {
                    layer.msg("生成拣货单失败:未知异常");
                }
            }
        })
    }
    // 打印
    function btnPrint(orderId, orderNo, settle) {
        console.log(orderId);
        console.log(orderNo);
        console.log(settle);
        printMatCodeNos.push(orderNo)
        var templateNo = 3;
        $.ajax({
            url: baseUrl+"/order/print/auth",
            headers: {'token': localStorage.getItem('token')},
            data: {param: printMatCodeNos},
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200){
                    layer.closeAll();
                    console.log(res);
                    for (let i=0;i<res.data.length;i++){
                        var templateDom = $("#templatePreview"+templateNo);
                        var className = templateDom.attr("class");
                        if (className === 'template-barcode') {
                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=1&param="+res.data[i].orderNo+
                                ";"+res.data[i].matnr+";"+res.data[i].batch;
                        } else {
                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=2&param="+res.data[i].orderNo+
                                ";"+res.data[i].matnr+";"+res.data[i].batch;
                        }
                    }
                    var tpl = templateDom.html();
                    var template = Handlebars.compile(tpl);
                    var html = template(res);
                    var box = $("#box");
                    box.html(html);box.show();
                    box.print({mediaPrint:true});
                    box.hide();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg)
                }
            }
        })
    }
});
src/main/webapp/static/js/picking/picking.js
New file
@@ -0,0 +1,247 @@
var pageCurr;
var printMatCodeNos = [];
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['table','laydate', 'form', 'admin', 'layer'], function(){
    var table = layui.table;
    var $ = layui.jquery;
    var layer = layui.layer;
    var layDate = layui.laydate;
    var form = layui.form;
    var admin = layui.admin;
    // 数据渲染
    tableIns = table.render({
        elem: '#saasLog',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/ManPakOut/detailed/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        // toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'wrkNo', align: 'center',title: 'id', hide:true}
            ,{field: 'docNum',title: '拣货单号' , templet: '#orderNoTpl'}
            ,{align: 'center', title: '二维码', toolbar: '#operate', width: 200 , hide:true}
            ,{align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160}
            ,{field: 'status$', align: 'center',title: '状态'}
            ,{field: 'custName', align: 'center',title: '客户名称', width: 160}
            ,{field: 'createTime$', align: 'center',title: '操作时间'}
        ]],
        request: {
            pageName: 'curr',
            pageSize: 'limit'
        },
        parseData: function (res) {
            console.log(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();
        }
    });
    // 监听排序事件
    table.on('sort(saasLog)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // 监听行工具事件
    table.on('tool(saasLog)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case "btnPrint":
                btnPrint(data.wrkNo, data.docNum, 4);
                break;
            case "wrkTrace":
                btnPrint(data.wrkNo, data.docNum, 4);
                break
            case "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: '1200px',
                    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+'/ManPakOut/list/auth',
                            where: {
                                doc_num: data.docNum
                            },
                            page: true,
                            cellMinWidth: 100,
                            cols: [[
                                {type: 'numbers'},
                                ,{field: 'id', align: 'center',title: 'id', hide:true}
                                ,{field: 'docNum', align: 'center',title: '拣货单号'}
                                ,{field: 'locNo', align: 'center',title: '库位'}
                                ,{field: 'matnr', align: 'center',title: '物料号'}
                                ,{field: 'maktx', align: 'center',title: '商品名称'}
                                ,{field: 'anfme', align: 'center',title: '数量'}
                                ,{field: 'createTime$', align: 'center',title: '操作时间'}
                                ,{field: 'status$', align: 'center',title: '状态'}
                                ,{field: 'memo', align: 'center',title: '备注'}
                                ,{field: 'createBy', align: 'center',title: '', hide:true}
                            ]],
                            request: {
                                pageName: 'curr',
                                pageSize: 'limit'
                            },
                            parseData: function (res) {
                                return {
                                    'code': res.code,
                                    'msg': res.msg,
                                    'count': res.data.total,
                                    'data': res.data.records
                                }
                            },
                            response: {
                                statusCode: 200
                            },
                            done: function () {
                                $(layero).find('.layui-table-view').css('margin', '0');
                            },
                            size: ''
                        });
                    }
                });
        }
    });
    // 搜索
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // 重置
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 时间选择器
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '#ioTime\\$',
                type: 'datetime',
                value: data!==undefined?data['ioTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
    // 打印
    function btnPrint(orderId, orderNo, settle) {
        printMatCodeNos.push(orderNo)
        var templateNo = 3;
        $.ajax({
            // url: baseUrl+"/pakOut/print/auth",
            url: baseUrl+"/pakOut/show",
            headers: {'token': localStorage.getItem('token')},
            // data: {param: printMatCodeNos},
            method: 'POST',
            async: false,
            success: function (res) {
                if (res.code === 200){
                    layer.closeAll();
                    for (let i=0;i<res.data.length;i++){
                        var templateDom = $("#templatePreview"+templateNo);
                        var className = templateDom.attr("class");
                        if (className === 'template-barcode') {
                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=1&param="+res.data[i].docNum;
                        } else {
                            res.data[i]["barcodeUrl"]=baseUrl+"/mac/code/auth?type=2&param="+res.data[i].docNum;
                        }
                    }
                    // var tpl = templateDom.html();
                    // var template = Handlebars.compile(tpl);
                    // var html = template(res);
                    // var box = $("#box");
                    // box.html(html);
                    // box.show();
                    var imgUrl;
                    // console.log(res.data[0]);
                    for (let i=0;i<res.data.length;i++){
                        if (res.data[i].docNum === orderNo){
                            imgUrl = res.data[i]["barcodeUrl"];
                        }
                    }
                    var img = '<img className="template-code template-qrcode" src='+imgUrl+' height="80%">'
                    layer.open({
                        type: 1,
                        title: "拣货单",
                        area: '150px',
                        content: img
                    })
                    // box.print({mediaPrint:true});
                    // box.hide();
                } else if (res.code === 403){
                    top.location.href = baseUrl+"/";
                }else {
                    layer.msg(res.msg)
                }
            }
        })
    }
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
     });
}
src/main/webapp/static/js/picking/pickingOrder.js
New file
@@ -0,0 +1,495 @@
var pageCurr;
layui.config({
    base: baseUrl + "/static/layui/lay/modules/"
}).use(['layer','table','laydate', 'form', 'admin', 'xmSelect'], 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 xmSelect = layui.xmSelect;
    // 数据渲染
    tableIns = table.render({
        elem: '#saasLog',
        headers: {token: localStorage.getItem('token')},
        url: baseUrl+'/order/picking/head/page/auth',
        page: true,
        limit: 15,
        limits: [15, 30, 50, 100, 200, 500],
        // toolbar: '#toolbar',
        cellMinWidth: 50,
        height: 'full-120',
        cols: [[
            {type: 'numbers'},
            {field: 'orderNo', title: '单据编号'},
            {field: 'docType$', align: 'center', title: '类型',  minWidth: 160, width: 160},
            {align: 'center', title: '明细', toolbar: '#tbLook', minWidth: 160, width: 160},
            {field: 'createTime$', title: '创建时间', minWidth: 200, width: 200},
            {field: 'settle$', align: 'center', title: '状态', templet: '#settleTpl',  minWidth: 160, width: 160},
            {field: 'memo', align: 'center',title: '备注', hide: true},
            {align: 'center', title: '操作', toolbar: '#operate', width: 380}
        ]],
        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();
        }
    });
    // 监听排序事件
    table.on('sort(saasLog)', function (obj) {
        var searchData = {};
        $.each($('#search-box [name]').serializeArray(), function() {
            searchData[this.name] = this.value;
        });
        searchData['orderByField'] = obj.field;
        searchData['orderByType'] = obj.type;
        tableIns.reload({
            where: searchData,
            page: {curr: 1}
        });
    });
    // 监听行工具事件
    table.on('tool(saasLog)', function(obj){
        var data = obj.data;
        switch (obj.event) {
            case "edit":
                console.log("修改");
                showEditModel(data);
                break;
            case "del":
                console.log("删除");
                doDel(data.id);
                break;
            case "complete":
                console.log("完结");
                break;
            case "btnPrint":
                console.log("打印");
                break;
            case "manPrint":
                addPakOut(data.orderNo);
                break;
            case "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: '820px',
                    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: 160},
                                {field: 'maktx', title: '商品名称', width: 160},
                                {field: 'batch', title: '批号'},
                                {field: 'anfme', title: '数量'},
                                // {field: 'workQty', title: '作业数量'},
                                {field: 'qty', title: '完成数量', style: 'font-weight: bold'},
                                {field: 'specs', 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: ''
                        });
                    }
                });
                break;
        }
    });
    // 搜索
    form.on('submit(search)', function (data) {
        pageCurr = 1;
        tableReload(false);
    });
    // 重置
    form.on('submit(reset)', function (data) {
        pageCurr = 1;
        clearFormVal($('#search-box'));
        tableReload(false);
    });
    // 添加
    $("#orderAddBtn").click(function () {
        showEditModel();
    });
    // 时间选择器
    function layDateRender(data) {
        setTimeout(function () {
            layDate.render({
                elem: '#ioTime\\$',
                type: 'datetime',
                value: data!==undefined?data['ioTime\\$']:null
            });
        }, 300);
    }
    layDateRender();
    // 生成拣货单
    function addPakOut(expTpe) {
        $.ajax({
            url: baseUrl+"/ManPakOut/add/auth",
            headers: {'token': localStorage.getItem('token')},
            data: JSON.stringify({
                docType: Number(20),
                orderNo: expTpe,
            }),
            contentType:'application/json;charset=UTF-8',
            method: 'POST',
            success: function (res) {
                if (res.code === 200){
                    layer.msg("生成拣货单:ok");
                } else if (res.code === 403){
                    layer.msg("生成拣货单:403");
                }else {
                    layer.msg("生成拣货单:???");
                }
            }
        })
    }
    // 删除单据
    function doDel(orderId) {
        console.log(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){
                        layer.msg(res.msg, {icon: 1});
                    } else if (res.code === 403){
                        top.location.href = baseUrl+"/";
                    }else {
                        layer.msg(res.msg, {icon: 2});
                    }
                }
            })
        });
    }
    // 显示表单弹窗
    function showEditModel(expTpe) {
        admin.open({
            type: 1,
            title: (expTpe ? '修改' : '添加') + '单据',
            content: $('#editDialog').html(),
            area: '1300px',
            success: function (layero, dIndex) {
                $(layero).children('.layui-layer-content').css('overflow', 'visible');
                var isExpAdd = !expTpe;
                // 回显数据
                form.val('editForm', expTpe);
                if (expTpe) {
                    $('#orderNo').attr("disabled", "disabled");
                }
                // 表单提交事件
                form.on('submit(orderEditSubmit)', function (data) {
                    // 组装数据
                    if (xxDataList.length <= 0) {
                        layer.tips('请添加单据明细', '#matAddBtnComment', {tips: [1, '#ff4c4c']});
                        return false;
                    }
                    let nList = admin.util.deepClone(xxDataList);
                    for (let xi = 0; xi < nList.length; xi++) {
                        if (nList[xi].anfme <= 0){
                            layer.msg('明细修改数量不合法', {icon: 2});
                            return false;
                        }
                        if (nList[xi].anfme < nList[xi].workQty){
                            layer.msg('数量不能小于已作业数量', {icon: 2});
                            return false;
                        }
                    }
                    layer.load(2);
                    $.ajax({
                        url: baseUrl+"/order/form/" + (isExpAdd?"add":"modify") + "/auth",
                        headers: {'token': localStorage.getItem('token')},
                        data: JSON.stringify({
                            orderId: Number(data.field.id),
                            docType: Number(20),
                            orderNo: data.field.orderNo,
                            orderDetlList: nList
                        }),
                        contentType:'application/json;charset=UTF-8',
                        method: 'POST',
                        success: function (res) {
                            layer.closeAll('loading');
                            if (res.code === 200){
                                layer.close(dIndex);
                                $(".layui-laypage-btn")[0].click();
                                layer.msg(res.msg, {icon: 1});
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2});
                            }
                        }
                    })
                    return false;
                });
                // 明细表格
                var xxDataList = [];
                var tbOptions = {
                    elem: '#formSSXMTable',
                    headers: {token: localStorage.getItem('token')},
                    data: xxDataList,
                    page: true,
                    height: '350px;',
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 200},
                        {field: 'batch', title: '批号', edit: true},
                        {field: 'specs', title: '规格'},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'workQty', title: '作业数量',  minWidth: 100, width: 100},
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
                    ]],
                    done: function (res) {
                        $(layero).find('.layui-table-view').css('margin', '0');
                    },
                    size: ''
                };
                if (!isExpAdd) {
                    $.ajax({
                        url: baseUrl+"/order/detl/all/auth?orderId=" + expTpe.id,
                        headers: {'token': localStorage.getItem('token')},
                        method: 'GET',
                        async: false,
                        success: function (res) {
                            if (res.code === 200){
                                xxDataList = res.data;
                                tbOptions.data = xxDataList;
                            } else if (res.code === 403){
                                top.location.href = baseUrl+"/";
                            }else {
                                layer.msg(res.msg, {icon: 2})
                            }
                        }
                    })
                }
                var insTbSSXM = table.render(tbOptions);
                // 工具条点击事件
                table.on('tool(formSSXMTable)', function (obj) {
                    var data = obj.data;
                    var layEvent = obj.event;
                    if (layEvent === 'edit') {
                        showEditModel2(data);
                    } else if (layEvent === 'del') {
                        if(data.workQty > 0){
                            layer.msg("已存在作业数量,不能删除", {icon: 2});
                            return;
                        }
                        layer.confirm('确定要删除吗?', {
                            shade: .1,
                            skin: 'layui-layer-admin'
                        }, function (i) {
                            layer.close(i);
                            for (var j = 0; j < xxDataList.length; j++) {
                                if (xxDataList[j].matnr === data.matnr && xxDataList[j].batch === data.batch) {
                                    xxDataList.splice(j, 1);
                                    break;
                                }
                            }
                            insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                        });
                    }
                });
                // 明细数据修改
                table.on('edit(formSSXMTable)', function (obj) {
                    let index = obj.tr.attr("data-index");
                    let data = xxDataList[index];
                    if (obj.field === 'anfme'){
                        let vle = Number(obj.value);
                        if (isNaN(vle)) {
                            layer.msg("请输入数字", {icon: 2});
                            return false;
                        } else {
                            if (vle <= 0) {
                                layer.msg("数量必须大于零", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                            if(obj.value < data.workQty){
                                layer.msg("输入数量不能小于作业中数量", {icon: 2});
                                // data[obj.field] = 0;
                                // insTbSSXM.reload({data: xxDataList});
                                return false;
                            }
                        }
                    }
                    data[obj.field] = obj.value;
                    insTbSSXM.reload({data: xxDataList});
                });
                $('#matAddBtnComment').click(function () {
                    showEditModel2();
                });
                // 显示添加明细表单弹窗
                function showEditModel2(exp) {
                    admin.open({
                        type: 1,
                        offset: '150px',
                        area: '680px',
                        title: (exp ? '修改' : '添加') + '明细',
                        content: $('#matEditDialog').html(),
                        success: function (layero, dIndex) {
                            // 回显数据
                            form.val('matEditForm', exp);
                            // 表单提交事件
                            form.on('submit(matEditSubmit)', function (data) {
                                let selectList = matXmSelect.getValue();
                                for (let i = 0; i<selectList.length; i++) {
                                    let item = selectList[i];
                                    // 查询物料详情
                                    $.ajax({
                                        url: baseUrl+"/mat/covert/"+item.value+"/auth",
                                        headers: {'token': localStorage.getItem('token')},
                                        method: 'GET',
                                        async: false,
                                        success: function (res) {
                                            if (res.code === 200){
                                                xxDataList.push(res.data);
                                                insTbSSXM.reload({data: xxDataList, page: {curr: 1}});
                                            } else if (res.code === 403){
                                                top.location.href = baseUrl+"/";
                                            }else {
                                                layer.msg(res.msg, {icon: 2})
                                            }
                                        }
                                    })
                                }
                                layer.close(dIndex);
                                return false;
                            });
                            // 渲染物料选择
                            var matXmSelect = xmSelect.render({
                                el: '#mat',
                                style: {
                                    width: '340px',
                                },
                                autoRow: true,
                                toolbar: { show: true },
                                filterable: true,
                                remoteSearch: true,
                                remoteMethod: function(val, cb, show){
                                    $.ajax({
                                        url: baseUrl+"/mat/all/get/kv",
                                        headers: {'token': localStorage.getItem('token')},
                                        data: {
                                            condition: val
                                        },
                                        method: 'POST',
                                        success: function (res) {
                                            if (res.code === 200){
                                                cb(res.data)
                                            } else {
                                                cb([]);
                                                layer.msg(res.msg, {icon: 2});
                                            }
                                        }
                                    });
                                }
                            })
                            // 弹窗不出现滚动条
                            $(layero).children('.layui-layer-content').css('overflow', 'visible');
                            layui.form.render('select');
                        }
                    });
                }
            }
        });
    }
});
// 关闭动作
$(document).on('click','#data-detail-close', function () {
    parent.layer.closeAll();
});
function tableReload(child) {
    var searchData = {};
    $.each($('#search-box [name]').serializeArray(), function() {
        searchData[this.name] = this.value;
    });
    tableIns.reload({
        where: searchData,
        page: {curr: pageCurr}
    });
}
src/main/webapp/views/order/order.html
@@ -27,6 +27,18 @@
        .btn-delete {
            display: none;
        }
        .contain td {
            border: 1px solid #000;
            /*font-family: 黑体;*/
            /*font-weight: bold;*/
            /*color: #000000;*/
        }
        .wrk-trace {
            color: green;
            cursor: pointer;
            margin-left: 6px;
            font-size: 18px;
        }
    </style>
</head>
<body>
@@ -90,9 +102,13 @@
        <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
        <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">删除</a>
    {{# } }}
    {{# if ((d.settle == 0 || d.settle == 1) && (d.docType == 21 || d.docType == 11 || d.docType == 12)) { }}
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="manPrint">生成拣货单</a>
    {{# } }}
    {{# if (d.settle == 2) { }}
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">完结</a>
    {{# } }}
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="btnPrint">打印</a>
</script>
<!-- 表格操作列 -->
<script type="text/html" id="tbLook">
@@ -102,6 +118,15 @@
        </a>
    </span>
</script>
<script type="text/html" id="orderNoTpl">
    {{d.orderNo}}
    {{# if(d.settle > 1 && d.settle !== 3){ }}
    {{# } }}
    <i class="layui-icon layui-icon-about wrk-trace" lay-tips="查看二维码" lay-direction="2" lay-offset="-10px,0px" lay-event="wrkTrace"></i>
</script>
<!--<script type="text/html" id="settleTpl">-->
<!--    <span name="settle" class="layui-badge layui-badge-gray">{{d.settle$}}</span>-->
<!--</script>-->
@@ -186,6 +211,7 @@
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
@@ -197,6 +223,78 @@
    <option value="{{docId}}">{{docName}}</option>
    {{/each}}
</script>
<!-- 打印操作弹窗 -->
<div id="printDataDiv" style="display: none;padding: 20px">
    <div class="layui-form" style="text-align: center">
        <hr>
        <!--单选框-->
        <div class="layui-form-item" style="display: inline-block; margin-bottom: 10px">
            <input type="radio" name="selectTemplate" value="3" title="模板三" lay-filter="selectTemplateRadio" checked="">
        </div>
        <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;text-align: left;">
            <legend>打印预览</legend>
            <div id="template-container" style="margin: 20px;text-align: center">
                <!-- 预览图 3 -->
                <div id="template-preview-3" class="template-preview" style="display: inline-block">
                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
                    </table>
                </div>
            </div>
        </fieldset>
    </div>
</div>
<div id="box" style="display: block"></div>
<!-- 初始化打印模板的条形码 -->
<script type="text/javascript">
    // $('.template-barcode').attr("src", baseUrl+"/mac/code/auth?type=1&param=123");
    $('.template-qrcode').attr("src", baseUrl+"/mac/code/auth?type=2&param=123");
</script>
<!-- 模板引擎 -->
<!-- 模板3 -->
<script type="text/template" id="templatePreview3" class="template-qrcode">
    {{#each data}}
    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
        <thead></thead>
        <tbody style="font-weight: bold">
        <tr style="height: 30px;">
            <td align="center" scope="col" colspan="1">商品</td>
            <td align="lift" colspan="4" style="padding-left: 8px;overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.maktx}}</td>
            <td align="center" scope="col" colspan="3" rowspan="3">
                <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" width="80%">
            </td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">料号</td>
            <!--            overflow:hidden; 溢出隐藏 white-space:nowrap; text-overflow:ellipsis;-->
            <!--             word-break : break-all;  超出自动换行-->
            <td align="lift" colspan="4" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.matnr}}</td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">日期</td>
            <td align="lift" colspan="4" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.createTime$}}</td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">牌号</td>
            <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.brand}}</td>
            <td align="center" scope="col" colspan="1">批号</td>
            <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.batch}}</td>
        </tr>
        <tr style="height: 30px">
            <td align="center" scope="col" colspan="1">数量</td>
            <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.anfme}}</td>
            <td align="center" scope="col" colspan="1">状态</td>
            <td align="lift" colspan="3" style="padding-left: 8px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;">{{this.status$}}</td>
        </tr>
        </tbody>
    </table>
    <div style="height: 20px">
    </div>
    {{/each}}
</script>
</body>
</html>
src/main/webapp/views/picking/picking.html
New file
@@ -0,0 +1,144 @@
<!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">
    <style>
        .contain td {
            border: 1px solid #000;
            /*font-family: 黑体;*/
            /*font-weight: bold;*/
            /*color: #000000;*/
        }
    </style>
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <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="doc_num" placeholder="拣货单号" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="saasLog" lay-filter="saasLog"></table>
        </div>
    </div>
</div>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/picking/picking.js" charset="utf-8"></script>
</body>
<!-- 表格操作列 -->
<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="operate">
    {{# if (d.settle == 0 || d.settle == 1) { }}
<!--    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>-->
<!--    <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">删除</a>-->
    {{# } }}
    {{# if (d.settle == 2) { }}
    <!--    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">完结</a>-->
    {{# } }}
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="btnPrint"><img src="../../static/image/nav/fn_3.png" alt="二维码"></a>
</script>
<script type="text/html" id="orderNoTpl">
    {{d.docNum}}
<!--    {{# 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>
<!-- 打印操作弹窗 -->
<div id="printDataDiv" style="display: none;padding: 20px">
    <div class="layui-form" style="text-align: center">
        <hr>
        <!--单选框-->
        <div class="layui-form-item" style="display: inline-block; margin-bottom: 10px">
            <input type="radio" name="selectTemplate" value="3" title="模板三" lay-filter="selectTemplateRadio" checked="">
        </div>
        <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;text-align: left;">
            <legend>打印预览</legend>
            <div id="template-container" style="margin: 20px;text-align: center">
                <!-- 预览图 3 -->
                <div id="template-preview-3" class="template-preview" style="display: inline-block">
                    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
                    </table>
                </div>
            </div>
        </fieldset>
    </div>
</div>
<div id="box" style="display: block"></div>
<script type="text/template" id="docTypeTpl">
    <option value="">选择类型</option>
    {{#each records}}
    <option value="{{docId}}">{{docName}}</option>
    {{/each}}
</script>
<!-- 初始化打印模板的条形码 -->
<script type="text/javascript">
    $('.template-qrcode').attr("src", baseUrl+"/mac/code/auth?type=2&param=123");
</script>
<!-- 模板引擎 -->
<!-- 模板3 -->
<script type="text/template" id="templatePreview3" class="template-qrcode">
    {{#each data}}
    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
        <thead></thead>
        <tbody>
        <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" height="80%">
<!--        <img class="template-code template-qrcode" src="{{res.data}}" height="80%">-->
        </tbody>
    </table>
    {{/each}}
</script>
<div id="qrcode" style="display: none;padding: 20px">
    {{#each result}}
    <table class="contain" width="280" style="overflow: hidden;font-size: xx-small;table-layout: fixed;">
        <thead></thead>
        <tbody>
        <img class="template-code template-qrcode" src="{{this.barcodeUrl}}" height="80%">
        <!--        <img class="template-code template-qrcode" src="{{res.data}}" height="80%">-->
        </tbody>
    </table>
    {{/each}}
</div>
</html>
src/main/webapp/views/picking/pickingOrder.html
New file
@@ -0,0 +1,157 @@
<!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">
    <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>
<!--    <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>-->
    <style>
        .wrk-trace {
            color: green;
            cursor: pointer;
            margin-left: 6px;
            font-size: 18px;
        }
    </style>
</head>
<body>
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <div class="layui-form toolbar" 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="order_no" placeholder="单据编号" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
                        <button class="layui-btn icon-btn" lay-filter="search" lay-submit>
                            <i class="layui-icon">&#xe615;</i>搜索
                        </button>
                        <button class="layui-btn icon-btn" lay-filter="reset" lay-submit>
                            <i class="layui-icon">&#xe666;</i>重置
                        </button>
                        <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon">&#xe654;</i>添加
                        </button>
                    </div>
                </div>
            </div>
            <table class="layui-hide" id="saasLog" lay-filter="saasLog"></table>
        </div>
    </div>
</div>
<script type="text/javascript" src="../../static/js/jquery/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="../../static/js/handlebars/handlebars-v4.5.3.js"></script>
<script type="text/javascript" src="../../static/js/jquery/jQuery.print.js"></script>
<script type="text/javascript" src="../../static/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/common.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/cool.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/echarts/echarts.min.js" charset="utf-8"></script>
<script type="text/javascript" src="../../static/js/picking/pickingOrder.js" charset="utf-8"></script>
</body>
<!-- 表格操作列 -->
<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="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" style="display: none" value="平库拣货单">
                <input id="docType$" name="docType$" value="平库拣货单" class="layui-input cool-auto-complete-div" onclick="autoShow(20)" placeholder="平库拣货单" onfocus=this.blur() lay-verType="tips" lay-verify="required">
            </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="operate">
    {{# if (d.settle == 0 || d.settle == 1) { }}
    <a class="layui-btn layui-btn-primary layui-btn-xs btn-edit" lay-event="edit">修改</a>
    <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="del">删除</a>
    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="manPrint">生成拣货单</a>
    {{# } }}
    {{# if (d.settle == 2) { }}
<!--    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">完结</a>-->
    {{# } }}
<!--    <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="btnPrint">打印</a>-->
</script>
<!-- 表单弹窗 -->
<script type="text/html" id="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>
</html>