loulijun2021
2022-07-07 f791db88d83a7ed851b9412d9797ed16b345fe79
1.项目页面修改2.生产管理工单页面开发
已添加21个文件
已修改20个文件
12192 ■■■■■ 文件已修改
public/static/temp/grwebapp.js 499 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/static/temp/webapp-ws-tutorial.htm 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/jcsz.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/scgl.js 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/.Archive/README.md/2019-06-06 22-53-18.md 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/.eslintignore 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/2021-05-12-18-28-08.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/2021-05-12-18-28-56.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/README.md 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/lib/print.common.js 4069 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/lib/print.umd.js 4079 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/lib/print.umd.min.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/package.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/print/index.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/print/packages/css/print.css 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/print/packages/images/print-icon.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/print/packages/print.js 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/print/packages/printarea.js 430 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/src/App.vue 310 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/src/img/Chrome.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/src/img/Chrome1.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/src/img/ie.png 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Print/vue-print-nb/src/main.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/global.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/jcsz/jsqd.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/jcsz/wldw.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/jcsz/yhqd.vue 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/jcsz/zzjg.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/sbgl/sbqd.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/scgl/gd.vue 547 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/scgl/gdpg.vue 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/scgl/scdd.vue 191 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/scgl/sckbg.vue 474 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wlgl/ckdy.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/wlgl/kwdy.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/zzmx/chda.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/zzmx/gxdy.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/zzmx/gylx.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/zzmx/jpgj.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/zzmx/wllx.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/static/temp/grwebapp.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,499 @@
//变量 _grwebapp_url æŒ‡å®šWEB报表客户端安装程序的下载URL,当通过WebSocket通讯不成功时,提示用户用此URL下载程序进行安装。
//或用于自动更新WEB报表客户端时下载新版本,开发者应将 _grwebapp_url æ”¹ä¸ºè‡ªå·±æœåŠ¡å™¨çš„URL,方便用户从可访问的WEB服务器下载
//变量 _grwebapp_version æŒ‡å®šè‡ªåŠ¨æ›´æ–°æ—¶ï¼Œå®¢æˆ·ç«¯ç¨‹åºéœ€è¦çš„ç‰ˆæœ¬å·ï¼Œå¦‚æžœå°äºŽæ­¤ç‰ˆæœ¬å·ï¼Œåˆ™è‡ªåŠ¨è¿›è¡Œæ›´æ–°
var _grwebapp_websocket = null,
  _grwebapp_url = "http://www.rubylong.cn/download/gridreport6-webapp.exe",
  _grwebapp_version = "6.8.2.0",
  webapp_onmessage ; //如果需要响应执行任务后的消息响应,应该写一个名称为 webapp_onmessage çš„ function
function webapp_url_method_valid(url, method) {
  if (!method) {
    if (typeof url == "object") {
      method = url.method;
      url = url.url;
    }
    if (!method) {
      method = /.grf|.txt|.xml|.json/.test(url) ? "GET" : "POST";
    }
  }
  return method;
}
//此函数用于判断一个变量是否为URL字符串,如果类型为字符串且首个非空白字符不为“<”与“{”即判定为URL
//如果参数是一个object对象,且其具有“url”属性,则其是HTTPParam对象,是一个url参数
var webapp_is_url = function (p) {
  var index = 0,
    len = p.length,
    ch;
  //对象如果有url属性,判定为url
  if (typeof p == "object") {
    return !!p.url;
  }
  if (typeof p != "string") {
    return 0;
  }
  //首先找到第一个非空白字符
  while (index < len) {
    ch = p[index];
    if (!/\s/g.test(ch))
      break;
    index++;
  }
  //如果不是xml或json文本串,则判定为url
  return (ch != "{") && (ch != "<") && (p.substr(index, 4) != "_WR_");
};
function webapp_ajax(method, url, callback, cbthis, params) {
  var xmlhttp = new XMLHttpRequest(),
    headers;
  xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4 && xmlhttp.status > 0) {
      callback.call(cbthis, xmlhttp, xmlhttp.status == 200);
    }
  }
  xmlhttp.onerror = function () {
    callback.call(cbthis, xmlhttp, 0);
  }
  if (typeof url == "object") {
    headers = url.headers;
    if (typeof headers == "string") {
      headers = JSON.parse(headers)
    }
    if (!method) {
      method = url.method;
    }
    if (!params) {
      params = url.data;
    }
    url = url.url;
  }
  xmlhttp.open(webapp_url_method_valid(url, method), url, true); //异步请求数据
  if (headers && typeof headers == "object") {
    for (var key in headers) {
      xmlhttp.setRequestHeader(key, headers[key]);
    }
  }
  xmlhttp.send(params);  //POST æˆ– PUT å¯ä»¥ä¼ é€’参数
}
/////////////////////////////////////////////////////////////////////////////
//创建启动WEB报表客户端的URL协议参数
function _gr_up_href(args) {
  return "grwebapp://" + (args ? JSON.stringify(args) : "");
}
//通过URL协议启动WEB报表客户端程序
//参数 appUpdate æŒ‡å®šæ˜¯å¦è‡ªåŠ¨æ›´æ–°WEB报表客户端程序,根据_grwebapp_version与已经安装的程序版本进行比较,按需进行自动升级
function webapp_urlprotocol_startup(appUpdate) {
  var arg = appUpdate ? {
    type: "update",
    url: _grwebapp_url,
    ver: _grwebapp_version
  } : 0;
  window.location.href = _gr_up_href(arg);
}
//如果WEB报表客户端程序未运行,先通过URL协议启动WEB报表客户端程序
//通知WEB报表客户端程序根据模板与数据的URL,以及生成类型等相关参数进行报表生成,
function webapp_urlprotocol_run(args, report_url, data_url) {
  if (report_url) {
    args.report = report_url;
  }
  if (data_url) {
    args.data = data_url;
  }
  window.location.href = _gr_up_href(args);
}
/////////////////////////////////////////////////////////////////////////////
//检查WebSocket是否已经创建并通讯连接成功
function webapp_ws_check(slience) {
  if (!slience) {
    if (!_grwebapp_websocket) {
      alert("WebSocket没有创建,无法发送数据!");
    }
    else if (_grwebapp_websocket.readyState != 1) {
      alert("WebSocket正在连接中,暂不能发送数据!");
    }
  }
  return _grwebapp_websocket && (_grwebapp_websocket.readyState === 1);
}
//创建并通讯连接WebSocket
function webapp_ws_create(onopen) {
  //如果已经创建,且连接正常,则不要再次创建
  if (_grwebapp_websocket && _grwebapp_websocket.readyState === 1) {
    return;
  }
  //判断当前浏览器是否支持WebSocket
  if ('WebSocket' in window) {
    _grwebapp_websocket = new WebSocket("ws://127.0.0.1:22333");
    //连接成功建立的回调方法
    if (onopen) {
      _grwebapp_websocket.onopen = function () {
        //alert("_grwebapp_websocket.onopen");
        onopen();
      }
    }
    // debugger;
    //接收到消息的回调方法
    if (window.webapp_onmessage) {
      _grwebapp_websocket.onmessage = function (event) {
        window.webapp_onmessage(event);
      }
    }
    _grwebapp_websocket.onerror = function () {
      var children = document.body.children,
        childrenLen = children.length,
        referNode = childrenLen ? children[0] : null,
        newNode = document.createElement("h3");
      _grwebapp_websocket = null;
      //弹出alert提示信息,可修改为更适合的表述
      //alert("创建WebSocket失败,可能是‘WEB报表客户端程序’在本机没有安装,或在报表网页加载时没有调用‘webapp_urlprotocol_startup’函数进行启动。");
      alert("创建WebSocket失败,可能是WEB报表客户端程序没有启动,或其在本机没有安装,请根据网页顶部的提示进行相应的操作。");
      //在网页最前面加上提示下载的文字,可修改为更适合的表述与界面形式
      //newNode.innerHTML = '特别提示:<a href="' + _grwebapp_url + '">点击下载WEB报表客户端程序</a>,下载后双击下载的文件进行安装,安装完成后重新打开当前网页。';
      newNode.innerHTML = '特别提示:尝试<a href="javascript:webapp_urlprotocol_startup();">启动WEB报表客户端程序</a>。或<a href="' + _grwebapp_url + '">点击下载WEB报表客户端程序</a>,下载后双击下载的文件进行安装,安装完成后重新打开当前网页。';
      document.body.insertBefore(newNode, referNode);
    };
    //连接关闭的回调方法
    _grwebapp_websocket.onclose = function () {
      _grwebapp_websocket = null;
    }
    //感觉这部分可以不要
    //监听窗口关闭事件,当窗口关闭时,主动去关闭_grwebapp_websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    //window.onbeforeunload = function () {
    //    if (_grwebapp_websocket) {
    //        _grwebapp_websocket.close();
    //    }
    //}
  }
  else {
    alert('当前浏览器不支持HTML5的WebSocket,请选用更新版本的浏览器!')
  }
}
function webapp_build_one(pack, report, report_method, data, data_method, callback_fun, dataParams) {
  if (!report) {
    alert("在参数中没有定义报表模板的url,报表不能生成!");
    return;
  }
  if (data) {
    if (webapp_is_url(data)) {
      webapp_ajax(data_method, data, function (xmlhttp, success) {
        if (success) {
          pack.data = xmlhttp.responseText;
          callback_fun();
        }
        else {
          //alert("载入报表数据失败,响应消息:" + xmlhttp.responseText);
          window.open(data, "blank");
        }
      }, undefined, dataParams);
    }
    else {
      pack.data = (typeof data == "object") ? JSON.stringify(data) : data;
      callback_fun();
    }
  }
  else {
    pack.data = "";
  }
  if (webapp_is_url(report)) {
    webapp_ajax(report_method, report, function (xmlhttp, success) {
      if (success) {
        pack.report = xmlhttp.responseText;
        callback_fun();
      }
      else {
        //alert("载入报表模板失败,响应消息:" + xmlhttp.responseText);
        window.open(report, "blank");
      }
    });
  }
  else {
    pack.report = (typeof report == "object") ? JSON.stringify(report) : report;
    callback_fun();
  }
}
//将参数通过WebSocket发送给WEB报表客户端,WEB报表客户端执行对应的任务
//参数说明:
//args:
//  æŠ¥è¡¨ç”Ÿæˆç›¸å…³çš„参数,为一个结构体对象或结构体对象数组。
//  å½“参数为数组时,表示是执行批量任务。此时后面的 report ä¸Ž data å‚数不会被用到。
//  ç»“构体对象的各个数据项说明请参考帮助中“WEB报表(B/S报表)->WEB报表客户端->启动参数说明”部分
//report:
//  æŠ¥è¡¨æ¨¡æ¿æ–‡æœ¬ï¼ŒæŠ¥è¡¨å®šä¹‰æ ¼å¼å¿…须为JSON格式。此参数可空,为空表示执行非报表生成任务,或WEB报表客户端通过URL获取报表模板。
//data:
//  æŠ¥è¡¨æ•°æ®æ–‡æœ¬ï¼Œæ­¤å‚数可空,报表无需提供数据,或WEB报表客户端通过URL获取报表数据。
//
//  æŠ¥è¡¨æ•°æ®å¯¹åº”çš„ XML æˆ– JSON æ–‡æœ¬ï¼Œè¯·å‚考帮助“WEB报表(B/S报表)->WEB报表数据”中的说明。
function webapp_ws_run(variant_args, report, data) {
  function run_one(args, reportText, dataText) {
    var msg;
    if (webapp_ws_check()) {
      if (typeof args === "string") {
        args = {
          type: args
        };
      }
      msg = JSON.stringify(args);
      if (reportText) {
        if (reportText.substr(0, 4) === "_WR_") {
          msg += reportText.length;
        }
        msg += reportText;
        if (dataText) {
          msg += dataText;
        }
      }
      _grwebapp_websocket.send(msg);
    }
  } //end of run_one
  if (!webapp_ws_check(1)) {
    //如果WebSocket没有连接,则首先创建并连接WebSocket,并在onopen事件中执行相关的任务
    webapp_ws_create(function () {
      webapp_ws_run(variant_args, report, data);
    });
    return;
  }
  if (Array.isArray(variant_args)) {
    variant_args.forEach(function (args) {
      run_one(args);
    })
  }
  else {
    run_one(variant_args, report, data);
  }
}
//通过 ajax æ–¹å¼èŽ·å–æŠ¥è¡¨æ¨¡æ¿ä¸ŽæŠ¥è¡¨æ•°æ®ï¼Œç„¶åŽé€šè¿‡ WebSocket å‘送相关数据给WEB报表客户端并生成报表
//参数既可以是单个结构体对象,也可以是结构体对象数组。如果是数组,表示成批生成多个报表。
//结构体对象的各个数据项说明请参考帮助中“WEB报表(B/S报表)->WEB报表客户端->启动参数说明”部分。
function webapp_ws_ajax_run(variant_args) {
  function run_one(args) {
    var report = args.report,
      data = args.data,
      report_method = args.report_method,
      data_method = args.data_method,
      dataUrlParams = args.dataUrlParams,
      pack = {};
    function run() {
      //只有当report与data都赋值之后才运行,即向WEB报表客户端程序发送数据
      if (pack.report && pack.data !== undefined) {
        webapp_ws_run(args, pack.report, pack.data);
      }
    }
    //因为args需要传递给WEBAPP,report与data的url相关的参数不需要传递,所以将其删除掉
    delete args.report;
    delete args.data;
    delete args.report_method;
    delete args.data_method;
    delete args.dataUrlParams;
    webapp_build_one(pack, report, report_method, data, data_method, run, dataUrlParams);
  } //end of run_one
  if (!webapp_ws_check(1)) {
    //如果WebSocket没有连接,则首先创建并连接WebSocket,并在onopen事件中执行相关的任务
    webapp_ws_create(function () {
      webapp_ws_ajax_run(variant_args);
    });
    return;
  }
  if (Array.isArray(variant_args)) {
    variant_args.forEach(function (args) {
      run_one(args);
    });
  }
  else {
    run_one(variant_args);
  }
}
//通过 ajax æ–¹å¼èŽ·å–å¤šä¸ªæŠ¥è¡¨çš„æ¨¡æ¿ä¸Žæ•°æ®ï¼Œç„¶åŽç”¨ WebSocket å°†æ•°æ®ä¸€æ¬¡æ€§å‘送给WEB报表客户端程序。
//实现多个报表同时生成在一个任务中(应用Grid++Report的独立子报表功能实现),达到多个报表同时预览、打印与数据导出
function webapp_ws_ajax_together(args, reports) {
  var reportCount = reports.length,
    reportPacks = [],
    gettedCount = 0; //指示已经获取到数据的报表个数
  function ajaxRequestOne(arg, index) {
    var report = arg.report,
      data = arg.data,
      report_method = arg.report_method,
      data_method = arg.data_method,
      dataUrlParams = arg.dataUrlParams,
      pack = reportPacks[index];
    function try_ws_send() {
      var msg,
        dataMsg = "",
        lengths = [];
      if (pack.report && pack.data !== undefined) {
        if (++gettedCount >= reportCount) { //只有当全部报表的模板与数据都已经获取到之后,才会向WEB报表客户端发送数据
          msg = JSON.stringify(args);
          reportPacks.forEach(function (item) {
            var report = item.report,
              data = item.data,
              reportLen = report.length,
              reportLenText = "";
            if (report.substr(0, 4) === "_WR_") {
              reportLenText += reportLen;
              dataMsg += reportLenText;
              reportLen += reportLenText.length;
            }
            dataMsg += report;
            if (data) {
              dataMsg += data;
            }
            lengths.push(reportLen + data.length);
          });
          msg += JSON.stringify(lengths);
          msg += dataMsg;
          _grwebapp_websocket.send(msg);
        }
      }
    }
    webapp_build_one(pack, report, report_method, data, data_method, try_ws_send, dataUrlParams);
  } //end of ajaxRequestOne
  if (!webapp_ws_check(1)) {
    //如果WebSocket没有连接,则首先创建并连接WebSocket,并在onopen事件中执行相关的任务
    webapp_ws_create(function () {
      webapp_ws_ajax_together(args, reports);
    });
    return;
  }
  reports.forEach(function (report, index) {
    reportPacks.push({});
    ajaxRequestOne(report, index);
  });
}
/////////////////////////////////////////////////////////////////////////////
//通过WebSocket向WEB报表客户端发送枚举出当前电脑的所有打印机信息的指令
//在网页的 webapp_onmessage å‡½æ•°ä¸­æŽ¥æ”¶WEB报表客户端返回的结果,具体请参考例子。
function webapp_ws_fun_Printers() {
  webapp_ws_run({
    type: "fun",
    fun: "Printers"
  });
}
//通过WebSocket向WEB报表客户端发送枚举出当前电脑的指定打印机的全部可用纸张的指令
//在网页的 webapp_onmessage å‡½æ•°ä¸­æŽ¥æ”¶WEB报表客户端返回的结果,具体请参考例子
function webapp_ws_fun_PrinterPapers(printer) {
  webapp_ws_run({
    type: "fun",
    fun: "PrinterPapers",
    printer: printer
  });
}
//通过WebSocket向WEB报表客户端发送停止当前报表预览并关闭预览窗口的指令
function webapp_ws_fun_StopPreview() {
  webapp_ws_run({
    type: "fun",
    fun: "StopPreview"
  });
}
/////////////////////////////////////////////////////////////////////////////
//通过WebSocket向WEB报表客户端发送消息进行自动更新检查处理
function webapp_ws_autoupdate() {
  webapp_ws_run({
    type: "update",
    url: _grwebapp_url,
    ver: _grwebapp_version
  });
}
/////////////////////////////////////////////////////////////////////////////
//为URL追加一个名为id的随机数参数,用于防止浏览器缓存。
//报表模板重新设计后,因为浏览器缓存而让报表生成不能反映出新修改的设计结果,URL后追加一个随机数参数可以避免这样的问题
//参数url必须是静态的URL,其后本身无任何参数
//如果模板几乎不怎么修改,可以去掉对本函数的调用
function urlAddRandomNo(url) {
  return url + "?id=" + Math.floor(Math.random() * 10000);
}
//根据当前网页URL获取到当前WEB服务器的根URL,并记录在 window.rootURL ä¸­
function gr_extractRootURL() {
  var path = window.location.pathname,
    index = path.lastIndexOf("/");
  window.rootURL = window.location.protocol + "//" + window.location.host;
  if (index >= 0) {
    path = path.substr(0, index);
    //demmo的根目录在当前页面的1级目录之上
    index = path.lastIndexOf("/");
    if (index >= 0) {
      path = path.substr(0, index);
    }
    window.rootURL += path;
  }
  window.rootURL += "/";
}
//vue中使用将下列注释开放
//export {
//    webapp_url_method_valid,
//    webapp_urlprotocol_startup,
//    webapp_ajax,
//    webapp_ws_ajax_run,
//    webapp_urlprotocol_run,
//    urlAddRandomNo,
//    webapp_onmessage,
//    webapp_ws_fun_StopPreview,
//    webapp_ws_fun_PrinterPapers,
//    webapp_ws_fun_Printers,
//    webapp_ws_ajax_together,
//    webapp_ws_autoupdate,
//    gr_extractRootURL
//}
public/static/temp/webapp-ws-tutorial.htm
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,259 @@
<!DOCTYPE html>
<html>
<head>
    <title>WEB报表客户端使用教程(WebSocket) - é”æµªWEB报表</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="Description" content="锐浪HTML5报表应用WEB报表客户端实现打印与数据导出。" />
    <meta name="Keywords" content="WEB报表,WEB打印,HTML5报表,WEB报表客户端" />
    <script src="grwebapp.js"></script>
    <script language="javascript" type="text/javascript">
        function window_onload() {
            //*这句特别重要*:只有在WEB报表客户端程序后,才能进行WebSocket通讯
            //如果WEB报表客户端程序为开机自启动,以下调用应该去掉。更多说明请参考帮助“WEB报表(B/S报表)->WEB报表客户端->部署与安装”部分中与谷歌Chrome浏览器的相关说明
            webapp_urlprotocol_startup(); //启动WEB报表客户端程序,以便侦听接受 WebSocket æ•°æ®
        }
        //消息响应函数,接受WEB报表客户端执行完打印与数据导出等任务回发的消息
        //如果不要响应任务执行完消息,此函数可以不用定义,直接去掉即可。
        function webapp_onmessage(event) {
            var message = JSON.parse(event.data);
            //在向打印机发送完打印数据后响应的消息,在函数体中完成自己的任务
            function OnPrintEnd() {
                var msg = "报表已经打印,输出打印机:" + message.PrinterName;
                if (message.reportid) {
                    msg += "\r\nreportid = " + message.reportid;
                }
                alert(msg);
            }
            //在执行了数据导出任务后响应的消息,在函数体中完成自己的任务
            function OnExportEnd() {
                var msg = "数据导出已经完成,导出文件:" + message.FileName;
                if (message.reportid) {
                    msg += "\r\nreportid = " + message.reportid;
                }
                alert(msg);
            }
            //alert(event.data);
            if (message.event == "PrintEnd") {
                OnPrintEnd();
            }
            else if (message.event == "ExportEnd") {
                OnExportEnd();
            }
        }
    </script>
</head>
<body onload="window_onload()">
    <h1>锐浪WEB报表客户端使用教程</h1>
    <h3><a href="webapp-overview.htm">关于锐浪WEB报表客户端</a></h3>
    <h3>特别提示:以下链接点击无响应,请下载安装<a href="webapp-download.htm">WEB报表客户端</a></h3>
    <h3>起步例子</h3>
    <p><a href='javascript:ws_ajax_preview();'>打印预览(AJAX)</a>通过AJAX方式获取报表模板与报表数据</p>
    <script language="javascript" type="text/javascript">
        function ws_ajax_preview() {
            //参数具体说明请参考帮助文档中的“WEB报表(B/S报表)->WEB报表客户端->启动参数说明”部分
            var args = {
              // http://localhost:8001/grf/%E4%BA%A7%E5%93%81%E6%B5%81%E4%BC%A0%E5%8D%95A5.grf
              //   report: urlAddRandomNo("../grf/产品流传单A5.grf"),
                report: urlAddRandomNo("http://121.196.36.24:8001/grf/产品流传单A5.grf"),
                data:
                {
                    "recordset": [
                        {
                            "seq": "1",
                            "wo_code": "PO202206280001_1",
                            "partcode": "1403-001-0001",
                            "partname": "圆钢F45MnVSφ20",
                            "partspec": "φ20",
                            "routename": "测试工艺路线1",
                            "orderqty": 166,
                            "lm_user": "Admin",
                            "lm_date": "2022-06-30",
                            "stepcode": "Step01",
                            "stepname": "测试工序一",
                            "plan_qty1": 166,
                            "good_qty": 0,
                            "ng_qty": 0,
                            "stepqrcode":"PO202206280001_1;Step01"
                        },
                        {
                            "seq": "2",
                            "wo_code": "PO202206280001_1",
                            "partcode": "1403-001-0001",
                            "partname": "圆钢F45MnVSφ20",
                            "partspec": "φ20",
                            "routename": "测试工艺路线1",
                            "orderqty": 166,
                            "lm_user": "Admin",
                            "lm_date": "2022-06-30",
                            "stepcode": "Step02",
                            "stepname": "测试工序二",
                            "plan_qty1": 166,
                            "good_qty": 0,
                            "ng_qty": 0,
                            "stepqrcode": "PO202206280001_1;Step02"
                        }
                    ]
                },
                //data: "../data/DataCenter.ashx?data=Customer",
                //dataUrlParams: "如果data参数为URL,且其需要额外的参数数据,则定义在此参数中", //例子演示不需要,所以注释掉
                type: "preview",
            };
            webapp_ws_ajax_run(args);
        }
    </script>
    <p> <a href='javascript:ws_ajax_print();'>打印(AJAX)</a>通过AJAX方式获取报表模板与报表数据</p>
    <script language="javascript" type="text/javascript">
        function ws_ajax_print() {
            var args = {
                type: "preview",//print
                //showOptionDlg: true, //如果不显示打印对话框而直接打印,将此行注释去掉即可
                report: urlAddRandomNo("../grf/报工产出标签.grf"),
                //data: "../data/DataCenter.ashx?data=Customer"
                data:
                {
                    "recordset": [
                        {
                            "wo_code": "PO202206280001_1",
                            "partcode": "1403-001-0001",
                            "partname": "圆钢F45MnVSφ20",
                            "qty": "100",
                            "next_stepname": "测试工序2",
                            "qrcode": "PO202206280001_1;Step02"
                        },
                        {
                            "wo_code": "PO202206280001_1",
                            "partcode": "1403-001-0001",
                            "partname": "圆钢F45MnVSφ20",
                            "qty": "100",
                            "next_stepname": "测试工序2",
                            "qrcode": "PO202206280001_1;Step02"
                        }
                    ]
                }
            };
            webapp_ws_ajax_run(args);
        }
    </script>
    <p><a href='javascript:ws_ajax_export_xls();'>导出Excel(AJAX)</a>通过AJAX方式获取报表模板与报表数据</p>
    <script language="javascript" type="text/javascript">
        function ws_ajax_export_xls() {
            var args = {
                type: "xls",
                report: urlAddRandomNo("../grf/1a.grf"),
                data: "../data/DataCenter.ashx?data=Customer",
                reportid: "1a" //这个参数不是必须的,只是用于回发消息标识报表身份
            };
            webapp_ws_ajax_run(args);
        }
    </script>
    <h3>自定义打印参数</h3>
    <p> <a href='javascript:print_arguments();'>自定义打印参数</a>:指定打印机,设置逐份打印与打印份数。</p>
    <script language="javascript" type="text/javascript">
        function print_arguments() {
            var args = {
                type: "print",   //如果是要进行打印,将 type è®¾ç½®ä¸º print
                report: urlAddRandomNo("../grf/1a.grf"),
                data: "../data/DataCenter.ashx?data=Customer",
                PrinterName: "Microsoft Print to PDF", //指定要输出的打印机名称
                Collate: false,  //不按逐份方式打印
                Copies: 5        //共打印5份
            }
            webapp_ws_ajax_run(args);
        }
    </script>
    <p> <a href='javascript:export_xls_custom();'>自定义导出Excel</a>:设置合适的选项参数,将数据导出为连续的表格,页眉页脚不导出,不显示导出参数对话框等。</p>
    <script language="javascript" type="text/javascript">
        function export_xls_custom() {
            var args = {
                report:urlAddRandomNo("../grf/1a.grf"),
                data: "../data/DataCenter.ashx?data=Customer",
                type: "xls",
                ExportPageBreak: false,
                ExportPageHeaderFooter: false,
                SameAsPrint: false,
                showOptionDlg: false,  //指定不显示导出选项对话框
                filename: "d:\\temp\\gridreport.xls", //指定导出的文件路径与文件名
                //open: false  //指定导出后不自动打开文件
            }
            webapp_ws_ajax_run(args);
        }
    </script>
    <h3>更多应用方式</h3>
    <p><a href='javascript:ws_data_from_string();'>打印预览(报表数据来自字符串)</a>:通过WebSocket直接将网页中的字符串数据传递给WEB报表客户端。</p>
    <script language="javascript" type="text/javascript">
        function ws_data_from_string() {
            var args = {
                type: "preview", //设置不同的属性可以执行不同的任务,如:preview print pdf xls csv txt rtf img grd
                report: urlAddRandomNo("../grf/1a.grf"),
                //实际应用中,data应该为程序中通过各种途径获取到的数据,最后要将数据转换为报表需要的XML或JSON格式的字符串数据
                data:"<xml>" +
                    "<row><CustomerID>HUNGC</CustomerID><CompanyName>五金机械</CompanyName><ContactName>苏先生</ContactName><ContactTitle>销售代表</ContactTitle></row>" +
                    "<row><CustomerID>CENTC</CustomerID><CompanyName>三捷实业</CompanyName><ContactName>王先生</ContactName><ContactTitle>市场经理</ContactTitle></row>" +
                    "<row><CustomerID>CACTU</CustomerID><CompanyName>威航货运</CompanyName><ContactName>刘先生</ContactName><ContactTitle>销售代理</ContactTitle></row>" +
                    "</xml>",
                    reportid: "ws_data_from_string" //这个参数不是必须的,只是用于回发消息标识报表身份
                };
            webapp_ws_ajax_run(args);
        }
    </script>
    <p><a href='javascript:ws_data_from_object();'>打印预览(报表数据来自JSON对象)</a>:通过WebSocket直接将网页中的JSON对象数据传递给WEB报表客户端。</p>
    <script language="javascript" type="text/javascript">
        function ws_data_from_object() {
            var args = {
                type: "preview", //设置不同的属性可以执行不同的任务,如:preview print pdf xls csv txt rtf img grd
                report: urlAddRandomNo("../grf/1a.grf"),
                //实际应用中,data应该为程序中通过各种途径获取到的数据,最后要将数据转换为报表需要的XML或JSON格式的字符串数据
                data:
                {
                    "recordset": [
                        {
                            "CustomerID": "ALFKI",
                            "CompanyName": "三川实业有限公司",
                            "ContactName": "刘小姐",
                            "Address": "大崇明路 50 å·",
                            "City": "天津",
                            "Region": "华北",
                            "PostalCode": "343567",
                            "Phone": "(030) 30074321"
                        },
                        {
                            "CustomerID": "ANATR",
                            "CompanyName": "东南实业",
                            "ContactName": "王先生",
                            "Address": "承德西路 80 å·",
                            "City": "天津",
                            "Region": "华北",
                            "PostalCode": "234575",
                            "Phone": "(030) 35554729"
                        }
                    ]
                },
                reportid: "ws_data_from_object" //这个参数不是必须的,只是用于回发消息标识报表身份
            };
            webapp_ws_ajax_run(args);
        }
    </script>
</body>
</html>
src/api/jcsz.js
@@ -198,3 +198,35 @@
    method: 'get'
  })
}
// ç”¨æˆ·æ‰€å±žç­ç»„
export function UserGroup() {
  return request({
    url: 'BasicSetting/UserGroup',
    method: 'get'
  })
}
// ç”¨æˆ·ç»„列表查询
export function UserGroupSearch(data) {
  return request({
    url: 'BasicSetting/UserGroupSearch',
    method: 'get',
    params: data
  })
}
// ç”¨æˆ·ç»„新增
export function UserGroupAdd(data) {
  return request({
    url: 'BasicSetting/UserGroupAdd',
    method: 'post',
    data
  })
}
// ç”¨æˆ·ç»„删除
export function UserGroupDelete(data) {
  return request({
    url: 'BasicSetting/UserGroupDelete',
    method: 'post',
    params: data
  })
}
src/api/scgl.js
@@ -77,7 +77,7 @@
  })
}
//
// ç”Ÿäº§å¼€æŠ¥å·¥æ‰«ç èŽ·å–å·¥å•å¯¹åº”å·¥åºä»»åŠ¡(自制)
export function MesOrderStepSearch(data) {
  return request({
    url: 'ProductionManagement/MesOrderStepSearch',
@@ -85,11 +85,102 @@
    params: data
  })
}
//
// ç”Ÿäº§å¼€æŠ¥å·¥æ‰«ç èŽ·å–å·¥å•å¯¹åº”å·¥åºä»»åŠ¡(外协)
export function MesOrderWxStepSearch(data) {
  return request({
    url: 'ProductionManagement/MesOrderWxStepSearch',
    method: 'get',
    params: data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥ï¼šå¼€å·¥(开始/报工)/外协(发料/收料)时条件判断及数据返回接口
export function MesOrderStepStart(data) {
  return request({
    url: 'ProductionManagement/MesOrderStepStart',
    method: 'get',
    params: data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥ï¼šå¼€å·¥æ—¶èŽ·å–è®¾å¤‡ä¸‹æ‹‰åˆ—è¡¨
export function MesOrderStepStartSelectEqp(data) {
  return request({
    url: 'ProductionManagement/MesOrderStepStartSelectEqp',
    method: 'get',
    params: data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥ï¼šæŠ¥å·¥æ—¶èŽ·å–ç”Ÿäº§ç­ç»„ä¸‹æ‹‰æ¡†
export function MesOrderStepReportSelectUserGroup() {
  return request({
    url: 'ProductionManagement/MesOrderStepReportSelectUserGroup',
    method: 'get'
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥ï¼šå¼€å·¥æ—¶èŽ·å–è®¾å¤‡ä¸‹æ‹‰åˆ—è¡¨
export function MesOrderGroupSelectUser(data) {
  return request({
    url: 'ProductionManagement/MesOrderGroupSelectUser',
    method: 'get',
    params: data
  })
}
// ç”Ÿäº§æŠ¥å·¥ï¼šæŠ¥å·¥/外协收料 èŽ·å–ä¸è‰¯åŽŸå› ä¸‹æ‹‰åˆ—è¡¨
export function MesOrderStepSelectCause(data) {
  return request({
    url: 'ProductionManagement/MesOrderStepSelectCause',
    method: 'get',
    params: data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥,开工提交
export function SavaMesOrderStepStart(data) {
  return request({
    url: 'ProductionManagement/SavaMesOrderStepStart',
    method: 'post',
    data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥,报工提交
export function SavaMesOrderStepReport(data) {
  return request({
    url: 'ProductionManagement/SavaMesOrderStepReport',
    method: 'post',
    data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥,发料提交
export function SavaMesOrderStepOut(data) {
  return request({
    url: 'ProductionManagement/SavaMesOrderStepOut',
    method: 'post',
    data
  })
}
// ç”Ÿäº§å¼€æŠ¥å·¥,收料提交
export function SavaMesOrderStepIn(data) {
  return request({
    url: 'ProductionManagement/SavaMesOrderStepIn',
    method: 'post',
    data
  })
}
// æ ¹æ®é€‰æ‹©å·¥è‰ºè·¯çº¿æŸ¥çœ‹å·¥åºæŽ¥å£
export function SelectRouteStep(data) {
  return request({
    url: 'ProductionManagement/SelectRouteStep',
    method: 'get',
    params: data
  })
}
// MES工单查看工序任务
export function SearchWorkStep(data) {
  return request({
    url: 'ProductionManagement/SearchWorkStep',
    method: 'get',
    params: data
  })
}
src/components/Print/vue-print-nb/.Archive/README.md/2019-06-06 22-53-18.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
# vue-print-nb
This is a directive wrapper for printed, Simple, fast, convenient, light.
## Install
#### NPM
```bash
npm install vue-print-nb --save
```
```javascript
import Print from 'vue-print-nb'
Vue.use(Print);
```
## Description
#### Print the entire page:
```
<button v-print>Print the entire page</button>
```
#### Print local range:
HTML:
```
    <div id="printMe" style="background:red;">
        <p>葫芦娃,葫芦娃</p>
        <p>一根藤上七朵花 </p>
        <p>小小树藤是我家 å•¦å•¦å•¦å•¦ </p>
        <p>叮当当咚咚当当 浇不大</p>
        <p> å®å½“当咚咚当当 æ˜¯æˆ‘å®¶</p>
        <p> å•¦å•¦å•¦å•¦</p>
        <p>...</p>
    </div>
    <button v-print="'#printMe'">Print local range</button>
```
## License
[MIT](http://opensource.org/licenses/MIT)
src/components/Print/vue-print-nb/.eslintignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
/lib
src/components/Print/vue-print-nb/2021-05-12-18-28-08.png
src/components/Print/vue-print-nb/2021-05-12-18-28-56.png
src/components/Print/vue-print-nb/README.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,354 @@
# vue-print-nb
This is a directive wrapper for printed, Simple, fast, convenient, light.
<!-- TOC -->
- [vue-print-nb](#vue-print-nb)
  - [Install](#install)
    - [Vue2 Version:](#vue2-version)
    - [Vue3 Version:](#vue3-version)
  - [Description](#description)
  - [Usage Method:](#usage-method)
    - [Print the entire page:](#print-the-entire-page)
    - [Print local range:](#print-local-range)
    - [Print local range More:](#print-local-range-more)
    - [Print URL:](#print-url)
    - [Print Preview](#print-preview)
      - [Print Url Preview:](#print-url-preview)
      - [Print local range Preview](#print-local-range-preview)
    - [Print Async Url](#print-async-url)
  - [v-print API](#v-print-api)
<!-- /TOC -->
## Install
[在线DEMO](https://power-kxlee.github.io/vue-print-nb/dist/index.html)
[ONLINE DEMO](https://power-kxlee.github.io/vue-print-nb/dist/index.html)
### Vue2 Version:
```bash
npm install vue-print-nb --save
```
```javascript
import Print from 'vue-print-nb'
// Global instruction
Vue.use(Print);
//or
// Local instruction
import print from 'vue-print-nb'
directives: {
    print
}
```
### Vue3 Version:
```bash
npm install vue3-print-nb --save
```
```javascript
// Global instruction
import { createApp } from 'vue'
import App from './App.vue'
import print from 'vue3-print-nb'
const app = createApp(App)
app.use(print)
app.mount('#app')
//or
// Local instruction
import print from 'vue3-print-nb'
directives: {
    print
}
```
![](https://github.com/Power-kxLee/vue-print-nb/blob/master/src/img/Chrome.png)
## Description
Support two printing methods, direct printing page HTML, and printing URL
It's easy to use, Support Vue compatible browser version
## Usage Method:
### Print the entire page:
```
<button v-print>Print the entire page</button>
```
### Print local range:
HTML:
```
    <div id="printMe" style="background:red;">
        <p>葫芦娃,葫芦娃</p>
        <p>一根藤上七朵花 </p>
        <p>小小树藤是我家 å•¦å•¦å•¦å•¦ </p>
        <p>叮当当咚咚当当 浇不大</p>
        <p> å®å½“当咚咚当当 æ˜¯æˆ‘å®¶</p>
        <p> å•¦å•¦å•¦å•¦</p>
        <p>...</p>
    </div>
    <button v-print="'#printMe'">Print local range</button>
```
Pass in a string type directly
* `id`: ID of local print range
### Print local range More:
HTML:
```
 <button v-print="printObj">Print local range</button><div id="loading" v-show="printLoading"></div>
  <div id="printMe" style="background:red;">
        <p>葫芦娃,葫芦娃</p>
        <p>一根藤上七朵花 </p>
        <p>小小树藤是我家 å•¦å•¦å•¦å•¦ </p>
        <p>叮当当咚咚当当 浇不大</p>
        <p> å®å½“当咚咚当当 æ˜¯æˆ‘å®¶</p>
        <p> å•¦å•¦å•¦å•¦</p>
        <p>...</p>
    </div>
```
JavaScript:
```
export default {
    data() {
        return {
           printLoading: true,
            printObj: {
              id: "printMe",
              popTitle: 'good print',
              extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
              extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
              beforeOpenCallback (vue) {
                vue.printLoading = true
                console.log('打开之前')
              },
              openCallback (vue) {
                vue.printLoading = false
                console.log('执行了打印')
              },
              closeCallback (vue) {
                console.log('关闭了打印工具')
              }
            }
        };
    }
}
```
You can also pass in an object type `Objcet`
### Print URL:
If you need to print the specified URL, you can use the following method:
(Ensure that your URL is the same source policy)
HTML:
```
 <button v-print="printObj">Print local range</button>
```
JavaScript:
```
export default {
    data() {
        return {
            printObj: {
              url: 'http://localhost:8080/'
              beforeOpenCallback (vue) {
                console.log('打开之前')
              },
              openCallback (vue) {
                console.log('执行了打印')
              },
              closeCallback (vue) {
                console.log('关闭了打印工具')
              }
            }
        };
    }
}
```
### Print Preview
Support print preview, pass in` preview:true `, All printing methods are supported
#### Print Url Preview:
HTML:
```
 <button v-print="printObj">Print local range</button>
```
JavaScript:
```
export default {
    data() {
        return {
            printObj: {
              url: 'http://localhost:8080/'
              preview: true,
              previewTitle: 'Test Title', // The title of the preview window. The default is æ‰“印预览
              previewBeforeOpenCallback (vue) {
                console.log('正在加载预览窗口')
              },
              previewOpenCallback (vue) {
                console.log('已经加载完预览窗口')
              },
              beforeOpenCallback (vue) {
                console.log('打开之前')
              },
              openCallback (vue) {
                console.log('执行了打印')
              },
              closeCallback (vue) {
                console.log('关闭了打印工具')
              }
            }
        };
    }
}
```
![](2021-05-12-18-28-08.png)
#### Print local range Preview
HTML:
```
 <button v-print="printObj">Print local range</button><div id="loading" v-show="printLoading"></div>
  <div id="printMe" style="background:red;">
        <p>葫芦娃,葫芦娃</p>
        <p>一根藤上七朵花 </p>
        <p>小小树藤是我家 å•¦å•¦å•¦å•¦ </p>
        <p>叮当当咚咚当当 浇不大</p>
        <p> å®å½“当咚咚当当 æ˜¯æˆ‘å®¶</p>
        <p> å•¦å•¦å•¦å•¦</p>
        <p>...</p>
    </div>
```
JavaScript:
```
export default {
    data() {
        return {
           printLoading: true,
            printObj: {
              id: "printMe",
              preview: true,
              previewTitle: 'print Title', // The title of the preview window. The default is æ‰“印预览
              popTitle: 'good print',
              extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
              extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
              previewBeforeOpenCallback (vue) {
                console.log('正在加载预览窗口')
              },
              previewOpenCallback (vue) {
                console.log('已经加载完预览窗口')
              },
              beforeOpenCallback (vue) {
                vue.printLoading = true
                console.log('打开之前')
              },
              openCallback (vue) {
                vue.printLoading = false
                console.log('执行了打印')
              },
              closeCallback (vue) {
                console.log('关闭了打印工具')
              }
            }
        };
    }
}
```
![](2021-05-12-18-28-56.png)
### Print Async Url
Perhaps, your URL is obtained asynchronously. You can use the following method
HTML:
```
 <button v-print="printObj">Print local range</button>
```
JavaScript:
```
export default {
    data() {
        return {
            printObj: {
              asyncUrl (reslove, vue) {
                setTimeout(() => {
                  reslove('http://localhost:8080/')
                }, 2000)
              },
              previewBeforeOpenCallback (vue) {
                console.log('正在加载预览窗口')
              },
              previewOpenCallback (vue) {
                console.log('已经加载完预览窗口')
              },
              beforeOpenCallback (vue) {
                console.log('打开之前')
              },
              openCallback (vue) {
                console.log('执行了打印')
              },
              closeCallback (vue) {
                console.log('关闭了打印工具')
              }
            }
        };
    }
}
```
Finally, use `reslove()` to return your URL
## v-print API
| Parame                    | Explain                                                                                                 | Type          | OptionalValue                                     | DefaultValue |
| ------------------------- | ------------------------------------------------------------------------------------------------------- | ------------- | ------------------------------------------------- | ------------ |
| id                        | Range print ID, required value                                                                          | String        | â€”                                                 | â€”            |
| standard                  | Document type (Print local range only)                                                                  | String        | html5/loose/strict                                | html5        |
| extraHead                 | `<head></head>`Add DOM nodes in the node, and separate multiple nodes with `,` (Print local range only) | String        | â€”                                                 | â€”            |
| extraCss                  | `<link>` New CSS style sheet , and separate multiple nodes with `,`(Print local range only)             | String        | â€”                                                 | -            |
| popTitle                  | `<title></title>` Content of label (Print local range only)                                             | String        | â€”                                                 | -            |
| openCallback              | Call the successful callback function of the printing tool                                              | Function      | Returns the instance of `Vue` called at that time | -            |
| closeCallback             | Close the callback function of printing tool success                                                    | Function      | Returns the instance of `Vue` called at that time | -            |
| beforeOpenCallback        | Callback function before calling printing tool                                                          | Function      | Returns the instance of `Vue` called at that time | -            |
| url                       | Print the specified URL. (It is not allowed to set the ID at the same time)                             | string        | -                                                 | -            |
| asyncUrl                  | Return URL through 'resolve()' and Vue                                                                  | Function      | -                                                 | -            |
| preview                   | Preview tool                                                                                            | Boolean       | -                                                 | false        |
| previewTitle              | Preview tool Title                                                                                      | String        | -                                                 | '打印预览'   |
| previewPrintBtnLabel      | The name of the preview tool button                                                                     | String        | -                                                 | '打印'       |
| zIndex                    | CSS of preview tool: z-index                                                                            | String,Number | -                                                 | 20002        |
| previewBeforeOpenCallback | Callback function before starting preview tool                                                          | Function      | Returns the instance of `Vue`                     | -            |
| previewOpenCallback       | Callback function after fully opening preview tool                                                      | Function      | Returns the instance of `Vue`                     | -            |
| clickMounted       | Click the callback function of the print button                                                    | Function      | Returns the instance of `Vue`                     | -            |
License:
[MIT](http://opensource.org/licenses/MIT)
src/components/Print/vue-print-nb/lib/print.common.js
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
src/components/Print/vue-print-nb/lib/print.umd.js
¶Ô±ÈÐÂÎļþ
ÎļþÌ«´ó
src/components/Print/vue-print-nb/lib/print.umd.min.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
(function(t,e){"object"===typeof exports&&"object"===typeof module?module.exports=e():"function"===typeof define&&define.amd?define([],e):"object"===typeof exports?exports["print"]=e():t["print"]=e()})("undefined"!==typeof self?self:this,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"===typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t["default"]}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s="fb15")}({"00ee":function(t,e,n){var r=n("b622"),o=r("toStringTag"),i={};i[o]="z",t.exports="[object z]"===String(i)},"0366":function(t,e,n){var r=n("1c0b");t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}}},"057f":function(t,e,n){var r=n("fc6a"),o=n("241c").f,i={}.toString,c="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return o(t)}catch(e){return c.slice()}};t.exports.f=function(t){return c&&"[object Window]"==i.call(t)?a(t):o(r(t))}},"06cf":function(t,e,n){var r=n("83ab"),o=n("d1e7"),i=n("5c6c"),c=n("fc6a"),a=n("c04e"),u=n("5135"),s=n("0cfb"),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=c(t),e=a(e,!0),s)try{return f(t,e)}catch(n){}if(u(t,e))return i(!o.f.call(t,e),t[e])}},"0cb2":function(t,e,n){var r=n("7b0b"),o=Math.floor,i="".replace,c=/\$([$&'`]|\d\d?|<[^>]*>)/g,a=/\$([$&'`]|\d\d?)/g;t.exports=function(t,e,n,u,s,f){var l=n+t.length,d=u.length,p=a;return void 0!==s&&(s=r(s),p=c),i.call(f,p,(function(r,i){var c;switch(i.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,n);case"'":return e.slice(l);case"<":c=s[i.slice(1,-1)];break;default:var a=+i;if(0===a)return r;if(a>d){var f=o(a/10);return 0===f?r:f<=d?void 0===u[f-1]?i.charAt(1):u[f-1]+i.charAt(1):r}c=u[a-1]}return void 0===c?"":c}))}},"0cfb":function(t,e,n){var r=n("83ab"),o=n("d039"),i=n("cc12");t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},"14c3":function(t,e,n){var r=n("c6b6"),o=n("9263");t.exports=function(t,e){var n=t.exec;if("function"===typeof n){var i=n.call(t,e);if("object"!==typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},"1be4":function(t,e,n){var r=n("d066");t.exports=r("document","documentElement")},"1c0b":function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},"1d80":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},"1dde":function(t,e,n){var r=n("d039"),o=n("b622"),i=n("2d00"),c=o("species");t.exports=function(t){return i>=51||!r((function(){var e=[],n=e.constructor={};return n[c]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},"23cb":function(t,e,n){var r=n("a691"),o=Math.max,i=Math.min;t.exports=function(t,e){var n=r(t);return n<0?o(n+e,0):i(n,e)}},"23e7":function(t,e,n){var r=n("da84"),o=n("06cf").f,i=n("9112"),c=n("6eeb"),a=n("ce4e"),u=n("e893"),s=n("94ca");t.exports=function(t,e){var n,f,l,d,p,v,b=t.target,y=t.global,h=t.stat;if(f=y?r:h?r[b]||a(b,{}):(r[b]||{}).prototype,f)for(l in e){if(p=e[l],t.noTargetGet?(v=o(f,l),d=v&&v.value):d=f[l],n=s(y?l:b+(h?".":"#")+l,t.forced),!n&&void 0!==d){if(typeof p===typeof d)continue;u(p,d)}(t.sham||d&&d.sham)&&i(p,"sham",!0),c(f,l,p,t)}}},"241c":function(t,e,n){var r=n("ca84"),o=n("7839"),i=o.concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,i)}},"25f0":function(t,e,n){"use strict";var r=n("6eeb"),o=n("825a"),i=n("d039"),c=n("ad6d"),a="toString",u=RegExp.prototype,s=u[a],f=i((function(){return"/a/b"!=s.call({source:"a",flags:"b"})})),l=s.name!=a;(f||l)&&r(RegExp.prototype,a,(function(){var t=o(this),e=String(t.source),n=t.flags,r=String(void 0===n&&t instanceof RegExp&&!("flags"in u)?c.call(t):n);return"/"+e+"/"+r}),{unsafe:!0})},2626:function(t,e,n){"use strict";var r=n("d066"),o=n("9bf2"),i=n("b622"),c=n("83ab"),a=i("species");t.exports=function(t){var e=r(t),n=o.f;c&&e&&!e[a]&&n(e,a,{configurable:!0,get:function(){return this}})}},"2d00":function(t,e,n){var r,o,i=n("da84"),c=n("342f"),a=i.process,u=a&&a.versions,s=u&&u.v8;s?(r=s.split("."),o=r[0]+r[1]):c&&(r=c.match(/Edge\/(\d+)/),(!r||r[1]>=74)&&(r=c.match(/Chrome\/(\d+)/),r&&(o=r[1]))),t.exports=o&&+o},"342f":function(t,e,n){var r=n("d066");t.exports=r("navigator","userAgent")||""},"37e8":function(t,e,n){var r=n("83ab"),o=n("9bf2"),i=n("825a"),c=n("df75");t.exports=r?Object.defineProperties:function(t,e){i(t);var n,r=c(e),a=r.length,u=0;while(a>u)o.f(t,n=r[u++],e[n]);return t}},"3bbe":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t}},"3ca3":function(t,e,n){"use strict";var r=n("6547").charAt,o=n("69f3"),i=n("7dd0"),c="String Iterator",a=o.set,u=o.getterFor(c);i(String,"String",(function(t){a(this,{type:c,string:String(t),index:0})}),(function(){var t,e=u(this),n=e.string,o=e.index;return o>=n.length?{value:void 0,done:!0}:(t=r(n,o),e.index+=t.length,{value:t,done:!1})}))},"3f8c":function(t,e){t.exports={}},"428f":function(t,e,n){var r=n("da84");t.exports=r},"44ad":function(t,e,n){var r=n("d039"),o=n("c6b6"),i="".split;t.exports=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==o(t)?i.call(t,""):Object(t)}:Object},"44d2":function(t,e,n){var r=n("b622"),o=n("7c73"),i=n("9bf2"),c=r("unscopables"),a=Array.prototype;void 0==a[c]&&i.f(a,c,{configurable:!0,value:o(null)}),t.exports=function(t){a[c][t]=!0}},"44e7":function(t,e,n){var r=n("861d"),o=n("c6b6"),i=n("b622"),c=i("match");t.exports=function(t){var e;return r(t)&&(void 0!==(e=t[c])?!!e:"RegExp"==o(t))}},4930:function(t,e,n){var r=n("d039");t.exports=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())}))},"4d63":function(t,e,n){var r=n("83ab"),o=n("da84"),i=n("94ca"),c=n("7156"),a=n("9bf2").f,u=n("241c").f,s=n("44e7"),f=n("ad6d"),l=n("9f7f"),d=n("6eeb"),p=n("d039"),v=n("69f3").set,b=n("2626"),y=n("b622"),h=y("match"),g=o.RegExp,m=g.prototype,x=/a/g,w=/a/g,S=new g(x)!==x,E=l.UNSUPPORTED_Y,O=r&&i("RegExp",!S||E||p((function(){return w[h]=!1,g(x)!=x||g(w)==w||"/a/i"!=g(x,"i")})));if(O){var A=function(t,e){var n,r=this instanceof A,o=s(t),i=void 0===e;if(!r&&o&&t.constructor===A&&i)return t;S?o&&!i&&(t=t.source):t instanceof A&&(i&&(e=f.call(t)),t=t.source),E&&(n=!!e&&e.indexOf("y")>-1,n&&(e=e.replace(/y/g,"")));var a=c(S?new g(t,e):g(t,e),r?this:m,A);return E&&n&&v(a,{sticky:n}),a},k=function(t){t in A||a(A,t,{configurable:!0,get:function(){return g[t]},set:function(e){g[t]=e}})},T=u(g),C=0;while(T.length>C)k(T[C++]);m.constructor=A,A.prototype=m,d(o,"RegExp",A)}b("RegExp")},"4d64":function(t,e,n){var r=n("fc6a"),o=n("50c4"),i=n("23cb"),c=function(t){return function(e,n,c){var a,u=r(e),s=o(u.length),f=i(c,s);if(t&&n!=n){while(s>f)if(a=u[f++],a!=a)return!0}else for(;s>f;f++)if((t||f in u)&&u[f]===n)return t||f||0;return!t&&-1}};t.exports={includes:c(!0),indexOf:c(!1)}},"50c4":function(t,e,n){var r=n("a691"),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},5135:function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},5319:function(t,e,n){"use strict";var r=n("d784"),o=n("825a"),i=n("50c4"),c=n("a691"),a=n("1d80"),u=n("8aa5"),s=n("0cb2"),f=n("14c3"),l=Math.max,d=Math.min,p=function(t){return void 0===t?t:String(t)};r("replace",2,(function(t,e,n,r){var v=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,b=r.REPLACE_KEEPS_$0,y=v?"$":"$0";return[function(n,r){var o=a(this),i=void 0==n?void 0:n[t];return void 0!==i?i.call(n,o,r):e.call(String(o),n,r)},function(t,r){if(!v&&b||"string"===typeof r&&-1===r.indexOf(y)){var a=n(e,t,this,r);if(a.done)return a.value}var h=o(t),g=String(this),m="function"===typeof r;m||(r=String(r));var x=h.global;if(x){var w=h.unicode;h.lastIndex=0}var S=[];while(1){var E=f(h,g);if(null===E)break;if(S.push(E),!x)break;var O=String(E[0]);""===O&&(h.lastIndex=u(g,i(h.lastIndex),w))}for(var A="",k=0,T=0;T<S.length;T++){E=S[T];for(var C=String(E[0]),P=l(d(c(E.index),g.length),0),j=[],I=1;I<E.length;I++)j.push(p(E[I]));var B=E.groups;if(m){var L=[C].concat(j,P,g);void 0!==B&&L.push(B);var R=String(r.apply(void 0,L))}else R=s(C,g,P,j,B,r);P>=k&&(A+=g.slice(k,P)+R,k=P+C.length)}return A+g.slice(k)}]}))},5692:function(t,e,n){var r=n("c430"),o=n("c6cd");(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.9.0",mode:r?"pure":"global",copyright:"© 2021 Denis Pushkarev (zloirock.ru)"})},"56ef":function(t,e,n){var r=n("d066"),o=n("241c"),i=n("7418"),c=n("825a");t.exports=r("Reflect","ownKeys")||function(t){var e=o.f(c(t)),n=i.f;return n?e.concat(n(t)):e}},"5c6c":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},6547:function(t,e,n){var r=n("a691"),o=n("1d80"),i=function(t){return function(e,n){var i,c,a=String(o(e)),u=r(n),s=a.length;return u<0||u>=s?t?"":void 0:(i=a.charCodeAt(u),i<55296||i>56319||u+1===s||(c=a.charCodeAt(u+1))<56320||c>57343?t?a.charAt(u):i:t?a.slice(u,u+2):c-56320+(i-55296<<10)+65536)}};t.exports={codeAt:i(!1),charAt:i(!0)}},"65f0":function(t,e,n){var r=n("861d"),o=n("e8b5"),i=n("b622"),c=i("species");t.exports=function(t,e){var n;return o(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!o(n.prototype)?r(n)&&(n=n[c],null===n&&(n=void 0)):n=void 0),new(void 0===n?Array:n)(0===e?0:e)}},"69f3":function(t,e,n){var r,o,i,c=n("7f9a"),a=n("da84"),u=n("861d"),s=n("9112"),f=n("5135"),l=n("c6cd"),d=n("f772"),p=n("d012"),v=a.WeakMap,b=function(t){return i(t)?o(t):r(t,{})},y=function(t){return function(e){var n;if(!u(e)||(n=o(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return n}};if(c){var h=l.state||(l.state=new v),g=h.get,m=h.has,x=h.set;r=function(t,e){return e.facade=t,x.call(h,t,e),e},o=function(t){return g.call(h,t)||{}},i=function(t){return m.call(h,t)}}else{var w=d("state");p[w]=!0,r=function(t,e){return e.facade=t,s(t,w,e),e},o=function(t){return f(t,w)?t[w]:{}},i=function(t){return f(t,w)}}t.exports={set:r,get:o,has:i,enforce:b,getterFor:y}},"6eeb":function(t,e,n){var r=n("da84"),o=n("9112"),i=n("5135"),c=n("ce4e"),a=n("8925"),u=n("69f3"),s=u.get,f=u.enforce,l=String(String).split("String");(t.exports=function(t,e,n,a){var u,s=!!a&&!!a.unsafe,d=!!a&&!!a.enumerable,p=!!a&&!!a.noTargetGet;"function"==typeof n&&("string"!=typeof e||i(n,"name")||o(n,"name",e),u=f(n),u.source||(u.source=l.join("string"==typeof e?e:""))),t!==r?(s?!p&&t[e]&&(d=!0):delete t[e],d?t[e]=n:o(t,e,n)):d?t[e]=n:c(e,n)})(Function.prototype,"toString",(function(){return"function"==typeof this&&s(this).source||a(this)}))},7156:function(t,e,n){var r=n("861d"),o=n("d2bb");t.exports=function(t,e,n){var i,c;return o&&"function"==typeof(i=e.constructor)&&i!==n&&r(c=i.prototype)&&c!==n.prototype&&o(t,c),t}},7418:function(t,e){e.f=Object.getOwnPropertySymbols},"746f":function(t,e,n){var r=n("428f"),o=n("5135"),i=n("e538"),c=n("9bf2").f;t.exports=function(t){var e=r.Symbol||(r.Symbol={});o(e,t)||c(e,t,{value:i.f(t)})}},7839:function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},"7b0b":function(t,e,n){var r=n("1d80");t.exports=function(t){return Object(r(t))}},"7c73":function(t,e,n){var r,o=n("825a"),i=n("37e8"),c=n("7839"),a=n("d012"),u=n("1be4"),s=n("cc12"),f=n("f772"),l=">",d="<",p="prototype",v="script",b=f("IE_PROTO"),y=function(){},h=function(t){return d+v+l+t+d+"/"+v+l},g=function(t){t.write(h("")),t.close();var e=t.parentWindow.Object;return t=null,e},m=function(){var t,e=s("iframe"),n="java"+v+":";return e.style.display="none",u.appendChild(e),e.src=String(n),t=e.contentWindow.document,t.open(),t.write(h("document.F=Object")),t.close(),t.F},x=function(){try{r=document.domain&&new ActiveXObject("htmlfile")}catch(e){}x=r?g(r):m();var t=c.length;while(t--)delete x[p][c[t]];return x()};a[b]=!0,t.exports=Object.create||function(t,e){var n;return null!==t?(y[p]=o(t),n=new y,y[p]=null,n[b]=t):n=x(),void 0===e?n:i(n,e)}},"7dd0":function(t,e,n){"use strict";var r=n("23e7"),o=n("9ed3"),i=n("e163"),c=n("d2bb"),a=n("d44e"),u=n("9112"),s=n("6eeb"),f=n("b622"),l=n("c430"),d=n("3f8c"),p=n("ae93"),v=p.IteratorPrototype,b=p.BUGGY_SAFARI_ITERATORS,y=f("iterator"),h="keys",g="values",m="entries",x=function(){return this};t.exports=function(t,e,n,f,p,w,S){o(n,e,f);var E,O,A,k=function(t){if(t===p&&I)return I;if(!b&&t in P)return P[t];switch(t){case h:return function(){return new n(this,t)};case g:return function(){return new n(this,t)};case m:return function(){return new n(this,t)}}return function(){return new n(this)}},T=e+" Iterator",C=!1,P=t.prototype,j=P[y]||P["@@iterator"]||p&&P[p],I=!b&&j||k(p),B="Array"==e&&P.entries||j;if(B&&(E=i(B.call(new t)),v!==Object.prototype&&E.next&&(l||i(E)===v||(c?c(E,v):"function"!=typeof E[y]&&u(E,y,x)),a(E,T,!0,!0),l&&(d[T]=x))),p==g&&j&&j.name!==g&&(C=!0,I=function(){return j.call(this)}),l&&!S||P[y]===I||u(P,y,I),d[e]=I,p)if(O={values:k(g),keys:w?I:k(h),entries:k(m)},S)for(A in O)(b||C||!(A in P))&&s(P,A,O[A]);else r({target:e,proto:!0,forced:b||C},O);return O}},"7f9a":function(t,e,n){var r=n("da84"),o=n("8925"),i=r.WeakMap;t.exports="function"===typeof i&&/native code/.test(o(i))},"825a":function(t,e,n){var r=n("861d");t.exports=function(t){if(!r(t))throw TypeError(String(t)+" is not an object");return t}},"83ab":function(t,e,n){var r=n("d039");t.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(t,e,n){"use strict";var r=n("c04e"),o=n("9bf2"),i=n("5c6c");t.exports=function(t,e,n){var c=r(e);c in t?o.f(t,c,i(0,n)):t[c]=n}},"861d":function(t,e){t.exports=function(t){return"object"===typeof t?null!==t:"function"===typeof t}},8875:function(t,e,n){var r,o,i;(function(n,c){o=[],r=c,i="function"===typeof r?r.apply(e,o):r,void 0===i||(t.exports=i)})("undefined"!==typeof self&&self,(function(){function t(){var e=Object.getOwnPropertyDescriptor(document,"currentScript");if(!e&&"currentScript"in document&&document.currentScript)return document.currentScript;if(e&&e.get!==t&&document.currentScript)return document.currentScript;try{throw new Error}catch(p){var n,r,o,i=/.*at [^(]*\((.*):(.+):(.+)\)$/gi,c=/@([^@]*):(\d+):(\d+)\s*$/gi,a=i.exec(p.stack)||c.exec(p.stack),u=a&&a[1]||!1,s=a&&a[2]||!1,f=document.location.href.replace(document.location.hash,""),l=document.getElementsByTagName("script");u===f&&(n=document.documentElement.outerHTML,r=new RegExp("(?:[^\\n]+?\\n){0,"+(s-2)+"}[^<]*<script>([\\d\\D]*?)<\\/script>[\\d\\D]*","i"),o=n.replace(r,"$1").trim());for(var d=0;d<l.length;d++){if("interactive"===l[d].readyState)return l[d];if(l[d].src===u)return l[d];if(u===f&&l[d].innerHTML&&l[d].innerHTML.trim()===o)return l[d]}return null}}return t}))},8925:function(t,e,n){var r=n("c6cd"),o=Function.toString;"function"!=typeof r.inspectSource&&(r.inspectSource=function(t){return o.call(t)}),t.exports=r.inspectSource},"8aa5":function(t,e,n){"use strict";var r=n("6547").charAt;t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},"90e3":function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++n+r).toString(36)}},9112:function(t,e,n){var r=n("83ab"),o=n("9bf2"),i=n("5c6c");t.exports=r?function(t,e,n){return o.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},9263:function(t,e,n){"use strict";var r=n("ad6d"),o=n("9f7f"),i=RegExp.prototype.exec,c=String.prototype.replace,a=i,u=function(){var t=/a/,e=/b*/g;return i.call(t,"a"),i.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),s=o.UNSUPPORTED_Y||o.BROKEN_CARET,f=void 0!==/()??/.exec("")[1],l=u||f||s;l&&(a=function(t){var e,n,o,a,l=this,d=s&&l.sticky,p=r.call(l),v=l.source,b=0,y=t;return d&&(p=p.replace("y",""),-1===p.indexOf("g")&&(p+="g"),y=String(t).slice(l.lastIndex),l.lastIndex>0&&(!l.multiline||l.multiline&&"\n"!==t[l.lastIndex-1])&&(v="(?: "+v+")",y=" "+y,b++),n=new RegExp("^(?:"+v+")",p)),f&&(n=new RegExp("^"+v+"$(?!\\s)",p)),u&&(e=l.lastIndex),o=i.call(d?n:l,y),d?o?(o.input=o.input.slice(b),o[0]=o[0].slice(b),o.index=l.lastIndex,l.lastIndex+=o[0].length):l.lastIndex=0:u&&o&&(l.lastIndex=l.global?o.index+o[0].length:e),f&&o&&o.length>1&&c.call(o[0],n,(function(){for(a=1;a<arguments.length-2;a++)void 0===arguments[a]&&(o[a]=void 0)})),o}),t.exports=a},"94ca":function(t,e,n){var r=n("d039"),o=/#|\.prototype\./,i=function(t,e){var n=a[c(t)];return n==s||n!=u&&("function"==typeof e?r(e):!!e)},c=i.normalize=function(t){return String(t).replace(o,".").toLowerCase()},a=i.data={},u=i.NATIVE="N",s=i.POLYFILL="P";t.exports=i},"99af":function(t,e,n){"use strict";var r=n("23e7"),o=n("d039"),i=n("e8b5"),c=n("861d"),a=n("7b0b"),u=n("50c4"),s=n("8418"),f=n("65f0"),l=n("1dde"),d=n("b622"),p=n("2d00"),v=d("isConcatSpreadable"),b=9007199254740991,y="Maximum allowed index exceeded",h=p>=51||!o((function(){var t=[];return t[v]=!1,t.concat()[0]!==t})),g=l("concat"),m=function(t){if(!c(t))return!1;var e=t[v];return void 0!==e?!!e:i(t)},x=!h||!g;r({target:"Array",proto:!0,forced:x},{concat:function(t){var e,n,r,o,i,c=a(this),l=f(c,0),d=0;for(e=-1,r=arguments.length;e<r;e++)if(i=-1===e?c:arguments[e],m(i)){if(o=u(i.length),d+o>b)throw TypeError(y);for(n=0;n<o;n++,d++)n in i&&s(l,d,i[n])}else{if(d>=b)throw TypeError(y);s(l,d++,i)}return l.length=d,l}})},"9bf2":function(t,e,n){var r=n("83ab"),o=n("0cfb"),i=n("825a"),c=n("c04e"),a=Object.defineProperty;e.f=r?a:function(t,e,n){if(i(t),e=c(e,!0),i(n),o)try{return a(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported");return"value"in n&&(t[e]=n.value),t}},"9ed3":function(t,e,n){"use strict";var r=n("ae93").IteratorPrototype,o=n("7c73"),i=n("5c6c"),c=n("d44e"),a=n("3f8c"),u=function(){return this};t.exports=function(t,e,n){var s=e+" Iterator";return t.prototype=o(r,{next:i(1,n)}),c(t,s,!1,!0),a[s]=u,t}},"9f7f":function(t,e,n){"use strict";var r=n("d039");function o(t,e){return RegExp(t,e)}e.UNSUPPORTED_Y=r((function(){var t=o("a","y");return t.lastIndex=2,null!=t.exec("abcd")})),e.BROKEN_CARET=r((function(){var t=o("^r","gy");return t.lastIndex=2,null!=t.exec("str")}))},a4d3:function(t,e,n){"use strict";var r=n("23e7"),o=n("da84"),i=n("d066"),c=n("c430"),a=n("83ab"),u=n("4930"),s=n("fdbf"),f=n("d039"),l=n("5135"),d=n("e8b5"),p=n("861d"),v=n("825a"),b=n("7b0b"),y=n("fc6a"),h=n("c04e"),g=n("5c6c"),m=n("7c73"),x=n("df75"),w=n("241c"),S=n("057f"),E=n("7418"),O=n("06cf"),A=n("9bf2"),k=n("d1e7"),T=n("9112"),C=n("6eeb"),P=n("5692"),j=n("f772"),I=n("d012"),B=n("90e3"),L=n("b622"),R=n("e538"),_=n("746f"),M=n("d44e"),N=n("69f3"),U=n("b727").forEach,D=j("hidden"),H="Symbol",$="prototype",q=L("toPrimitive"),F=N.set,W=N.getterFor(H),G=Object[$],z=o.Symbol,V=i("JSON","stringify"),Y=O.f,X=A.f,K=S.f,J=k.f,Q=P("symbols"),Z=P("op-symbols"),tt=P("string-to-symbol-registry"),et=P("symbol-to-string-registry"),nt=P("wks"),rt=o.QObject,ot=!rt||!rt[$]||!rt[$].findChild,it=a&&f((function(){return 7!=m(X({},"a",{get:function(){return X(this,"a",{value:7}).a}})).a}))?function(t,e,n){var r=Y(G,e);r&&delete G[e],X(t,e,n),r&&t!==G&&X(G,e,r)}:X,ct=function(t,e){var n=Q[t]=m(z[$]);return F(n,{type:H,tag:t,description:e}),a||(n.description=e),n},at=s?function(t){return"symbol"==typeof t}:function(t){return Object(t)instanceof z},ut=function(t,e,n){t===G&&ut(Z,e,n),v(t);var r=h(e,!0);return v(n),l(Q,r)?(n.enumerable?(l(t,D)&&t[D][r]&&(t[D][r]=!1),n=m(n,{enumerable:g(0,!1)})):(l(t,D)||X(t,D,g(1,{})),t[D][r]=!0),it(t,r,n)):X(t,r,n)},st=function(t,e){v(t);var n=y(e),r=x(n).concat(vt(n));return U(r,(function(e){a&&!lt.call(n,e)||ut(t,e,n[e])})),t},ft=function(t,e){return void 0===e?m(t):st(m(t),e)},lt=function(t){var e=h(t,!0),n=J.call(this,e);return!(this===G&&l(Q,e)&&!l(Z,e))&&(!(n||!l(this,e)||!l(Q,e)||l(this,D)&&this[D][e])||n)},dt=function(t,e){var n=y(t),r=h(e,!0);if(n!==G||!l(Q,r)||l(Z,r)){var o=Y(n,r);return!o||!l(Q,r)||l(n,D)&&n[D][r]||(o.enumerable=!0),o}},pt=function(t){var e=K(y(t)),n=[];return U(e,(function(t){l(Q,t)||l(I,t)||n.push(t)})),n},vt=function(t){var e=t===G,n=K(e?Z:y(t)),r=[];return U(n,(function(t){!l(Q,t)||e&&!l(G,t)||r.push(Q[t])})),r};if(u||(z=function(){if(this instanceof z)throw TypeError("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,e=B(t),n=function(t){this===G&&n.call(Z,t),l(this,D)&&l(this[D],e)&&(this[D][e]=!1),it(this,e,g(1,t))};return a&&ot&&it(G,e,{configurable:!0,set:n}),ct(e,t)},C(z[$],"toString",(function(){return W(this).tag})),C(z,"withoutSetter",(function(t){return ct(B(t),t)})),k.f=lt,A.f=ut,O.f=dt,w.f=S.f=pt,E.f=vt,R.f=function(t){return ct(L(t),t)},a&&(X(z[$],"description",{configurable:!0,get:function(){return W(this).description}}),c||C(G,"propertyIsEnumerable",lt,{unsafe:!0}))),r({global:!0,wrap:!0,forced:!u,sham:!u},{Symbol:z}),U(x(nt),(function(t){_(t)})),r({target:H,stat:!0,forced:!u},{for:function(t){var e=String(t);if(l(tt,e))return tt[e];var n=z(e);return tt[e]=n,et[n]=e,n},keyFor:function(t){if(!at(t))throw TypeError(t+" is not a symbol");if(l(et,t))return et[t]},useSetter:function(){ot=!0},useSimple:function(){ot=!1}}),r({target:"Object",stat:!0,forced:!u,sham:!a},{create:ft,defineProperty:ut,defineProperties:st,getOwnPropertyDescriptor:dt}),r({target:"Object",stat:!0,forced:!u},{getOwnPropertyNames:pt,getOwnPropertySymbols:vt}),r({target:"Object",stat:!0,forced:f((function(){E.f(1)}))},{getOwnPropertySymbols:function(t){return E.f(b(t))}}),V){var bt=!u||f((function(){var t=z();return"[null]"!=V([t])||"{}"!=V({a:t})||"{}"!=V(Object(t))}));r({target:"JSON",stat:!0,forced:bt},{stringify:function(t,e,n){var r,o=[t],i=1;while(arguments.length>i)o.push(arguments[i++]);if(r=e,(p(e)||void 0!==t)&&!at(t))return d(e)||(e=function(t,e){if("function"==typeof r&&(e=r.call(this,t,e)),!at(e))return e}),o[1]=e,V.apply(null,o)}})}z[$][q]||T(z[$],q,z[$].valueOf),M(z,H),I[D]=!0},a691:function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},ac1f:function(t,e,n){"use strict";var r=n("23e7"),o=n("9263");r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},ad6d:function(t,e,n){"use strict";var r=n("825a");t.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},ae93:function(t,e,n){"use strict";var r,o,i,c=n("d039"),a=n("e163"),u=n("9112"),s=n("5135"),f=n("b622"),l=n("c430"),d=f("iterator"),p=!1,v=function(){return this};[].keys&&(i=[].keys(),"next"in i?(o=a(a(i)),o!==Object.prototype&&(r=o)):p=!0);var b=void 0==r||c((function(){var t={};return r[d].call(t)!==t}));b&&(r={}),l&&!b||s(r,d)||u(r,d,v),t.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},b041:function(t,e,n){"use strict";var r=n("00ee"),o=n("f5df");t.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},b622:function(t,e,n){var r=n("da84"),o=n("5692"),i=n("5135"),c=n("90e3"),a=n("4930"),u=n("fdbf"),s=o("wks"),f=r.Symbol,l=u?f:f&&f.withoutSetter||c;t.exports=function(t){return i(s,t)||(a&&i(f,t)?s[t]=f[t]:s[t]=l("Symbol."+t)),s[t]}},b727:function(t,e,n){var r=n("0366"),o=n("44ad"),i=n("7b0b"),c=n("50c4"),a=n("65f0"),u=[].push,s=function(t){var e=1==t,n=2==t,s=3==t,f=4==t,l=6==t,d=7==t,p=5==t||l;return function(v,b,y,h){for(var g,m,x=i(v),w=o(x),S=r(b,y,3),E=c(w.length),O=0,A=h||a,k=e?A(v,E):n||d?A(v,0):void 0;E>O;O++)if((p||O in w)&&(g=w[O],m=S(g,O,x),t))if(e)k[O]=m;else if(m)switch(t){case 3:return!0;case 5:return g;case 6:return O;case 2:u.call(k,g)}else switch(t){case 4:return!1;case 7:u.call(k,g)}return l?-1:s||f?f:k}};t.exports={forEach:s(0),map:s(1),filter:s(2),some:s(3),every:s(4),find:s(5),findIndex:s(6),filterOut:s(7)}},c04e:function(t,e,n){var r=n("861d");t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},c430:function(t,e){t.exports=!1},c6b6:function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},c6cd:function(t,e,n){var r=n("da84"),o=n("ce4e"),i="__core-js_shared__",c=r[i]||o(i,{});t.exports=c},c8ba:function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"===typeof window&&(n=window)}t.exports=n},ca84:function(t,e,n){var r=n("5135"),o=n("fc6a"),i=n("4d64").indexOf,c=n("d012");t.exports=function(t,e){var n,a=o(t),u=0,s=[];for(n in a)!r(c,n)&&r(a,n)&&s.push(n);while(e.length>u)r(a,n=e[u++])&&(~i(s,n)||s.push(n));return s}},cc12:function(t,e,n){var r=n("da84"),o=n("861d"),i=r.document,c=o(i)&&o(i.createElement);t.exports=function(t){return c?i.createElement(t):{}}},ce4e:function(t,e,n){var r=n("da84"),o=n("9112");t.exports=function(t,e){try{o(r,t,e)}catch(n){r[t]=e}return e}},d012:function(t,e){t.exports={}},d039:function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},d066:function(t,e,n){var r=n("428f"),o=n("da84"),i=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t])||i(o[t]):r[t]&&r[t][e]||o[t]&&o[t][e]}},d1e7:function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},d28b:function(t,e,n){var r=n("746f");r("iterator")},d2bb:function(t,e,n){var r=n("825a"),o=n("3bbe");t.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,n={};try{t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set,t.call(n,[]),e=n instanceof Array}catch(i){}return function(n,i){return r(n),o(i),e?t.call(n,i):n.__proto__=i,n}}():void 0)},d3b7:function(t,e,n){var r=n("00ee"),o=n("6eeb"),i=n("b041");r||o(Object.prototype,"toString",i,{unsafe:!0})},d44e:function(t,e,n){var r=n("9bf2").f,o=n("5135"),i=n("b622"),c=i("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,c)&&r(t,c,{configurable:!0,value:e})}},d784:function(t,e,n){"use strict";n("ac1f");var r=n("6eeb"),o=n("d039"),i=n("b622"),c=n("9263"),a=n("9112"),u=i("species"),s=!o((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")})),f=function(){return"$0"==="a".replace(/./,"$0")}(),l=i("replace"),d=function(){return!!/./[l]&&""===/./[l]("a","$0")}(),p=!o((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2!==n.length||"a"!==n[0]||"b"!==n[1]}));t.exports=function(t,e,n,l){var v=i(t),b=!o((function(){var e={};return e[v]=function(){return 7},7!=""[t](e)})),y=b&&!o((function(){var e=!1,n=/a/;return"split"===t&&(n={},n.constructor={},n.constructor[u]=function(){return n},n.flags="",n[v]=/./[v]),n.exec=function(){return e=!0,null},n[v](""),!e}));if(!b||!y||"replace"===t&&(!s||!f||d)||"split"===t&&!p){var h=/./[v],g=n(v,""[t],(function(t,e,n,r,o){return e.exec===c?b&&!o?{done:!0,value:h.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}}),{REPLACE_KEEPS_$0:f,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:d}),m=g[0],x=g[1];r(String.prototype,t,m),r(RegExp.prototype,v,2==e?function(t,e){return x.call(t,this,e)}:function(t){return x.call(t,this)})}l&&a(RegExp.prototype[v],"sham",!0)}},da84:function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||Function("return this")()}).call(this,n("c8ba"))},ddb0:function(t,e,n){var r=n("da84"),o=n("fdbc"),i=n("e260"),c=n("9112"),a=n("b622"),u=a("iterator"),s=a("toStringTag"),f=i.values;for(var l in o){var d=r[l],p=d&&d.prototype;if(p){if(p[u]!==f)try{c(p,u,f)}catch(b){p[u]=f}if(p[s]||c(p,s,l),o[l])for(var v in i)if(p[v]!==i[v])try{c(p,v,i[v])}catch(b){p[v]=i[v]}}}},df75:function(t,e,n){var r=n("ca84"),o=n("7839");t.exports=Object.keys||function(t){return r(t,o)}},e01a:function(t,e,n){"use strict";var r=n("23e7"),o=n("83ab"),i=n("da84"),c=n("5135"),a=n("861d"),u=n("9bf2").f,s=n("e893"),f=i.Symbol;if(o&&"function"==typeof f&&(!("description"in f.prototype)||void 0!==f().description)){var l={},d=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof d?new f(t):void 0===t?f():f(t);return""===t&&(l[e]=!0),e};s(d,f);var p=d.prototype=f.prototype;p.constructor=d;var v=p.toString,b="Symbol(test)"==String(f("test")),y=/^Symbol\((.*)\)[^)]+$/;u(p,"description",{configurable:!0,get:function(){var t=a(this)?this.valueOf():this,e=v.call(t);if(c(l,t))return"";var n=b?e.slice(7,-1):e.replace(y,"$1");return""===n?void 0:n}}),r({global:!0,forced:!0},{Symbol:d})}},e163:function(t,e,n){var r=n("5135"),o=n("7b0b"),i=n("f772"),c=n("e177"),a=i("IE_PROTO"),u=Object.prototype;t.exports=c?Object.getPrototypeOf:function(t){return t=o(t),r(t,a)?t[a]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},e177:function(t,e,n){var r=n("d039");t.exports=!r((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},e260:function(t,e,n){"use strict";var r=n("fc6a"),o=n("44d2"),i=n("3f8c"),c=n("69f3"),a=n("7dd0"),u="Array Iterator",s=c.set,f=c.getterFor(u);t.exports=a(Array,"Array",(function(t,e){s(this,{type:u,target:r(t),index:0,kind:e})}),(function(){var t=f(this),e=t.target,n=t.kind,r=t.index++;return!e||r>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:e[r],done:!1}:{value:[r,e[r]],done:!1}}),"values"),i.Arguments=i.Array,o("keys"),o("values"),o("entries")},e538:function(t,e,n){var r=n("b622");e.f=r},e893:function(t,e,n){var r=n("5135"),o=n("56ef"),i=n("06cf"),c=n("9bf2");t.exports=function(t,e){for(var n=o(e),a=c.f,u=i.f,s=0;s<n.length;s++){var f=n[s];r(t,f)||a(t,f,u(e,f))}}},e8b5:function(t,e,n){var r=n("c6b6");t.exports=Array.isArray||function(t){return"Array"==r(t)}},f5df:function(t,e,n){var r=n("00ee"),o=n("c6b6"),i=n("b622"),c=i("toStringTag"),a="Arguments"==o(function(){return arguments}()),u=function(t,e){try{return t[e]}catch(n){}};t.exports=r?o:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=u(e=Object(t),c))?n:a?o(e):"Object"==(r=o(e))&&"function"==typeof e.callee?"Arguments":r}},f772:function(t,e,n){var r=n("5692"),o=n("90e3"),i=r("keys");t.exports=function(t){return i[t]||(i[t]=o(t))}},fb15:function(t,e,n){"use strict";if(n.r(e),"undefined"!==typeof window){var r=window.document.currentScript,o=n("8875");r=o(),"currentScript"in document||Object.defineProperty(document,"currentScript",{get:o});var i=r&&r.src.match(/(.+\/)[^/]+\.js(\?.*)?$/);i&&(n.p=i[1])}n("a4d3"),n("e01a"),n("d3b7"),n("d28b"),n("3ca3"),n("ddb0");function c(t){return c="function"===typeof Symbol&&"symbol"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},c(t)}n("5319"),n("ac1f"),n("4d63"),n("25f0");function a(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function u(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}function s(t,e,n){return e&&u(t.prototype,e),n&&u(t,n),t}n("99af");var f=function(){return!(!window.ActiveXobject&&!("ActiveXObject"in window))},l=function(){return!!/Trident\/7\./.test(navigator.userAgent)},d=function(t){return f()||l()?t.removeNode(!0):t.remove(),t},p=function(){function t(e){a(this,t),this.standards={strict:"strict",loose:"loose",html5:"html5"},this.previewBody=null,this.close=null,this.previewBodyUtilPrintBtn=null,this.selectArray=[],this.counter=0,this.settings={standard:this.standards.html5},Object.assign(this.settings,e),this.init()}return s(t,[{key:"init",value:function(){this.counter++,this.settings.id="printArea_".concat(this.counter);var t="";this.settings.url&&!this.settings.asyncUrl&&(t=this.settings.url);var e=this;if(this.settings.asyncUrl)e.settings.asyncUrl((function(t){var n=e.getPrintWindow(t);e.settings.preview?e.previewIfrmaeLoad():e.print(n)}),e.settings.vue);else{var n=this.getPrintWindow(t);this.settings.url||this.write(n.doc),this.settings.preview?this.previewIfrmaeLoad():this.print(n)}}},{key:"addEvent",value:function(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n}},{key:"previewIfrmaeLoad",value:function(){var t=document.getElementById("vue-pirnt-nb-previewBox");if(t){var e=this,n=t.querySelector("iframe");this.settings.previewBeforeOpenCallback(),this.addEvent(n,"load",(function(){e.previewBoxShow(),e.removeCanvasImg(),e.settings.previewOpenCallback()})),this.addEvent(t.querySelector(".previewBodyUtilPrintBtn"),"click",(function(){e.settings.beforeOpenCallback(),e.settings.openCallback(),n.contentWindow.print(),e.settings.closeCallback()}))}}},{key:"removeCanvasImg",value:function(){var t=this;try{if(t.elsdom)for(var e=t.elsdom.querySelectorAll(".canvasImg"),n=0;n<e.length;n++)d(e[n])}catch(r){console.log(r)}}},{key:"print",value:function(t){var e=this,n=document.getElementById(this.settings.id)||t.f,r=document.getElementById(this.settings.id).contentWindow||t.f.contentWindow,o=function(){r.focus(),e.settings.openCallback(),r.print(),d(n),e.settings.closeCallback(),e.removeCanvasImg()};e.settings.beforeOpenCallback(),e.addEvent(n,"load",(function(){o()}))}},{key:"write",value:function(t){t.open(),t.write("".concat(this.docType(),"<html>").concat(this.getHead()).concat(this.getBody(),"</html>")),t.close()}},{key:"docType",value:function(){if(this.settings.standard===this.standards.html5)return"<!DOCTYPE html>";var t=this.settings.standard===this.standards.loose?" Transitional":"",e=this.settings.standard===this.standards.loose?"loose":"strict";return'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01'.concat(t,'//EN" "http://www.w3.org/TR/html4/').concat(e,'.dtd">')}},{key:"getHead",value:function(){var t="",e="",n="";this.settings.extraHead&&this.settings.extraHead.replace(/([^,]+)/g,(function(e){t+=e})),[].forEach.call(document.querySelectorAll("link"),(function(t){t.href.indexOf(".css")>=0&&(e+='<link type="text/css" rel="stylesheet" href="'.concat(t.href,'" >'))}));var r=document.styleSheets;if(r&&r.length>0)for(var o=0;o<r.length;o++)try{if(r[o].cssRules||r[o].rules)for(var i=r[o].cssRules||r[o].rules,c=0;c<i.length;c++)n+=i[c].cssText}catch(a){console.log(r[o].href+a)}return this.settings.extraCss&&this.settings.extraCss.replace(/([^,\s]+)/g,(function(t){e+='<link type="text/css" rel="stylesheet" href="'.concat(t,'">')})),"<head><title>".concat(this.settings.popTitle,"</title>").concat(t).concat(e,'<style type="text/css">').concat(n,"</style></head>")}},{key:"getBody",value:function(){var t=this.settings.ids;t=t.replace(new RegExp("#","g"),""),this.elsdom=this.beforeHanler(document.getElementById(t));var e=this.getFormData(this.elsdom),n=e.outerHTML;return"<body>"+n+"</body>"}},{key:"beforeHanler",value:function(t){for(var e=t.querySelectorAll("canvas"),n=0;n<e.length;n++)if(!e[n].style.display){var r=e[n].parentNode,o=e[n].toDataURL("image/png"),i=new Image;i.className="canvasImg",i.style.display="none",i.src=o,r.appendChild(i)}return t}},{key:"getFormData",value:function(t){for(var e=t.cloneNode(!0),n=e.querySelectorAll("input,select,textarea"),r=e.querySelectorAll(".canvasImg,canvas"),o=-1,i=0;i<r.length;i++){var c=r[i].parentNode,a=r[i];"canvas"===a.tagName.toLowerCase()?c.removeChild(a):a.style.display="block"}for(var u=0;u<n.length;u++){var s=n[u],f=s.getAttribute("type"),l=n[u];if(f||(f="SELECT"===s.tagName?"select":"TEXTAREA"===s.tagName?"textarea":""),"INPUT"===s.tagName)"radio"===f||"checkbox"===f?s.checked&&l.setAttribute("checked",s.checked):(l.value=s.value,l.setAttribute("value",s.value));else if("select"===f){o++;for(var d=0;d<t.querySelectorAll("select").length;d++){var p=t.querySelectorAll("select")[d];if(!p.getAttribute("newbs")&&p.setAttribute("newbs",d),p.getAttribute("newbs")==o){var v=t.querySelectorAll("select")[o].selectedIndex;s.options[v].setAttribute("selected",!0)}}}else l.innerHTML=s.value,l.setAttribute("html",s.value)}return e}},{key:"getPrintWindow",value:function(t){var e=this.Iframe(t);return{f:e,win:e.contentWindow||e,doc:e.doc}}},{key:"previewBoxShow",value:function(){var t=document.getElementById("vue-pirnt-nb-previewBox");t&&(document.querySelector("html").setAttribute("style","overflow: hidden"),t.style.display="block")}},{key:"previewBoxHide",value:function(){var t=document.getElementById("vue-pirnt-nb-previewBox");t&&(document.querySelector("html").setAttribute("style","overflow: visible;"),t.querySelector("iframe")&&d(t.querySelector("iframe")),t.style.display="none")}},{key:"previewBox",value:function(){var t=document.getElementById("vue-pirnt-nb-previewBox"),e="previewBody";if(t)return t.querySelector("iframe")&&d(t.querySelector("iframe")),{close:t.querySelector(".previewClose"),previewBody:t.querySelector(".".concat(e))};var n=document.createElement("div");n.setAttribute("id","vue-pirnt-nb-previewBox"),n.setAttribute("style","position: fixed;top: 0px;left: 0px;width: 100%;height: 100%;background: white;display:none"),n.style.zIndex=this.settings.zIndex;var r=document.createElement("div");r.setAttribute("class","previewHeader"),r.setAttribute("style","padding: 5px 20px;"),r.innerHTML=this.settings.previewTitle,n.appendChild(r),this.close=document.createElement("div");var o=this.close;o.setAttribute("class","previewClose"),o.setAttribute("style","position: absolute;top: 5px;right: 20px;width: 25px;height: 20px;cursor: pointer;");var i=document.createElement("div"),c=document.createElement("div");i.setAttribute("class","closeBefore"),i.setAttribute("style","position: absolute;width: 3px;height: 100%;background: #040404;transform: rotate(45deg); top: 0px;left: 50%;"),c.setAttribute("class","closeAfter"),c.setAttribute("style","position: absolute;width: 3px;height: 100%;background: #040404;transform: rotate(-45deg); top: 0px;left: 50%;"),o.appendChild(i),o.appendChild(c),r.appendChild(o),this.previewBody=document.createElement("div");var a=this.previewBody;a.setAttribute("class",e),a.setAttribute("style","display: flex;flex-direction: column; height: 100%;"),n.appendChild(a);var u=document.createElement("div");u.setAttribute("class","previewBodyUtil"),u.setAttribute("style","height: 32px;background: #474747;position: relative;"),a.appendChild(u),this.previewBodyUtilPrintBtn=document.createElement("div");var s=this.previewBodyUtilPrintBtn;return s.setAttribute("class","previewBodyUtilPrintBtn"),s.innerHTML=this.settings.previewPrintBtnLabel,s.setAttribute("style","position: absolute;padding: 2px 10px;margin-top: 3px;left: 24px;font-size: 14px;color: white;cursor: pointer;background-color: rgba(0,0,0,.12);background-image: linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip: padding-box;border: 1px solid rgba(0,0,0,.35);border-color: rgba(0,0,0,.32) rgba(0,0,0,.38) rgba(0,0,0,.42);box-shadow: inset 0 1px 0 hsla(0,0%,100%,.05), inset 0 0 1px hsla(0,0%,100%,.15), 0 1px 0 hsla(0,0%,100%,.05);"),u.appendChild(s),document.body.appendChild(n),{close:this.close,previewBody:this.previewBody}}},{key:"iframeBox",value:function(t,e){var n=document.createElement("iframe");return n.style.border="0px",n.style.position="absolute",n.style.width="0px",n.style.height="0px",n.style.right="0px",n.style.top="0px",n.setAttribute("id",t),n.setAttribute("src",e),n}},{key:"Iframe",value:function(t){var e=this.settings.id;t=t||(new Date).getTime();var n=this,r=this.iframeBox(e,t);try{if(this.settings.preview){r.setAttribute("style","border: 0px;flex: 1;");var o=this.previewBox(),i=o.previewBody,c=o.close;i.appendChild(r),this.addEvent(c,"click",(function(){n.previewBoxHide()}))}else document.body.appendChild(r);r.doc=null,r.doc=r.contentDocument?r.contentDocument:r.contentWindow?r.contentWindow.document:r.document}catch(a){throw new Error(a+". iframes may not be supported in this browser.")}if(null==r.doc)throw new Error("Cannot find document.");return r}}]),t}(),v=function(t,e,n){t.addEventListener?t.addEventListener(e,n,!1):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n},b={directiveName:"print",bind:function(t,e,n){var r=n.context,o="";v(t,"click",(function(){r.$nextTick((function(){var t,n;if(null!==e&&void 0!==e&&null!==(t=e.value)&&void 0!==t&&t.clickMounted&&e.value.clickMounted(r),"string"===typeof e.value)o=e.value,i();else if("object"===c(e.value)&&e.value.id){o=e.value.id;var a=o.replace(new RegExp("#","g"),""),u=document.getElementById(a);u||(console.log("id in Error"),o=""),i()}else{if(null===e||void 0===e||null===(n=e.value)||void 0===n||!n.preview)return void window.print();i()}}))}));var i=function(){new p({ids:o,vue:r,url:e.value.url,standard:"",extraHead:e.value.extraHead,extraCss:e.value.extraCss,previewTitle:e.value.previewTitle||"打印预览",zIndex:e.value.zIndex||20002,previewPrintBtnLabel:e.value.previewPrintBtnLabel||"打印",popTitle:e.value.popTitle,preview:e.value.preview||!1,asyncUrl:e.value.asyncUrl,previewBeforeOpenCallback:function(){e.value.previewBeforeOpenCallback&&e.value.previewBeforeOpenCallback(r)},previewOpenCallback:function(){e.value.previewOpenCallback&&e.value.previewOpenCallback(r)},openCallback:function(){e.value.openCallback&&e.value.openCallback(r)},closeCallback:function(){e.value.closeCallback&&e.value.closeCallback(r)},beforeOpenCallback:function(){e.value.beforeOpenCallback&&e.value.beforeOpenCallback(r)}})}},install:function(t){t.directive("print",b)}},y=b;e["default"]=y},fc6a:function(t,e,n){var r=n("44ad"),o=n("1d80");t.exports=function(t){return r(o(t))}},fdbc:function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},fdbf:function(t,e,n){var r=n("4930");t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator}})}));
//# sourceMappingURL=print.umd.min.js.map
src/components/Print/vue-print-nb/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
{
  "_from": "vue-print-nb",
  "_id": "vue-print-nb@1.7.5",
  "_inBundle": false,
  "_integrity": "sha512-iNbNyUVRWz0Ha1UTiCKxMPtHLUDGgNI8e8xmD3xqm9RlXIUeX9bT7DgNAfY8vPzqyFRHqGjxLI1rycKH366ziQ==",
  "_location": "/vue-print-nb",
  "_phantomChildren": {
    "@vue/compiler-sfc": "2.7.2",
    "csstype": "3.1.0"
  },
  "_requested": {
    "type": "tag",
    "registry": true,
    "raw": "vue-print-nb",
    "name": "vue-print-nb",
    "escapedName": "vue-print-nb",
    "rawSpec": "",
    "saveSpec": null,
    "fetchSpec": "latest"
  },
  "_requiredBy": [
    "#USER",
    "/"
  ],
  "_resolved": "https://registry.npmmirror.com/vue-print-nb/-/vue-print-nb-1.7.5.tgz",
  "_shasum": "0eaaf9317c233028458e8dbe8aa76603fef63b95",
  "_spec": "vue-print-nb",
  "_where": "E:\\WebstormProjects\\VueUi",
  "author": {
    "name": "Power-kxLee"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ],
  "bundleDependencies": false,
  "dependencies": {
    "vue": "^2.6.11"
  },
  "deprecated": false,
  "description": "Vue plug-in, print! Good!",
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "babel-eslint": "^10.1.0",
    "core-js": "^3.6.5",
    "echarts": "^5.0.2",
    "element-ui": "^2.15.5",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "less": "^3.9.0",
    "less-loader": "^4.1.0",
    "qrcodejs2": "0.0.2",
    "sass": "^1.32.8",
    "sass-loader": "^7.3.1",
    "vue-router": "^3.5.1",
    "vue-template-compiler": "^2.6.11"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },
  "license": "MIT",
  "main": "lib/print.umd.min.js",
  "name": "vue-print-nb",
  "private": false,
  "scripts": {
    "build": "vue-cli-service build",
    "lib": "vue-cli-service build --target lib --name print --dest lib print/index.js",
    "lint": "vue-cli-service lint",
    "serve": "vue-cli-service serve"
  },
  "version": "1.7.5"
}
src/components/Print/vue-print-nb/print/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
import Print from './packages/print.js';
Print.install = function(Vue) {
    Vue.directive('print', Print);
};
export default Print;
src/components/Print/vue-print-nb/print/packages/css/print.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3 @@
div{
}
src/components/Print/vue-print-nb/print/packages/images/print-icon.png
src/components/Print/vue-print-nb/print/packages/print.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
/*
 * @Author: lee
 * @Date: 2021-05-10 11:45:50
 * @LastEditors: lee
 * @LastEditTime: 2021-05-20 15:39:43
 * @Description: file content
 */
import Print from './printarea.js';
/**
 * @file æ‰“印
 * æŒ‡ä»¤`v-print`,默认打印整个窗口
 * ä¼ å…¥å‚æ•°`v-print="'#id'"` , å‚数为需要打印局部的盒子标识.
 */
const addEvent = (element, type, callback) => {
  if (element.addEventListener) {
    element.addEventListener(type, callback, false);
  } else if (element.attachEvent) {
    element.attachEvent('on' + type, callback);
  } else {
    element['on' + type] = callback;
  }
}
export default {
  directiveName: 'print',
  bind (el, binding, vnode) {
    let vue = vnode.context;
    let id = '';
    addEvent(el, 'click', () => {
      vue.$nextTick(() => {
        if (binding?.value?.clickMounted) {
          binding.value.clickMounted(vue)
        }
        if (typeof binding.value === 'string') {
          // å…¨å±€æ‰“印
          id = binding.value;
          localPrint();
        } else if (typeof binding.value === 'object' && !!binding.value.id) {
          // å±€éƒ¨æ‰“印
          id = binding.value.id;
          let ids = id.replace(new RegExp("#", "g"), '');
          let elsdom = document.getElementById(ids);
          if (!elsdom) console.log("id in Error"), id = '';
          localPrint();
        } else if(binding?.value?.preview) {
          localPrint();
        } else {
          window.print();
          return
        }
      });
    })
    const localPrint = () => {
      new Print({
        ids: id, // * å±€éƒ¨æ‰“印必传入id
        vue,
        url: binding.value.url, // æ‰“印指定的网址,这里不能跟id共存 å¦‚果共存id的优先级会比较高
        standard: '', // æ–‡æ¡£ç±»åž‹ï¼Œé»˜è®¤æ˜¯html5,可选 html5,loose,strict
        extraHead: binding.value.extraHead, // é™„加在head标签上的额外标签,使用逗号分隔
        extraCss: binding.value.extraCss, // é¢å¤–çš„css连接,多个逗号分开
        previewTitle: binding.value.previewTitle || '打印预览', // æ‰“印预览的标题
        zIndex: binding.value.zIndex || 20002, // é¢„览窗口的z-index
        previewPrintBtnLabel: binding.value.previewPrintBtnLabel || '打印', // æ‰“印预览的标题
        popTitle: binding.value.popTitle, // title的标题
        preview: binding.value.preview || false, // æ˜¯å¦å¯åŠ¨é¢„è§ˆæ¨¡å¼
        asyncUrl: binding.value.asyncUrl,
        beforeEntryIframe(){
          binding.value.beforeEntryIframe && binding.value.beforeEntryIframe(vue)
        },
        previewBeforeOpenCallback () { // é¢„览窗口打开之前的callback
          binding.value.previewBeforeOpenCallback && binding.value.previewBeforeOpenCallback(vue)
        },
        previewOpenCallback () { // é¢„览窗口打开之后的callback
          binding.value.previewOpenCallback && binding.value.previewOpenCallback(vue)
        },
        openCallback () { // è°ƒç”¨æ‰“印之后的回调事件
          binding.value.openCallback && binding.value.openCallback(vue)
        },
        closeCallback () {
          binding.value.closeCallback && binding.value.closeCallback(vue)
        },
        beforeOpenCallback () {
          binding.value.beforeOpenCallback && binding.value.beforeOpenCallback(vue)
        }
      });
    };
  }
};
src/components/Print/vue-print-nb/print/packages/printarea.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,430 @@
 const isIE = () =>{
    if (!!window.ActiveXobject || "ActiveXObject" in window) {
        return true;
    } else {
        return false;
    }
}
/**
 * åˆ¤æ–­æ˜¯å¦æ˜¯IE11
 * @returns boolean
 */
const isIE11 = () => {
    if((/Trident\/7\./).test(navigator.userAgent)) {
        return true;
    } else {
        return false;
    }
}
const isRemove = (dom) => {
  if (isIE() || isIE11()) {
    dom.removeNode(true)
  } else {
    dom.remove()
  }
  return dom
}
export default class {
  constructor(option) {
    this.standards = {
      strict: 'strict',
      loose: 'loose',
      html5: 'html5'
    };
    this.previewBody = null;
    this.close = null;
    this.previewBodyUtilPrintBtn = null;
    this.selectArray = []; // å­˜å‚¨select的
    this.counter = 0;
    this.settings = {
      standard: this.standards.html5,
    };
    Object.assign(this.settings, option);
    this.init();
  }
  init () {
    this.counter++;
    this.settings.id = `printArea_${this.counter}`;
    let url = ''
    if (this.settings.url && !this.settings.asyncUrl) {
      url = this.settings.url
    }
    let _this = this
    // å¦‚果是异步的
    if (this.settings.asyncUrl) {
      _this.settings.asyncUrl(function (url) {
        let PrintAreaWindow = _this.getPrintWindow(url); // åˆ›å»ºiframe
        if (_this.settings.preview) {
          // æ‰“开预览弹窗
          _this.previewIfrmaeLoad()
        } else {
          // ç›´æŽ¥æ‰“印
          _this.print(PrintAreaWindow);
        }
      }, _this.settings.vue)
      return
    }
    let PrintAreaWindow = this.getPrintWindow(url); // åˆ›å»ºiframe
    if (!this.settings.url) {
      this.write(PrintAreaWindow.doc); // å†™å…¥å†…容
    }
    if (this.settings.preview) {
      // æ‰“开预览弹窗
      this.previewIfrmaeLoad()
    } else {
      // ç›´æŽ¥æ‰“印
      this.print(PrintAreaWindow);
    }
  }
  addEvent (element, type, callback) {
    if (element.addEventListener) {
      element.addEventListener(type, callback, false);
    } else if (element.attachEvent) {
      element.attachEvent('on' + type, callback);
    } else {
      element['on' + type] = callback;
    }
  }
  previewIfrmaeLoad () {
    let box = document.getElementById('vue-pirnt-nb-previewBox')
    if (box) {
      let _this = this
      let iframe = box.querySelector('iframe')
      this.settings.previewBeforeOpenCallback()
      this.addEvent(iframe, 'load', function () {
        _this.previewBoxShow()
        _this.removeCanvasImg()
        _this.settings.previewOpenCallback()
      })
      this.addEvent(box.querySelector('.previewBodyUtilPrintBtn'), 'click', function () {
        _this.settings.beforeOpenCallback()
        _this.settings.openCallback();
        iframe.contentWindow.print();
        _this.settings.closeCallback()
      })
    }
  }
  // åˆ é™¤æ‰€æœ‰canva转换的图片
  removeCanvasImg () {
    let _this = this
    try {
      if (_this.elsdom) {
        // åˆ é™¤canva转变图片的dom节点
        let canvasList = _this.elsdom.querySelectorAll('.canvasImg')
        for (let i = 0; i < canvasList.length; i++) {
          isRemove(canvasList[i])
        }
      }
    } catch (e) {
      console.log(e);
    }
  }
  print (ifrmae) {
    var _this = this;
    let iframe = document.getElementById(this.settings.id) || ifrmae.f;
    let iframeWin = document.getElementById(this.settings.id).contentWindow || ifrmae.f.contentWindow;
    var _loaded = function () {
      iframeWin.focus();
      _this.settings.openCallback();
      iframeWin.print();
      isRemove(iframe)
      _this.settings.closeCallback()
      _this.removeCanvasImg()
    }
    _this.settings.beforeOpenCallback()
    _this.addEvent(iframe, 'load', function () {
      _loaded()
    })
  }
  write (PADocument) {
    PADocument.open();
    PADocument.write(`${this.docType()}<html>${this.getHead()}${this.getBody()}</html>`);
    PADocument.close();
  }
  docType () {
    if (this.settings.standard === this.standards.html5) {
      return '<!DOCTYPE html>';
    }
    var transitional = this.settings.standard === this.standards.loose ? ' Transitional' : '';
    var dtd = this.settings.standard === this.standards.loose ? 'loose' : 'strict';
    return `<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01${transitional}//EN" "http://www.w3.org/TR/html4/${dtd}.dtd">`;
  }
  getHead () {
    let extraHead = '';
    let links = '';
    let style = '';
    if (this.settings.extraHead) {
      this.settings.extraHead.replace(/([^,]+)/g, (m) => {
        extraHead += m;
      });
    }
    // å¤åˆ¶æ‰€æœ‰link标签
    [].forEach.call(document.querySelectorAll('link'), function (item) {
      if (item.href.indexOf('.css') >= 0) {
        links += `<link type="text/css" rel="stylesheet" href="${item.href}" >`;
      }
    });
    // å¾ªçŽ¯èŽ·å–style标签的样式
    let domStyle = document.styleSheets;
    if (domStyle && domStyle.length > 0) {
      for (let i = 0; i < domStyle.length; i++) {
        try {
          if (domStyle[i].cssRules || domStyle[i].rules) {
            let rules = domStyle[i].cssRules || domStyle[i].rules;
            for (let b = 0; b < rules.length; b++) {
              style += rules[b].cssText;
            }
          }
        } catch (e) {
          console.log(domStyle[i].href + e);
        }
      }
    }
    if (this.settings.extraCss) {
      this.settings.extraCss.replace(/([^,\s]+)/g, (m) => {
        links += `<link type="text/css" rel="stylesheet" href="${m}">`;
      });
    }
    return `<head><title>${this.settings.popTitle}</title>${extraHead}${links}<style type="text/css">${style}</style></head>`;
  }
  getBody () {
    let ids = this.settings.ids;
    ids = ids.replace(new RegExp("#", "g"), '');
    this.settings.beforeEntryIframe();
    this.elsdom = this.beforeHanler(document.getElementById(ids));
    let ele = this.getFormData(this.elsdom);
    let htm = ele.outerHTML;
    return '<body>' + htm + '</body>';
  }
  // å¤„理canva转成图片
  beforeHanler (elsdom) {
    let canvasList = elsdom.querySelectorAll('canvas');
    // canvas转换png图片
    for (let i = 0; i < canvasList.length; i++) {
      if (!canvasList[i].style.display) {
        let _parent = canvasList[i].parentNode
        let _canvasUrl = canvasList[i].toDataURL('image/png')
        let _img = new Image()
        _img.className = 'canvasImg'
        _img.style.display = 'none'
        _img.src = _canvasUrl
        _parent.appendChild(_img)
      }
    }
    return elsdom
  }
  // æ ¹æ®type去处理form表单
  getFormData (ele) {
    let copy = ele.cloneNode(true);
    let copiedInputs = copy.querySelectorAll('input,select,textarea');
    let canvasImgList = copy.querySelectorAll('.canvasImg,canvas');
    let selectCount = -1;
    // å¤„理所有canvas
    for (let i = 0; i < canvasImgList.length; i++) {
      let _parent = canvasImgList[i].parentNode
      let item = canvasImgList[i]
      // åˆ é™¤å…‹éš†åŽçš„canvas节点
      if (item.tagName.toLowerCase() === 'canvas') {
        _parent.removeChild(item)
      } else {
        item.style.display = 'block'
      }
    }
    // å¤„理所有输入框
    for (let i = 0; i < copiedInputs.length; i++) {
      let item = copiedInputs[i];
      let typeInput = item.getAttribute('type');
      let copiedInput = copiedInputs[i];
      // èŽ·å–select标签
      if (!typeInput) {
        typeInput = item.tagName === 'SELECT' ? 'select' : item.tagName === 'TEXTAREA' ? 'textarea' : '';
      }
      // å¤„理input框
      if (item.tagName === 'INPUT') {
        // é™¤äº†å•选框 å¤šé€‰æ¡†æ¯”较特别
        if (typeInput === 'radio' || typeInput === 'checkbox') {
          if (item.checked) {
            copiedInput.setAttribute('checked', item.checked);
          }
        } else {
          copiedInput.value = item.value;
          copiedInput.setAttribute('value', item.value);
        }
        // å¤„理select
      } else if (typeInput === 'select') {
        selectCount++;
        for (let b = 0; b < ele.querySelectorAll('select').length; b++) {
          let select = ele.querySelectorAll('select')[b]; // èŽ·å–åŽŸå§‹å±‚æ¯ä¸€ä¸ªselect
          !select.getAttribute('newbs') && select.setAttribute('newbs', b) // æ·»åŠ æ ‡è¯†
          if (select.getAttribute('newbs') == selectCount) {
            let opSelectedIndex = ele.querySelectorAll('select')[selectCount].selectedIndex;
            item.options[opSelectedIndex].setAttribute('selected', true);
          }
        }
        // å¤„理textarea
      } else {
        copiedInput.innerHTML = item.value;
        copiedInput.setAttribute('html', item.value);
      }
    }
    return copy;
  }
  getPrintWindow (url) {
    var f = this.Iframe(url);
    return {
      f: f,
      win: f.contentWindow || f,
      doc: f.doc
    };
  }
  previewBoxShow () {
    let box = document.getElementById('vue-pirnt-nb-previewBox')
    if (box) {
      document.querySelector('html').setAttribute('style', 'overflow: hidden')
      box.style.display = 'block'
    }
  }
  previewBoxHide () {
    let box = document.getElementById('vue-pirnt-nb-previewBox')
    if (box) {
      document.querySelector('html').setAttribute('style', 'overflow: visible;')
      box.querySelector('iframe') && isRemove(box.querySelector('iframe'))
      box.style.display = 'none'
    }
  }
  previewBox () {
    let box = document.getElementById('vue-pirnt-nb-previewBox')
    let previewBodyClass = 'previewBody'
    if (box) {
      box.querySelector('iframe') && isRemove(box.querySelector('iframe'))
      return {
        close: box.querySelector('.previewClose'),
        previewBody: box.querySelector(`.${previewBodyClass}`)
      }
    }
    let previewContent = document.createElement('div');
    previewContent.setAttribute('id', "vue-pirnt-nb-previewBox")
    previewContent.setAttribute('style', 'position: fixed;top: 0px;left: 0px;width: 100%;height: 100%;background: white;display:none')
    previewContent.style.zIndex = this.settings.zIndex
    // æ‰“印预览弹窗的header
    let previewHeader = document.createElement('div');
    previewHeader.setAttribute('class', "previewHeader")
    previewHeader.setAttribute('style', "padding: 5px 20px;")
    previewHeader.innerHTML = this.settings.previewTitle
    previewContent.appendChild(previewHeader)
    // close关闭按钮
    this.close = document.createElement('div');
    let close = this.close
    close.setAttribute('class', "previewClose")
    close.setAttribute('style', "position: absolute;top: 5px;right: 20px;width: 25px;height: 20px;cursor: pointer;")
    let closeBefore = document.createElement('div');
    let closeAfter = document.createElement('div');
    closeBefore.setAttribute('class', "closeBefore")
    closeBefore.setAttribute('style', "position: absolute;width: 3px;height: 100%;background: #040404;transform: rotate(45deg); top: 0px;left: 50%;")
    closeAfter.setAttribute('class', "closeAfter")
    closeAfter.setAttribute('style', "position: absolute;width: 3px;height: 100%;background: #040404;transform: rotate(-45deg); top: 0px;left: 50%;")
    close.appendChild(closeBefore)
    close.appendChild(closeAfter)
    previewHeader.appendChild(close)
    // æ‰“印预览弹窗的body
    this.previewBody = document.createElement('div');
    let previewBody = this.previewBody
    previewBody.setAttribute('class', previewBodyClass)
    previewBody.setAttribute('style', "display: flex;flex-direction: column; height: 100%;")
    previewContent.appendChild(previewBody)
    // æ‰“印预览弹窗的body的工具栏
    let previewBodyUtil = document.createElement('div');
    previewBodyUtil.setAttribute('class', "previewBodyUtil")
    previewBodyUtil.setAttribute('style', "height: 32px;background: #474747;position: relative;")
    previewBody.appendChild(previewBodyUtil)
    // æ‰“印的按钮
    this.previewBodyUtilPrintBtn = document.createElement('div');
    let previewBodyUtilPrintBtn = this.previewBodyUtilPrintBtn
    previewBodyUtilPrintBtn.setAttribute('class', 'previewBodyUtilPrintBtn')
    previewBodyUtilPrintBtn.innerHTML = this.settings.previewPrintBtnLabel
    previewBodyUtilPrintBtn.setAttribute('style', 'position: absolute;padding: 2px 10px;margin-top: 3px;left: 24px;font-size: 14px;color: white;cursor: pointer;background-color: rgba(0,0,0,.12);background-image: linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip: padding-box;border: 1px solid rgba(0,0,0,.35);border-color: rgba(0,0,0,.32) rgba(0,0,0,.38) rgba(0,0,0,.42);box-shadow: inset 0 1px 0 hsla(0,0%,100%,.05), inset 0 0 1px hsla(0,0%,100%,.15), 0 1px 0 hsla(0,0%,100%,.05);')
    previewBodyUtil.appendChild(previewBodyUtilPrintBtn)
    // æ·»åŠ æ•´ä¸ªé¢„è§ˆåˆ°body
    document.body.appendChild(previewContent);
    return {
      close: this.close,
      previewBody: this.previewBody
    }
  }
  iframeBox (frameId, url) {
    let iframe = document.createElement('iframe');
    iframe.style.border = '0px';
    iframe.style.position = 'absolute';
    iframe.style.width = '0px';
    iframe.style.height = '0px';
    iframe.style.right = '0px';
    iframe.style.top = '0px';
    iframe.setAttribute('id', frameId);
    iframe.setAttribute('src', url);
    return iframe
  }
  Iframe (url) {
    let frameId = this.settings.id;
    // å±€éƒ¨æ‰“印 ç”¨å½“前的时间做ifrmae的url
    url = !url ? new Date().getTime() : url
    let _this = this
    let iframe = this.iframeBox(frameId, url)
    // let that = this
    try {
      // ç›´æŽ¥æ‰“印 ä¸é¢„览
      if (!this.settings.preview) {
        document.body.appendChild(iframe);
      } else {
        iframe.setAttribute('style', 'border: 0px;flex: 1;')
        // é¢„览打印
        let previewBox = this.previewBox()
        let previewBody = previewBox.previewBody
        let close = previewBox.close
        // æ·»åŠ ifrmae到预览弹窗
        previewBody.appendChild(iframe);
        this.addEvent(close, 'click', function () {
          _this.previewBoxHide()
        })
      }
      iframe.doc = null;
      iframe.doc = iframe.contentDocument ? iframe.contentDocument : (iframe.contentWindow ? iframe.contentWindow.document : iframe.document);
    } catch (e) {
      throw new Error(e + '. iframes may not be supported in this browser.');
    }
    if (iframe.doc == null) {
      throw new Error('Cannot find document.');
    }
    return iframe;
  }
}
src/components/Print/vue-print-nb/src/App.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,310 @@
<template>
  <div id="app">
    <div id="loading"></div>
    <h3 style="text-align: left;margin-left: 30px;">支持的打印方式:</h3>
    <el-divider><i class="el-icon-printer"></i></el-divider>
    <el-row :gutter="20">
      <el-col :span="8">
        <el-button type="primary"
                   icon="el-icon-printer"
                   v-print>全局打印</el-button>
        <el-card class="box-card">
          å¯¹å½“前页面全部进行打印
        </el-card>
      </el-col>
    </el-row>
    <el-divider><i class="el-icon-printer"></i></el-divider>
    <el-row :gutter="20">
      <el-col :span="8">
        <el-button type="primary"
                   icon="el-icon-magic-stick"
                   v-print="'#printMe'">局部打印(快速)</el-button>
                   <el-card class="box-card">
          å¯ä»¥æ‰“印页面某部分内容,直接传入对应的唯一标识ID
        </el-card>
      </el-col>
      <el-col :span="8">
        <el-button type="primary"
                   icon="el-icon-umbrella"
                   v-print="printObj">局部打印(对象配置)</el-button>
                   <el-card class="box-card">
          ä¹Ÿè®¸ä½ ä¼šéœ€è¦ä¸€äº›é…ç½®ï¼Œå¯æŽ¥æ”¶ä¸€ä¸ªå¯¹è±¡ï¼Œæ ¹æ®æ–‡æ¡£API进行设置
        </el-card>
      </el-col>
    </el-row>
    <el-divider><i class="el-icon-printer"></i></el-divider>
    <el-row :gutter="20">
      <el-col :span="8">
        <el-button type="primary"
                   icon="el-icon-bank-card"
                   v-print="printUrl">预览网址</el-button>
                   <el-card class="box-card">
          æˆ‘需要打印指定的网址(要符合同源策略) éœ€è¦ä¼ å…¥ä¸€ä¸ªå¯¹è±¡ï¼Œè¯¦ç»†çœ‹æ–‡æ¡£API进行设置
        </el-card>
      </el-col>
      <el-col :span="8">
        <el-button type="primary"
                   icon="el-icon-wallet"
                   v-print="printAsyncUrl">预览网址(异步)</el-button>
                   <el-card class="box-card">
          ä½ æ‰“印的网址(URL)也是可以通过异步得到的
        </el-card>
        å¼‚步获取URL:<el-progress :text-inside="true" :stroke-width="20" :percentage="times"></el-progress>
      </el-col>
    </el-row>
    <div>
<el-divider><i class="el-icon-printer"></i></el-divider>
      <div class="asyncTips">
      </div>
      <div class="box"
           v-show="printLoading">
        <div class="loader-04"></div>
        æ­£åœ¨å¤„理...请稍等
      </div>
      <h3  style="text-align: left;margin-left: 30px;">下面是被打印的例子:</h3>
      <div id="printMe"
           style="background: #dac9c9">
        <div ref="qrcode"></div>
        <div ref="echartMain"
             :style="{width: '300px', height: '300px'}"></div>
        <input type="number" />
        <input type="time" />
        <input type="checkbox" />
        <input type="radio" />
        <select>
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="mercedes">Mercedes</option>
          <option value="audi">Audi</option>
        </select>
        <select>
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="mercedes">Mercedes</option>
          <option value="audi">Audi</option>
        </select>
        <textarea name=""
                  id=""
                  cols="30"
                  rows="10"></textarea>
        <p>葫芦娃,葫芦娃</p>
        <p style="background: yellow">一根藤上七朵花</p>
        <p>小小树藤是我家 å•¦å•¦å•¦å•¦</p>
        <p>叮当当咚咚当当 æµ‡ä¸å¤§</p>
        <p>叮当当咚咚当当 æ˜¯æˆ‘å®¶</p>
        <p>啦啦啦啦</p>
        <p>...</p>
      </div>
      <p>叮当当咚咚当当 æµ‡ä¸å¤§</p>
    </div>
  </div>
</template>
<style type="text/css">
p {
  color: blue;
}
</style>
<script>
import QRCode from "qrcodejs2";
import * as echarts from "echarts";
export default {
  name: "app",
  data () {
    return {
      printLoading: false,
      times: 0,
      printAsyncUrl: {
        preview: true,
        previewTitle: 'Test Title',
        previewPrintBtnLabel: 'Print',
        asyncUrl (reslove, vue) {
          const _set = setInterval(() => {
            vue.times += 20
          }, 1000)
          setTimeout(() => {
            reslove(process.env.NODE_ENV === 'production' ? 'https://power-kxlee.github.io/' : 'http://localhost:8080/')
            clearInterval(_set)
          }, 5000)
        },
        previewBeforeOpenCallback: this.previewBeforeOpenCallback ,
        previewOpenCallback:this.previewOpenCallback,
        beforeOpenCallback: this.beforeOpenCallback,
        openCallback: this.openCallback,
        closeCallback: this.closeCallback,
        clickMounted: this.clickMounted
      },
      printUrl: {
        url: process.env.NODE_ENV === 'production' ? 'https://power-kxlee.github.io/' : 'http://localhost:8080/',
        preview: true,
        previewTitle: 'Test Title',
        previewPrintBtnLabel: 'Print',
        previewBeforeOpenCallback: this.previewBeforeOpenCallback ,
        previewOpenCallback:this.previewOpenCallback,
        beforeOpenCallback: this.beforeOpenCallback,
        openCallback: this.openCallback,
        closeCallback: this.closeCallback,
        clickMounted: this.clickMounted
      },
      printObj: {
        id: "printMe",
        popTitle: "good print",
        extraCss: "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.compat.css, https://cdn.bootcdn.net/ajax/libs/hover.css/2.3.1/css/hover-min.css",
        extraHead: '<meta http-equiv="Content-Language"content="zh-cn"/>',
        beforeOpenCallback: this.beforeOpenCallback,
        openCallback: this.openCallback,
        closeCallback: this.closeCallback,
        clickMounted: this.clickMounted
      },
    };
  },
  mounted () {
    this.$nextTick(() => {
      this.echart();
      new QRCode(this.$refs.qrcode, {
        width: 100,
        height: 100,
        text: "https://www.baidu.com/",
      });
    });
  },
  methods: {
    clickMounted(vue) {
      vue.$notify({
        title: '消息',
        message: '点击按钮的回调事件',
      });
    },
    previewBeforeOpenCallback(vue) {
      vue.$notify({
        title: '消息',
        message: '正在加载预览窗口',
      });
    },
    previewOpenCallback(vue) {
      vue.times = 0
      vue.$notify({
            title: '消息',
            message: '已经加载完预览窗口',
            type: 'success'
          });
    },
    beforeOpenCallback(vue) {
      vue.printLoading = true
      vue.$notify({
        title: '消息',
        message: '正在准备打印控件',
      });
    },
    openCallback(vue) {
      vue.printLoading = false
      vue.$notify({
        title: '消息',
        message: '已经打开了 æ‰“印控件',
      });
    },
    closeCallback(vue) {
      vue.$notify({
        title: '消息',
        message: '关闭了打印工具',
      });
    },
    beforeOpen () {
      this.printLoading = true
      console.log('准备打开')
    },
    echart () {
      let myChart = echarts.init(this.$refs.echartMain);
      myChart.setOption({
        title: {
          text: "ECharts å…¥é—¨ç¤ºä¾‹",
        },
        tooltip: {},
        xAxis: {
          data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
        },
        yAxis: {},
        series: [
          {
            name: "销量",
            type: "bar",
            data: [5, 20, 36, 10, 10, 20],
          },
        ],
      });
    },
  },
};
</script>
<style scoped lang="scss">
#app::v-deep {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
      width: 800px;
    margin: 0 auto;
  .el-row {
    margin-bottom: 20px;
    &:last-child {
      margin-bottom: 0;
    }
    .box-card {
      margin-top: 10px;
    }
  }
}
[class*="loader-"] {
  display: inline-block;
  width: 1em;
  height: 1em;
  color: inherit;
  vertical-align: middle;
  pointer-events: none;
}
.loader-04 {
  border: 1px solid currentcolor;
  border-radius: 50%;
  -webkit-animation: 1s loader-04 linear infinite;
  animation: 1s loader-04 linear infinite;
  position: relative;
}
.loader-04:before {
  content: "";
  display: block;
  width: 0;
  height: 0;
  position: absolute;
  top: -0.2em;
  left: 50%;
  border: 0.2em solid currentcolor;
  border-radius: 50%;
}
@-webkit-keyframes loader-04 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
@keyframes loader-04 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(360deg);
    transform: rotate(360deg);
  }
}
</style>
src/components/Print/vue-print-nb/src/img/Chrome.png
src/components/Print/vue-print-nb/src/img/Chrome1.png
src/components/Print/vue-print-nb/src/img/ie.png
src/components/Print/vue-print-nb/src/main.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
/*
 * @Author: lee
 * @Date: 2021-05-10 11:45:50
 * @LastEditors: lee
 * @LastEditTime: 2021-05-12 14:18:39
 * @Description: file content
 */
import Vue from 'vue'
import App from './App.vue'
import Print from '../print'
import VueRouter from 'vue-router'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.config.productionTip = false
Vue.use(Print)
Vue.use(ElementUI);
Vue.use(VueRouter)
new Vue({
  render: h => h(App),
}).$mount('#app')
src/main.js
@@ -49,7 +49,8 @@
import '../public/static/theme/index.css' /* icofont */
// æ‰“印
import Print from 'vue-print-nb'
// import Print from 'vue-print-nb'
import Print from './components/Print/vue-print-nb'
Vue.use(Print)
// æ°´å°
src/utils/global.js
@@ -22,7 +22,7 @@
}
// æ—¶é—´å¤„理函数
export function handleDatatime(value) {
export function handleDatetime(value) {
  const data = new Date(value)
  const month = data.getMonth() < 9 ? '0' + (data.getMonth() + 1) : data.getMonth() + 1
  const date = data.getDate() <= 9 ? '0' + data.getDate() : data.getDate()
src/views/jcsz/jsqd.vue
@@ -150,7 +150,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="65%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      @closed="handleClose"
@@ -194,7 +194,7 @@
    <el-dialog
      title="设置"
      :visible.sync="settingDialogVisible"
      width="50%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      class="settingDialogVisible"
@@ -276,7 +276,7 @@
    <el-dialog
      title="角色关联用户"
      :visible.sync="userDialogVisible"
      width="80%"
      width="1500px"
      :close-on-click-modal="false"
      top="15vh"
      :fullscreen="isFullscreen"
@@ -419,7 +419,7 @@
    <el-dialog
      title="角色关联权限"
      :visible.sync="dialogVisibleRight"
      width="50%"
      width="800px"
      top="15vh"
      :fullscreen="isFullscreen"
      :close-on-click-modal="false"
@@ -813,7 +813,7 @@
    // æ·»åŠ æŒ‰é’®
    addSetting() {
      let number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      number = number === 0 ? Math.random() * Math.random() : number
      number = number === 0 ? (10 + Math.random()) : number
      const data = { roletype_code: '', roletype_name: '', isVisible: 1, number: number }
      this.RoleTypeCodeArr.unshift(data)
    },
@@ -1362,9 +1362,9 @@
  color: #606266;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
.settingDialogVisible, .userDialogVisible, .dialogVisibleRight {
  ::v-deep .el-dialog__body {
src/views/jcsz/wldw.vue
@@ -162,7 +162,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="50%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      @closed="handleClose"
@@ -503,9 +503,9 @@
  color: #606266;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
::v-deep .el-radio__input.is-checked .el-radio__inner {
  background-color: $main_color;
src/views/jcsz/yhqd.vue
@@ -57,6 +57,7 @@
      <el-divider />
      <div style="margin-left: 10px;display: flex">
        <el-button type="primary" icon="el-icon-circle-plus-outline" @click="add('add')">新增</el-button>
        <el-button type="primary" icon="el-icon-menu" @click="workingTramClick">生产班组</el-button>
        <el-button type="primary" icon="el-icon-upload2" @click="upload">导入</el-button>
      </div>
      <el-divider />
@@ -102,8 +103,13 @@
            sortable="custom"
          />
          <el-table-column
            prop="group_name"
            label="生产班组"
            sortable="custom"
          />
          <el-table-column
            prop="wagetype"
            label="所属组织"
            label="工资类型"
            sortable="custom"
          >
            <template slot-scope="{row}">
@@ -179,7 +185,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="65%"
      width="800px"
      :close-on-click-modal="false"
      top="15vh"
      @closed="handleClose"
@@ -259,7 +265,7 @@
    <el-dialog
      title="关联角色"
      :visible.sync="dialogVisibleRoles"
      width="65%"
      width="800px"
      top="15vh"
      :fullscreen="isFullscreen"
      :close-on-click-modal="false"
@@ -323,6 +329,99 @@
        </div>
      </span>
    </el-dialog>
    <!--    äº§ç»„按钮对话框-->
    <el-dialog
      title="生产班组"
      :visible.sync="workingDialogVisible"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      class="workingDialogVisible"
      @close="handleCloseWorking"
    >
      <div style="margin-bottom: 20px;display: flex">
        <el-button type="primary" icon="el-icon-circle-plus-outline" @click="addWorking">新增</el-button>
        <!--        <el-button type="primary" icon="el-icon-delete" @click="delSetting">删除</el-button>-->
      </div>
      <el-table
        :data="workingTableData"
        border
        height="300"
        highlight-current-row
        :header-cell-style="this.$headerCellStyle"
        :cell-style="this.$cellStyle"
        @sort-change="sortChangeOfWorking"
      >
        <!--        :style="{width: 100+'%',height:tableHeight-300+'px'}"-->
        <!--        <el-table-column-->
        <!--          type="selection"-->
        <!--          width="50"-->
        <!--        />-->
        <el-table-column
          width="50"
          label="序号"
          prop="RowNum"
        />
        <el-table-column
          prop="group_code"
          label="班组编码"
          sortable="custom"
        >
          <template slot-scope="{row}">
            <el-input v-if="row.isVisible===1" v-model="row.group_code" placeholder="请输入" />
            <div v-else> {{ row.group_code }}</div>
          </template>
        </el-table-column>
        <el-table-column
          prop="group_name"
          label="班组名称"
          sortable="custom"
        >
          <template slot-scope="{row}">
            <el-input v-if="row.isVisible===1" v-model="row.group_name" placeholder="请输入" />
            <div v-else> {{ row.group_name }}</div>
          </template>
        </el-table-column>
        <el-table-column
          prop="description"
          label="班组描述"
          sortable="custom"
        >
          <template slot-scope="{row}">
            <el-input v-if="row.isVisible===1" v-model="row.description" placeholder="请输入" />
            <div v-else> {{ row.description }}</div>
          </template>
        </el-table-column>
        <el-table-column label="操作">
          <template slot-scope="{row}">
            <div class="operationClass">
              <el-button v-if="row.isVisible===0" type="text" @click="delWorking(row)">删除</el-button>
              <el-button v-if="row.isVisible===1" type="text" @click="saveWorking(row)">保存</el-button>
              <el-button v-if="row.isVisible===1" type="text" @click="cancelWorking(row)">取消</el-button>
            </div>
          </template>
        </el-table-column>
      </el-table>
      <!--分页-->
      <pagination
        v-show="workingTableDataLength>0"
        :total="workingTableDataLength"
        :page.sync="formWorking.page"
        :limit.sync="formWorking.rows"
        align="right"
        layout="prev, pager, next,sizes"
        popper-class="select_bottom"
        @pagination="getUserGroupSearch"
      />
      <span slot="footer" class="dialog-footer">
        <div class="footerButton">
          <el-button @click="WorkingDialogVisibleCancel">返回</el-button>
          <!--          <el-button type="primary" @click="settingDialogVisibleConfirm">ç¡® å®š</el-button>-->
        </div>
      </span>
    </el-dialog>
  </div>
</template>
@@ -330,7 +429,14 @@
import Pagination from '@/components/Pagination'
import {
  AddUpdateUser,
  DeleteUser, SaveUserAssoctRole, UserAssociationRole,
  DeleteUser,
  RoleTypeAdd,
  RoleTypeDelete,
  SaveUserAssoctRole,
  UserAssociationRole,
  UserGroupAdd,
  UserGroupDelete,
  UserGroupSearch,
  UserOrganization,
  UserSearch
} from '@/api/jcsz'
@@ -436,8 +542,16 @@
        value: 'code',
        label: 'name',
        children: 'children'
      },
      workingDialogVisible: false,
      workingTableData: [],
      workingTableDataLength: 0,
      formWorking: {
        rows: 10,
        page: 1,
        prop: 'group_code',
        order: 'desc'
      }
    }
  },
  created() {
@@ -879,8 +993,105 @@
      // })
      console.log(this.dialogFormRoles.rolesArrSelectedArr, 6666)
      console.log(this.dialogFormRoles.roleTreeSelectedArr, 6777)
    }
    },
    /*
      ç”Ÿäº§ç­ç»„模块
   */
    // ç”Ÿäº§ç­ç»„按钮点击
    workingTramClick() {
      this.workingDialogVisible = true
      this.getUserGroupSearch()
    },
    // ç”Ÿäº§ç­ç»„对话框关闭事件
    handleCloseWorking() {
      this.workingTableData.forEach((item, index) => {
        if (item.isVisible === 1) {
          this.workingTableData.splice(index, 1)
        }
      })
      // this.getUserGroupSearch()
    },
    // ç”Ÿäº§ç­ç»„排序
    sortChangeOfWorking({ column, prop, order }) {
      if (order === 'descending') {
        order = 'desc'
      } else if (order === 'ascending') {
        order = 'asc'
      } else {
        order = 'desc'
      }
      this.form.order = order
      this.form.prop = prop
      this.getUserGroupSearch()
    },
    // èŽ·å–ç”Ÿäº§ç­ç»„åˆ—è¡¨
    async  getUserGroupSearch() {
      const res = await UserGroupSearch(this.formWorking)
      this.workingTableData = res.data
      this.workingTableDataLength = res.count
      this.workingTableData.forEach(item => {
        item.isVisible = 0
      })
    },
    // æ–°å¢ž
    addWorking() {
      let number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      number = number === 0 ? (10 + Math.random()) : number
      const data = { group_code: '', group_name: '', description: '', isVisible: 1, number: number }
      this.workingTableData.unshift(data)
    },
    // åˆ é™¤
    delWorking(row) {
      this.$confirm('是否确认删除?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        UserGroupDelete({ UserGrupCode: row.group_code }).then(res => {
          if (res.code === '200') {
            this.$message.success('删除成功!')
            this.getUserGroupSearch()
          }
        })
      }).catch(() => {
        this.$message.info('已取消删除')
      })
    },
    // ä¿å­˜
    async  saveWorking(row) {
      if (row.group_code.trim().length < 1) {
        return this.$message.info('班组编码不能为空!')
      }
      if (row.group_name.trim().length < 1) {
        return this.$message.info('班组名称不能为空!')
      }
      if (row.description.trim().length < 1) {
        return this.$message.info('班组描述不能为空!')
      }
      const data = {
        code: row.group_code,
        name: row.group_name,
        flag: row.description
      }
      const res = await UserGroupAdd([data])
      if (res.code === '200') {
        this.$message.success('保存成功!')
        await this.getUserGroupSearch()
      }
    },
    // å–消
    cancelWorking(row) {
      this.workingTableData.forEach((item, index) => {
        if (item.isVisible === 1 && item.number === row.number) {
          this.workingTableData.splice(index, 1)
        }
      })
    },
    // ç”Ÿäº§ç­ç»„返回按钮
    WorkingDialogVisibleCancel() {
      this.workingDialogVisible = false
    }
  }
}
</script>
@@ -934,9 +1145,13 @@
  color: #606266;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
.workingDialogVisible ::v-deep .el-dialog__body{
  padding: 20px 20px !important;
}
::v-deep .el-radio__input.is-checked .el-radio__inner {
  background-color: $main_color;
src/views/jcsz/zzjg.vue
@@ -129,7 +129,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="60%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      @closed="handleClose"
@@ -495,9 +495,9 @@
  color: #606266;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
::v-deep .el-radio__input.is-checked .el-radio__inner {
  background-color: $main_color;
src/views/sbgl/sbqd.vue
@@ -200,7 +200,7 @@
      :close-on-click-modal="false"
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="65%"
      width="800px"
      top="15vh"
      @closed="handleClose"
      @close="handleClose"
@@ -288,7 +288,7 @@
    <el-dialog
      title="设备类型"
      :visible.sync="DeviceTypeDialogVisible"
      width="65%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      class="DeviceTypeDialogVisible"
@@ -375,7 +375,7 @@
    <el-dialog
      title="设备组"
      :visible.sync="DeviceGroupDialogVisible"
      width="70%"
      width="800px"
      :close-on-click-modal="false"
      top="15vh"
      class="DeviceTypeDialogVisible"
@@ -492,7 +492,7 @@
  DeviceTypeSelectGroup,
  WorkShopSelect, WorkShopSelectLine
} from '@/api/sbgl'
import { handleDatatime } from '@/utils/global'
import { handleDatetime } from '@/utils/global'
const SER_HZ = /^[\u4e00-\u9fa5]+$/
export default {
@@ -748,7 +748,7 @@
            devicename: this.dialogForm.devicename,
            devicetypecode: this.dialogForm.devicetypecode,
            devicegroupcode: this.dialogForm.devicegroupcode,
            importdate: handleDatatime(this.dialogForm.importdate),
            importdate: handleDatetime(this.dialogForm.importdate),
            workshopcode: this.dialogForm.workshopcode,
            linecode: this.dialogForm.linecode,
            status: this.dialogForm.status,
@@ -816,7 +816,8 @@
    },
    // æ–°å¢žæŒ‰é’®
    addDeviceType() {
      const number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      let number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      number = number === 0 ? (10 + Math.random()) : number
      this.DeviceTypeArray.unshift({ code: '', name: '', group: '', remark: '', isVisible: 1, number: number })
    },
    // åˆ é™¤
@@ -892,7 +893,8 @@
    },
    // æ–°å¢ž
    addDeviceGroup() {
      const number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      let number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      number = number === 0 ? (10 + Math.random()) : number
      this.DeviceGroupArray.unshift({ code: '', name: '', eqptype_code: '', eqptype_name: '', remark: '', isVisible: 1, number: number })
    },
    // æŽ’序
@@ -1024,9 +1026,9 @@
  color: #606266;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
.DeviceTypeDialogVisible {
  ::v-deep .el-dialog__body {
src/views/scgl/gd.vue
@@ -46,31 +46,45 @@
            <el-form-item label="产品规格" style=" display: flex;">
              <el-input v-model="form.partspec" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item label="交付时间" style=" display: flex;">
              <el-date-picker
                v-model="form.paydate"
                type="date"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 200px"
                placeholder="选择日期"
              />
            </el-form-item>
            <el-form-item label="创建人员" style=" display: flex;">
              <el-input v-model="form.creatuser" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item label="创建时间" style=" display: flex;">
              <!--              <el-date-picker-->
              <!--                v-model="form.createdate"-->
              <!--                type="date"-->
              <!--                value-format="yyyy-MM-dd HH:mm:ss"-->
              <!--                style="width: 200px"-->
              <!--                placeholder="选择日期"-->
              <!--              />-->
              <el-date-picker
                v-model="form.createdate"
                type="date"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 200px"
                placeholder="选择日期"
                type="daterange"
                range-separator="~"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                size="mini"
              />
            </el-form-item>
          </div>
          <div style="display: flex;align-items: start;margin-top: 5px;z-index: 2">
            <el-button type="primary" icon="el-icon-search" @click="search">查询</el-button>
            <el-button type="info" icon="el-icon-refresh" @click="reset">重置</el-button>
          <div style="min-height: 100px">
            <div style="display: flex;align-items: start;justify-content:end;margin-top: 5px;z-index: 2">
              <el-button type="primary" icon="el-icon-search" @click="search">查询</el-button>
              <el-button type="info" icon="el-icon-refresh" @click="reset">重置</el-button>
            </div>
            <!--            <div v-if="!isFullscreen" style="display: flex;align-items: start; margin-top: 15px;z-index: 2">-->
            <!--              <el-button type="primary" icon="el-icon-circle-plus-outline" @click="add('add')">新增</el-button>-->
            <!--              <el-button type="primary" icon="el-icon-connection" @click="send('send')">派发</el-button>-->
            <!--              <el-button type="primary" icon="el-icon-switch-button">订单关闭</el-button>-->
            <!--            </div>-->
            <!--            <div v-if="isFullscreen" style="display: flex;flex-direction: column;align-items: end">-->
            <!--              <div style="display: flex;margin: 10px 0">-->
            <!--                <el-button type="primary" icon="el-icon-circle-plus-outline" @click="add('add')">新增</el-button>-->
            <!--                <el-button type="primary" icon="el-icon-connection" @click="send('send')">派发</el-button>-->
            <!--              </div>-->
            <!--              <el-button type="primary" icon="el-icon-switch-button">订单关闭</el-button>-->
            <!--            </div>-->
          </div>
        </el-form>
      </div>
@@ -78,11 +92,7 @@
      <div style="margin-left: 10px;display: flex">
        <el-button type="primary" icon="el-icon-circle-plus-outline" @click="add('add')">新增</el-button>
        <el-button type="primary" icon="el-icon-connection" @click="send('send')">派发</el-button>
        <el-button
          type="primary"
          icon="el-icon-switch-button"
        >订单关闭
        </el-button>
        <el-button type="primary" icon="el-icon-switch-button" @click="orderClose">工单关闭</el-button>
      </div>
      <el-divider />
      <div class="elTableDiv">
@@ -103,6 +113,7 @@
          <!--          />-->
          <el-table-column
            width="50"
            fixed
          >
            <template slot-scope="{row}">
              <el-radio
@@ -126,17 +137,18 @@
          >
            <template slot-scope="{row}">
              <div v-if="row.status==='NEW'">新工单</div>
              <div v-if="row.status==='CREATING'">执行中</div>
              <div v-if="row.status==='CREATED'">已关闭</div>
              <!--              <div v-if="row.status==='ALLOC'">已派发</div>-->
              <!--              <div v-if="row.status==='START'">开工</div>-->
              <!--              <div v-if="row.status==='CLOSED'">完工</div>-->
              <!--              <div v-if="row.status==='CREATING'">执行中</div>-->
              <!--              <div v-if="row.status==='CREATED'">已关闭</div>-->
              <div v-if="row.status==='ALLO'">已派发</div>
              <div v-if="row.status==='START'">开工</div>
              <div v-if="row.status==='CLOSED'">完工</div>
            </template>
          </el-table-column>
          <el-table-column
            prop="wo_code"
            label="工单编号"
            sortable="custom"
            width="160"
          />
          <el-table-column
@@ -192,15 +204,21 @@
            label="工单等级"
            sortable="custom"
            width="120"
          />
          >
            <template slot-scope="{row}">
              <div v-if="row.piroque==='1'">特级</div>
              <div v-if="row.piroque==='2'">紧急</div>
              <div v-if="row.piroque==='3'">正常</div>
            </template>
          </el-table-column>
          <el-table-column
            prop="createuser"
            prop="lm_user"
            label="创建人员"
            sortable="custom"
            width="120"
          />
          <el-table-column
            prop="createdate"
            prop="lm_date"
            label="创建时间"
            width="160"
            sortable="custom"
@@ -213,7 +231,7 @@
            <template slot-scope="{row}">
              <div class="operationClass">
                <el-button type="text" @click="check(row)">工序任务</el-button>
                <el-button v-if="row.status==='NEW'" type="text" @click="del(row)">删除</el-button>
                <el-button type="text" @click="del(row)">删除</el-button>
              </div>
            </template>
          </el-table-column>
@@ -231,24 +249,30 @@
        @pagination="getMesOrderSearch"
      />
    </div>
    <!--新增派发对话框-->
    <el-dialog
      :title="operation==='add'?'新增':'派发'"
      :visible.sync="dialogVisible"
      width="60%"
      width="840px"
      top="15vh"
      :close-on-click-modal="false"
      @closed="handleClose"
      @close="handleClose"
    >
      <el-form ref="dialogForm" inline :rules="dialogFormRules" :model="dialogForm" label-width="80px">
      <el-form
        ref="dialogForm"
        inline
        :rules="dialogFormRules"
        :model="dialogForm"
        label-width="110px"
      >
        <el-form-item
          label="订单状态"
          prop="mesorderstus"
        >
          <el-select
            v-model="dialogForm.mesorderstus"
            :disabled="operation!=='add'"
            disabled
            :popper-append-to-body="false"
            style="width: 200px"
            placeholder="请选择"
@@ -261,35 +285,9 @@
            />
          </el-select>
        </el-form-item>
        <el-form-item
          v-if="operation==='add'"
          label="产品信息"
          prop="partcode"
        >
          <el-select
            v-model="dialogForm.partcode"
            :disabled="operation!=='add'"
            :popper-append-to-body="false"
            style="width: 200px"
            placeholder="请选择"
            @change="partcodeChange"
          >
            <el-option
              v-for="item in partArr"
              :key="item.partcode"
              :label="item.partname"
              :value="item.partcode"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="工单编号" prop="mesordercode">
          <el-input v-model="dialogForm.mesordercode" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item v-if="operation!=='add'" label="产品编码" prop="partcode">
          <el-input v-model="dialogForm.partcode" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item v-if="operation!=='add'" label="产品名称" prop="partname">
          <el-input v-model="dialogForm.partname" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item label="工单数量" prop="mesqty">
          <el-input
@@ -299,54 +297,93 @@
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item v-if="operation!=='add'" label="产品规格" prop="partspec">
          <el-input v-model="dialogForm.partspec" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item label="生产车间" prop="wkshopcode">
        <el-form-item
          v-if="operation==='add'"
          label="产品名称"
          prop="partcode"
        >
          <el-select
            v-model="dialogForm.wkshopcode"
            v-model="dialogForm.partcode"
            :disabled="operation!=='add'"
            :popper-append-to-body="false"
            style="width: 200px"
            placeholder="请选择"
            @change="partcodeChangeDialog"
          >
            <el-option
              v-for="item in wkshopArr"
              :key="item.code"
              :label="item.name"
              :value="item.code"
              v-for="item in partArr"
              :key="item.partcode"
              :label="item.partname"
              :value="item.partcode"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="工艺路线" prop="routecode">
          <el-select
            v-model="dialogForm.routecode"
            :disabled="dialogForm.partcode===''"
            :popper-append-to-body="false"
            style="width: 200px"
            placeholder="请选择"
          >
            <el-option
              v-for="item in routeArr"
              :key="item.route_code"
              :label="item.route_name"
              :value="item.route_code"
            />
          </el-select>
        <el-form-item v-if="operation!=='add'" label="产品名称" prop="partname">
          <el-input v-model="dialogForm.partname" disabled style="width: 200px" />
        </el-form-item>
        <el-form-item label="开始时间" prop="planstartdate">
        <el-form-item label="产品编码" prop="partcode">
          <el-input v-model="dialogForm.partcode" disabled style="width: 200px" />
        </el-form-item>
        <el-form-item label="产品规格" prop="partspec">
          <el-input v-model="dialogForm.partspec" disabled style="width: 200px" />
        </el-form-item>
        <div style="display: flex">
          <el-form-item label="生产车间" prop="wkshopcode">
            <el-select
              v-model="dialogForm.wkshopcode"
              :popper-append-to-body="false"
              style="width: 200px"
              placeholder="请选择"
            >
              <el-option
                v-for="item in wkshopArr"
                :key="item.code"
                :label="item.name"
                :value="item.code"
              />
            </el-select>
          </el-form-item>
          <div style="display: flex;flex-wrap: nowrap">
            <el-form-item label="工艺路线" prop="routecode">
              <el-select
                v-model="dialogForm.routecode"
                :disabled="dialogForm.partcode===''"
                :popper-append-to-body="false"
                style="width: 160px"
                placeholder="请选择"
              >
                <el-option
                  v-for="item in routeArr"
                  :key="item.route_code"
                  :label="item.route_name"
                  :value="item.route_code"
                />
              </el-select>
            </el-form-item>
            <el-button
              type="primary"
              style="padding: 0 10px;margin-left: -8px;margin-top: 5px"
              class="el-icon-search"
              @click="searchClick"
            />
            <!--            :disabled="dialogForm.routecode===''"-->
          </div>
        </div>
        <el-form-item label="计划开始时间" prop="planstartdate">
          <el-date-picker
            v-model="dialogForm.planstartdate"
            type="date"
            value-format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd"
            style="width: 200px"
            placeholder="选择日期"
          />
        </el-form-item>
        <el-form-item label="结束时间" prop="planenddate">
        <el-form-item label="计划完成时间" prop="planenddate">
          <el-date-picker
            v-model="dialogForm.planenddate"
            type="date"
            value-format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd"
            style="width: 200px"
            placeholder="选择日期"
          />
@@ -367,6 +404,54 @@
          </el-select>
        </el-form-item>
      </el-form>
      <!--        å·¥è‰ºè·¯çº¿æ”¾å¤§é•œå¯¹è¯æ¡†-->
      <el-dialog
        title="工序"
        :visible.sync="dialogVisibleSearch"
        width="540px"
        top="25vh"
        class="dialogVisibleSearch"
        append-to-body
      >
        <el-table
          :data="searchTableData"
          border
          stripe
          height="300"
          style="width: 100%;"
          highlight-current-row
          :header-cell-style="this.$headerCellStyle"
          :cell-style="this.$cellStyle"
        >
          <el-table-column
            prop="seq"
            label="序号"
            width="50"
          />
          <el-table-column
            prop="stepcode"
            label="工序编码"
          />
          <el-table-column
            prop="stepname"
            label="工序名称"
          />
          <el-table-column
            prop="flwtype"
            label="工序类型"
          >
            <template slot-scope="{row}">
              <div v-if="row.flwtype==='W'">外协</div>
              <div v-if="row.flwtype==='Z'">自制</div>
            </template>
          </el-table-column>
          <el-table-column
            prop="descr"
            label="工序描述"
          />
        </el-table>
      </el-dialog>
      <span slot="footer" class="dialog-footer">
        <div class="footerButton">
          <el-button @click="dialogVisibleCancel">取 æ¶ˆ</el-button>
@@ -374,14 +459,94 @@
        </div>
      </span>
    </el-dialog>
    <!--    å·¥åºä»»åŠ¡å¯¹è¯æ¡†-->
    <el-dialog
      title="工序任务"
      :visible.sync="dialogVisibleTask"
      width="840px"
      top="15vh"
      class="dialogVisibleSearch"
      :close-on-click-modal="false"
    >
      <el-table
        :data="taskTableData"
        border
        stripe
        height="300"
        style="width: 100%;"
        highlight-current-row
        :header-cell-style="this.$headerCellStyle"
        :cell-style="this.$cellStyle"
      >
        <el-table-column
          prop="seq"
          width="50"
          label="序号"
        />
        <el-table-column
          prop="wo_code"
          label="工单编号"
        />
        <el-table-column
          prop="stepcode"
          label="工序编码"
        />
        <el-table-column
          prop="stepname"
          label="工序名称"
        />
        <!--        <el-table-column-->
        <!--          prop="flwtype"-->
        <!--          label="工序类型"-->
        <!--        >-->
        <!--          <template slot-scope="{row}">-->
        <!--            <div v-if="row.flwtype==='W'">外协</div>-->
        <!--            <div v-if="row.flwtype==='Z'">自制</div>-->
        <!--          </template>-->
        <!--        </el-table-column>-->
        <!--        <el-table-column-->
        <!--          prop="descr"-->
        <!--          label="工序描述"-->
        <!--        />-->
        <el-table-column
          prop="plan_qty"
          label="任务数量"
        />
        <el-table-column
          prop="good_qty"
          label="合格数量"
        />
        <el-table-column
          prop="ng_qty"
          label="不良数量"
        />
      </el-table>
      <span slot="footer" class="dialog-footer">
        <div class="footerButton">
          <el-button @click="dialogVisibleBack">返 å›ž</el-button>
          <!--          <el-button type="primary" @click="dialogVisibleConfirm">ç¡® å®š</el-button>-->
        </div>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import Pagination from '@/components/Pagination'
import { DeleteMesOrder, MesOrderSearch } from '@/api/scgl'
import {
  AddUpdateMesOrder,
  ClosedErpOrder,
  ClosedMesOrder,
  DeleteMesOrder,
  MesOrderSearch, SearchWorkStep,
  SelectRouteStep
} from '@/api/scgl'
import { WorkShopSelect } from '@/api/sbgl'
import { PartSelect, PartSelectRpute } from '@/api/zzmx'
import { handleDatetime } from '@/utils/global'
const SER_HZ = /^[\u4e00-\u9fa5]+$/
export default {
@@ -402,6 +567,7 @@
      }
    }
    return {
      isFullscreen: false,
      mainHeight: 0,
      tableHeight: 0,
      form: {
@@ -412,18 +578,18 @@
        partspec: '', // äº§å“è§„æ ¼
        creatuser: '', // åˆ›å»ºäººå‘˜
        createdate: '', // åˆ›å»ºæ—¶é—´
        prop: 'partcode', // æŽ’序字段
        prop: 'lm_date', // æŽ’序字段
        order: 'desc', // æŽ’序字段
        page: 1, // ç¬¬å‡ é¡µ
        rows: 20 // æ¯é¡µå¤šå°‘条
      },
      erporderstusArr: [
        { code: 'NEW', name: '新工单' },
        { code: 'CREATING', name: '执行中' },
        { code: 'CREATED', name: '已关闭' }
        // { code: 'ALLOC', name: '已派发' },
        // { code: 'START', name: '开工' },
        // { code: 'CLOSED', name: '完工' }
        // { code: 'CREATING', name: '执行中' },
        // { code: 'CREATED', name: '已关闭' }
        { code: 'ALLO', name: '已派发' },
        { code: 'START', name: '开工' },
        { code: 'CLOSED', name: '完工' }
      ],
      total: 10,
      radioSelected: '',
@@ -435,7 +601,7 @@
        wkshopname: '', // ç”Ÿäº§è½¦é—´åç§°
        routename: '', // å·¥è‰ºè·¯çº¿åç§°
        mesorderstus: '', // å·¥å•状态码
        mesorderstus: 'NEW', // å·¥å•状态码
        mesordercode: '', // å·¥å•编号
        partcode: '', // äº§å“ç¼–码
        mesqty: '', // å·¥å•数量
@@ -452,9 +618,9 @@
      wkshopArr: [], // ç”Ÿäº§è½¦é—´æ•°ç»„
      routeArr: [], // å·¥è‰ºè·¯çº¿æ•°ç»„
      orderlevArr: [
        { code: '101', name: '一般' },
        { code: '102', name: '重要' },
        { code: '103', name: '特级' }
        { code: 1, name: '特级' },
        { code: 2, name: '紧急' },
        { code: 3, name: '正常' }
      ], // å·¥å•等级数组
      operation: '',
      dialogFormRules: {
@@ -486,8 +652,29 @@
          { required: true, message: '请选择工单等级', trigger: ['blur', 'change'] }
        ]
      }
      },
      dialogVisibleTask: false,
      taskTableData: [],
      // dialogFormTask: {
      //   partname: '', // äº§å“åç§°
      //   partspec: '', // äº§å“è§„æ ¼
      //   wkshopname: '', // ç”Ÿäº§è½¦é—´åç§°
      //   routename: '', // å·¥è‰ºè·¯çº¿åç§°
      //
      //   mesorderstusName: '', // å·¥å•状态名称
      //   mesorderstus: '', // å·¥å•状态码
      //   mesordercode: '', // å·¥å•编号
      //   partcode: '', // äº§å“ç¼–码
      //   mesqty: '', // å·¥å•数量
      //
      //   routecode: '', // å·¥è‰ºè·¯çº¿ç¼–码
      //   wkshopcode: '', // ç”Ÿäº§è½¦é—´ç¼–码
      //   planstartdate: '', // è®¡åˆ’开始时间
      //   planenddate: '', // è®¡åˆ’完成时间
      //   orderlev: '' // å·¥å•等级
      // },
      dialogVisibleSearch: false,
      searchTableData: []
    }
  },
  created() {
@@ -500,11 +687,31 @@
  },
  methods: {
    async getMesOrderSearch() {
      const res = await MesOrderSearch(this.form)
      let tempDate = this.form.createdate
      if (tempDate.length > 0) {
        tempDate = handleDatetime(tempDate[0]) + '~' + handleDatetime(tempDate[1])
      }
      const data = {
        mesorderstus: this.form.mesorderstus, // å·¥å•状态码
        mesordercode: this.form.mesordercode, // å·¥å•编号
        partcode: this.form.partcode, // äº§å“ç¼–码
        partname: this.form.partname, // äº§å“åç§°
        partspec: this.form.partspec, // äº§å“è§„æ ¼
        creatuser: this.form.creatuser, // åˆ›å»ºäººå‘˜
        createdate: tempDate, // åˆ›å»ºæ—¶é—´
        prop: this.form.prop, // æŽ’序字段
        order: this.form.order, // æŽ’序字段
        page: this.form.page, // ç¬¬å‡ é¡µ
        rows: this.form.rows // æ¯é¡µå¤šå°‘条
      }
      const res = await MesOrderSearch(data)
      this.tableData = res.data
      this.total = res.count
      // this.form.createdate = tempDate
    },
    async  getSelect() {
    async getSelect() {
      // èŽ·å–äº§å“ä¿¡æ¯
      const { data: res1 } = await PartSelect()
      this.partArr = res1
@@ -560,8 +767,13 @@
      this.dialogForm.routecode = ''
    },
    // å·¥åºä»»åŠ¡
    check() {
    async  check(row) {
      this.dialogVisibleTask = true
      const { data: res } = await SearchWorkStep({ wo_code: row.wo_code })
      this.taskTableData = res
    },
    dialogVisibleBack() {
      this.dialogVisibleTask = false
    },
    // æ´¾å‘
    send(operation) {
@@ -572,7 +784,7 @@
      const row = this.tableData.find(item => item.wo_code === this.radioSelected)
      if (row.status !== 'NEW') {
        return this.$message.info('此工单为非未开始状态,不可派发!')
        return this.$message.info('此工单为非新工单状态,不可派发!')
      }
      this.operation = operation
      this.dialogVisible = true
@@ -586,17 +798,18 @@
        this.dialogForm.partspec = row.partspec
        this.dialogForm.routecode = row.route_code// å·¥è‰ºè·¯çº¿ä»£ç 
        this.dialogForm.wkshopcode = row.wkshp_code// ç”Ÿäº§è½¦é—´ä»£ç 
        // handleDatatime(row.plan_startdate.toString().length > 0)
        this.dialogForm.planstartdate = row.plan_startdate
        this.dialogForm.planenddate = row.plan_enddate
        this.dialogForm.orderlev = row.piroque // ç­‰çº§
        this.dialogForm.planstartdate = row.plan_startdate !== null ? row.plan_startdate : handleDatetime(new Date())
        this.dialogForm.planenddate = row.plan_enddate !== null ? row.plan_enddate : handleDatetime(new Date())
        this.dialogForm.orderlev = row.piroque !== null ? row.piroque : 3 // ç­‰çº§
      })
    },
    // åˆ é™¤æŒ‰é’®
    async del(row) {
      // if (row.status !== 'NEW') {
      //   return this.$message.success('')
      // }
      console.log(row.status)
      if (row.status === 'START' || row.status === 'CLOSED') {
        return this.$message.info('此工单不可删除!')
      }
      this.$confirm('是否确认删除?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
@@ -609,15 +822,62 @@
          orderqty: row.plan_qty
        }
        console.log(data, 2)
        // DeleteMesOrder(data).then(res => {
        //   if (res.code === '200') {
        //     this.$message.success('删除成功!')
        //     this.getMesOrderSearch()
        //   }
        // })
        DeleteMesOrder(data).then(res => {
          if (res.code === '200') {
            this.$message.success('删除成功!')
            this.getMesOrderSearch()
          }
        })
      }).catch(() => {
        this.$message.info('已取消删除')
      })
    },
    // å·¥å•关闭事件
    orderClose() {
      if (this.radioSelected.length < 1) {
        return this.$message.info('请先选择工单!')
      }
      console.log('工单关闭事件')
      this.tableData.forEach(item => {
        if (item.wo_code === this.radioSelected) {
          if (item.status === 'START') {
            return this.$message.info('当前工单未完工,无法关闭!')
          } else if (item.status === 'CLOSED') {
            return this.$message.info('工单已关闭,无需再关闭!')
          } else {
            this.$confirm('是否确认关闭工单?', '提示', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
            }).then(() => {
              const data = {
                wocode: item.wo_code,
                m_po: item.m_po
              }
              ClosedMesOrder(data).then(res => {
                if (res.code === '200') {
                  this.$message.success('工单关闭成功!')
                  this.getMesOrderSearch()
                  // this.radioSelected = ''
                }
              })
            }).catch(() => {
              this.$message.info('已取消关闭!')
            })
          }
        }
      })
    },
    // å¯¹è¯æ¡†äº§å“ä¿¡æ¯å€¼æ”¹å˜
    partcodeChangeDialog(val) {
      console.log(val)
      this.dialogForm.partname = this.partArr.find(item => item.partcode === val).partname
      this.dialogForm.partcode = this.partArr.find(item => item.partcode === val).partcode
      this.dialogForm.partspec = this.partArr.find(item => item.partcode === val).partspec
      // const { data: res } = await PartSelectRpute({ partcode: val })
      // this.routeArr = res
      // this.dialogForm.routecode = ''
      this.partcodeChange(val)
    },
    // å¯¹è¯æ¡†å…³é—­äº‹ä»¶
    handleClose() {
@@ -626,7 +886,7 @@
      this.dialogForm.wkshopname = '' // ç”Ÿäº§è½¦é—´åç§°
      this.dialogForm.routename = '' // å·¥è‰ºè·¯çº¿åç§°
      this.dialogForm.mesorderstus = '' // å·¥å•状态码
      this.dialogForm.mesorderstus = 'NEW' // å·¥å•状态码
      this.dialogForm.mesordercode = '' // å·¥å•编号
      this.dialogForm.partcode = '' // äº§å“ç¼–码
      this.dialogForm.mesqty = '' // å·¥å•数量
@@ -648,10 +908,10 @@
      this.$refs.dialogForm.validate(valid => {
        if (valid) {
          const data = {
            partname: this.dialogForm.partname, // äº§å“åç§°
            partspec: this.dialogForm.partspec, // äº§å“è§„æ ¼
            wkshopname: this.dialogForm.wkshopname, // ç”Ÿäº§è½¦é—´åç§°
            routename: this.dialogForm.routename, // å·¥è‰ºè·¯çº¿åç§°
            // partname: this.dialogForm.partname, // äº§å“åç§°
            // partspec: this.dialogForm.partspec, // äº§å“è§„æ ¼
            // wkshopname: this.dialogForm.wkshopname, // ç”Ÿäº§è½¦é—´åç§°
            // routename: this.dialogForm.routename, // å·¥è‰ºè·¯çº¿åç§°
            mesorderstus: this.dialogForm.mesorderstus, // å·¥å•状态码
            mesordercode: this.dialogForm.mesordercode, // å·¥å•编号
@@ -666,15 +926,15 @@
            OperType: this.operation === 'add' ? 'Add' : 'Update'
          }
          console.log(data, 1)
          // AddUpdateMesOrder(data).then(res => {
          //   if (res.code === '200') {
          //     this.$message.success(this.operation === 'add' ? '添加成功!' : '修改成功!')
          //     this.dialogVisible = false
          //     this.getMesOrderSearch()
          //   } else {
          //     this.$message.error(this.operation === 'add' ? '添加失败!' : '修改失败!')
          //   }
          // })
          AddUpdateMesOrder(data).then(res => {
            if (res.code === '200') {
              this.$message.success(this.operation === 'add' ? '添加成功!' : '派发成功!')
              this.dialogVisible = false
              this.getMesOrderSearch()
            } else {
              this.$message.error(this.operation === 'add' ? '添加失败!' : '派发失败!')
            }
          })
        }
      })
    },
@@ -683,7 +943,23 @@
      this.$nextTick(() => {
        this.mainHeight = window.innerHeight - 250
        this.tableHeight = this.mainHeight - 100
        this.isFullscreen = window.innerHeight < 800
        if (this.isFullscreen) {
          this.tableHeight = this.tableHeight - 50
        }
      })
    },
    // å·¥è‰ºè·¯çº¿æ”¾å¤§é•œç‚¹å‡»
    async searchClick() {
      if (this.dialogForm.routecode === '') {
        return this.$message.info('请先选择工艺路线!')
      }
      this.dialogVisibleSearch = true
      const { data: res } = await SelectRouteStep({ routecode: this.dialogForm.routecode })
      this.searchTableData = res
    },
    dialogVisibleSearchBack() {
      this.dialogVisibleSearch = false
    }
  }
}
@@ -741,6 +1017,9 @@
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
.dialogVisibleSearch ::v-deep .el-dialog__body {
  padding: 20px 20px !important;
}
::v-deep .el-radio__input.is-checked .el-radio__inner {
  background-color: $main_color;
src/views/scgl/gdpg.vue
@@ -6,12 +6,12 @@
    <el-dialog
      title="预览"
      :visible.sync="dialogVisible"
      width="70%"
      width="1140"
    >
      <!-- è¦æ‰“印的区域 -->
      <div id="printMe">
      <div id="printMe" style="padding: 30px">
        <div style="display: flex;justify-content: space-around">
        <div style="display: flex;justify-content: space-around;">
          <!--          äºŒç»´ç éƒ¨åˆ†-->
          <div>
            <div id="qrCode" ref="qrCodeDiv" />
@@ -28,30 +28,72 @@
          </div>
          <!--右侧水印及姓名日期-->
          <div>
            <div ref="watermark" style="width: 100px;height:100px;" />
            <!--            <div ref="watermark" style="width: 100px;height:100px;" />-->
            <div style="color:#0f0f0f;;width: 100px;margin-top:40px;height: 50px;text-align: center">凯迪制造</div>
            <div style="font-weight: bolder">
              <div>姓名:张三</div>
              <div>日期:2022-07-05</div>
            </div>
          </div>
        </div>
        <el-divider />
        <!--        <el-divider />-->
        <div style="width:100%;height: 30px;border-bottom: 1px solid #eee;margin-bottom: 20px" />
        <el-table
          id="table"
          :data="tableData"
          border
          style="width: 100%"
          class="elTable"
          style="width: 100%;"
        >
          <el-table-column
            id="column0"
            prop="date"
            label="日期"
            width="180"
            width="100"
          />
          <el-table-column
            id="column1"
            prop="name"
            label="姓名"
            width="180"
            width="100"
          />
          <el-table-column
            id="column2"
            prop="address"
            label="地址"
            width="150"
          />
          <el-table-column
            id="column3"
            prop="address"
            label="地址"
            width="150"
          />
          <el-table-column
            id="column4"
            prop="address"
            width="150"
            label="地址"
          />
          <el-table-column
            id="column5"
            width="150"
            prop="address"
            label="地址"
          />
          <el-table-column
            id="column6"
            prop="address"
            width="120"
            label="地址"
          />
          <el-table-column
            id="column7"
            width="119"
            prop="address"
            label="地址"
          />
@@ -71,20 +113,115 @@
        <el-button type="primary" @click="dialogVisible = false">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <!--2222-->
    <el-dialog
      title="预览"
      :visible.sync="dialogVisible2"
      width="1140"
    >
      <!-- è¦æ‰“印的区域 -->
      <div id="printMe2" style="padding: 30px;">
        <!--        <div style="width: 500px; height: 300px;">-->
        <div style="display: flex;width: 300px;height: 200px;border: 1px solid #000;text-align: center;font-size: 16px;">
          <div style="width: 100px;display: flex;flex-direction: column;border-right: 1px solid #000">
            <div style="display: flex;height: 75%;border-bottom:1px solid #000;justify-content: center;align-items: center ">
              <div id="qrCode2" ref="qrCodeDiv2" />
            </div>
            <div style="display: flex;height: 25%;justify-content: center;align-items: center">
              æ•°é‡ï¼š100
            </div>
          </div>
          <div style="width:200px;display: flex;flex-direction: column">
            <div style="display: flex;height: 25%;border-bottom:1px solid #000;justify-content: center;align-items: center ">
              å·¥å•编号:1403-001-0001
            </div>
            <div style="display: flex;height: 25%;border-bottom:1px solid #000;justify-content: center;align-items: center ">
              å·¥å•编号:1403-001-0001
            </div>
            <div style="display: flex;height: 25%;border-bottom:1px solid #000 ;justify-content: center;align-items: center">
              å·¥å•编号:1403-001-0001
            </div>
            <div style="display: flex;height: 25%;justify-content: center;align-items: center">
              å·¥å•编号:1403-001-0001
            </div>
          </div>
        </div>
        <!--        </div>-->
      </div>
      <!--      <vue-easy-print ref="printRef" :button-show="true">-->
      <!--        x-->
      <!--      </vue-easy-print>-->
      <!-- æ‰“印的按钮,显示打印预览 -->
      <!--    <el-button v-print="'#printMe'">打印</el-button>-->
      <el-button v-print="printObj2">打印</el-button>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible2 = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="dialogVisible2 = false">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <el-button type="text" @click="outerVisible = true">点击打开外层 Dialog</el-button>
    <el-dialog
      title="外层 Dialog"
      top="15vh"
      :close-on-click-modal="false"
      width="840"
      :visible.sync="outerVisible"
    >
      <el-dialog
        width="30%"
        title="内层 Dialog"
        :visible.sync="innerVisible"
        append-to-body
      />
      <div slot="footer" class="dialog-footer">
        <el-button @click="outerVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="innerVisible = true">打开内层 Dialog</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import vueEasyPrint from 'vue-easy-print'
// import vueEasyPrint from 'vue-easy-print'
import QRCode from 'qrcodejs2'
// import QRCode from 'qrcode'
export default {
  name: 'Gdpg',
  components: {
    vueEasyPrint
  },
  // components: {
  //   vueEasyPrint
  // },
  data() {
    return {
      outerVisible: false,
      innerVisible: false,
      dialogVisible2: false,
      printObj2: {
        id: 'printMe2',
        beforeOpenCallback(vue) {
          vue.printLoading = true
          console.log('打开之前')
          console.log()
        },
        openCallback(vue) {
          vue.printLoading = false
          console.log('执行了打印')
        },
        closeCallback(vue) {
          console.log('关闭了打印工具')
        }
      },
      firstWatermark: true, // ç¬¬ä¸€æ¬¡æ˜¾ç¤ºæ°´å°
      firstbindQRCode: true, // ç¬¬ä¸€æ¬¡æ˜¾ç¤ºäºŒç»´ç 
      form: {
@@ -96,7 +233,42 @@
      printObj: {
        id: 'printMe',
        popTitle: '打印模板',
        extraHead: '<meta http-equiv="Content-Language" content="zh-cn"/>'
        extraHead: '<meta http-equiv="Content-Language" content="zh-cn"/>',
        previewBeforeOpenCallback() {
        }, // é¢„览窗口打开之前的callback(开启预览模式调用)
        previewOpenCallback() {
        }, // é¢„览窗口打开之后的callback(开启预览模式调用)
        beforeEntryIframe() {
          const widthArr = ['10%', '10%', '15%', '15%', '15%', '15%', '10%', '10%']
          // const tables = document.getElementById('table').getElementsByTagName('el-table') // èŽ·å–æ‰“å°çš„è¡¨æ ¼
          const tables = document.getElementById('table') // èŽ·å–æ‰“å°çš„è¡¨æ ¼
          // const headcolgroupCol0 = tables[0].getElementsByTagName('colgroup')[0].getElementsByTagName('col')
          // const headcolgroupCol0 = document.getElementById('column0').style.width = '400px'
          // const headcolgroupCol1 = document.getElementById('column1')
          // const headcolgroupCol2 = document.getElementById('column2')
          // const headcolgroupCol3 = document.getElementById('column3')
          // const headcolgroupCol4 = document.getElementById('column4')
          // const headcolgroupCol5 = document.getElementById('column5')
          // const headcolgroupCol6 = document.getElementById('column6')
          // const headcolgroupCol7 = document.getElementById('column7')
          // const headcolgroupCol1 = tables[1].getElementsByTagName('colgroup')[0].getElementsByTagName('col')
          // widthArr.forEach((val, index) => {
          //   headcolgroupCol0[index].width = val
          //   headcolgroupCol1[index].width = val
          //   headcolgroupCol2[index].width = val
          //   headcolgroupCol3[index].width = val
          //   headcolgroupCol4[index].width = val
          //   headcolgroupCol5[index].width = val
          //   headcolgroupCol6[index].width = val
          //   headcolgroupCol7[index].width = val
          // })
        },
        openCallback() {
        }, // è°ƒç”¨æ‰“印之后的回调事件
        closeCallback() {
        } // å…³é—­æ‰“印的回调事件(无法确定点击的是确认还是取消)
        // id: 'printMe',
        // popTitle: '打印', // æ‰“印配置页上方标题
        // extraHead: '', // æœ€ä¸Šæ–¹çš„头部文字,附加在head标签上的额外标签,使用逗号分隔
@@ -133,7 +305,9 @@
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.bindQRCode()
    })
  },
  methods: {
    addWatermark() {
@@ -148,15 +322,20 @@
      this.$nextTick(() => {
        this.bindQRCode()
        this.addWatermark()
        console.log(document.getElementById('column0').style.width = '200px', 0)
        console.log(document.getElementById('column7'), 7)
        console.log(document.getElementById('table'), 2)
        console.log(document.getElementById('table').getElementsByTagName('el-table'), 1)
      })
    },
    bindQRCode() {
      if (this.firstbindQRCode) {
        new QRCode(this.$refs.qrCodeDiv, {
        const text = 'PO202206280001;Step02'
        new QRCode(this.$refs.qrCodeDiv2, {
          // text: 'Vue实现生成二维码!',
          text: 'Vue实现生成二维码!',
          width: 100,
          height: 100,
          text: text,
          width: 80,
          height: 80,
          colorDark: '#333333', // äºŒç»´ç é¢œè‰²
          colorLight: '#ffffff', // äºŒç»´ç èƒŒæ™¯è‰²
          correctLevel: QRCode.CorrectLevel.L// å®¹é”™çŽ‡ï¼ŒL/M/H
@@ -189,7 +368,38 @@
}
</script>
<style scoped>
<style media="print">
/*@media print {*/
  @page {
    /*size: auto;*/
    size: auto;
    margin: 3mm;
    /*margin: 0mm;*/
    /*padding: 0;*/
  }
/*}*/
/*.elTable {*/
/*::v-deep .el-table {*/
/*  margin-top: 10px;*/
/*}*/
/*table {*/
/*  width: 100% !important;*/
/*}*/
/*.el-table__body,*/
/*.el-table__header {*/
/*  width: 100% !important;*/
/*}*/
/*.el-table__body {*/
/*  width: 100% !important;*/
/*}*/
/*}*/
/*/deep/.el-table__body-wrapper::-webkit-scrollbar{*/
/*  width: 0;*/
/*}*/
</style>
src/views/scgl/scdd.vue
@@ -39,30 +39,81 @@
              <el-input v-model="form.partspec" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item label="交付时间" style=" display: flex;">
              <!--              <el-date-picker-->
              <!--                v-model="form.paydate"-->
              <!--                type="date"-->
              <!--                value-format="yyyy-MM-dd HH:mm:ss"-->
              <!--                style="width: 200px"-->
              <!--                placeholder="选择日期"-->
              <!--              />-->
              <el-date-picker
                v-model="form.paydate"
                type="date"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 200px"
                placeholder="选择日期"
                type="daterange"
                range-separator="~"
                size="mini"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
              />
              <!--              :picker-options="expireTimeOption"-->
            </el-form-item>
            <el-form-item label="创建人员" style=" display: flex;">
              <el-input v-model="form.creatuser" style="width: 200px" placeholder="请输入" />
            </el-form-item>
            <el-form-item label="创建时间" style=" display: flex;">
              <!--              <el-date-picker-->
              <!--                v-model="form.createdate"-->
              <!--                type="date"-->
              <!--                value-format="yyyy-MM-dd HH:mm:ss"-->
              <!--                style="width: 200px"-->
              <!--                placeholder="选择日期"-->
              <!--              />-->
              <el-date-picker
                v-model="form.createdate"
                type="date"
                value-format="yyyy-MM-dd HH:mm:ss"
                style="width: 200px"
                placeholder="选择日期"
                type="daterange"
                range-separator="~"
                start-placeholder="开始日期"
                end-placeholder="结束日期"
                size="mini"
              />
              <!--              :picker-options="expireTimeOption"-->
            </el-form-item>
          </div>
          <div style="display: flex;align-items: start;margin-top: 5px;z-index: 2">
            <el-button type="primary" icon="el-icon-search" @click="search">查询</el-button>
            <el-button type="info" icon="el-icon-refresh" @click="reset">重置</el-button>
          <div style="min-height: 100px">
            <div style="display: flex;align-items: start;margin-top: 5px;z-index: 2;justify-content: end">
              <el-button type="primary" icon="el-icon-search" @click="search">查询</el-button>
              <el-button type="info" icon="el-icon-refresh" @click="reset">重置</el-button>
            </div>
            <!--                      <div v-if="!isFullscreen" style="display: flex;align-items: start; margin-top: 15px;z-index: 2">-->
            <!--                        <el-button-->
            <!--                          type="primary"-->
            <!--                          icon="el-icon-refresh-right"-->
            <!--                          @click="reset('update')"-->
            <!--                        >同步ERP-->
            <!--                        </el-button>-->
            <!--                        <el-button-->
            <!--                          type="primary"-->
            <!--                          icon="el-icon-switch-button"-->
            <!--                          @click="orderClose"-->
            <!--                        >关闭订单-->
            <!--                        </el-button>-->
            <!--                      </div>-->
            <!--                      <div v-if="isFullscreen" style="display: flex;flex-direction: column;align-items: end">-->
            <!--                        <el-button-->
            <!--                          type="primary"-->
            <!--                          icon="el-icon-refresh-right"-->
            <!--                          style="margin: 10px 0"-->
            <!--                          @click="reset('update')"-->
            <!--                        >同步ERP-->
            <!--                        </el-button>-->
            <!--                        <el-button-->
            <!--                          type="primary"-->
            <!--                          icon="el-icon-switch-button"-->
            <!--                          @click="orderClose"-->
            <!--                        >关闭订单-->
            <!--                        </el-button>-->
            <!--                      </div>-->
          </div>
        </el-form>
      </div>
@@ -134,16 +185,19 @@
            prop="wo"
            label="订单编号"
            sortable="custom"
            width="150"
          />
          <el-table-column
            prop="partcode"
            label="产品编码"
            sortable="custom"
            width="150"
          />
          <el-table-column
            prop="partname"
            label="产品名称"
            sortable="custom"
            width="150"
          />
          <el-table-column
            prop="partspec"
@@ -154,12 +208,14 @@
          <el-table-column
            prop="qty"
            label="订单数量"
            width="150"
            sortable="custom"
          />
          <el-table-column
            prop="wkshp_name"
            label="生产车间"
            sortable="custom"
            width="150"
          />
          <el-table-column
            prop="paydate"
@@ -171,6 +227,7 @@
            prop="createuser"
            label="创建人员"
            sortable="custom"
            width="150"
          />
          <el-table-column
            prop="createdate"
@@ -180,6 +237,7 @@
          />
          <el-table-column
            label="操作"
            fixed="right"
          >
            <template slot-scope="{row}">
              <div class="operationClass">
@@ -205,29 +263,29 @@
    <el-dialog
      :title="operation==='add'?'新增':'下达'"
      :visible.sync="dialogVisible"
      width="60%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      @closed="handleClose"
      @close="handleClose"
    >
      <el-form ref="dialogForm" inline :rules="dialogFormRules" :model="dialogForm" label-width="80px">
        <el-form-item label="订单状态" prop="erporderstus">
          <el-select
            v-model="dialogForm.erporderstus"
            disabled
            :popper-append-to-body="false"
            style="width: 200px"
            placeholder="请选择"
          >
            <el-option
              v-for="item in erporderstusArr"
              :key="item.code"
              :label="item.name"
              :value="item.code"
            />
          </el-select>
        </el-form-item>
        <!--        <el-form-item label="订单状态" prop="erporderstus">-->
        <!--          <el-select-->
        <!--            v-model="dialogForm.erporderstus"-->
        <!--            disabled-->
        <!--            :popper-append-to-body="false"-->
        <!--            style="width: 200px"-->
        <!--            placeholder="请选择"-->
        <!--          >-->
        <!--            <el-option-->
        <!--              v-for="item in erporderstusArr"-->
        <!--              :key="item.code"-->
        <!--              :label="item.name"-->
        <!--              :value="item.code"-->
        <!--            />-->
        <!--          </el-select>-->
        <!--        </el-form-item>-->
        <el-form-item label="订单编号" prop="erpordercode">
          <el-input v-model="dialogForm.erpordercode" disabled style="width: 200px" />
        </el-form-item>
@@ -237,9 +295,7 @@
        <el-form-item label="产品名称" prop="partname">
          <el-input v-model="dialogForm.partname" disabled style="width: 200px" />
        </el-form-item>
        <el-form-item label="订单数量" prop="erpqty">
          <el-input v-model="dialogForm.erpqty" disabled style="width: 200px" />
        </el-form-item>
        <el-form-item label="产品规格" prop="partspec">
          <el-input v-model="dialogForm.partspec" disabled style="width: 200px" />
        </el-form-item>
@@ -248,6 +304,17 @@
        </el-form-item>
        <el-form-item label="所属仓库" prop="warehousename">
          <el-input v-model="dialogForm.warehousename" disabled style="width: 200px" />
        </el-form-item>
        <el-form-item label="订单数量" prop="erpqty">
          <el-input v-model="dialogForm.erpqty" disabled style="width: 200px" />
        </el-form-item>
        <el-form-item label="已下单数" prop="relse_qty">
          <el-input
            v-model="dialogForm.relse_qty"
            disabled
            oninput="value=value.replace(/[^0-9.]/g,'')"
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="下单数量" prop="markqty">
          <el-input
@@ -263,14 +330,7 @@
            style="width: 200px"
          />
        </el-form-item>
        <el-form-item label="已下单数" prop="relse_qty">
          <el-input
            v-model="dialogForm.relse_qty"
            disabled
            oninput="value=value.replace(/[^0-9.]/g,'')"
            style="width: 200px"
          />
        </el-form-item>
        <!--        <el-form-item label="交付时间" prop="">-->
        <!--          <el-date-picker-->
        <!--            v-model="dialogForm.markqty"-->
@@ -295,7 +355,7 @@
<script>
import Pagination from '@/components/Pagination'
import { ClosedErpOrder, ErpOrderSearch, MarkSaveErpOrder } from '@/api/scgl'
import { handleDatatime } from '@/utils/global'
import { handleDatatime, handleDatetime } from '@/utils/global'
const SER_HZ = /^[\u4e00-\u9fa5]+$/
export default {
@@ -316,6 +376,7 @@
      }
    }
    return {
      isFullscreen: false,
      mainHeight: 0,
      tableHeight: 0,
      form: {
@@ -327,7 +388,7 @@
        paydate: '', // äº¤ä»˜æ—¶é—´
        creatuser: '', // åˆ›å»ºäººå‘˜
        createdate: '', // åˆ›å»ºæ—¶é—´
        prop: 'partcode', // æŽ’序字段
        prop: 'createdate', // æŽ’序字段
        order: 'desc', // æŽ’序字段
        page: 1, // ç¬¬å‡ é¡µ
        rows: 20 // æ¯é¡µå¤šå°‘条
@@ -376,6 +437,11 @@
        ]
      }
      // expireTimeOption: {
      //   disabledDate(time) {
      //     return time.getTime() > Date.now() - 8.64e6 // å¦‚果没有后面的-8.64e6就是不可以选择今天的
      //   }
      // }
    }
  },
@@ -389,7 +455,34 @@
  },
  methods: {
    async getErpOrderSearch() {
      const res = await ErpOrderSearch(this.form)
      console.log(this.form, 1)
      let tempDate2 = this.form.paydate
      if (tempDate2.length > 0) {
        tempDate2 = handleDatetime(tempDate2[0]) + '~' + handleDatetime(tempDate2[1])
      }
      let tempDate = this.form.createdate
      if (tempDate.length > 0) {
        tempDate = handleDatetime(tempDate[0]) + '~' + handleDatetime(tempDate[1])
      }
      const data = {
        erporderstus: this.form.erporderstus, // è®¢å•状态码
        erpordercode: this.form.erpordercode, // è®¢å•编号
        partcode: this.form.partcode, // äº§å“ç¼–码
        partname: this.form.partname, // äº§å“åç§°
        partspec: this.form.partspec, // äº§å“è§„æ ¼
        paydate: tempDate2, // äº¤ä»˜æ—¶é—´
        creatuser: this.form.creatuser, // åˆ›å»ºäººå‘˜
        createdate: tempDate, // åˆ›å»ºæ—¶é—´
        prop: this.form.prop, // æŽ’序字段
        order: this.form.order, // æŽ’序字段
        page: this.form.page, // ç¬¬å‡ é¡µ
        rows: this.form.rows // æ¯é¡µå¤šå°‘条
      }
      const res = await ErpOrderSearch(data)
      this.tableData = res.data
      this.total = res.count
    },
@@ -430,11 +523,11 @@
      this.radioSelected = wo
    },
    // è®¢å•关闭
    async  orderClose() {
    async orderClose() {
      if (this.radioSelected.length < 1) {
        return this.$message.info('请先选择订单!')
      }
      this.tableData.find(item => {
      this.tableData.forEach(item => {
        if (item.wo === this.radioSelected) {
          if (item.status !== 'NEW') {
            return this.$message.info('此订单非新订单,无法关闭!')
@@ -519,7 +612,7 @@
      this.$refs.dialogForm.validate(valid => {
        if (valid) {
          const data = {
            'erporderstus': this.dialogForm.erporderstus,
            // 'erporderstus': this.dialogForm.erporderstus,
            'erpordercode': this.dialogForm.erpordercode,
            'partcode': this.dialogForm.partcode,
            'wkshopcode': this.dialogForm.wkshopcode,
@@ -547,6 +640,10 @@
      this.$nextTick(() => {
        this.mainHeight = window.innerHeight - 250
        this.tableHeight = this.mainHeight - 100
        this.isFullscreen = window.innerHeight < 800
        if (this.isFullscreen) {
          this.tableHeight = this.tableHeight - 50
        }
      })
    }
  }
@@ -717,8 +814,8 @@
  border-color: $main_color;
}
.elTableDiv{
  ::v-deep .el-radio__label{
.elTableDiv {
  ::v-deep .el-radio__label {
    display: none;
  }
}
src/views/scgl/sckbg.vue
@@ -2,7 +2,7 @@
  <div>
    <div class="body" style="padding: 0;height: 100%" :style="{height:mainHeight+'px'}">
      <el-tabs type="border-card">
      <el-tabs ref="elTabs" type="border-card" @tab-click="tabClick">
        <el-tab-pane label="生产列表">
          <div style="margin-left: 10px;margin-top:10px;display: flex;justify-content: space-between">
            <div style="display: flex;align-items: center">
@@ -15,8 +15,14 @@
              />
            </div>
            <div style="display: flex;padding-right: 10px">
              <el-button><svg-icon icon-class="start_time" style="margin-right: 2px" />开始</el-button>
              <el-button><svg-icon icon-class="report_work" style="margin-right: 2px" />报工</el-button>
              <el-button @click="ZZstart">
                <svg-icon icon-class="start_time" style="margin-right: 2px" />
                å¼€å§‹
              </el-button>
              <el-button @click="ZZreport">
                <svg-icon icon-class="report_work" style="margin-right: 2px" />
                æŠ¥å·¥
              </el-button>
            </div>
          </div>
          <el-divider />
@@ -132,21 +138,27 @@
            <div style="display: flex;align-items: center">
              <div style="width: 70px">工序码:</div>
              <el-input
                v-model="produceCode"
                v-model="WXproduceCode"
                oninput="value=value.replace(/[^0-9.]/g,'')"
                name="produceCode"
                name="WXproduceCode"
                style="width: 500px"
              />
            </div>
            <div style="display: flex;padding-right: 10px">
              <el-button><svg-icon icon-class="start_time" style="margin-right: 2px" />发料</el-button>
              <el-button><svg-icon icon-class="report_work" style="margin-right: 2px" />收料</el-button>
              <el-button @click="WXsend">
                <svg-icon icon-class="start_time" style="margin-right: 2px" />
                å‘æ–™
              </el-button>
              <el-button @click="WXback">
                <svg-icon icon-class="report_work" style="margin-right: 2px" />
                æ”¶æ–™
              </el-button>
            </div>
          </div>
          <el-divider />
          <div class="elTableDiv">
            <el-table
              :data="tableData"
              :data="WXtableData"
              :height="tableHeight"
              border
              stripe
@@ -241,10 +253,10 @@
          </div>
          <!--分页-->
          <pagination
            v-show="total>0"
            :total="total"
            :page.sync="form.page"
            :limit.sync="form.rows"
            v-show="WXtotal>0"
            :total="WXtotal"
            :page.sync="WXform.page"
            :limit.sync="WXform.rows"
            align="right"
            layout="prev, pager, next,sizes"
            popper-class="select_bottom"
@@ -257,41 +269,265 @@
    </div>
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :title="dialogTitle"
      :visible.sync="dialogVisible"
      width="60%"
      top="15vh"
      @closed="handleClose"
      width="70%"
      :close-on-click-modal="false"
      @close="handleClose"
      @closed="handleClose"
    >
      <el-form ref="dialogForm" :rules="dialogFormRules" :model="dialogForm" label-width="80px">
        <el-form-item label="组织类型" prop="OrgType" />
        <el-form-item label="组织编码" prop="OrgCode">
          <el-input v-model="dialogForm.OrgCode" :disabled="operation!=='add'" style="width: 200px" />
      <el-form ref="dialogForm" inline :model="dialogForm" label-width="110px">
        <el-form-item label="工单编号:">
          <!--          <el-input v-model="dialogForm.name"></el-input>-->
          <div style="width: 200px">PO2022050500001</div>
        </el-form-item>
        <el-form-item label="组织名称" prop="OrgName">
          <el-input v-model="dialogForm.OrgName" style="width: 200px" />
        <el-form-item label="产品编码:">
          <div style="width: 200px">427100</div>
        </el-form-item>
        <el-form-item prop="SupUnit" label="上级单位">
        <el-form-item label="产品名称:">
          <div style="width: 200px">机箱板底</div>
        </el-form-item>
        <el-form-item label="产品规格:">
          <div style="width: 200px">机箱底板&1</div>
        </el-form-item>
        <el-form-item label="当前工序:">
          <div style="width: 200px">激光切割</div>
        </el-form-item>
        <el-form-item label="工序描述:">
          <el-tooltip class="item" effect="dark" content="原材料切按材料切按材料切按时打卡数据的卡" placement="top-start">
            <div style="width: 200px;white-space: nowrap;text-overflow: ellipsis;overflow: hidden;">
              åŽŸææ–™åˆ‡æŒ‰ææ–™åˆ‡æŒ‰ææ–™åˆ‡æŒ‰æ—¶æ‰“å¡æ•°æ®çš„å¡
            </div>
          </el-tooltip>
        </el-form-item>
        <el-form-item label="任务数量:">
          <div style="width: 200px">1000</div>
        </el-form-item>
        <el-form-item label="未报/已报:">
          <div style="width: 200px">900/100</div>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制开始'" label="开工数量:">
          <div style="width: 200px">1000</div>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制开始'" label="生产设备:">
          <el-select
            v-model="dialogForm.SupUnit"
            style="width: 200px"
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
            :popper-append-to-body="false"
          >
            <el-option
              v-for="item in SupUnitArr"
              :key="item.code"
              :label="item.name"
              :value="item.code"
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协发料'" label="外协供方:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协发料'" label="发料人员:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
            multiple
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协发料'" label="发料数量:">
          <el-input v-model="dialogForm.OrgName" oninput="value=value.replace(/[^0-9.]/g,'')" style="width: 200px;" />
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制报工'" label="下道工序:">
          <div style="width: 200px">B工序</div>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制报工'" label="设备名称:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制报工'" label="生产班组:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制报工'" label="报工数量:">
          <el-input v-model="dialogForm.OrgName" oninput="value=value.replace(/[^0-9.]/g,'')" style="width: 200px;" />
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制报工'" label="不良数量:">
          <el-input v-model="dialogForm.OrgName" oninput="value=value.replace(/[^0-9.]/g,'')" style="width: 200px;" />
        </el-form-item>
        <el-form-item v-if="dialogTitle==='自制报工'" label="不良原因:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <div v-if="dialogTitle==='自制报工'">
          <i class="el-icon-s-operation" style="color:#42b983;" /> äººå‘˜åˆ—表
          <el-button type="primary" style="margin: 10px 0">增行</el-button>
          <el-table
            :data="userTableData"
            border
            stripe
            :header-cell-style="this.$headerCellStyle"
            :cell-style="this.$cellStyle"
            height="180"
            highlight-current-row
            style="width: 100%"
          >
            <el-table-column
              prop="RowNum"
              label="序号"
            />
            <el-table-column
              prop="RowNum"
              label="人员名称"
            >
              <template slot-scope="{row}">
                <div v-if="row.isVisible===0">{{ row }}</div>
                <el-select
                  v-if="row.isVisible===1"
                  v-model="dialogForm.OrgType"
                  style="width: 200px;"
                  placeholder="请选择"
                >
                  <el-option
                    v-for="item in options"
                    :key="item.value"
                    :label="item.label"
                    :value="item.value"
                  />
                </el-select>
              </template>
            </el-table-column>
            <el-table-column
              prop="RowNum"
              label="操作"
            >
              <template slot-scope="{row}">
                <div class="operationClass">
                  <el-button v-if="row.isVisible===0" type="text" @click="userDel(row)">删除</el-button>
                  <el-button v-if="row.isVisible===1" type="text" @click="userSave(row)">保存</el-button>
                  <el-button v-if="row.isVisible===1" type="text" @click="userCancel(row)">取消</el-button>
                </div>
              </template>
            </el-table-column>
          </el-table>
          <!--分页-->
          <pagination
            v-show="UserTotal>0"
            :total="UserTotal"
            :page.sync="Userform.page"
            :limit.sync="Userform.rows"
            align="right"
            layout="prev, pager, next,sizes"
            popper-class="select_bottom"
            @pagination="getMesOrderStepSearch"
          />
        </div>
        <el-form-item v-if="dialogTitle==='外协收料'" label="下道工序:">
          <div style="width: 200px">B工序</div>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协收料'" label="外协供方:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协收料'" label="收料人员:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
            multiple
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协收料'" label="收料数量:">
          <el-input
            v-model="dialogForm.OrgName"
            style="width: 200px"
            oninput="value=value.replace(/[^0-9.]/g,'')"
          />
        </el-form-item>
        <el-form-item v-if="dialogTitle==='外协收料'" label="不良原因:">
          <el-select
            v-model="dialogForm.OrgType"
            style="width: 200px;"
            placeholder="请选择"
          >
            <el-option
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <div class="footerButton">
          <el-button @click="dialogVisibleCancel">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="dialogVisibleConfirm">ç¡® å®š</el-button>
          <el-button type="primary" @click="dialogVisible = false">ç¡® å®š</el-button>
        </div>
      </span>
    </el-dialog>
@@ -334,6 +570,7 @@
      mainHeight: 0,
      tableHeight: 0,
      produceCode: '', // å·¥åºç 
      WXproduceCode: '', // å¤–协工序码
      form: {
        orderstepqrcode: '', // æ‰«æçš„二维码信息
        prop: 'lm_date', // æŽ’序字段
@@ -341,31 +578,48 @@
        page: 1, // ç¬¬å‡ é¡µ
        rows: 20 // æ¯é¡µå¤šå°‘条
      },
      total: 10,
      tableData: [],
      WXform: { // å¤–协表单
        orderstepqrcode: '', // æ‰«æçš„二维码信息
        prop: 'lm_date', // æŽ’序字段
        order: 'desc', // æŽ’序字段
        page: 1, // ç¬¬å‡ é¡µ
        rows: 20 // æ¯é¡µå¤šå°‘条
      },
      WXtotal: 10, // å¤–协表单总数
      WXtableData: [], // å¤–协表
      dialogVisible: false,
      dialogTitle: '',
      dialogForm: {
        OrgType: '',
        OrgCode: '',
        OrgName: '',
        SupUnit: ''// ä¸Šçº§å•位
      },
      operation: '',
      dialogFormRules: {
        OrgType: [
          { required: true, message: '请输入选择类型', trigger: ['blur', 'change'] }
        ],
        OrgCode: [
          { required: true, validator: validateName, trigger: ['blur', 'change'] }
        ],
        OrgName: [
          { required: true, message: '请输入名称', trigger: ['blur', 'change'] }
        ],
        SupUnit: [
          { required: true, validator: validateTypeCode, trigger: ['blur', 'change'] }
        ]
      userTableData: [
      ], // äººå‘˜åˆ—表
      UserTotal: 0,
      Userform: {
      }
      // operation: '',
      // dialogFormRules: {
      //   OrgType: [
      //     { required: true, message: '请输入选择类型', trigger: ['blur', 'change'] }
      //   ],
      //   OrgCode: [
      //     { required: true, validator: validateName, trigger: ['blur', 'change'] }
      //   ],
      //   OrgName: [
      //     { required: true, message: '请输入名称', trigger: ['blur', 'change'] }
      //   ],
      //   SupUnit: [
      //     { required: true, validator: validateTypeCode, trigger: ['blur', 'change'] }
      //   ]
      // }
    }
  },
@@ -377,7 +631,7 @@
    this.getHeight()
    this.$nextTick(() => {
      $("input[name='produceCode']").focus()
      $("input[name='produceCode']")[0].focus()
    })
  },
  methods: {
@@ -402,15 +656,58 @@
    getCurrentRow() {
    },
    tabClick(val, d) {
      console.log(val, d, 1)
      if (this.$refs.elTabs.currentName === '0') {
        this.$nextTick(() => {
          $("input[name='produceCode']")[0].focus()
        })
      }
      if (this.$refs.elTabs.currentName === '1') {
        this.$nextTick(() => {
          $("input[name='WXproduceCode']")[0].focus()
        })
      }
    },
    // æŸ¥è¯¢
    search() {
      this.getMesOrderStepSearch()
    },
    upload() {
    // è‡ªåˆ¶å¼€å§‹
    ZZstart() {
      this.dialogTitle = '自制开始'
      this.dialogVisible = true
    },
    // è‡ªåˆ¶æŠ¥å·¥
    ZZreport() {
      this.dialogTitle = '自制报工'
      this.dialogVisible = true
    },
    // å¤–协发料
    WXsend() {
      this.dialogTitle = '外协发料'
      this.dialogVisible = true
    },
    // å¤–协收料
    WXback() {
      this.dialogTitle = '外协收料'
      this.dialogVisible = true
    },
    // ç”¨æˆ·åˆ—表删除
    userDel() {
    },
    // ç”¨æˆ·åˆ—表保存
    userSave() {
    },
    // ç”¨æˆ·åˆ—表取消
    userCancel() {
    },
    // é‡ç½®
    reset() {
      this.dialogTitle = ''
      this.form.OrgCode = ''
      this.form.OrgName = ''
      this.form.OrgType = ''
@@ -418,39 +715,6 @@
      this.getMesOrderStepSearch()
    },
    // æ–°å¢žæŒ‰é’®
    add(operation) {
      this.operation = operation
      this.dialogVisible = true
    },
    // ä¿®æ”¹æŒ‰é’®
    edit(operation, row) {
      this.operation = operation
      this.dialogVisible = true
      this.$nextTick(() => {
        this.dialogForm.OrgCode = row.org_code
        this.dialogForm.OrgName = row.org_name
        this.dialogForm.SupUnit = row.parent_id
      })
    },
    // åˆ é™¤æŒ‰é’®
    async del(row) {
      this.$confirm('是否确认删除?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        DeleteOrganization({ orgid: row.code }).then(res => {
          if (res.code === '200') {
            this.$message.success('删除成功!')
            this.getMesOrderStepSearch()
          }
        })
      }).catch(() => {
        this.$message.info('已取消删除')
      })
    },
    // å¯¹è¯æ¡†å…³é—­äº‹ä»¶
    handleClose() {
      this.dialogForm.OrgType = ''
@@ -462,6 +726,13 @@
    // å¯¹è¯æ¡†å–消
    dialogVisibleCancel() {
      this.dialogVisible = false
      // if (this.dialogTitle === '自制开始'||this.dialogTitle === '自制报工') {
      //   this.tabClick('0')
      // }
      // if (this.dialogTitle === '外协发料'||this.dialogTitle === '外协收料') {
      //   this.tabClick('1')
      // }
      this.tabClick()
    },
    // å¯¹è¯æ¡†ç¡®è®¤
    dialogVisibleConfirm() {
@@ -470,18 +741,18 @@
          const data = {
            OrganCode: this.dialogForm.OrgCode,
            OrganName: this.dialogForm.OrgName,
            OperType: this.operation === 'add' ? 'Add' : 'Update',
            Operator: getCookie('admin')
          }
          AddUpdateOrganization(data).then(res => {
            if (res.code === '200') {
              this.$message.success(this.operation === 'add' ? '添加成功!' : '修改成功!')
              this.dialogVisible = false
              this.getMesOrderStepSearch()
            } else {
              this.$message.error(this.operation === 'add' ? '添加失败!' : '修改失败!')
            }
          })
          this.tabClick()
          // AddUpdateOrganization(data).then(res => {
          //   if (res.code === '200') {
          //     // this.$message.success(this.operation === 'add' ? '添加成功!' : '修改成功!')
          //     this.dialogVisible = false
          //     this.getMesOrderStepSearch()
          //   } else {
          //     // this.$message.error(this.operation === 'add' ? '添加失败!' : '修改失败!')
          //   }
          // })
        }
      })
    },
@@ -489,7 +760,7 @@
    getHeight() {
      this.$nextTick(() => {
        this.mainHeight = window.innerHeight - 250
        this.tableHeight = this.mainHeight - 100
        this.tableHeight = this.mainHeight - 80
      })
    }
  }
@@ -507,9 +778,11 @@
  border: none;
  padding: 0 20px;
}
::v-deep .el-button--primary:hover {
  border: none;
}
::v-deep .el-button--info {
  height: 30px;
  display: flex;
@@ -543,9 +816,9 @@
  color: #606266;
}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-radio__input.is-checked .el-radio__inner {
  background-color: $main_color;
@@ -565,6 +838,7 @@
  height: 30px;
  line-height: 30px;
}
::v-deep .el-input__inner:focus {
  border-color: $main_color;
}
@@ -641,17 +915,19 @@
  border-color: $main_color;
}
::v-deep .el-select .el-input__inner:focus{
::v-deep .el-select .el-input__inner:focus {
  border-color: $main_color;
}
::v-deep .el-select-dropdown__item.selected{
::v-deep .el-select-dropdown__item.selected {
  color: $main_color;
}
::v-deep .el-checkbox__inner:hover{
::v-deep .el-checkbox__inner:hover {
  border-color: $main_color;
}
::v-deep .el-textarea__inner:focus{
::v-deep .el-textarea__inner:focus {
  border-color: $main_color;
}
src/views/wlgl/ckdy.vue
@@ -109,7 +109,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="50%"
      width="800px"
      :close-on-click-modal="false"
      top="15vh"
      @closed="handleClose"
@@ -117,13 +117,13 @@
    >
      <el-form ref="dialogForm" inline :rules="dialogFormRules" :model="dialogForm" label-width="80px">
        <el-form-item label="仓库编码" prop="warehousecode">
          <el-input v-model="dialogForm.warehousecode" :disabled="operation!=='add'" style="width: 220px" />
          <el-input v-model="dialogForm.warehousecode" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item label="仓库名称" prop="warehousename">
          <el-input v-model="dialogForm.warehousename" style="width: 220px" />
          <el-input v-model="dialogForm.warehousename" style="width: 200px" />
        </el-form-item>
        <el-form-item label="仓库描述">
          <el-input v-model="dialogForm.description" type="textarea" style="width: 220px" />
          <el-input v-model="dialogForm.description" type="textarea" style="width: 200px" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
src/views/wlgl/kwdy.vue
@@ -124,7 +124,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="50%"
      width="800px"
      :close-on-click-modal="false"
      top="15vh"
      @closed="handleClose"
@@ -132,16 +132,16 @@
    >
      <el-form ref="dialogForm" inline :rules="dialogFormRules" :model="dialogForm" label-width="80px">
        <el-form-item label="库位编码" prop="storagecode">
          <el-input v-model="dialogForm.storagecode" :disabled="operation!=='add'" style="width: 220px" />
          <el-input v-model="dialogForm.storagecode" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item label="库位名称" prop="storagename">
          <el-input v-model="dialogForm.storagename" style="width: 220px" />
          <el-input v-model="dialogForm.storagename" style="width: 200px" />
        </el-form-item>
        <el-form-item label="所属库位" prop="stockcode">
          <el-select
            v-model="dialogForm.stockcode"
            :popper-append-to-body="false"
            style="width: 220px"
            style="width: 200px"
            placeholder="请选择"
          >
            <el-option
@@ -153,7 +153,7 @@
          </el-select>
        </el-form-item>
        <el-form-item label="库位描述">
          <el-input v-model="dialogForm.description" type="textarea" style="width: 220px" />
          <el-input v-model="dialogForm.description" type="textarea" style="width: 200px" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
src/views/zzmx/chda.vue
@@ -160,6 +160,7 @@
            prop="lm_date"
            label="创建时间"
            sortable="custom"
            width="160"
          />
          <el-table-column
            label="工艺路线"
@@ -201,7 +202,7 @@
      :close-on-click-modal="false"
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="65%"
      width="800px"
      top="15vh"
      @closed="handleClose"
      @close="handleClose"
@@ -298,7 +299,7 @@
      :close-on-click-modal="false"
      title="单位设置"
      :visible.sync="officeDialogVisible"
      width="65%"
      width="800px"
      top="15vh"
      class="officeDialogVisible"
      @close="handleCloseOffice"
@@ -418,7 +419,7 @@
      :close-on-click-modal="false"
      title="关联工艺路线"
      :visible.sync="dialogVisibleRoute"
      width="50%"
      width="800px"
      top="15vh"
      :fullscreen="isFullscreen"
      class="dialogVisibleRoute"
@@ -967,7 +968,7 @@
    // æ–°å¢ž
    addOffice() {
      let number = Math.random() * Math.random()// ä½œä¸ºåˆ é™¤æ—¶çš„æ ‡è¯†ç¬¦
      number = number === 0 ? Math.random() * Math.random() : number
      number = number === 0 ? (10 + Math.random()) : number
      const data = { code: '', name: '', digdect: '', r_ule: '', isVisible: 1, number: number }
      this.officeTableData.unshift(data)
    },
@@ -1101,9 +1102,9 @@
  color: #606266;
}
//::v-deep .el-dialog__body {
//  padding: 20px 100px !important;
//}
::v-deep .el-dialog__body {
  padding: 20px 100px !important;
}
.dialogVisibleRoute {
  ::v-deep .el-dialog__body {
src/views/zzmx/gxdy.vue
@@ -171,7 +171,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="50%"
      width="800px"
      :close-on-click-modal="false"
      top="15vh"
      @closed="handleClose"
@@ -179,15 +179,15 @@
    >
      <el-form ref="dialogForm" inline :rules="dialogFormRules" :model="dialogForm" label-width="80px">
        <el-form-item label="工序编码" prop="stepcode">
          <el-input v-model="dialogForm.stepcode" :disabled="operation!=='add'" style="width: 220px" />
          <el-input v-model="dialogForm.stepcode" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item label="工序名称" prop="stepname">
          <el-input v-model="dialogForm.stepname" style="width: 220px" />
          <el-input v-model="dialogForm.stepname" style="width: 200px" />
        </el-form-item>
        <el-form-item prop="steptypecode" label="工序类型">
          <el-select
            v-model="dialogForm.steptypecode"
            style="width: 220px"
            style="width: 200px"
            placeholder="请选择"
            :popper-append-to-body="false"
          >
@@ -202,7 +202,7 @@
        <el-form-item prop="enable" label="启用状态">
          <el-select
            v-model="dialogForm.enable"
            style="width: 220px"
            style="width: 200px"
            placeholder="请选择"
            :popper-append-to-body="false"
          >
@@ -215,7 +215,7 @@
          </el-select>
        </el-form-item>
        <el-form-item label="工序描述" prop="description">
          <el-input v-model="dialogForm.description" type="textarea" style="width: 220px" />
          <el-input v-model="dialogForm.description" type="textarea" style="width: 200px" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
src/views/zzmx/gylx.vue
@@ -120,7 +120,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'预览'"
      :visible.sync="dialogVisible"
      width="70%"
      width="1200px"
      :close-on-click-modal="false"
      top="15vh"
      :fullscreen="isFullscreen"
src/views/zzmx/jpgj.vue
@@ -199,7 +199,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="70%"
      width="1200px"
      top="15vh"
      :fullscreen="isFullscreen"
      :close-on-click-modal="false"
src/views/zzmx/wllx.vue
@@ -113,7 +113,7 @@
    <el-dialog
      :title="operation==='add'?'新增':'编辑'"
      :visible.sync="dialogVisible"
      width="50%"
      width="800px"
      top="15vh"
      :close-on-click-modal="false"
      @closed="handleClose"
@@ -121,13 +121,13 @@
    >
      <el-form ref="dialogForm" inline :rules="dialogFormRules" :model="dialogForm" label-width="80px">
        <el-form-item label="类型编码" prop="materialtypecode">
          <el-input v-model="dialogForm.materialtypecode" :disabled="operation!=='add'" style="width: 220px" />
          <el-input v-model="dialogForm.materialtypecode" :disabled="operation!=='add'" style="width: 200px" />
        </el-form-item>
        <el-form-item label="类型名称" prop="materialtypename">
          <el-input v-model="dialogForm.materialtypename" style="width: 220px" />
          <el-input v-model="dialogForm.materialtypename" style="width: 200px" />
        </el-form-item>
        <el-form-item label="存货类型" prop="stocktypecode">
          <el-select v-model="dialogForm.stocktypecode" :popper-append-to-body="false" style="width: 220px" placeholder="请选择">
          <el-select v-model="dialogForm.stocktypecode" :popper-append-to-body="false" style="width: 200px" placeholder="请选择">
            <el-option
              v-for="item in stocktypeArr"
              :key="item.code"