Browse Source

2021/06/21

dxd123456 3 years ago
parent
commit
b115575c0f
100 changed files with 7737 additions and 0 deletions
  1. 18 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 14 0
      .eslintignore
  4. 61 0
      .eslintrc.js
  5. 5 0
      .gitignore
  6. 4 0
      .npmrc
  7. 10 0
      .postcssrc.js
  8. 9 0
      bash.exe.stackdump
  9. 41 0
      build/build.js
  10. 54 0
      build/check-versions.js
  11. 209 0
      build/utils.js
  12. 22 0
      build/vue-loader.conf.js
  13. 98 0
      build/webpack.base.conf.js
  14. 99 0
      build/webpack.dev.conf.js
  15. 153 0
      build/webpack.prod.conf.js
  16. 98 0
      build/webpack.test.conf.js
  17. 7 0
      config/dev.env.js
  18. 150 0
      config/index.js
  19. 4 0
      config/prod.env.js
  20. 7 0
      config/test.env.js
  21. 14 0
      index.html
  22. 91 0
      nginx.conf
  23. 141 0
      package.json
  24. 22 0
      src/Counter.vue
  25. 3609 0
      src/assets/css/style.css
  26. 3 0
      src/assets/iconfont/iconfont.css
  27. BIN
      src/assets/iconfont/iconfont.eot
  28. 28 0
      src/assets/iconfont/iconfont.svg
  29. BIN
      src/assets/iconfont/iconfont.ttf
  30. BIN
      src/assets/iconfont/iconfont.woff
  31. BIN
      src/assets/iconfont/iconfont.woff2
  32. BIN
      src/assets/img/Artboard.png
  33. BIN
      src/assets/img/custlogo.jpg
  34. BIN
      src/assets/img/default-bg.png
  35. BIN
      src/assets/img/download.png
  36. BIN
      src/assets/img/favicon.ico
  37. BIN
      src/assets/img/func/func_w.png
  38. BIN
      src/assets/img/hnst_logo.png
  39. BIN
      src/assets/img/icons.png
  40. BIN
      src/assets/img/icons/icons-add.png
  41. BIN
      src/assets/img/icons/icons-arrow-left.png
  42. BIN
      src/assets/img/icons/icons-arrow-right.png
  43. BIN
      src/assets/img/icons1.png
  44. BIN
      src/assets/img/icore-shown-all.png
  45. BIN
      src/assets/img/icore-shown-desc.png
  46. BIN
      src/assets/img/icore-shown-frame.png
  47. BIN
      src/assets/img/icore-shown-psw.png
  48. BIN
      src/assets/img/icore-shown-user.png
  49. BIN
      src/assets/img/icore-shown.png
  50. BIN
      src/assets/img/login-show.png
  51. BIN
      src/assets/img/login-shown1.png
  52. BIN
      src/assets/img/login.png
  53. BIN
      src/assets/img/login/login-bg.png
  54. BIN
      src/assets/img/login/login-icon1.png
  55. BIN
      src/assets/img/login/login-icon2.png
  56. BIN
      src/assets/img/login/login-icon3.png
  57. BIN
      src/assets/img/login/login-list-icon1.png
  58. BIN
      src/assets/img/login/login-list-icon2.png
  59. BIN
      src/assets/img/login/login-list-icon3.png
  60. BIN
      src/assets/img/login/login-list-icon4.png
  61. BIN
      src/assets/img/login/login-list-icon5.png
  62. BIN
      src/assets/img/login/login-list-icon6.png
  63. BIN
      src/assets/img/login/login-list-icon7.png
  64. BIN
      src/assets/img/login/login-list-icon8.png
  65. BIN
      src/assets/img/login/login-logo.png
  66. BIN
      src/assets/img/login/login-logo2.jpg
  67. BIN
      src/assets/img/login/login_blue.png
  68. BIN
      src/assets/img/login/login_date.png
  69. BIN
      src/assets/img/login/login_jobs.png
  70. BIN
      src/assets/img/login/login_paw.png
  71. BIN
      src/assets/img/login/login_submit.png
  72. BIN
      src/assets/img/login/login_user.png
  73. BIN
      src/assets/img/login/zhonggang_logo.png
  74. BIN
      src/assets/img/menu/menu_b.png
  75. BIN
      src/assets/img/menu/menu_w.png
  76. BIN
      src/assets/img/nav/nav_b.png
  77. BIN
      src/assets/img/nav/nav_c.png
  78. BIN
      src/assets/img/nav/nav_w.png
  79. BIN
      src/assets/img/photo-default.png
  80. BIN
      src/assets/img/spirit00.png
  81. BIN
      src/assets/img/ytg_tab.png
  82. BIN
      src/assets/img/ytg_xtico.png
  83. BIN
      src/assets/img/ytgbg_img.png
  84. BIN
      src/assets/img/ytgico.png
  85. 20 0
      src/components/App.vue
  86. 180 0
      src/components/common/LorderDetail.vue
  87. 704 0
      src/components/common/additional.vue
  88. 71 0
      src/components/common/customerDialog.vue
  89. 137 0
      src/components/common/dataDetail.vue
  90. 101 0
      src/components/common/deliveryStateDialog.vue
  91. 81 0
      src/components/common/deptSelector.vue
  92. 135 0
      src/components/common/fileList.vue
  93. 128 0
      src/components/common/gradeDialog.vue
  94. 280 0
      src/components/common/mlineDetail.vue
  95. 173 0
      src/components/common/modalType.vue
  96. 236 0
      src/components/common/mtitleDetail.vue
  97. 124 0
      src/components/common/orderDeatil.vue
  98. 40 0
      src/components/common/print.vue
  99. 78 0
      src/components/common/processDialog.vue
  100. 269 0
      src/components/common/processPointDialog.vue

+ 18 - 0
.babelrc

@@ -0,0 +1,18 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-runtime"],
+  "env": {
+    "test": {
+      "presets": ["env", "stage-2"],
+      "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node", "istanbul"]
+    }
+  }
+}

+ 9 - 0
.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 14 - 0
.eslintignore

@@ -0,0 +1,14 @@
+/build/
+/config/
+/dist/
+/*.js
+/test/unit/coverage/
+/src/components/st-table/
+/src/lib/
+/src/views/modelManagement/components/
+/src/components/
+/src/views/metaData/components/keyManagementER/
+/src/views/cloudPlatform/
+/src/views/systemConfig/
+/src/views/workFlow/components/processDdesign.vue
+# /src/views/devops/components/appList/flowchart.vue

+ 61 - 0
.eslintrc.js

@@ -0,0 +1,61 @@
+// https://eslint.org/docs/user-guide/configuring
+
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint'
+  },
+  env: {
+    browser: true,
+    node: true,
+    commonjs: true,
+    es6: true,
+    jquery: true // 添加对jquery的支持
+  },
+  extends: [
+    // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
+    // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
+    'plugin:vue/essential',
+    // https://github.com/standard/standard/blob/master/docs/RULES-en.md
+    'standard'
+  ],
+  // 指定你所要使用的全局变量,true代表允许重写、false代表不允许重写
+  globals: {
+    mini: true,
+    XLSX: true,
+    VCode: true, // 验证码
+    QRCode: true, // 二维码
+    Swiper: true, // Swiper
+    Steer: true // Steer
+  },
+  // required to lint *.vue files
+  plugins: [
+    'vue'
+  ],
+  // add your custom rules here
+  // 系数0为不提示(off)、1为警告(warn)、2为错误抛出(error)
+  rules: {
+    'indent': [0, 4, {
+        'SwitchCase': 4
+    }],  
+    // allow paren-less arrow functions
+    'arrow-parens': 0,
+    // allow async-await
+    'generator-star-spacing': 'off',
+    // allow debugger during development
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+
+    // allow / 强制 语句结束以分号结束
+    'semi': 0,
+    // allow 连续声明 let a=1,b=2,....;
+    'one-var': 0,
+    // allow new Object()
+    'no-new': 0,
+    // 在创建对象字面量时不允许键重复 {a:1, a:1}
+    'no-dupe-keys': 2,
+    // 函数参数不能重复
+    'no-dupe-args': 2,
+    // 不能有声明后未被使用的变量或参数
+    'no-unused-vars': 0
+  }
+};

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/package-lock.json
+/node_modules
+/dist
+/.vscode
+/src/views.zip

+ 4 - 0
.npmrc

@@ -0,0 +1,4 @@
+sass_binary_site=https://npm.taobao.org/mirrors/node-sass
+fse_binary_host_mirror=https://npm.taobao.org/mirrors/fsevents
+chromedriver_cdnurl=https://npm.taobao.org/mirrors/chromedriver
+phantomjs_cdnurl=https://npm.taobao.org/mirrors//phantomjs

+ 10 - 0
.postcssrc.js

@@ -0,0 +1,10 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    "postcss-import": {},
+    "postcss-url": {},
+    // to edit target browsers: use "browserslist" field in package.json
+    "autoprefixer": {}
+  }
+}

+ 9 - 0
bash.exe.stackdump

@@ -0,0 +1,9 @@
+Stack trace:
+Frame        Function    Args
+000FFFFA358  0018006021E (00180252DED, 001802340A6, 000FFFFA358, 000FFFF9250)
+000FFFFA358  00180048859 (00000000000, 00000000000, 00000000000, 00000000000)
+000FFFFA358  00180048892 (00180252EA9, 000FFFFA208, 000FFFFA358, 00000000000)
+000FFFFA358  001800AF0D8 (00000000000, 00000000000, 00000000000, 00000000000)
+000FFFFA358  001800AF25D (000FFFFA370, 00000000000, 00000000000, 00000000000)
+000FFFFA5E0  001800B0673 (000FFFFA370, 00000000000, 00000000000, 00000000000)
+End of stack trace

+ 41 - 0
build/build.js

@@ -0,0 +1,41 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red('  Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+  })
+})

+ 54 - 0
build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

+ 209 - 0
build/utils.js

@@ -0,0 +1,209 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const merge = require('webpack-merge');
+const glob = require('glob');
+const pathSrc = path.resolve(__dirname, '../src');
+
+// 指定开发模式下需要加载的模块(可以做到只加载当前模块,提高开发效率)
+// index模块(登录)为必须,all 为所有
+// const devModules = ['index', 'systemInterface', 'energyPerformance', 'basicInformation', 'energyScheduling'];
+const devModules = ['all'];
+// 获取入口集合
+const getEntries = function (suffix, polyfill) {
+  // 自动获取
+  const entryHtml = glob.sync(pathSrc + '/views/**/app.html'); // 根据html来
+  const entries = {};
+  entryHtml.forEach((filePath) => {
+    // views/index/app.html --> views/index   chunk有'/'则js/css会有相应的目录
+    let _chunk = filePath.split(pathSrc.replace(/\\/g, '/') + '/')[1]; // views/index/app.html
+    _chunk = _chunk.substring(0, _chunk.lastIndexOf('/'));
+    let flag = true;
+
+    flag = false;
+    for (let item of devModules) {
+      if (item && (_chunk.indexOf('views/' + item) >= 0 || item === 'all')) {
+        flag = true;
+        break;
+      }
+    }
+
+    // views/workshop/work-slitting.html
+    if (flag) {
+      let arr = _chunk.split('/'),
+        larr = [],
+        rarr = [];
+      // console.log(arr) // [ 'views', 'workshop', 'work', 'sllitting', 'slitting']
+      console.log('arr: ', arr);
+      // -->> views/workshop/work-slitting.html
+      larr = arr.slice(0, 2);
+      _chunk = larr.join('/');
+      if (arr.length > 2) {
+        rarr = arr.slice(2, arr.length);
+        _chunk = _chunk + '/' + rarr.join('-');
+      }
+      if (suffix) {
+        filePath = filePath.replace('.html', suffix);
+      }
+      if (polyfill) {
+        entries[_chunk] = ['babel-polyfill', filePath];
+      } else {
+        entries[_chunk] = filePath;
+      }
+    }
+  });
+  //{ 'views/index/index': 'F:/webui/multiple-pages/demo/src/views/index/index.js',
+  //  'views/user/user': 'F:/webui/multiple-pages/demo/src/views/user/user.js' }
+  // 自动指定,可指定模块
+  // const entries = {
+  //   'views/index/index': pathSrc + '/views/index/index/index' + suffix, // 默认页面/登录
+  //   // 车间MES
+  //   'views/workshop/w4mm': pathSrc + '/views/workshop/work/w4mm/w4mm' + suffix, // 4mm分条机作业管理
+  //   'views/workshop/m4mm': pathSrc + '/views/workshop/monitor/m4mm/m4mm' + suffix, // 4mm分条机作业管理
+  // };
+  return entries;
+};
+// 多入口配置(入口JS固定为main.js)
+exports.entries = function () {
+  // ['babel-polyfill', './src/main.js']
+  let _entries = getEntries('.js', true);
+  return _entries;
+};
+//多页面输出配置
+exports.htmlPlugins = function () {
+  let entryHtmls = getEntries('.html');
+  let arr = [];
+  for (let _chunk in entryHtmls) {
+    console.log('loading chunk:', _chunk);
+    // _chunk :views/index/index
+    let conf = {
+      favicon: pathSrc + '/assets/img/favicon.ico', //favicon路径,通过webpack引入同时可以生成hash值
+      template: entryHtmls[_chunk], // html模板路径
+      // filename: 'views/' + fileName, // 生成的html存放路径,相对于path
+      filename: _chunk + '.html',
+      chunks: [_chunk],
+      inject: true // js插入的位置,true/'head'/'body'/false
+    };
+    if (process.env.NODE_ENV === 'production') {
+      console.log('package content: ', _chunk)
+      conf = merge(conf, {
+        chunks: ['manifest', 'vendor', _chunk],
+        minify: {
+          // removeAttributeQuotes: true, // 删除可删除的引号
+          removeComments: true, // 移除HTML中的注释
+          collapseWhitespace: true // 删除空白符与换行符
+        },
+        chunksSortMode: 'dependency'
+      })
+    }
+    arr.push(new HtmlWebpackPlugin(conf));
+  }
+  console.log('arr:', arr);
+  return arr;
+};
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory = process.env.NODE_ENV === 'production' ?
+    config.build.assetsSubDirectory :
+    config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders(loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        // 解决打包后背景图片路径不对的问题
+        // static/css/views/index/index.css
+        // ../../../../static/img/xx.jpg
+        publicPath: '../../../', // 注意: 此处根据路径, 自动更改
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', {
+      indentedSyntax: true
+    }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 22 - 0
build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 98 - 0
build/webpack.base.conf.js

@@ -0,0 +1,98 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve(dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const createLintingRule = () => ({
+  test: /\.(js|vue)$/,
+  loader: 'eslint-loader',
+  enforce: 'pre',
+  include: [resolve('src'), resolve('test')],
+  options: {
+    formatter: require('eslint-friendly-formatter'),
+    emitWarning: !config.dev.showEslintErrorsInOverlay
+  }
+})
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  // entry: {
+  //   app: './src/main.js'
+  // },
+  entry: utils.entries(),
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production' ?
+      config.build.assetsPublicPath :
+      config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+    }
+  },
+  module: {
+    rules: [
+      ...(config.dev.useEslint ? [createLintingRule()] : []),
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        exclude: [resolve('node_modules/element-ui/src/utils/date.js'), resolve('node_modules/element-ui/src/utils/popper.js')],// sb element-ui竟然在源码里面单独把这两个js转译成了es5 气死哥了!!!
+        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client'),
+          resolve('node_modules/vue-element-bigdata-table'),
+          resolve('node_modules/element-ui/src'),
+          resolve('node_modules/icore-sdk')
+        ]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[ext]')
+        }
+      }
+    ]
+  },
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 99 - 0
build/webpack.dev.conf.js

@@ -0,0 +1,99 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.dev.cssSourceMap,
+      usePostCSS: true
+    })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: {
+      rewrites: [{
+        from: /.*/,
+        to: path.posix.join(config.dev.assetsPublicPath, 'index.html')
+      }, ],
+    },
+    hot: true,
+    contentBase: false, // since we use CopyWebpackPlugin.
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay ? {
+      warnings: false,
+      errors: true
+    } : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    // new HtmlWebpackPlugin({
+    //   filename: 'index.html',
+    //   template: 'index.html',
+    //   inject: true,
+    //   chunks: [] // 不指定则引入所有chunk,[]则是不引入chunk
+    // }),
+    // copy custom static assets
+    new CopyWebpackPlugin([{
+      from: path.resolve(__dirname, '../static'),
+      to: config.dev.assetsSubDirectory,
+      ignore: ['.*']
+    }])
+  ].concat(utils.htmlPlugins())
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          // messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}/views/index.html`],
+        },
+        onErrors: config.dev.notifyOnErrors ?
+          utils.createNotifierCallback() : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 153 - 0
build/webpack.prod.conf.js

@@ -0,0 +1,153 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = process.env.NODE_ENV === 'testing'
+  ? require('../config/test.env')
+  : require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].js'),
+    chunkFilename: utils.assetsPath('js/[id].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+
+    new HtmlWebpackPlugin({
+      filename: process.env.NODE_ENV === 'testing'
+        ? 'index.html'
+        : config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      chunks: [], // 不指定则引入所有chunk,[]则是不引入chunk
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+
+
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    // new webpack.optimize.CommonsChunkPlugin({
+    //   name: 'app',
+    //   async: 'vendor-async',
+    //   children: true,
+    //   minChunks: 3
+    // }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ].concat(utils.htmlPlugins())
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 98 - 0
build/webpack.test.conf.js

@@ -0,0 +1,98 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: 'inline-cheap-module-source-map',
+  externals: [require('webpack-node-externals')()],
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: {
+      rewrites: [
+        { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
+      ],
+    },
+    hot: true,
+    contentBase: false, // since we use CopyWebpackPlugin.
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    // new HtmlWebpackPlugin({
+    //   filename: 'index.html',
+    //   template: 'index.html',
+    //   inject: true,
+    //   chunks: [] // 不指定则引入所有chunk,[]则是不引入chunk
+    // }),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.dev.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ].concat(utils.htmlPlugins())
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          // messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}/views/index.html`],
+        },
+        onErrors: config.dev.notifyOnErrors
+        ? utils.createNotifierCallback()
+        : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 7 - 0
config/dev.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"'
+})

+ 150 - 0
config/index.js

@@ -0,0 +1,150 @@
+'use strict'
+// Template version: 1.3.1
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+
+module.exports = {
+
+  // 网站模块名,例如 http://192.168.0.216:8089/module/app/initlayer.html 中的
+  //【views】,默认为views,修改这里的配置的同时,也要同时重命名/src/views的这个文件夹名称
+  // moduleName: 'zhongsteel.ytg', // http://localhost:8081/#/views/user.html
+  //   apolloclear
+  dev: {
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {
+      '/zhongsteel.pass.web/pass/v1': {
+        target: 'http://172.16.100.133:9001/v1', //加http
+        // target: 'http://192.168.10.191:9001/v1', //加http
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/v1': '/' //这里理解成用‘/api’代替target里面的地址,组件中我们调接口时直接用/api代替
+          // 比如我要调用'http://0.0:300/user/add',直接写‘/api/user/add’即可 代理后地址栏显示/
+        }
+      },
+      '/zhongsteel.pass.web/pass/auth': {
+        target: 'http://172.16.100.133:9001/auth', //加http
+        // target: 'http://192.168.10.191:9001/auth', //加http
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/auth': '/' //这里理解成用‘/api’代替target里面的地址,组件中我们调接口时直接用/api代替
+          // 比如我要调用'http://0.0:300/user/add',直接写‘/api/user/add’即可 代理后地址栏显示/
+        }
+      },
+      '/zhongsteel.pass.web/pass/logout': {
+        target: 'http://172.16.100.133:9001/logout', //加http
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/logout': '/' //这里理解成用‘/api’代替target里面的地址,组件中我们调接口时直接用/api代替
+          // 比如我要调用'http://0.0:300/user/add',直接写‘/api/user/add’即可 代理后地址栏显示/
+        }
+      },
+      '/zhongsteel.pass.web/pass/configCenter': {
+        target: 'https://config.steerinfo.com/configCenter', //加http
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/configCenter': '/' //这里理解成用‘/api’代替target里面的地址,组件中我们调接口时直接用/api代替
+          // 比如我要调用'http://0.0:300/user/add',直接写‘/api/user/add’即可 代理后地址栏显示/
+        }
+      },
+      '/zhongsteel.pass.web/pass/serviceCenter': {
+        target: 'https://service-govern.steerinfo.com',
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass': '/'
+        }
+      },
+      '/zhongsteel.pass.web/pass/act': {
+        target: 'https://act.steerinfo.com',
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/act': '/'
+        }
+      },
+      '/icore-api': {
+        target: 'http://172.16.100.133:9001',
+        changeOrigin: true,
+        pathRewrite: {
+          '^/icore-api': '/'
+        }
+      },
+      '/zhongsteel.pass.web/pass/ems': {
+        target: 'http://localhost:9002',
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/ems': '/'
+        }
+      },
+      '/zhongsteel.pass.web/pass/localhost': {
+        target: 'http://localhost:9002',
+        changeOrigin: true,
+        pathRewrite: {
+          '^/zhongsteel.pass.web/pass/localhost': '/'
+        }
+      }
+    },
+
+    // Various Dev Server settings
+    host: 'localhost', // can be overwritten by process.env.HOST
+    port: 8802, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: true,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    // Use Eslint Loader?
+    // If true, your code will be linted during bundling and
+    // linting errors and warnings will be shown in the console.
+    useEslint: true,
+    // If true, eslint errors and warnings will also be shown in the error overlay
+    // in the browser.
+    showEslintErrorsInOverlay: false,
+
+    /**
+     * Source Maps
+     */
+
+    // https://webpack.js.org/configuration/devtool/#development
+    // devtool: 'cheap-module-eval-source-map',
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    cssSourceMap: false
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../dist/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static', // 打包后 static放的位置
+    assetsPublicPath: '../', // html中webpack打包的JS -> ../static/xxx.js
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: false,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: '#source-map',
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ['js', 'css'],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  }
+}

+ 4 - 0
config/prod.env.js

@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"'
+}

+ 7 - 0
config/test.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const devEnv = require('./dev.env')
+
+module.exports = merge(devEnv, {
+  NODE_ENV: '"testing"'
+})

+ 14 - 0
index.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <title>工业互联网平台 iCore-ICP</title>
+    <script>
+      window.location.href='./views/index.html';
+    </script>
+  </head>
+  <body>
+    <div>&nbsp;</div>
+  </body>
+</html>

+ 91 - 0
nginx.conf

@@ -0,0 +1,91 @@
+#user  nobody;
+worker_processes  1;
+
+#error_log  logs/error.log;
+#error_log  logs/error.log  notice;
+#error_log  logs/error.log  info;
+
+#pid        logs/nginx.pid;
+
+
+events {
+    worker_connections  1024;
+}
+
+
+http {
+    include       mime.types;
+    default_type  application/octet-stream;
+
+    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+    #                  '$status $body_bytes_sent "$http_referer" '
+    #                  '"$http_user_agent" "$http_x_forwarded_for"';
+
+    #access_log  logs/access.log  main;
+
+    sendfile        on;
+    #tcp_nopush     on;
+
+    #keepalive_timeout  0;
+    keepalive_timeout  65;
+
+    #gzip  on;
+	
+    add_header Access-Control-Allow-Origin *;
+    add_header Access-Control-Allow-Headers X-Requested-With;
+    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
+
+    server {
+        root /usr/share/nginx/html/;	
+        location /zhongsteel.pass.web/pass/v1 {
+            rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-sso.dev.svc.cluster.local/v1; # 转发地址
+        }
+        location /zhongsteel.pass.web/pass/logout {
+            rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-sso.dev.svc.cluster.local/logout; # 转发地址
+        }
+        location /zhongsteel.pass.web/pass/auth {
+            rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-sso.dev.svc.cluster.local/auth; # 转发地址
+        }
+        location /zhongsteel.pass.web/pass/img {
+            rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-sso.dev.svc.cluster.local/img; # 转发地址
+        }
+        location /zhongsteel.pass.web/pass/service {
+            rewrite ^/b/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-sso.dev.svc.cluster.local/service; # 转发地址
+        }		
+        location /icore-api {
+            rewrite ^/icore-api/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-sso.dev.svc.cluster.local; # 转发地址
+        }
+        location /zhongsteel.pass.web/pass/ems {
+            rewrite ^/zhongsteel.pass.web/pass/ems/(.*)$ /$1 break; # 去除本地接口/api前缀, 否则会出现404
+            proxy_set_header Host $host;
+            proxy_set_header X-Real-IP $remote_addr;
+            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+            proxy_pass http://zgems-ems-api.dev.svc.cluster.local/v1; # 转发地址.dev.svc.cluster.local
+        }
+
+     }
+}

+ 141 - 0
package.json

@@ -0,0 +1,141 @@
+{
+  "name": "zhongsteel.energy.ms",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "onlyang",
+  "private": true,
+  "scripts": {
+    "dev": "webpack-dev-server --inline --progress --profile --colors --config build/webpack.dev.conf.js --host 0.0.0.0",
+    "start": "npm run dev",
+    "unit": "jest --config test/unit/jest.conf.js --coverage",
+    "e2e": "node test/e2e/runner.js",
+    "test": "npm run unit && npm run e2e",
+    "lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
+    "build": "node build/build.js",
+    "testc": "cross-env NODE_ENV=test nyc mocha-webpack --webpack-config build/webpack.test.conf.js --require test/setup.js test/**/*.spec.js"
+  },
+  "dependencies": {
+    "@antv/g6": "1.2.8",
+    "apollo-cache-inmemory": "^1.5.1",
+    "apollo-client": "^2.5.1",
+    "apollo-link": "^1.2.11",
+    "apollo-link-error": "^1.1.11",
+    "apollo-link-http": "^1.5.14",
+    "axios": "^0.18.0",
+    "babel-polyfill": "^6.26.0",
+    "echarts": "^4.1.0",
+    "element-ui": "2.4.2",
+    "file-saver": "^1.3.8",
+    "graphql": "^14.1.1",
+    "graphql-tag": "^2.10.1",
+    "script-loader": "^0.7.2",
+    "socket.io": "^2.2.0",
+    "socket.io-stream": "^0.9.1",
+    "sockjs-client": "^1.3.0",
+    "vue": "^2.5.2",
+    "vue-apollo": "^3.0.0-beta.28",
+    "vue-baidu-map": "^0.21.19",
+    "vue-clipboard2": "^0.2.1",
+    "vue-element-bigdata-table": "^1.3.1",
+    "vue-quill-editor": "^3.0.5",
+    "vue-router": "^3.0.1",
+    "vue-splitpane": "^1.0.2",
+    "vuex": "^3.0.1",
+    "x2js": "^3.3.0",
+    "xlsx": "^0.11.13",
+    "xlsx-style": "^0.8.13",
+    "xterm": "3.12.0"
+  },
+  "devDependencies": {
+    "@vue/test-utils": "^1.0.0-beta.24",
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-eslint": "^8.2.1",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
+    "babel-preset-es2015": "^6.24.1",
+    "babel-jest": "^21.0.2",
+    "babel-loader": "^7.1.1",
+    "babel-plugin-dynamic-import-node": "^1.2.0",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "babel-register": "^6.22.0",
+    "chalk": "^2.0.1",
+    "chromedriver": "^2.27.2",
+    "copy-webpack-plugin": "^4.0.1",
+    "cross-env": "^5.2.0",
+    "cross-spawn": "^5.0.1",
+    "css-loader": "^0.28.0",
+    "eslint": "^4.15.0",
+    "eslint-config-standard": "^10.2.1",
+    "eslint-friendly-formatter": "^3.0.0",
+    "eslint-loader": "^1.7.1",
+    "eslint-plugin-import": "^2.7.0",
+    "eslint-plugin-node": "^5.2.0",
+    "eslint-plugin-promise": "^3.4.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "eslint-plugin-vue": "^4.0.0",
+    "expect": "^23.5.0",
+    "extract-text-webpack-plugin": "^3.0.0",
+    "file-loader": "^1.1.4",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
+    "icore-sdk": "1.0.1-alpha.49",
+    "jest": "^22.0.4",
+    "jest-serializer-vue": "^0.3.0",
+    "jsdom": "^12.0.0",
+    "jsdom-global": "^3.0.2",
+    "jsplumb": "^2.8.8",
+    "less": "^3.8.1",
+    "less-loader": "^4.1.0",
+    "mocha": "^5.2.0",
+    "mocha-webpack": "^1.1.0",
+    "moment": "^2.22.2",
+    "nightwatch": "^0.9.12",
+    "node-notifier": "^5.1.2",
+    "node-sass": "^4.7.2",
+    "node-uuid": "^1.4.8",
+    "nyc": "^13.0.1",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "qrcode": "^1.3.2",
+    "rimraf": "^2.6.0",
+    "sass-loader": "^6.0.6",
+    "selenium-server": "^3.0.1",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "uglifyjs-webpack-plugin": "^1.1.1",
+    "url-loader": "^0.5.8",
+    "vue-jest": "^1.0.2",
+    "vue-loader": "^13.3.0",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0",
+    "webpack-node-externals": "^1.7.2"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ],
+  "nyc": {
+    "include": [
+      "src/**/*.(js|vue)"
+    ],
+    "instrument": false,
+    "sourceMap": false
+  }
+}

+ 22 - 0
src/Counter.vue

@@ -0,0 +1,22 @@
+<template>
+<div>
+    {{ count }}
+    <button @click="increment">自增</button>
+</div>
+</template>
+
+<script>
+export default {
+  data () {
+    return {
+      count: 0
+    }
+  },
+
+  methods: {
+    increment () {
+      this.count++
+    }
+  }
+}
+</script>

+ 3609 - 0
src/assets/css/style.css

@@ -0,0 +1,3609 @@
+/*
+ * common css
+ */
+/* icons */
+/* html, body {
+  background-color: rgb(71, 154, 231);
+} */
+/* html {
+  font-size: 10px;
+} */
+.mainVueIndex .el-tabs__content {
+    overflow: auto !important;
+}
+.xl-icon-size {
+  font-size: 18px;
+  color: #70baf2;
+  cursor: pointer;
+  margin-right: 10px;
+  margin-top: 2px;
+}
+
+.ytg-menu-level1>li>div:hover>.xs-menu-icons {
+  width: 26px;
+  height: 26px;
+  transform: scale(0.8);
+  background: url(../img/menu/menu_b.png) 0 0 no-repeat;
+  /* width: 20px; height: 20px */
+}
+
+.ytg-menu-level1>li>div>.xs-menu-icons {
+  display: inline-block;
+  width: 26px;
+  height: 26px;
+  cursor: pointer;
+  transform: scale(0.8);
+  background: url(../img/menu/menu_w.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+}
+
+.xs-nav-icons {
+  display: inline-block;
+  width: 26px;
+  height: 26px;
+  cursor: pointer;
+  background: url(../img/nav/nav_c.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+  -webkit-transform: scale(0.45);
+  transform: scale(0.45);
+}
+
+.xs-fuc-icons {
+  display: inline-block;
+  width: 17px;
+  height: 17px;
+  /* padding-left: 20px; */
+  cursor: pointer;
+  background: url(../img/func/func_w.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+}
+
+.xs-fuc-icons-add {
+  background-position: -27px -23px;
+}
+
+.xs-icons {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  background: url(../img/icons.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+}
+
+.xs-icons-add {
+  background-position: -168px -24px;
+}
+
+.xs-icons-user {
+  background-position: -408px 0;
+  width: 34px;
+  height: 34px;
+}
+
+.xs-icons-right-arrow {
+  background-position: -144px -97px;
+  width: 16px;
+  height: 14px;
+}
+
+.xs-icons-see {
+  background-position: -408px -48px;
+}
+
+.xs-icons-see-reverse {
+  background-position: -408px -72px;
+}
+
+.xs-icons-slm {
+  background-position: -48px 0;
+}
+
+.sl-menu-a:hover .xs-icons-slm {
+  background-position: -48px -24px;
+}
+
+.sl-menu-sed .xs-icons-slm {
+  background-position: -48px -24px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu1,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu1 {
+  background-position: -25px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-menu1 {
+  background-position: 0 -144px;
+}
+
+.sl-menu-sed .xs-icons-menu1 {
+  background-position: 0 -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu2,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu2 {
+  background-position: -73px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-menu2 {
+  background-position: -24px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu2 {
+  background-position: -24px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu3,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu3 {
+  background-position: -120px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-menu3 {
+  background-position: -48px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu3 {
+  background-position: -48px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu4,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu4 {
+  background-position: -168px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-menu4 {
+  background-position: -72px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu4 {
+  background-position: -72px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu5,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu5 {
+  background-position: -25px -70px;
+}
+
+.sl-menu-a:hover .xs-icons-menu5 {
+  background-position: -96px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu5 {
+  background-position: -96px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu6,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu6 {
+  background-position: -73px -70px;
+}
+
+.sl-menu-a:hover .xs-icons-menu6 {
+  background-position: -120px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu6 {
+  background-position: -120px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu7,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu7 {
+  background-position: -120px -70px;
+}
+
+.sl-menu-a:hover .xs-icons-menu7 {
+  background-position: -144px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu7 {
+  background-position: -144px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu8,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu8 {
+  background-position: -168px -70px;
+}
+
+.sl-menu-a:hover .xs-icons-menu8 {
+  background-position: -168px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu8 {
+  background-position: -168px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu9,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu9 {
+  background-position: -25px -119px;
+}
+
+.sl-menu-a:hover .xs-icons-menu9 {
+  background-position: -192px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu9 {
+  background-position: -192px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu10,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu10 {
+  background-position: -73px -119px;
+}
+
+.sl-menu-a:hover .xs-icons-menu10 {
+  background-position: -216px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu10 {
+  background-position: -216px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu11,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu11 {
+  background-position: -120px -119px;
+}
+
+.sl-menu-a:hover .xs-icons-menu11 {
+  background-position: -240px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu11 {
+  background-position: -240px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu12,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu12 {
+  background-position: -168px -119px;
+}
+
+.sl-menu-a:hover .xs-icons-menu12 {
+  background-position: -264px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu12 {
+  background-position: -264px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu13,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu13 {
+  background-position: -25px -168px;
+}
+
+.sl-menu-a:hover .xs-icons-menu13 {
+  background-position: -288px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu13 {
+  background-position: -288px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu14,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu14 {
+  background-position: -73px -168px;
+}
+
+.sl-menu-a:hover .xs-icons-menu14 {
+  background-position: -312px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu14 {
+  background-position: -312px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu15,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu15 {
+  background-position: -120px -168px;
+}
+
+.sl-menu-a:hover .xs-icons-menu15 {
+  background-position: -336px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu15 {
+  background-position: -336px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu16,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu16 {
+  background-position: -168px -168px;
+}
+
+.sl-menu-a:hover .xs-icons-menu16 {
+  background-position: -360px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu16 {
+  background-position: -360px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu17,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu17 {
+  background-position: -25px -217px;
+}
+
+.sl-menu-a:hover .xs-icons-menu17 {
+  background-position: -384px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu17 {
+  background-position: -384px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu18,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu18 {
+  background-position: -73px -217px;
+}
+
+.sl-menu-a:hover .xs-icons-menu18 {
+  background-position: -408px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu18 {
+  background-position: -408px -144px;
+}
+
+.ytg-menu-level1>li>div>.xs-icons-menu19,
+.ytg-menu-level1>li>div:hover>.xs-icons-menu19 {
+  background-position: -120px -217px;
+}
+
+.sl-menu-a:hover .xs-icons-menu19 {
+  background-position: -432px -144px;
+}
+
+.sl-menu-sed .xs-icons-menu19 {
+  background-position: -432px -144px;
+}
+
+.el-breadcrumb__item__inner:hover {
+  color: #70baf2;
+  cursor: default;
+}
+
+.appendColor .el-input-group__append,
+.appendColor .el-input-group__prepend {
+  background-color: #f5f7fa;
+  color: #909399;
+  vertical-align: middle;
+  display: table-cell;
+  position: relative;
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  padding: 0 0px;
+  width: 1px;
+  white-space: nowrap;
+}
+
+
+.st-icons {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  background: url(../img/spirit00.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+}
+
+.st-icons-user {
+  background-position: -264px -48px;
+}
+
+.st-icons-pwd {
+  background-position: -288px -48px;
+}
+
+.st-icons-out {
+  background-position: -312px -48px;
+}
+
+.st-icons1 {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+  background: url(../img/icons1.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+}
+
+.st-icons-success {
+  background-position: -288px -216px;
+}
+
+.st-icons-del {
+  background-position: -312px -216px;
+}
+
+.ytg-icons {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  background: url(../img/ytgico.png) 0 0 no-repeat;
+}
+
+.ytg-additional-liBtn {
+  background-position: -144px -72px;
+  width: 17px;
+  height: 17px;
+}
+
+.ytg-cust-logo {
+  background-position: 0 -144px;
+  width: 40px;
+  height: 40px;
+}
+
+/*表格最后一项保留右边框*/
+.table-lastTh-border .has-gutter th:nth-last-of-type(2) {
+  border-right: 1px solid #ccc;
+}
+
+/*新增*/
+.ytg-add-red {
+  background-position: -96px -72px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+/*编辑*/
+.ytg-edit-red {
+  background-position: -72px -72px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+/*启用*/
+.ytg-startU-red {
+  background-position: -192px -72px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+/*停用*/
+.ytg-stopU-red {
+  background-position: -216px -72px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+/*返回*/
+.ytg-return {
+  background-position: -120px -120px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+/** 客户管理 ***/
+.xs-yt-search {
+  float: right
+}
+
+.returnText {
+  position: relative;
+  top: 0;
+}
+
+.xs-yt-add {
+  position: relative;
+  top: 5px;
+}
+
+.xs-yt-form .el-form-item__content:first-child {
+  margin-left: 0px !important;
+  width: 100%
+}
+
+.xs-yt-form .el-form-item__button:last-child {
+  text-align: right;
+}
+
+.xs-yt-form .el-select {
+  display: block;
+}
+
+/* 修改系统斑马线的颜色 */
+.el-table--striped .el-table__body tr.el-table__row--striped td {
+  background: #ccf1ff
+}
+
+/*用于解决复合型输入框内容为空时,标签和输入框会错位的bug*/
+.ytg-append-form .el-input__inner {
+  display: inline-block;
+}
+
+.yt-cst-child-content {
+  padding-top: 20px;
+}
+.ctr-tec-table1 .select-row {
+  background: rgb(255, 255, 120) !important;
+}
+.el-table tr.select-row td {
+  background: rgb(255, 255, 120) !important;
+}
+.el-table .warning-row {
+  background: rgb(255, 255, 0) !important;
+}
+
+.el-table tr.warning-row td {
+  background: rgb(255, 255, 0) !important;
+}
+
+.el-table .success-row {
+  background: #00FF00 !important;
+}
+
+.el-table .solution-row {
+  background: rgb(250, 128, 19) !important;
+}
+
+/* 改变复选框右边距,以前没有右边距,似乎是element-ui样式变了,优特钢也出现类似情况,影响页面展示
+2019-03-05 */
+.el-checkbox {
+  margin-right: 0;
+}
+/*.yt-table-no-srcoll .el-table__body-wrapper{
+  overflow: hidden;
+}*/
+
+.userLoginTitle .el-dialog__title {
+  font-size: 20px;
+}
+
+.yt-cst-table-top {}
+
+.xs-yt-ctc-edit {
+  border-top: 1px solid #cccccc;
+  margin-top: 30px;
+}
+
+.del-scroll .el-table__body-wrapper {
+  overflow-x: hidden;
+}
+
+.span-text {
+  position: relative;
+  top: 0px;
+  display: inline-block;
+  height: 20px;
+  line-height: 20px;
+  padding: 0 10px;
+  border-left: 3px solid #70baf2;
+}
+
+.yt-table-page {
+  margin: 5px 0 0;
+  text-align: right;
+}
+
+.yt-cst-bi-upload .el-upload {
+  display: flex !important;
+}
+
+.table-expand .el-table__expanded-cell[class*=cell] {
+  padding: 15px !important;
+}
+
+/* 表格表头居中*/
+.th-center th {
+  text-align: center !important;
+}
+
+/*弹窗的四个按钮样式*/
+.yt-modal-btn {
+  width: 120px;
+  position: absolute;
+  top: 30px;
+}
+
+.yt-modal-btn span {
+  margin-right: 6px
+}
+
+.el-icon-edit-outline {
+  cursor: pointer;
+}
+
+.yt-base-top-content {
+  height: 100%;
+  padding: 50px 20px 42px 20px;
+  position: relative;
+}
+
+.yt-base-top-search {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 100%;
+  padding: 10px 20px 0px 20px;
+}
+
+.yt-base-top-table {
+  height: 100%;
+
+}
+
+/** 物流成分 材质 结果按钮 **/
+.out-edit .el-input-group__append {
+  background: #409EFF;
+  color: white;
+  border-color: #409EFF
+}
+
+.yt-base-top-page {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: 1000;
+  width: 100%;
+  padding-right: 20px;
+  text-align: right;
+}
+
+
+.yt-base-bottom-edit {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: 1000;
+  width: 100%;
+  max-height: 205px;
+  overflow: auto;
+  padding: 0 20px 5px 20px;
+  border-top: 1px solid #ccc;
+  background-color: #fff;
+  box-shadow: 0 0 10px #ccc;
+}
+
+.yt-base-editArea {
+  height: 23px;
+  line-height: 23px;
+}
+
+.yt-base-editArea h2 {
+  border-left: 3px solid #70baf2;
+  padding-left: 5px;
+}
+
+.yt-base-edit-form {
+  margin-top: 0;
+}
+
+.yt-content {
+  padding-top: 10px
+}
+
+
+/* 技术要求输入下拉框 */
+/*ytg-s-m-mm-msc: 冶金规范管理Msc表格*/
+.ctr-tec-table .el-input__inner,
+.ytg-s-m-mm-msc .el-input__inner {
+  background: #FEFEC0;
+}
+
+.ctr-tec-table1 .el-input__inner,
+.ytg-s-m-mm-msc .el-input__inner {
+  background: #FEFEC0;
+}
+.ctr-tec-table1 .el-input__inner {
+  padding: 1px !important;
+}
+/* 物流管理 */
+.yt-alc {
+  padding: 10px 20px;
+}
+
+.yt-summary .el-table__body-wrapper {
+  overflow: hidden !important;
+}
+
+.yt-summary .el-table__footer-wrapper {
+  overflow: auto !important;
+}
+
+.el-tabs__active-bar {
+  background-color: #70baf2;
+}
+
+.el-tabs__item:hover {
+  color: #70baf2;
+  cursor: pointer;
+}
+
+.el-tabs__item.is-active {
+  color: #70baf2;
+}
+
+.sl-header-li-lgbc .el-breadcrumb__inner {
+  color: white
+}
+
+.sl-header-li-lgbc .el-breadcrumb__item:last-child .el-breadcrumb__inner {
+  color: white
+}
+
+.sl-header-li-lgbc .el-breadcrumb__separator {
+  color: white
+}
+
+.el-breadcrumb__inner:hover {
+  color: white;
+  cursor: text;
+}
+
+/* 输入按钮颜色变化 */
+.el-input-group__append {
+  background: white;
+}
+
+/*点击树节点使字体变红*/
+.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
+  color: #70baf2;
+}
+
+/*树节点下边框*/
+.el-tree-node__label {
+  display: block;
+  width: 100%;
+  border-bottom: 1px solid #ccc;
+  font-size: 12px;
+}
+
+.el-tree-node__content {
+  height: 32px;
+  line-height: 31px;
+}
+
+/*树控件的字体颜色改为跟body一个颜色*/
+.el-tree {
+  color: #1f2f3d
+}
+
+.el-button {
+  color: #111;
+}
+
+.el-button--primary {
+  color: #fff;
+}
+
+.el-button--success {
+  background-color: #61f06e;
+  border-color: #61f06e;
+}
+.el-button--success:hover {
+  background: #61f06e;
+  border-color: #61f06e;
+}
+.el-button--success:focus {
+  background: #61f06e;
+  border-color: #61f06e;
+}
+
+.el-button--text {
+  color: #409EFF;
+  cursor: pointer;
+}
+
+.el-checkbox+.el-checkbox {
+  margin-left: 20px;
+}
+
+.xg-zhb-short-design .el-checkbox+.el-checkbox {
+  margin-left: 0px
+}
+
+.xg-zhb-short-design .el-button+.el-button {
+  margin-left: 0px;
+}
+
+.xg-zhb-short-design .el-button--small {
+  padding: 7px 13px 6px 15px;
+}
+
+.el-checkbox__label {
+  padding-left: 5px;
+}
+
+.el-table th>.cell.highlight {
+  color: #ffffff
+}
+
+.el-dropdown {
+  font-size: 12px;
+  color: #409EFF;
+  cursor: pointer;
+}
+
+.el-dropdown-menu__item {
+  font-size: 12px;
+  white-space: nowrap;
+  color: #000;
+}
+
+.el-dialog__wrapper {
+  position: absolute;
+}
+
+.el-dialog__title {
+  font-size: 14px;
+  font-weight: bold;
+}
+
+.el-dialog--center .el-dialog__body {
+  padding-top: 10px;
+  padding-bottom: 20px;
+}
+
+.el-dialog--center .el-dialog__header {
+  padding-top: 15px;
+  padding-bottom: 5px;
+}
+
+.el-dialog__body {
+  padding: 10px 20px;
+  font-size: 12px;
+}
+
+.el-date-editor .el-range-separator {
+  width: 20px;
+  font-size: 12px;
+  padding: 0;
+  text-align: center;
+}
+
+.el-table .cell {
+  padding: 0 5px !important;
+  line-height: 20px;
+}
+
+.el-picker-panel {
+  color: #000;
+}
+
+.el-picker-panel__shortcut {
+  color: #000;
+}
+
+.el-radio {
+  color: #000;
+}
+
+.el-radio__label {
+  font-size: 12px;
+}
+
+.el-message-box {
+  padding-bottom: 20px;
+}
+
+.el-message-box__wrapper {
+  position: absolute;
+}
+
+.el-dialog__footer {
+  padding-bottom: 20px;
+  padding-top: 0;
+}
+
+.el-table__empty-block {}
+
+.el-table__empty-text {
+  left: 30px;
+  top: 15px;
+  transform: translate(0, 0);
+  color: #666;
+}
+
+.el-table__body tr.current-row>td {
+  color: #000 !important;
+  background-color: #d3ddf5 !important;
+  font-weight: bold !important;
+}
+
+.ytg-ws-collapse .el-collapse-item__header {
+  height: 40px;
+  line-height: 40px;
+  padding-left: 2px;
+}
+
+.ytg-ws-collapse .el-collapse-item__arrow {
+  line-height: 40px;
+}
+
+.ytg-ws-collapse .el-collapse-item__content {
+  padding-bottom: 10px;
+}
+
+.el-range-editor--small .el-range-input {
+  font-size: 12px;
+}
+
+.el-switch,
+.el-switch__label,
+.el-switch__label * {
+  font-size: 12px;
+}
+
+.el-message-box__title {
+  color: #000;
+}
+
+.el-message-box__content {
+  color: #000;
+}
+
+/* form */
+.search-form .el-select .el-input__inner {
+  height: 28px !important;
+}
+
+/*删掉了这里的important,会影响表格内输入控件的样式*/
+.el-input--small .el-input__inner {
+  height: 28px;
+  line-height: 28px;
+}
+
+.el-range-editor--small.el-input__inner {
+  height: 28px;
+  line-height: 28px;
+}
+
+.el-form-item {
+  margin-bottom: 13px;
+}
+
+.el-form-item__error {
+  padding-top: 0;
+}
+
+.el-form-item--small .el-form-item__error {
+  padding-top: 0;
+}
+
+.el-form-item__content {
+  font-size: 12px;
+  line-height: 30px;
+}
+
+.el-input--small {
+  font-size: 12px;
+}
+
+.el-form-item__label {
+  font-size: 12px;
+  line-height: 30px;
+  color: #000;
+  padding-right: 8px;
+}
+
+.el-form-item--small .el-form-item__content,
+.el-form-item--small .el-form-item__label {
+  line-height: 28px;
+}
+
+.sui-search-form .el-form-item {
+  margin-bottom: 7px;
+}
+
+.sui-search-form2 .el-form-item {
+  margin-bottom: 5px;
+}
+
+.sui-search-form2 .el-input--small .el-input__inner {
+  border-radius: 0;
+}
+
+.sui-search-mform .el-form-item {
+  margin-bottom: 10px;
+}
+
+.sui-search-mform .el-input--small .el-input__inner {
+  padding: 0 5px;
+  border-radius: 0;
+}
+
+.sui-search-mform .el-form-item__label {
+  padding-right: 5px;
+}
+
+.sui-search-mform .el-checkbox__label {
+  padding-left: 2px;
+}
+
+.sui-search-mform .el-slider .el-input-number--small {
+  width: 100px;
+}
+
+.sui-search-mform .el-slider__runway.show-input {
+  margin-right: 110px;
+}
+
+.sui-search-mform .el-radio__label {
+  padding-left: 5px;
+}
+
+.el-tabs--border-card>.el-tabs__content {
+  padding: 10px;
+}
+
+.el-tabs--border-card {
+  box-shadow: none;
+}
+
+.el-select-dropdown__item {
+  font-size: 12px;
+  color: #000;
+}
+
+.ytg-table-el-cion {
+  font-size: 20px;
+  color: #409EFF;
+  cursor: pointer;
+  position: relative;
+  top: 3px;
+}
+
+.el-input__inner {
+  color: #000;
+}
+
+
+/* other */
+.el-loading-mask {
+  z-index: 100;
+}
+
+.el-tabs__item {
+  font-size: 12px;
+  height: 30px;
+  line-height: 30px;
+}
+
+.el-time-picker-no-icon .el-input__icon {
+  display: none;
+}
+
+.el-time-picker-is-icon .el-input__inner {
+  padding-left: 30px !important;
+}
+
+.sui-form-lh2 .el-form-item--small .el-form-item__content,
+.sui-form-lh2 .el-form-item--small .el-form-item__label {
+  line-height: 40px;
+}
+
+.el-input-number--small .el-input-number__decrease,
+.el-input-number--small .el-input-number__increase {
+  line-height: 28px;
+}
+
+/* layout */
+.ytg-lo-cl {
+  height: 100%;
+  padding: 10px 20px 20px 20px;
+  overflow: auto;
+}
+
+.ytg-lo-cr {
+  height: 100%;
+  position: relative;
+  overflow: auto;
+}
+
+/*详情页表格(有边框有底色)*/
+.ytg-table {
+  max-width: 100%;
+  width: 100%;
+  border-top: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+}
+
+.ytg-table td {
+  padding: 12px 12px;
+  text-align: left;
+  border-color: #ccc;
+  color: #000;
+  border-right: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+}
+
+.ytg-table-bgg {
+  background-color: #f5f5f5;
+  word-break: break-all
+}
+
+.ytg-table .ytg-table-tdl {
+  color: #666;
+  text-align: right;
+}
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+  font-weight: normal;
+}
+
+.el-pager li {
+  min-width: 20px;
+  padding: 0 5px;
+}
+
+.el-pagination__jump {
+  margin-left: 10px;
+}
+
+.el-pagination button {
+  padding: 0 4px;
+}
+
+.el-pagination .btn-next {
+  padding-left: 6px;
+}
+
+.el-pagination .btn-prev {
+  padding-right: 6px;
+}
+
+/*图标的大小*/
+.elIconStyle {
+  color: #70baf2;
+  font-size: 20px;
+  cursor: pointer;
+}
+
+.el-return-IconStyle {
+  font-size: 15px;
+  cursor: pointer;
+}
+
+.ytg-line-title {
+  border-left: 3px solid #ff4949;
+  height: 20px;
+  line-height: 20px;
+  padding: 0px 10px;
+}
+
+.ytg-text-title {
+  text-align: center;
+  font-size: 13px;
+  position: relative;
+}
+
+.ytg-go-bak {
+  position: relative;
+  height: 20px;
+  line-height: 20px;
+  vertical-align: middle;
+  padding-left: 23px;
+  padding-top: 2px;
+  cursor: pointer;
+  color: #20a0ff;
+}
+
+.ytg-go-bak>.ytg-return {
+  position: absolute;
+  top: 0;
+  left: 0;
+}
+
+/*有效显示绿色,无效显示红色*/
+.effective {
+  color: green;
+}
+
+.invalid {
+  color: red;
+}
+
+/* 管理页面基本布局 */
+.ytg-ps {
+  min-width: 1300px;
+  height: 100%;
+  position: relative;
+}
+
+.ytg-ps-title {
+  height: 25px;
+  line-height: 25px;
+  border-left: 3px solid #70baf2;
+  padding-left: 5px;
+  position: relative;
+}
+
+.ytg-ps-title2 {
+  /* height: 25px; line-height: 25px; */
+  border-left: 3px solid #70baf2;
+  padding: 2px 5px 2px 5px;
+  position: relative;
+}
+
+.ytg-ps-title3 {
+  /* height: 25px; line-height: 25px; */
+  border-left: 3px solid #70baf2;
+  padding: 8px 5px 8px 5px;
+  position: relative;
+}
+
+.ytg-ps-title2>span {
+  margin-left: 10px;
+}
+
+.ytg-ps-title3>span {
+  margin-left: 10px;
+}
+
+.el-button--small {
+  padding: 7px 15px 6px 15px;
+}
+
+/*.ytg-ps-title .el-button--small {
+  padding: 7px 10px;
+}*/
+.ytg-ps-title-btns {
+  margin-right: 20px;
+  vertical-align: top;
+  position: absolute;
+  bottom: 2px;
+  right: 0;
+}
+
+.ytg-ps-title-btns>.el-button {
+  vertical-align: top;
+}
+
+.ytg-ps-title-btns>.el-input-number {
+  vertical-align: top;
+}
+
+.ytg-ps-title-btns>.el-radio {
+  vertical-align: top;
+  top: 7px;
+}
+
+.ytg-ps-ops {
+  position: absolute;
+  top: 0;
+  left: 0;
+  padding: 10px 20px 0 20px;
+  height: 50px;
+  width: 100%;
+  background-color: #f5f7fa;
+  border-bottom: 1px solid #ddd;
+}
+
+.el-form--inline .el-form-item {
+  margin-right: 5px;
+}
+
+.el-button+.el-button {
+  margin-left: 3px;
+}
+
+.ytg-ps-ops>.el-button+.el-button {
+  margin-left: 5px;
+  padding: 8px 10px;
+}
+
+.ytg-ps-content {
+  height: 100%;
+  padding-top: 10px;
+}
+
+.ytg-search-more-content {
+  height: 0px;
+  overflow: hidden;
+  transition: height .3s ease-out;
+}
+
+.ytg-search-more-content-auto {
+  height: auto;
+}
+
+.ytg-search-more-icon {
+  position: relative;
+  top: 1px;
+  font-size: 14px;
+  -webkit-transition: transform .3s;
+  transition: transform .3s;
+}
+
+.ytg-search-more-icon2 {
+  -webkit-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+
+/* login commnon css */
+.xs-lg-form {
+  padding: 0.5rem 2rem;
+}
+
+.xs-lg-form .el-form-item {
+  margin-bottom: 0.5rem;
+}
+
+.xs-lg-form .el-form-item__error {
+  padding-top: 4px;
+  padding-left: 10px;
+}
+
+.xs-lg-form .el-input__inner {
+  border: 1px solid #fff;
+  height: 2.5rem;
+  line-height: 2.5rem;
+  color: #000;
+  background: transparent;
+  border-radius: 0;
+  position: relative;
+  font-size: 1.2rem;
+}
+
+.xs-lg-form .el-input--prefix .el-input__inner {
+  padding-left: 3rem;
+  background: transparent;
+  color: #000;
+  height: 2.5rem;
+  line-height: 2.5rem;
+  border: 1px solid #fff;
+}
+
+.xs-lg-form .xs-lg-form-date .el-input__prefix {
+  left: 18px;
+  top: -2px;
+  font-size: 20px;
+}
+
+.xs-lg-form .el-input__icon {
+  color: #ddd;
+  font-weight: none;
+  width: 1.25rem;
+  line-height: 2.5rem;
+  /* display: none; */
+}
+
+.xs-lg-form .el-select .el-input.is-focus .el-input__inner {
+  border-color: #fff;
+  line-height: 2rem;
+  font-size: 1rem;
+}
+
+.xs-lg-form .el-select .el-input .el-select__caret {
+  color: #fff;
+  line-height: 2.5rem;
+  font-size: 1rem;
+}
+
+/*复制OA的router-link样式*/
+/* tabs */
+.st-tabs {
+  text-align: center;
+  padding: 15px 0;
+  border: 1px #ccc solid;
+}
+
+.st-tabs-li {
+  display: inline-block;
+  margin: 0 10px;
+  padding: 0 24px;
+  height: 34px;
+  line-height: 34px;
+  vertical-align: middle;
+  font-size: 14px;
+  color: #333;
+  text-align: center;
+  border: 1px solid #ccc;
+  background-color: #fff;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.st-tabs-li:hover {
+  background-color: #f1f1f1;
+  text-decoration: none;
+  color: #666;
+}
+
+.st-tabs-li:focus {
+  text-decoration: none;
+}
+
+.st-tabs-li.router-link-active {
+  border-color: #4086ff;
+  background-color: #4086ff;
+  color: #fff;
+  cursor: default;
+}
+
+.st-tabs-li.router-link-active:hover {
+  background-color: #3D74FF;
+}
+
+/*资产管理模块样式-复制OA的样式*/
+.line-border .el-input__inner {
+  border: none
+}
+
+.line-border .el-textarea__inner {
+  border: none
+}
+
+.line-border .el-form-item__error {
+  margin-top: -8px;
+}
+
+.line-border .el-form-item {
+  margin: 0px;
+  width: 100%;
+}
+
+.wLine .line-border .el-form-item {
+  margin: 0px;
+  width: 100%
+}
+
+/** 质量模块**/
+.chen-formula .el-form-item__label {
+  width: 160px !important;
+}
+
+/**/
+/* 文件列表显示样式 */
+.st-filelist-ul {
+  padding: 20px;
+  overflow: hidden;
+}
+
+.st-filelist-ul>li {
+  position: relative;
+  padding: 15px 0;
+  margin-bottom: 20px;
+  border: 1px solid #d9d9d9;
+}
+
+.st-filelist-ul>li:last-child {
+  margin-bottom: 0px;
+}
+
+.st-filelist-text {
+  height: 30px;
+  line-height: 30px;
+  vertical-align: middle;
+  padding: 0 60px;
+  text-align: left;
+  overflow: hidden;
+}
+
+.st-ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  word-break: keep-all;
+}
+
+.st-filelist-icon-img {
+  position: absolute;
+  top: 14px;
+  left: 20px;
+  width: 30px;
+  height: 30px;
+  text-align: center;
+  line-height: 30px;
+  vertical-align: middle;
+  cursor: pointer;
+}
+
+.st-filelist-icon-img>img {
+  max-width: 100%;
+  max-height: 100%;
+  vertical-align: middle;
+}
+
+.st-filelist-icon-download {
+  position: absolute;
+  top: 14px;
+  right: 20px;
+  cursor: pointer;
+}
+
+.st-icons-download {
+  background-position: -120px -168px;
+  width: 30px;
+  height: 30px;
+}
+
+.st-icons-file {
+  background-position: -72px -168px;
+  width: 30px;
+  height: 30px;
+}
+
+.st-filelist-icon-file {
+  position: absolute;
+  top: 14px;
+  left: 20px;
+  cursor: default;
+}
+
+.oa-asset-am-page {
+  padding: 10px 20px 20px 0;
+  overflow: hidden;
+  text-align: right;
+}
+
+.oa-asset-am-page2 {
+  float: right;
+  margin-top: 20px;
+}
+
+.st-table {
+  max-width: 100%;
+  width: 100%;
+  border-top: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+}
+
+.st-table td {
+  padding: 12px 12px;
+  text-align: left;
+  border-color: #ccc;
+  color: #000;
+  border-right: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+}
+
+.st-table-bgg {
+  background-color: #f5f5f5;
+  word-break: break-all
+}
+
+.st-table .st-table-tdl {
+  color: #666;
+  text-align: right;
+}
+
+.st-table-form .st-table-tdl {
+  background-color: #f5f5f5;
+}
+
+.st-icons-email-addc {
+  background-position: -168px -212px;
+  width: 20px;
+  height: 25px;
+}
+
+/*下拉框*/
+.oa-search-header-form-s {
+  width: 180px;
+}
+
+.st-icons-addo {
+  background-position: -48px -48px;
+}
+
+.st-slider-title-x2 {
+  position: absolute;
+  top: 24px;
+  right: 30px;
+  cursor: pointer;
+  margin-right: 0 !important;
+}
+
+.st-slider-title-x2:hover {
+  animation: circle 2s linear 0s infinite;
+}
+
+.st-icons-x {
+  background-position: 0 -72px;
+  width: 16px;
+  height: 16px;
+}
+
+.st-icons-x:hover {
+  animation: circle 3s linear infinite;
+}
+
+.st-slider-title-x {
+  position: absolute;
+  top: 24px;
+  right: 30px;
+  cursor: pointer;
+  margin-right: 0 !important;
+}
+
+.sui-slider {
+  position: absolute;
+}
+
+.st-slider-title-x:hover {
+  animation: circle 2s linear 0s infinite;
+}
+
+.sui-slider-title-text {
+  display: inline-block;
+  padding-left: 5px;
+}
+
+.oa-asset-am-button {
+  margin-top: 20px;
+  overflow: hidden;
+}
+
+/* 合同行修改 */
+.ct-line .el-input__inner {
+  background: #f2e6b6;
+}
+
+/* 合同打印页面的单选按钮样式 */
+.printRadio .el-radio__label {
+  padding-left: 0;
+}
+
+/*产品规范新增按钮*/
+.stdAddBtn {
+  margin-left: 10px;
+}
+
+.appendColor .el-input .el-input-group__append {
+  background-color: #f5f7fa;
+}
+
+/*tab页选中之后的样式,非路由,路由有路由的class*/
+.ytg-tab-check {
+  border-color: #4086ff !important;
+  background-color: #4086ff !important;
+  color: #fff !important;
+  cursor: default !important;
+}
+
+.el-table .warning-row {
+  background: oldlace;
+}
+
+.ytg-s-mm-process .el-tabs__content {
+  overflow: visible;
+}
+
+/*冶金规范管理页面,交付标准和制成那一块不要有太多的层级,就是表格的左、下、右边框重合*/
+.ytg-s-mm-process .el-tabs__content {
+  padding: 0px;
+  margin: 10px -1px -1px -1px;
+}
+
+.el-table .caret-wrapper {
+  height: 20px;
+  width: 20px;
+}
+
+.el-table .sort-caret.ascending {
+  top: -2px;
+  font-size: 16px;
+  border-bottom-color: #fff;
+}
+
+.el-table .ascending .sort-caret.ascending {
+  border-bottom-color: #000;
+}
+
+.el-table .sort-caret.descending {
+  bottom: 1px;
+  font-size: 16px;
+  border-top-color: #fff;
+}
+
+.el-table .descending .sort-caret.descending {
+  border-top-color: #000;
+}
+
+.el-input.is-disabled .el-input__inner {
+  background-color: #dfdfdf;
+  border-color: #ccc;
+  color: #333 !important;
+}
+
+.el-input__inner {
+  border-color: #ccc;
+}
+
+.el-radio__inner,
+.el-checkbox__inner {
+  border-color: #ccc;
+}
+
+/* .el-select .el-input .el-select__caret {
+  color: #fff;
+  line-height: 35px;
+  font-size: 20px;
+} */
+.el-checkbox__label {
+  font-size: 12px;
+}
+
+/*根据设计要求做出以下修改:表格内的编辑控件高度调整为20px,效果为打钩状态和不打钩状态下表格的行高一致*/
+/*去掉表格内编辑控件的圆角*/
+.ctr-tec-table .el-input--small .el-input__inner {
+  height: 20px;
+}
+
+.ctr-tec-table .el-input__inner {
+  border-radius: 0;
+}
+
+.ctr-tec-table .el-input-group>.el-input__inner {
+  display: inline-block;
+}
+
+.ctr-tec-table1 .el-input--small .el-input__inner {
+  height: 20px;
+}
+
+.ctr-tec-table1 .el-input__inner {
+  border-radius: 0;
+  height: 20px !important;
+}
+
+.ctr-tec-table1 .el-input-group>.el-input__inner {
+  display: inline-block;
+}
+
+/*数字输入组件 el-input 在 size='small' 时行高为30,会撑开td的高度导致同一个页面内的表格行高不一致,这里调整为20px*/
+.el-input-number--small {
+  line-height: 20px;
+}
+
+.el-table th>.cell {
+  padding: 0 !important;
+}
+
+.el-pagination button,
+.el-pagination span:not([class*=suffix]),
+.el-pager li {
+  height: 22px;
+  line-height: 22px;
+}
+
+.el-pagination .el-select .el-input .el-input__inner {
+  height: 22px !important;
+  font-size: 12px;
+}
+
+.el-pagination__editor.el-input .el-input__inner {
+  height: 22px;
+  font-size: 12px;
+}
+
+.el-pagination__total {
+  margin-right: 5px;
+}
+
+.el-pagination__jump {
+  margin-left: 5px;
+}
+
+.el-pagination button {
+  min-width: 25px;
+}
+
+.el-table__fixed-right {
+  bottom: 1px !important;
+}
+
+.el-table--border.el-loading-parent--relative {
+  border-top: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+}
+
+.el-range-editor--small .el-range__close-icon,
+.el-range-editor--small .el-range__icon {
+  line-height: 20px;
+}
+
+.el-range-editor--small .el-range-separator {
+  line-height: 20px;
+}
+
+.el-input--small .el-input__icon {
+  line-height: 22px;
+}
+
+.bottom .el-tabs__header {
+  margin-bottom: 5px;
+}
+
+.xtg-right-table .el-button--small {
+  margin-top: 2px;
+  margin-left: 14px;
+}
+
+.xtg-search-left .el-form-item {
+  margin-bottom: 4px;
+}
+
+/* .xtg-button .el-button {
+  margin-left: 5px;
+} */
+.xtg-cutter .el-select {
+  margin: 0;
+  width: 80px;
+}
+
+.xtg-cutter .el-icon-time {
+  display: none;
+}
+
+.xtg-cutter .el-date-editor.el-input {
+  width: 80px;
+}
+
+.xtg-cutter .el-date-editor .el-input__inner {
+  width: 80px;
+  height: 20px;
+  padding: 0;
+  text-align: center;
+}
+
+.xtg-cutter .el-date-editor i {
+  display: none;
+}
+
+.xtg-cutter-data {
+  height: 25px;
+  padding-bottom: 29px;
+  border-bottom: 1px solid #ccc;
+}
+
+.xtg-cutter-data .el-form-item__content,
+.xtg-cutter-data .el-input--mini .el-input__inner,
+.xtg-cutter-data .el-form-item__label,
+.xtg-cutter-data .el-form-item__content {
+  height: 25px;
+  line-height: 25px;
+}
+
+.xtg-cutter-data .el-form-item {
+  margin-left: 40px;
+}
+
+/* CSS for miniui */
+.mini-table-sum {
+  color: #666;
+}
+
+.mini-textbox {
+  width: auto;
+
+}
+
+.mini-textbox-input {}
+
+.mini-grid-filterCell {
+  padding: 2px 2px 2px 2px;
+}
+
+.mini-grid-summaryCell {
+  border-right: 1px solid #ccc;
+  text-align: right;
+}
+
+.mini-textbox .el-icon-circle-close-outline {
+  display: none;
+  position: absolute;
+  right: 2px;
+  top: 50%;
+  margin-top: -8px;
+  font-size: 16px;
+  color: #999;
+  cursor: pointer;
+}
+
+.mini-textbox:hover .el-icon-circle-close-outline {
+  display: block;
+}
+
+.mini-panel-border {
+  border-color: #ccc;
+}
+
+.mini-grid-headerCell {
+  background: #f5f7fa;
+  border-color: #ccc;
+}
+
+.mini-grid-headerCell-inner {
+  text-align: center;
+}
+
+.mini-grid-cell-inner,
+.mini-grid-headerCell-inner {
+  font-family: 'Avenir', Helvetica, Arial, sans-serif;
+}
+
+.mini-textbox-border {
+  border-color: #ccc;
+}
+
+.mini-textbox-focus .mini-textbox-border {
+  border-color: #ccc;
+}
+
+html body .mini-grid-row-selected {
+  font-weight: bold;
+}
+
+.mini-grid-summaryRow {
+  background-color: #f5f7fa;
+}
+
+/*质量设计产品规范描述用*/
+.design-psc-select {
+  position: absolute;
+  background: #f5f7fa;
+  /*padding-left: 645px;*/
+  z-index: 1;
+}
+
+.design-psc-select .el-input__inner {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  height: 30px;
+}
+
+/* 采购模块供应商信息 */
+.ytg-cg-gys-edit .el-form-item {
+  margin-bottom: 0;
+}
+
+.ytg-cg-gys-edit .el-date-editor .el-input__inner {
+  padding-left: 15px;
+  padding-right: 0px;
+}
+
+.ytg-cg-gys-edit .el-date-editor .el-input__icon {
+  display: none;
+}
+
+/* 采购模块电子签名文件上传 */
+.ytg-cg-edit-up .el-upload-list {
+  margin: -66px 0 0 0;
+}
+
+.ytg-cg-edit-up .el-upload--text,
+.ytg-cg-edit-up .upload-demo {
+  height: 30px;
+}
+
+.el-table .xtg-cj-bc {
+  background-color: rgba(255, 255, 111, 0.829);
+}
+
+/* 采购模块合同编制 */
+.ytg-sc-ht-title {
+  width: 25px;
+  text-align: center;
+  border-top: 3px solid #70baf2;
+  /* padding-left: 5px; */
+  position: relative;
+  font-size: 16px;
+  cursor: pointer;
+}
+
+.xtg-cg-ht-add .el-button--small {
+  padding: 6px 0;
+}
+
+.xtg-cg-ht-add .el-button--small span {
+  display: block;
+  width: 25px;
+  font-size: 15px
+}
+
+.xtg-cg-line-edit .el-form--inline .el-form-item {
+  margin: 0 24px 0 30px
+}
+
+.xs-s-mm-process .el-tabs__content {
+  overflow: visible;
+}
+
+.xs-s-mm-process .el-tabs__header {
+  margin: 0 0 2px;
+}
+
+/* 车间 探伤 编辑区 */
+.xs-j-flaw-edit .el-form-item__content,
+.xs-j-flaw-edit .el-form-item__label,
+.xs-j-flaw-edit .el-input__icon {
+  line-height: 26px;
+}
+
+.xs-j-flaw-edit .el-input__inner {
+  height: 26px;
+}
+
+.xs-j-flaw-edit .el-form-item {
+  margin-bottom: 0;
+}
+
+/* 原中厚板移动过来的样式 */
+
+/*
+ * xinsteel.sales css
+ */
+/* icons */
+.xl-icon-size {
+  font-size: 18px;
+  color: #ff474e;
+  cursor: pointer;
+  margin-right: 10px;
+  margin-top: -2px;
+}
+
+/* .xs-icons {
+  display: inline-block;
+  width: 20px; height: 20px;
+  cursor: pointer;
+  background: url(../img/spirit_xyzhb.png) 0 0 no-repeat;
+  transition: background-position 0.3s;
+} */
+.xs-icons-default-person {
+  background-position: -405px 0;
+  width: 48px;
+  height: 47px;
+}
+
+.xs-icons-see {
+  background-position: -96px -51px;
+  width: 20px;
+  height: 14px;
+}
+
+.xs-icons-see-reverse {
+  background-position: -120px -53px;
+  width: 20px;
+  height: 10px;
+}
+
+.xs-icons-add {
+  background-position: -168px -24px;
+}
+
+.xs-icons-user {
+  background-position: -288px -24px;
+}
+
+.xs-icons-add1 {
+  background-position: -312px -24px;
+  width: 20px;
+  height: 18px;
+}
+
+.xs-icons-del1 {
+  background-position: -335px -24px;
+  width: 20px;
+  height: 18px;
+}
+
+.xs-icons-expand {
+  background-position: -311px -24px;
+  width: 18px;
+  height: 17px;
+}
+
+.xs-icons-expanded {
+  background-position: -335px -24px;
+  width: 18px;
+  height: 17px;
+}
+
+.sui-icons-delete {
+  cursor: pointer;
+  color: #48576a
+}
+
+.sui-icons-delete:hover {
+  color: #999;
+}
+
+/* .xs-icons-blue {
+  display: inline-block;
+  width: 20px; height: 20px;
+  cursor: pointer;
+  background: url(../img/iconsBlue.png) 0 0 no-repeat;
+  -webkit-transition: background-position .3s;
+  transition: background-position .3s;
+} */
+.xs-icons-blue-right-arrow {
+  background-position: -144px -97px;
+  width: 16px;
+  height: 14px;
+}
+
+.sui-menu .xs-icons {
+  -webkit-transition: all .3s linear;
+  transition: all .3s linear;
+}
+
+.xs-icons-ctt {
+  background-position: 0 0;
+}
+
+.sui-menu-li:hover .xs-icons-ctt {
+  background-position: 0 -24px;
+}
+
+.router-link-active .xs-icons-ctt {
+  background-position: 0 -24px;
+}
+
+.sl-menu-a:hover .xs-icons-ctt {
+  background-position: 0 -24px;
+}
+
+.sl-menu-sed .xs-icons-ctt {
+  background-position: 0 -24px;
+}
+
+.xs-icons-vhc {
+  background-position: -24px 0;
+}
+
+.sui-menu-li:hover .xs-icons-vhc {
+  background-position: -24px -24px;
+}
+
+.router-link-active .xs-icons-vhc {
+  background-position: -24px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-vhc {
+  background-position: -24px -24px;
+}
+
+.sl-menu-sed .xs-icons-vhc {
+  background-position: -24px -24px;
+}
+
+.xs-icons-slm {
+  background-position: -48px 0;
+}
+
+.sui-menu-li:hover .xs-icons-slm {
+  background-position: -48px -24px;
+}
+
+.router-link-active .xs-icons-slm {
+  background-position: -48px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-slm {
+  background-position: -48px -24px;
+}
+
+.sl-menu-sed .xs-icons-slm {
+  background-position: -48px -24px;
+}
+
+.xs-icons-cpt {
+  background-position: -72px 0;
+}
+
+.sui-menu-li:hover .xs-icons-cpt {
+  background-position: -72px -24px;
+}
+
+.router-link-active .xs-icons-cpt {
+  background-position: -72px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-cpt {
+  background-position: -72px -24px;
+}
+
+.sl-menu-sed .xs-icons-cpt {
+  background-position: -72px -24px;
+}
+
+.xs-icons-bcf {
+  background-position: -96px 0;
+}
+
+.sui-menu-li:hover .xs-icons-bcf {
+  background-position: -96px -24px;
+}
+
+.router-link-active .xs-icons-bcf {
+  background-position: -96px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-bcf {
+  background-position: -96px -24px;
+}
+
+.sl-menu-sed .xs-icons-bcf {
+  background-position: -96px -24px;
+}
+
+.xs-icons-ctm {
+  background-position: -120px 0;
+}
+
+.sui-menu-li:hover .xs-icons-ctm {
+  background-position: -120px -24px;
+}
+
+.router-link-active .xs-icons-ctm {
+  background-position: -120px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-ctm {
+  background-position: -120px -24px;
+}
+
+.sl-menu-sed .xs-icons-ctm {
+  background-position: -120px -24px;
+}
+
+.xs-icons-plb {
+  background-position: -144px 0;
+}
+
+.sui-menu-li:hover .xs-icons-plb {
+  background-position: -144px -24px;
+}
+
+.router-link-active .xs-icons-plb {
+  background-position: -144px -24px;
+}
+
+.sl-menu-a:hover .xs-icons-plb {
+  background-position: -144px -24px;
+}
+
+.sl-menu-sed .xs-icons-plb {
+  background-position: -144px -24px;
+}
+
+.xs-icons-wl {
+  background-position: -24px -3px;
+}
+
+.router-link-active .xs-icons-wl {
+  background-position: -24px -27px;
+}
+
+.sui-menu-li:hover .xs-icons-wl {
+  background-position: -24px -27px;
+}
+
+.sl-menu-a:hover .xs-icons-wl {
+  background-position: -24px -27px;
+}
+
+.sl-menu-sed .xs-icons-wl {
+  background-position: -24px -27px;
+}
+
+.xs-dialog-m500 .el-dialog {
+  max-width: 500px;
+}
+
+.xs-dialog-m600 .el-dialog {
+  max-width: 600px;
+}
+
+.xs-dialog-m700 .el-dialog {
+  max-width: 700px;
+}
+
+.xs-dialog-m800 .el-dialog {
+  max-width: 800px;
+}
+
+.router-link-active .xs-icons-plb {
+  background-position: -144px -24px;
+}
+
+.xs-comp-content {
+  padding-top: 10px;
+  position: relative;
+}
+
+.xs-comp-content-add-btn {
+  position: absolute;
+  top: -35px;
+  left: 20px;
+}
+
+.xs-content-title {
+  /*display: inline-block;*/
+  margin-bottom: 10px;
+  padding-left: 8px;
+  height: 24px;
+  line-height: 24px;
+  vertical-align: middle;
+  border-left: 3px solid #70baf2;
+  font-size: 12px;
+  position: relative;
+}
+
+.xs-content-title-btn {
+  position: absolute;
+  right: 0;
+  top: 2px;
+}
+
+.xs-tabs .el-tabs__content {
+  overflow: visible;
+}
+
+.xs-edit-table .el-input__inner {
+  background: #FEFEC0;
+  border-radius: 0;
+  height: 20px;
+}
+
+/* 定义的表格名称样式 */
+.xs-define-title {
+  float: left;
+  width: 120px;
+  padding-left: 8px;
+  margin: 10px 0;
+  height: 24px;
+  display: inline-block;
+  border-left: 3px solid #70baf2;
+}
+
+.xs-define-title-span {
+  line-height: 24px
+}
+
+.xs-define-title-add {
+  margin-left: 10px;
+  vertical-align: middle;
+  height: 24px;
+}
+
+.xs-define-title-search {
+  margin-left: 120px;
+}
+
+.el-button--danger {
+  color: #fff;
+  /* background-color: #66a2ff;
+  border-color: #66a2ff; */
+}
+
+.el-table__body tr.current-row>td {
+  color: #3279e8 !important;
+}
+
+/*面包屑*/
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+  font-weight: normal;
+}
+
+.sl-header-li-lgbc .el-breadcrumb__inner {
+  color: white;
+}
+
+.sl-header-li-lgbc .el-breadcrumb__inner {
+  color: white
+}
+
+.sl-header-li-lgbc .el-breadcrumb__item:last-child .el-breadcrumb__inner {
+  color: white
+}
+
+.sl-header-li-lgbc .el-breadcrumb__separator {
+  color: white
+}
+
+.el-breadcrumb__inner:hover {
+  color: white;
+  cursor: text;
+}
+
+/* end */
+
+/* 表格标题及按钮样式 */
+.ytg-ps {
+  min-width: 1300px;
+  height: 100%;
+  position: relative;
+}
+
+.ytg-ps-title {
+  height: 25px;
+  line-height: 25px;
+  border-left: 3px solid #70baf2;
+  padding-left: 5px;
+  position: relative;
+}
+
+.ytg-ps-title-btns {
+  vertical-align: top;
+  position: absolute;
+  bottom: 2px;
+  right: 0;
+}
+
+/* end */
+
+/* login common css */
+/* .xs-lg-form {
+  padding: 20px 40px;
+}
+.xs-lg-form .el-form-item {
+  margin-bottom: 5px;
+} */
+/* .xs-lg-form .zhb-login-pawd.el-form-item {
+  margin-bottom: 0.75rem;
+} */
+
+/* .xs-lg-form .el-form-item__error { padding-top: 2px; padding-left: 10px; } */
+/* .xs-lg-form .el-input__inner {
+  border: 0; border-bottom: 1px solid #e3e3e3;
+  font: 400 14px Arial;
+  border-radius: 0;
+  position: relative;
+  padding-left: 0;
+} */
+.xs-edit-form .el-form-item {
+  margin-bottom: 15px;
+}
+
+.xs-edit-form .el-form-item__error {
+  padding-top: 1px;
+  margin-top: 0;
+}
+
+/* .xs-lg-form .el-form-item__error {
+  padding-top: 1px;
+} */
+
+/* end */
+
+/*用于解决复合型输入框内容为空时,标签和输入框会错位的bug*/
+.xs-append-form .el-input__inner {
+  display: inline-block;
+}
+
+/* end */
+
+/*编辑区标题*/
+.xs-edit-title {
+  text-align: left;
+  margin-bottom: 10px;
+  padding-left: 5px;
+  vertical-align: middle;
+  border-left: 3px solid #70baf2;
+  position: relative;
+  border-bottom: 1px solid #ccc;
+}
+
+.xs-page-tr {
+  padding: 10px 0 0 0;
+  text-align: right;
+  overflow: hidden;
+}
+
+.xs-testarea {
+  position: relative;
+  background-color: #eef1f6;
+  border: 1px solid #d1dbe5;
+  color: #bbb;
+  cursor: not-allowed;
+  display: inline-table;
+  border-radius: 4px;
+}
+
+.xs-testarea-content {
+  min-height: 36px;
+  position: relative;
+  width: 100%;
+  padding: 0 56px 0 10px;
+  color: #bbb;
+}
+
+.xs-textarea-append {
+  position: absolute;
+  right: 0;
+  top: 0;
+  height: 100%;
+  border-color: #bfcbd9;
+  color: #97A8BE;
+}
+
+.xs-textarea-append:hover {
+  border-color: #bfcbd9;
+  color: #97A8BE;
+}
+
+/*树*/
+.el-tree-node__content {
+  position: relative;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.el-form-item {
+  margin-bottom: 15px;
+}
+
+/* .el-form-item__error { padding-top: 0; margin-top: -7px; } */
+/*.el-input--small { width: 200px; }*/
+/*.el-input--small {width: auto;}*/
+/*也不知道是哪两个人,就这个100%和200px重复写了好多次,你覆盖我的我就在下面再写一次重新覆盖你,也是倔强!!!*/
+/*下面的全部删掉,要改这个样式请再前面加上前缀,不要修改这种全局的样式,修改之前先搜索一下*/
+.el-date-editor.el-input {
+  width: 200px;
+}
+
+/*.el-table { font-size: 12px; }*/
+/* table */
+.el-table th {
+  padding: 1px 0;
+  background-color: #45A4F9 !important;
+}
+
+.el-table td {
+  padding: 3px 0;
+}
+
+.el-table td .el-button--text {
+  padding: 2px 0;
+  margin-left: 6px;
+}
+
+.el-table {
+  color: #000;
+  font-size: 12px;
+}
+
+.el-table thead {
+  color: #FFF;
+}
+
+.el-table--border td,
+.el-table--border th {
+  border-color: #ccc;
+}
+
+.el-table--border th {
+  text-align: center !important;
+}
+
+.el-table--border,
+.el-table--group {
+  border-color: #ccc;
+}
+
+.el-table td,
+.el-table th.is-leaf {
+  border-color: #ccc;
+}
+
+.el-table__fixed,
+.el-table__fixed-right {
+  box-shadow: 0 0 10px rgba(0, 0, 0, .3);
+}
+
+.el-table--border::after,
+.el-table--group::after,
+.el-table::before {
+  background-color: #ccc;
+}
+
+.el-table--border .has-gutter td:nth-last-of-type(2),
+.el-table--border .has-gutter th:nth-last-of-type(2) {
+  border-right: 1px solid #ccc;
+}
+
+.el-table__row.current-row {
+  color: #20a0ff;
+}
+
+.el-table-column-span {
+  color: #000 !important;
+  background-color: #fff !important;
+}
+
+.el-table__column-filter-trigger {
+  line-height: normal;
+}
+
+.el-table-td-ops {
+  position: relative;
+  width: 100%;
+  padding-right: 36px;
+  overflow: hidden;
+}
+
+.el-table-td-btn {
+  position: absolute;
+  right: 0;
+  top: 2px;
+}
+
+.el-table__fixed-right-patch {
+  background-color: #f5f7fa;
+}
+
+.el-table__column-filter-trigger i {
+  -webkit-transform: scale(1);
+  transform: scale(1);
+  position: relative;
+  top: 1px;
+  left: 1px;
+  color: #FFF;
+}
+
+.el-table .cell {
+  padding: 0 5px !important;
+  line-height: 20px;
+}
+
+.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
+  background: #f0f5ff;
+}
+
+/*改变字体大小*/
+.el-table {
+  font-size: 12px;
+}
+
+.el-input__inner {
+  font-size: 12px;
+}
+
+.el-form-item__label {
+  font-size: 12px;
+  line-height: 32px;
+}
+
+.el-button,
+.el-textarea__inner {
+  font-size: 12px;
+}
+
+.el-dialog__title {
+  font-size: 14px;
+}
+
+/*.el-date-picker { z-index: 30000 !important; }*/
+/*.el-select-dropdown { z-index: 30000 !important; }*/
+
+/*对话框*/
+.el-dialog--defineLarge {
+  width: 1000px;
+}
+
+.el-dialog--defineSmall {
+  width: 400px;
+}
+
+.el-dialog--define65 {
+  width: 65%;
+}
+
+.el-dialog__header {
+  padding: 20px;
+  text-align: center;
+}
+
+.buttonTopCls .el-dialog__header {
+  padding-bottom: 0px;
+  text-align: center;
+}
+/*ul*/
+.xs-li {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  line-height: 36px;
+  height: 36px;
+  border-bottom: 1px solid #ccc;
+  cursor: pointer;
+}
+
+.xs-li:hover {
+  background: #f0f5ff;
+}
+
+.xs-li-active {
+  background: #f0f5ff;
+}
+
+.yt-base-top-page {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: 1000;
+  width: 100%;
+  padding-right: 20px;
+  text-align: right;
+}
+
+/* 多条件下拉样式 */
+.ytg-search-more-icon {
+  position: relative;
+  top: 1px;
+  font-size: 14px;
+  -webkit-transition: transform .3s;
+  transition: transform .3s;
+}
+
+.ytg-search-more-icon2 {
+  -webkit-transform: rotate(180deg);
+  transform: rotate(180deg);
+}
+
+/* 分页样式 */
+.yt-table-page {
+  margin: 5px 0 0;
+  text-align: right;
+}
+
+/* 物流管理 */
+.yt-alc {
+  padding: 10px 20px;
+}
+
+.ytg-lo-cr {
+  height: 100%;
+  position: relative;
+  overflow: auto;
+}
+
+/* 基础布局样式 */
+.yt-base-bottom-edit {
+  position: absolute;
+  bottom: 0;
+  z-index: 1000;
+  width: 100%;
+  overflow: auto;
+  padding: 0 20px 5px 20px;
+  border-top: 1px solid #ccc;
+  background-color: #fff;
+  box-shadow: 0 0 10px #ccc;
+}
+
+/* xs-form-inline */
+.xs-form-inline {}
+
+.xs-form-inline-c1 {
+  width: 100%;
+}
+
+.xs-form-inline-c2 {
+  width: 50%;
+}
+
+
+.xs-pl-button-right {
+  float: right;
+  margin-left: 0 !important;
+  margin-right: 10px;
+}
+
+.xs-pl-button-right1 {
+  float: right;
+  margin-left: 0 !important;
+  margin-right: 0;
+}
+
+/*表格行内编辑样式*/
+/*选择框*/
+.el-checkbox_noEdit {
+  cursor: default
+}
+
+.el-checkbox_noEdit .el-checkbox__input_noEdit {
+  cursor: default
+}
+
+.el-checkbox__inner_no_noEdit:hover {
+  border: 1px solid #bfcbd9;
+}
+
+.el-checkbox__inner_yes_noEdit:hover {
+  border-color: #0190fe;
+}
+
+/* 客户管理*/
+
+.xs-xtm-child-left {
+  width: 15%;
+  height: 100%;
+  float: left;
+  background: #f0f5ff;
+}
+
+.xs-xtm-child-right {
+  width: 85%;
+  height: 100%;
+  float: right;
+  overflow-y: auto;
+  padding-right: 20px;
+}
+
+
+/** 更改原表单样式 **/
+.xs-xtm-form .el-cascader-menus {
+  /*z-index: 20019 !important;*/
+  left: 170px;
+}
+
+.xs-xtm-form .el-form-item__content:only-child {
+  margin: 0 !important;
+}
+
+.xs-xtm-form .el-select {
+  display: block !important;
+}
+
+.xs-xtm-form .el-input {
+  width: 100%;
+}
+
+.xs-xtm-form .el-cascader {
+  display: block !important;
+}
+
+/* end */
+
+/* 中厚板之前elementUi版本过低,修改了弹出框跟对话框的z-index,现在版本升级后请使用 .xs-message 和 .xs-dialog*/
+.el-message-box__wrapper {
+  /*z-index: 21503 !important;*/
+}
+
+.el-message {
+  /*z-index: 21505 !important;*/
+}
+
+.el-dialog__wrapper {
+  /*z-index: 21504 !important;*/
+}
+
+.el-tooltip__popper {
+  /*z-index: 21504 !important;*/
+}
+
+/* end */
+
+.xs-xtm-icon-add {
+  float: right;
+  margin-top: 10px;
+}
+
+.v-modal {
+  position: absolute;
+}
+
+/*poptip*/
+.tip {
+  display: none;
+  width: 300px;
+  padding: 20px;
+  z-index: 20000;
+  background: #fff;
+  -webkit-animation: msgbox-fade-out .3s, msgbox-fade-in .3s;
+  animation: msgbox-fade-out .3s, msgbox-fade-in .3s;
+}
+
+.tooltip-content {
+  width: 260px;
+  word-break: break-all;
+}
+
+.poptip-arrow {
+  position: absolute;
+  overflow: hidden;
+  font-style: normal;
+  font-family: simsun;
+  font-size: 12px;
+  text-shadow: 0 0 2px #ccc;
+}
+
+.poptip-arrow em,
+.poptip-arrow i {
+  position: absolute;
+  left: 0;
+  top: 0;
+  font-style: normal;
+}
+
+.poptip-arrow em {
+  color: #d1dbe5;
+}
+
+.poptip-arrow i {
+  color: #fff;
+  text-shadow: none;
+}
+
+.poptip-arrow-left,
+.poptip-arrow-right {
+  height: 12px;
+  width: 6px;
+  top: 12px;
+  margin-top: -6px;
+}
+
+.poptip-arrow-left {
+  left: -6px;
+}
+
+.poptip-arrow-left em {
+  left: 1px;
+}
+
+.poptip-arrow-left i {
+  left: 2px;
+}
+
+.poptip-arrow-right {
+  right: -6px;
+}
+
+.poptip-arrow-right em {
+  left: -6px;
+}
+
+.poptip-arrow-right i {
+  left: -7px;
+}
+
+.ytg-search-more-content {
+  height: 0;
+  overflow: hidden;
+  transition: height .3s ease-out;
+}
+
+.ytg-search-more-content-auto {
+  height: auto;
+}
+
+/* 改变单元格背景色 */
+.plan_ht_time {
+  background-color: #ecf5ff;
+}
+
+.xs-ctt-mt-fm input {
+  padding: 0 10px;
+  /* background: red */
+}
+
+.xg-ytg-produce .el-table__expanded-cell[class*=cell] {
+  padding: 5px 30px;
+}
+
+.xs-qt-table .el-table .cell {
+  padding: 0 8px !important
+}
+
+.xs-qt-table.el-table .cell {
+  padding: 0 8px !important
+}
+
+.xs-c-p-p-lrb-edit .el-form-item__content,
+.xs-c-p-p-lrb-edit .el-form-item__label {
+  line-height: 26px;
+}
+
+.xs-c-p-p-lrb-edit .el-form-item {
+  margin-bottom: 0;
+}
+
+.xs-s-mm-process .el-tabs__content {
+  overflow: visible;
+}
+
+/*
+ * xinsteel.sales css
+ */
+.xs-lg-form .el-input--prefix .el-input__inner {
+  padding-left: 60px
+}
+
+.xs-lg-form .xs-lg-form-date .el-input__prefix {
+  left: 0.9rem;
+  top: 0;
+  font-size: 1rem;
+}
+
+/*
+ * xinsteel.sales css
+ */
+/*复制OA的router-link样式*/
+/* tabs */
+.st-tabs {
+  text-align: center;
+  padding: 15px 0;
+  border: 1px #ccc solid;
+}
+
+.st-tabs-li {
+  display: inline-block;
+  margin: 0 10px;
+  padding: 0 24px;
+  height: 34px;
+  line-height: 34px;
+  vertical-align: middle;
+  font-size: 14px;
+  color: #333;
+  text-align: center;
+  border: 1px solid #ccc;
+  background-color: #fff;
+  border-radius: 4px;
+  cursor: pointer;
+}
+
+.st-tabs-li:hover {
+  background-color: #f1f1f1;
+  text-decoration: none;
+  color: #666;
+}
+
+.st-tabs-li:focus {
+  text-decoration: none;
+}
+
+.st-tabs-li.router-link-active {
+  border-color: #4086ff;
+  background-color: #4086ff;
+  color: #fff;
+  cursor: default;
+}
+
+.st-tabs-li.router-link-active:hover {
+  background-color: #3D74FF;
+}
+
+/* 车间管理组批页面移动按钮 */
+.ytg-xd-button .el-button--mini {
+  padding: 5px 15px
+}
+
+/*根据设计要求做出以下修改:表格内的编辑控件高度调整为20px,效果为打钩状态和不打钩状态下表格的行高一致*/
+/*去掉表格内编辑控件的圆角*/
+.ctr-tec-table .el-input--small .el-input__inner {
+  height: 20px;
+}
+
+.ctr-tec-table .el-input__inner {
+  border-radius: 0;
+}
+
+.ctr-tec-table .el-input-group>.el-input__inner {
+  display: inline-block;
+}
+
+/* 去掉表格内编辑时间小图标 */
+.ctr-tec-table .el-input__icon {
+  display: none;
+}
+
+.ctr-tec-table .el-input__inner {
+  padding-left: 14px;
+}
+
+.ctr-tec-table1 .el-input__inner {
+  padding-left: 14px;
+}
+
+/* 技术要求输入下拉框 */
+/*ytg-s-m-mm-msc: 冶金规范管理Msc表格*/
+.ctr-tec-table .el-input__inner,
+.ytg-s-m-mm-msc .el-input__inner {
+  background: #FEFEC0;
+}
+
+.ctr-tec-table1 .el-input__inner,
+.ytg-s-m-mm-msc .el-input__inner {
+  background: #FEFEC0;
+}
+
+/*规范管理模块用的分页器样式*/
+.std-page {
+  padding: 20px 20px 0 20px;
+  text-align: right;
+}
+
+.el-form-item__content {
+  line-height: 28px;
+}
+
+/* 车间 探伤 编辑区 */
+.xs-j-flaw-edit .el-form-item__content,
+.xs-j-flaw-edit .el-form-item__label,
+.xs-j-flaw-edit .el-input__icon {
+  line-height: 26px;
+}
+
+.xs-j-flaw-edit .el-input__inner {
+  height: 26px;
+}
+
+.xs-j-flaw-edit .el-form-item {
+  margin-bottom: 0;
+}
+
+.ytg-s-mm-process .el-tabs__content {
+  overflow: visible;
+}
+
+/*冶金规范管理页面,交付标准和制成那一块不要有太多的层级,就是表格的左、下、右边框重合*/
+.ytg-s-mm-process .el-tabs__content {
+  padding: 0px;
+  margin: 10px -1px -1px -1px;
+}
+
+/* 加热炉入炉,出炉,吊销 */
+.xs-edit-table .el-input--suffix .el-input__inner {
+  padding-left: 10px;
+  padding-right: 10px;
+}
+.xg-heat-fur .el-input__icon {
+  line-height: 20px;
+  text-align: right;
+}
+
+.xs-edit-table .el-input__prefix .el-input__icon {
+  display: none;
+  /* line-height: 25px; */
+}
+
+/* 组批 */
+.el-table .xg-zhb-combine td {
+  background-color: skyblue !important;
+}
+
+/* 表格列高度 */
+/* .el-table .cell {
+  line-height: 12px !important;
+} */
+/* 计划模块表头样式 */
+.xs-s-mm-process .el-table thead.is-group th {
+  background-color: skyblue;
+}
+
+.xg-zhb-plan-edit .el-checkbox+.el-checkbox {
+  margin-left: 12px;
+}
+.xg-zhb-plan-long-edit .el-checkbox {
+  margin-right: 0
+}
+.xg-zhb-plan-long-edit .el-checkbox+.el-checkbox {
+  margin-left: 12px;
+}
+
+.xg-zhb-dialog .el-checkbox:first-child {
+  margin-left: 20px;
+}
+
+/* 生产订单管理行变色 */
+.xs-ctt-s .xg-zhb-prod-table td {
+  background-color: rgb(249, 255, 169) !important;
+}
+
+.xg-ytg-produce .el-table tr .cell {
+  padding: 0 2px !important;
+  line-height: 12px;
+  white-space: nowrap;
+  text-overflow:ellipsis;
+}
+
+/* .xg-ytg-produce thead {
+  line-height: 12px;
+} */
+
+/* .xg-ytg-produce .el-table th {
+  margin-left: 1px;
+} */
+.xg-ytg-produce .el-table td {
+  padding: 1px 0;
+}
+
+.xg-ytg-produce .el-checkbox__inner {
+  width: 12px;
+  height: 12px;
+}
+
+.xg-ytg-produce .el-checkbox__inner::after {
+  left: 3px;
+  top: 0;
+}
+
+.xg-ytg-produce .xg-ytg-line-hei.el-table td {
+  padding: 5px 0;
+}
+
+/* 计划,车间模块所有编辑区的高度调整 */
+.xg-ytg-produce .el-button--small {
+  padding: 3px 5px 4px 5px;
+}
+
+.xg-ytg-produce .el-input--small .el-input__inner {
+  height: 21px !important;
+  line-height: 21px;
+  padding: 0 5px;
+}
+
+.xg-ytg-produce .el-input-number--small .el-input-number__decrease,
+.xg-ytg-produce .el-input-number--small .el-input-number__increase {
+  line-height: 19px;
+}
+
+.xg-ytg-produce .el-form--inline .el-form-item {
+  margin-right: 0px;
+}
+
+.xg-ytg-produce .el-form-item {
+  margin-bottom: 0px;
+}
+
+.xg-ytg-produce .el-form-item__label {
+  padding-right: 4px
+}
+
+.xg-ytg-produce .el-icon-date,
+.xg-ytg-produce .el-icon-time {
+  display: none;
+}
+.xg-table-footer .el-table__footer tr {
+  height: 24px;
+}
+
+/* .xg-ytg-line-hei {
+  margin-left: 30px
+} */
+/* 轧制计划编制 */
+.ctr-tec-table.xg-zhb-heat .el-input__inner {
+  padding: 0 0 0 2px;
+}
+
+/* element-bigdata-table 表头对齐 颜XX */
+.vue-element-bigdata-table.el-table--scrollable-y:not(.el-table--scrollable-x) col[name="gutter"] {
+  width: 0 !important
+}
+
+.vue-element-bigdata-table.el-table--scrollable-y:not(.el-table--scrollable-x) th.gutter {
+  width: 0 !important
+}
+
+/* 短尺设计侧边划出框样式 */
+.zhb_slider .el-input--small .el-input__icon {
+  display: none
+}
+
+.zhb_slider .el-input--prefix .el-input__inner {
+  padding-left: 3px;
+  padding-right: 3px;
+}
+
+.zhb_slider .el-form-item {
+  margin-bottom: 2px;
+}
+
+.xs-qt-table .el-checkbox__inner {
+  transition: none;
+}
+
+.theCont .el-tabs__header {
+  margin: 0px;
+}
+
+.theCont .el-form-item {
+  margin-bottom: 0px;
+}
+
+.tableHear .el-table thead.is-group th {
+  background: #5BABE3;
+}
+
+.head .el-table__expanded-cell {
+  padding: 22px 20px 1px 20px;
+}
+
+/* .xg-ytg-tab-wid .el-table__body-wrapper, .xg-ytg-tab-wid .el-table__footer-wrapper, .xg-ytg-tab-wid .el-table__header-wrapper {
+  width: 80%;
+} */
+/* .xg-ytg-tab-wid.el-table {
+  width: 45%;
+} */
+.sl-content-main .el-tabs__header {
+  margin: 0
+}
+
+.design .el-tabs__nav {
+  transform: translateX(757px) ! important;
+}
+
+.td-overflow-tooltip {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  text-align: center;
+  width: 140px;
+  /* position: relative; */
+  cursor: pointer;
+}
+
+.td-overflow-tooltip-box {
+  /* width: 150px; */
+  background: #333;
+  color: #fff;
+  position: absolute;
+  top: -46px;
+  left: 0;
+  z-index: 999;
+  display: none;
+  padding: 10px;
+  border-radius: 2px;
+  font-size: 12px;
+  /* white-space: normal; */
+}
+
+/* 原生表格自定义高亮当前行 */
+.zhb-highlighet-row td {
+  color: #3279e8;
+  background-color: #d3ddf5;
+  font-weight: bold;
+}
+
+.head-wrapper::-webkit-scrollbar-thumb:horizontal {
+  height: 0px;
+}
+
+.head-wrapper::-webkit-scrollbar {
+  height: 0px;
+}
+
+.origin-ul ul {
+  list-style: none;
+  display: none;
+  position: absolute;
+  border-radius: 3px;
+  background: #fff;
+  /* width: calc(100% - 8px); */
+  min-width: 130px;
+  border: 1px solid #cccccc;
+  z-index: 999;
+  max-height: 200px;
+  overflow: scroll;
+}
+
+.origin-ul ul li {
+  text-align: left;
+  padding: 3px 10px;
+  color: #000;
+  font-weight: 100;
+}
+
+.origin-ul ul li:hover {
+  background: skyblue;
+  color: #fff;
+  cursor: pointer;
+}
+
+.origin input,
+.origin select {
+  background: #FEFEC0;
+  width: 100%;
+  padding-left: 4px;
+  font-weight: 500;
+  color: #000;
+}
+
+.origin select {
+  appearance: none;
+  -moz-appearance: none;
+  -webkit-appearance: none;
+}
+
+.origin input {
+  /* border: none; */
+  outline: none;
+  border: 1px solid #aaa;
+  padding-top: 1px;
+  padding-bottom: 1px;
+}
+
+.origin-ul ul::-webkit-scrollbar {
+  /*滚动条整体样式*/
+  width: 8px;
+  /*高宽分别对应横竖滚动条的尺寸*/
+  height: 8px;
+}
+
+.origin-ul ul::-webkit-scrollbar-thumb {
+  /*滚动条里面小方块*/
+  border-radius: 2px;
+  background-color: #CCC;
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent);
+}
+
+.origin-ul ul::-webkit-scrollbar-track {
+  /*滚动条里面轨道*/
+  /* -webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2); */
+  /*border-radius: 10px;*/
+  background: #FFF;
+}
+
+/* 计划,车间模块所有编辑区的高度调整 */
+.zhb-plan-box .el-button--small {
+  padding: 3px 5px 4px 5px;
+}
+
+.zhb-plan-box .el-input--small .el-input__inner {
+  height: 21px;
+  line-height: 21px;
+}
+
+.el-menu-item {
+  font-size: 12px !important;
+  height: 32px !important;
+  line-height: 32px !important;
+}
+
+.el-submenu__title {
+  font-size: 12px !important;
+  height: 42px !important;
+  line-height: 42px !important;
+}
+
+/* .el-table--striped .el-table__body tr.el-table__row--striped td {
+  background: #dcdfe6;
+} */
+.sl-menu.el-menu {
+  background-color: rgb(168, 230, 219);
+  /* color: #fff; */
+}
+
+.ytg-menu-level1>li>div.el-submenu__title {
+  padding-left: 26px !important;
+}
+
+/* 第一级菜单背景色 */
+.sl-menu.ytg-menu-level1 {
+  /* background-color: #45A4F9; */
+  background-color: #409EFF;
+  /* color: #fff */
+}
+
+.sl-menu.ytg-menu-level1>li>div.el-submenu__title {
+  color: #fff;
+}
+
+.sl-menu.ytg-menu-level1>li>div.el-submenu__title>i {
+  color: #fff;
+}
+
+/* 第二级菜单背景色 */
+.sl-menu.ytg-menu-level1>li>ul {
+  background-color: #fff;
+}
+
+/* 第二级打开菜单背景色 */
+.sl-menu.ytg-menu-level1>li>ul>li.is-opened {
+  background-color: #fff;
+}
+
+/* 第三级菜单背景色 */
+.sl-menu.ytg-menu-level1>li>ul>li>ul {
+  background-color: #fff;
+}
+
+/* 鼠标移入菜单背景色 */
+.sl-menu .el-submenu__title:hover,
+.sl-menu .el-menu-item:hover,
+.sl-menu.ytg-menu-level1>li>div.el-submenu__title:hover,
+.sl-menu.ytg-menu-level1>li>div.el-submenu__title:hover>i {
+  background-color: #ccf1ff;
+  color: #000;
+}
+
+/* 选中菜单背景色 */
+.ytg-menu-level1 .el-menu-item.is-active {
+  background-color: #fff;
+}
+
+/* 选中菜单背景色 */
+.ytg-menu-level1 .el-menu-item.is-active:hover {
+    background-color: #ccf1ff;
+    color: #000;
+}
+
+/* 短尺坯设计导入文件列表隐藏 */
+.zhb-plan-short-design .el-upload-list.el-upload-list--text {
+  display: none
+}
+
+input:-webkit-autofill {
+  -webkit-text-fill-color: #000 !important;
+  -webkit-box-shadow: 0 0 0 1000px transparent inset !important;
+  background-color: transparent !important;
+  background-image: none !important;
+  transition: background-color 50000s ease-in-out 0s !important;
+}
+
+/* input {
+  background-color:transparent !important;
+} */
+/* 长尺充当时间控件样式 */
+.zhb-ems-long-feed .el-input--small .el-input__inner {
+  padding-right: 0;
+}
+
+.zhb-ems-long-feed .el-input--prefix .el-input__inner {
+  padding-left: 20px;
+}
+
+.zhb-ems-long-feed .el-input__prefix {
+  left: 0
+}
+
+/* 长尺坯设计选中坯料变色 */
+.el-table--striped .el-table__body tr.el-table__row--striped.zhb-long-row-bgcolor td {
+  background-color: red;
+}
+
+.el-table__body tr.zhb-long-row-bgcolor>td {
+  background-color: red
+}
+
+/** 动态的给el-form-item添加红* **/
+.wBeforeItem label.el-form-item__label::before {
+  content: '*';
+  color: red;
+  margin-right: 4px;
+}
+
+/** 扩展行的div内的padding **/
+.WextendTr .el-table__expanded-cell[class*=cell] {
+  padding: 5px auto;
+}
+
+/* .WextendTr .el-table--border{
+  border-color: #fff;
+} */
+
+/*去掉 el-menu 的title*/
+.el-menu-item-group__title {
+  padding: 0 !important;
+}
+
+/* input-tooltip宽度调整(发运-可发量申报) 颜XX start*/
+.input-tooltip-item {
+  max-width: 50%;
+}
+/* input-tooltip宽度调整(发运-可发量申报) 颜XX end */
+/* 计划模块el-form-item宽度改变 */
+.xs-ct-bcm-edit .el-form-item, .xg-zhb-plan-edit .el-form-item {
+  width: 100%;
+}
+.xs-ct-bcm-edit .el-form-item__content {
+  width: calc(100% - 120px)
+}
+/* .xg-zhb-plan-edit .el-form-item__content {
+  width: calc(100% - 120px)
+} */
+.xg-zhb-trans-table .el-table__body tr.current-row>td {
+  color: #fff !important;
+  background-color: red !important;
+}
+/* el-tooltip 中pre样式修改,设置自动换行(合同头页面) 颜XX */
+pre.alpha_pre {
+  max-width: 880px;
+  white-space: pre-wrap;
+  word-wrap: break-word;
+}

File diff suppressed because it is too large
+ 3 - 0
src/assets/iconfont/iconfont.css


BIN
src/assets/iconfont/iconfont.eot


File diff suppressed because it is too large
+ 28 - 0
src/assets/iconfont/iconfont.svg


BIN
src/assets/iconfont/iconfont.ttf


BIN
src/assets/iconfont/iconfont.woff


BIN
src/assets/iconfont/iconfont.woff2


BIN
src/assets/img/Artboard.png


BIN
src/assets/img/custlogo.jpg


BIN
src/assets/img/default-bg.png


BIN
src/assets/img/download.png


BIN
src/assets/img/favicon.ico


BIN
src/assets/img/func/func_w.png


BIN
src/assets/img/hnst_logo.png


BIN
src/assets/img/icons.png


BIN
src/assets/img/icons/icons-add.png


BIN
src/assets/img/icons/icons-arrow-left.png


BIN
src/assets/img/icons/icons-arrow-right.png


BIN
src/assets/img/icons1.png


BIN
src/assets/img/icore-shown-all.png


BIN
src/assets/img/icore-shown-desc.png


BIN
src/assets/img/icore-shown-frame.png


BIN
src/assets/img/icore-shown-psw.png


BIN
src/assets/img/icore-shown-user.png


BIN
src/assets/img/icore-shown.png


BIN
src/assets/img/login-show.png


BIN
src/assets/img/login-shown1.png


BIN
src/assets/img/login.png


BIN
src/assets/img/login/login-bg.png


BIN
src/assets/img/login/login-icon1.png


BIN
src/assets/img/login/login-icon2.png


BIN
src/assets/img/login/login-icon3.png


BIN
src/assets/img/login/login-list-icon1.png


BIN
src/assets/img/login/login-list-icon2.png


BIN
src/assets/img/login/login-list-icon3.png


BIN
src/assets/img/login/login-list-icon4.png


BIN
src/assets/img/login/login-list-icon5.png


BIN
src/assets/img/login/login-list-icon6.png


BIN
src/assets/img/login/login-list-icon7.png


BIN
src/assets/img/login/login-list-icon8.png


BIN
src/assets/img/login/login-logo.png


BIN
src/assets/img/login/login-logo2.jpg


BIN
src/assets/img/login/login_blue.png


BIN
src/assets/img/login/login_date.png


BIN
src/assets/img/login/login_jobs.png


BIN
src/assets/img/login/login_paw.png


BIN
src/assets/img/login/login_submit.png


BIN
src/assets/img/login/login_user.png


BIN
src/assets/img/login/zhonggang_logo.png


BIN
src/assets/img/menu/menu_b.png


BIN
src/assets/img/menu/menu_w.png


BIN
src/assets/img/nav/nav_b.png


BIN
src/assets/img/nav/nav_c.png


BIN
src/assets/img/nav/nav_w.png


BIN
src/assets/img/photo-default.png


BIN
src/assets/img/spirit00.png


BIN
src/assets/img/ytg_tab.png


BIN
src/assets/img/ytg_xtico.png


BIN
src/assets/img/ytgbg_img.png


BIN
src/assets/img/ytgico.png


+ 20 - 0
src/components/App.vue

@@ -0,0 +1,20 @@
+<template>
+  <div id="app">
+    <router-view/>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'App'
+}
+</script>
+<style>
+  #app {
+    font-family: 'Avenir', Helvetica, Arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    height: 100%;
+  }
+  body, html { height: 100%; }
+</style>

+ 180 - 0
src/components/common/LorderDetail.vue

@@ -0,0 +1,180 @@
+<template>
+  <div>
+    <el-table class="ctr-tec-table xg-ytg-line-hei" :span-method="params.spanMethod" :ref="'detailTable' + params.index" max-height="600" :data="params.data" v-loading="params.loading" border highlight-current-row>
+      <el-table-column prop="PACT_INDEX" label="计划号" :show-overflow-tooltip="true" align="left" min-width="120"></el-table-column>
+      <el-table-column prop="SLAB_SEQ" label="子坯序号" :show-overflow-tooltip="true" align="left" min-width="100"></el-table-column>
+      <el-table-column prop="DESIGN_NO" label="短尺设计号" :show-overflow-tooltip="true" align="left" min-width="140" :filter-method="filterColumn"></el-table-column>
+      <el-table-column prop="STEEL_NAME" label="牌号" :show-overflow-tooltip="true" align="left" min-width="80" :filter-method="filterColumn"></el-table-column>
+      <el-table-column prop="SLAB_THK" label="厚(mm)" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+      <el-table-column prop="SLAB_WTH" label="宽(mm)" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+      <el-table-column prop="SLAB_LEN" label="长(mm)" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+      <el-table-column prop="SINGLE_WGT" label="单重(t)"  :show-overflow-tooltip="true"  align="right" min-width="60">
+        <template slot-scope="scope">
+          <span>{{scope.row.SINGLE_WGT | weightTrans}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单序号" prop="PLATE_SEQ" align="center" show-overflow-tooltip min-width="60"></el-table-column>
+      <el-table-column prop="ORDER_NO" label="订单号" white-space-nowrap :show-overflow-tooltip="true" align="left" min-width="100" :filter-method="filterColumn"></el-table-column>
+      <el-table-column prop="PROD_ORDER_NO" label="生产订单号" :show-overflow-tooltip="true" align="left" min-width="100" :filter-method="filterColumn"></el-table-column>
+      <el-table-column  label="设计子板规格(长度:mm 重量:t)">
+          <el-table-column prop="CHILD_THK" label="厚" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+          <el-table-column prop="CHILD_WTH" label="宽" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+          <el-table-column prop="CHILD_LEN" label="长" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+          <el-table-column prop="CHILD_WGT" label="重" :show-overflow-tooltip="true" align="right" min-width="60">
+            <template slot-scope="scope">
+              <span>{{scope.row.CHILD_WGT | weightTrans}}</span>
+            </template>
+          </el-table-column>
+      </el-table-column>
+      <el-table-column  label="订单要求规格(长度:mm 重量:t)">
+        <el-table-column prop="THICK" label="厚" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+        <el-table-column prop="WIDTH" label="宽" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+        <el-table-column prop="LENGTH" label="长" :show-overflow-tooltip="true" align="right" min-width="50"></el-table-column>
+        <el-table-column prop="ESTIMATE_WEIGHT" label="重"  :show-overflow-tooltip="true" align="right" min-width="50">
+          <template slot-scope="scope">
+            <span>{{scope.row.ESTIMATE_WEIGHT | weightTrans}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="LENGTH_MAX" label="长度上限" :show-overflow-tooltip="true" align="right" min-width="60"></el-table-column>
+        <el-table-column prop="LENGTH_MIN" label="长度下限" :show-overflow-tooltip="true" align="right" min-width="60"></el-table-column>
+        <el-table-column prop="WIDTH_MAX" label="宽度上限" :show-overflow-tooltip="true" align="right" min-width="60"></el-table-column>
+        <el-table-column prop="WIDTH_MIN" label="宽度下限" :show-overflow-tooltip="true" align="right" min-width="60"></el-table-column>
+        <el-table-column prop="SINGLE_WEIGHT_MAX" label="单重上限"  :show-overflow-tooltip="true"  align="right" min-width="60">
+          <template slot-scope="scope">
+            <span>{{scope.row.SINGLE_WEIGHT_MAX | weightTrans}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="SINGLE_WEIGHT_MIN" label="单重下限" :show-overflow-tooltip="true" align="right" min-width="60">
+          <template slot-scope="scope">
+            <span>{{scope.row.SINGLE_WEIGHT_MIN | weightTrans}}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column prop="FIX_SIZE_DESC" label="定尺方式" :show-overflow-tooltip="true" align="left" min-width="80"></el-table-column>
+      <el-table-column prop="CUT_EDGE_TYPE_NAME" label="切边方式" :show-overflow-tooltip="true" align="left" min-width="80"></el-table-column>
+      <el-table-column prop="DELIVERY_ERROR_MIN" label="交货重量下限(t)" :show-overflow-tooltip="true" align="right" min-width="60">
+        <template slot-scope="scope">
+          <span>{{scope.row.DELIVERY_ERROR_MIN | weightTrans}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="DELIVERY_ERROR_MAX" label="交货重量上限(t)" :show-overflow-tooltip="true" align="right" min-width="60">
+        <template slot-scope="scope">
+          <span>{{scope.row.DELIVERY_ERROR_MAX | weightTrans}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="SPECIAL" label="特殊要求" :show-overflow-tooltip="true" align="left" min-width="80">
+        <template slot-scope="props">
+          <el-button type="text" size="small" @click="showSpecialDetail(props.row)">{{props.row.SPECIAL}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column prop="ADD_ASK_DESC" label="附加要求" :show-overflow-tooltip="true" align="left" min-width="80"></el-table-column>
+      <el-table-column prop="ORG" label="检验机构" :show-overflow-tooltip="true" align="left" min-width="80"></el-table-column>
+      <el-table-column prop="RECIVER_UNIT_NAME" label="收货单位" white-space-nowrap :show-overflow-tooltip="true" align="left" min-width="80" :filter-method="filterColumn"></el-table-column>
+    </el-table>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    params: {
+      type: Object,
+      default: {}
+    },
+    isshow: {
+      type: Boolean
+    }
+  },
+  data () {
+    return {}
+  },
+  mounted () {
+    console.log('传过来的数据', this.params)
+    this.getDetailData(this.params)
+  },
+  methods: {
+    showSpecialDetail (row) {
+      this.$emit('showdetail', row)
+    },
+    getDetailData (row) {
+      let _this = this;
+      let ldesignNo = row.ldesign_no || row.LDESIGN_NO || row.object_type
+      if (ldesignNo) {
+        let arr = [
+          {
+            object: {
+              ldesign_no: ldesignNo
+            }
+          }
+        ]
+        _this.$set(row, 'loading', true)
+        _this.axios.post('/PlnLslabdesignMainService/doQuaryMultinfoMain', arr).then(function (response) {
+          if (response) {
+            if (response.status === 200 || response.status === '200') {
+              let arr = [];
+              let len = response.data.data.length;
+              let data = response.data.data
+              for (let i = 0; i < len; i++) {
+                data[i].index = i
+                data[i].$index = row.index
+                if (!arr[Number(data[i].SLAB_SEQ) - 1]) {
+                  arr[Number(data[i].SLAB_SEQ) - 1] = []
+                }
+              }
+              for (let i = 1; i <= arr.length; i++) {
+                for (let item of data) {
+                  if (Number(item.SLAB_SEQ) === i) {
+                    arr[i - 1].push(item.SLAB_SEQ)
+                  }
+                }
+              }
+              _this.$set(row, 'data', response.data.data)
+              _this.$refs['detailTable' + row.index].clearFilter();
+              _this.setFilterDatas(_this.$refs['detailTable' + row.index].columns, row.data, ['ORDER_NO', 'PROD_ORDER_NO', 'DELIVERY_STATE_DESC', 'DESIGN_NO', 'STEEL_NAME', 'RECIVER_UNIT_NAME']);
+              _this.$set(row, 'spanMethod', function ({ row, column, rowIndex, columnIndex }) {
+                let index = 0;
+                if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2 || columnIndex === 3 || columnIndex === 4 || columnIndex === 5 || columnIndex === 6) {
+                  if (rowIndex === 0) {
+                    return {
+                      rowspan: arr[0].length,
+                      colspan: 1
+                    }
+                  } else {
+                    for (let i = 0; i < arr.length; i++) {
+                      index += arr[i].length
+                      if (rowIndex === index) {
+                        if (i < arr.length - 1) {
+                          return {
+                            rowspan: arr[i + 1].length,
+                            colspan: 1
+                          }
+                        }
+                      }
+                    }
+                  }
+                  for (let i = 0; i < arr.length; i++) {
+                    if (rowIndex !== 0 && rowIndex !== arr[i].length) {
+                      return {
+                        rowspan: 0,
+                        colspan: 0
+                      }
+                    }
+                  }
+                }
+              })
+            }
+          }
+          _this.$set(row, 'loading', false)
+        }).catch(function () {
+          _this.$set(row, 'loading', false)
+        })
+      }
+    }
+  },
+  watch: {
+    isshow () {
+      console.log('执行了监听')
+      this.getDetailData(this.params)
+    }
+  }
+}
+</script>

+ 704 - 0
src/components/common/additional.vue

@@ -0,0 +1,704 @@
+<template>
+  <!--附加要求-->
+  <div class="additional">
+    <div class="ctr-tec-top">
+      <div class="ytg-return-div" @click="handleBack">
+        <span class="el-icon-arrow-left el-return-IconStyle" ></span>
+        <span @click="visible = 1" class="returnText">返回</span>
+      </div>
+
+      <span>最终用户:</span><el-input v-model="headRow.customer_name" disabled style="width: 300px;margin-right: 10px;" size="small"></el-input>
+      <div v-show="visibleFlag" style="display: inline">
+        <el-button :loading="saveLoading" size="small" @click="handleSave">保存</el-button>
+        <el-button :loading="UnuseLoading" size="small" @click="handleUnuse">停用</el-button>
+        <el-button :loading="chooseLoading" type="primary" size="small" @click="handleChoose">选择</el-button>
+      </div>
+
+    </div>
+
+    <el-row style="height: 94%;">
+      <el-col class="col-l" :span="6">
+        <div style="height: 50px;line-height: 50px;border-bottom: 1px solid #ccc;padding-left: 20px">附加要求</div>
+        <div class="add-l">
+          <ul>
+            <!--<div :id="'item' + index" v-for="(item, index) in leftList" :key="index" class="add-list-row">-->
+            <template v-for="(item, index) in leftList" >
+              <el-tooltip placement="right" effect="light" :key="item.add_ask_no">
+                <div slot="content">{{item.add_ask_no}}{{index === 0 ? '' : '+'}}{{index === 0 ? '' : headRow.customer_name}}</div>
+                <li  @click="findRightTb(item, index)" class="add-list-row" :id="'item' + index"><span class="ytg-icons ytg-additional-liBtn ytg-additional-icon"></span>
+                  {{item.add_ask_no}}{{index === 0 ? '' : '+'}}{{index === 0 ? '' : headRow.customer_name}}</li>
+              </el-tooltip>
+              <!--<span class="ytg-icons ytg-additional-liBtn"></span>-->
+              <!--<li v-if="index===0" style="display: inline-block" @click="findRightTb(item, index)">{{item.add_ask_no}}</li>-->
+              <!--<li v-else style="display: inline-block" @click="findRightTb(item, index)">{{item.add_ask_no}} + {{headRow.customer_name}}</li>-->
+            <!--</div>-->
+            </template>
+          </ul>
+        </div>
+      </el-col>
+      <el-col class="col-r" :span="18">
+        <div class="add-r ctr-tec-table">
+          <el-table :data="data1" @select="handleSelect" @select-all="handleSelectAll">
+            <el-table-column fixed="left" type="selection" align="center"></el-table-column>
+            <el-table-column prop="add_ask_type" label="要求类型" width="80">
+              <template slot-scope="scope">
+                <span v-if="scope.row.add_ask_type==='0'">标准项</span>
+                <span v-else-if="scope.row.add_ask_type==='1'">修改项</span>
+                <span v-else-if="scope.row.add_ask_type==='2'">新增项</span>
+                <span v-else></span>
+              </template>
+            </el-table-column>
+            <el-table-column label="要求项" min-width="150">
+              <template slot-scope="scope">
+                <el-select v-model="scope.row.ask_itme_desc" placeholder="" size="small" @change="handleAskItme" @focus="askItmeFocus(scope.$index)">
+                  <el-option v-for="item in askItemList" :key="item.id" :label="item.text" :value="item.text">
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="要求分项" min-width="150">
+              <template slot-scope="scope">
+                <el-select v-model="scope.row.ask_sub_itme_desc" placeholder="" size="small" @change="handleAskSubItme" @focus="askSubItmeFocus(scope.$index)">
+                  <el-option v-for="item in askSubItemList" :key="item.id" :label="item.text" :value="item.text">
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="标准说明" align="center">
+              <el-table-column :show-overflow-tooltip="true" prop="ask_sub_itme_val_desc" label="交付标准要求标准说明" min-width="350"></el-table-column>
+              <el-table-column :show-overflow-tooltip="true" label="客户要求标准说明" min-width="350">
+                <template slot-scope="scope">
+                  <el-select style="width: 100%;" clearable allow-create filterable :filter-method="handleFilterMethod" v-model="scope.row.customer_val_desc"
+                             placeholder="" size="small" @change="handleCustomerVal" @focus="customerValFocus(scope.$index)">
+                    <el-option v-for="item in customerValList" :key="item.id" :label="item.text" :value="item.text">
+                    </el-option>
+                  </el-select>
+                </template>
+              </el-table-column>
+            </el-table-column>
+            <el-table-column :show-overflow-tooltip="true" prop="add_ask_status" label="评审状态" width="80">
+              <template slot-scope="scope">
+                <span v-if="scope.row.add_ask_status==='1'">待评审</span>
+                <span v-else-if="scope.row.add_ask_status==='2'">评审通过</span>
+                <span v-else-if="scope.row.add_ask_status==='3'">评审不通过</span>
+              </template>
+            </el-table-column>
+            <el-table-column :show-overflow-tooltip="true" prop="review_desc" label="评审说明" min-width="200"></el-table-column>
+            <el-table-column prop="valid_flag" label="有效标志" width="80">
+              <template slot-scope="scope">
+                <span v-if="scope.row.valid_flag==='1'">有效</span>
+                <span v-else>无效</span>
+              </template>
+            </el-table-column>
+            <el-table-column fixed="right" label="操作" align="center" width="140">
+              <template slot-scope="scope">
+                <el-button type="text" @click="showDetail(scope.row)">查看</el-button>
+                <el-button v-if="scope.$index === data1.length - 1" type="text" @click="addRow">添加空白行</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-col>
+    </el-row>
+    <div is="additionalDetail" :row="DetailRow"></div>
+  </div>
+</template>
+<script>
+// import additionalDetail from '@/views/slaes/components/contract/additionalDetail.vue';
+import additionalDetail from '@/views/sales/components/contract/additionalDetail.vue'
+export default {
+  components: { additionalDetail },
+  data () {
+    return {
+      paramObj: {
+        contract_pk: '',
+        contract_line_no: '',
+        page_type: '',
+        order_flag_no: ''
+      }, // 路由参数
+      chooseLoading: false,
+      UnuseLoading: false,
+      saveLoading: false,
+      param: [],
+      headRow: {},
+      lineRow: {},
+      leftData: {}, // 当前所点击的左边列表的数据
+      leftIndex: 0,
+      isLong: false, // 客户要求超过4000字则为true
+      selection: [],
+      // 当前操作的表格行的index
+      scopeIndex: '',
+      askItemList: [],
+      askSubItemList: [],
+      customerValList: [],
+      DetailRow: {},
+      leftList: [],
+      data1: [],
+      data1ToCompare: [] // 用于和data1比较的副本,判断是否为修改项
+    }
+  },
+  mounted () {
+    let _this = this;
+    let val = decodeURI(this.$route.params.lineData);
+    this.param = val.split('_');
+    this.paramObj.contract_pk = this.param[0];
+    this.paramObj.contract_line_no = this.param[1];
+    this.paramObj.page_type = this.param[2]; // 合同:contract- '0' 合同维护 1' 合同生效 ‘2’ 合同结案 '3' 合同跟踪   order- '0' 订单信息 ' '1' 订单下发  '2' 订单跟踪  '3' 订单
+
+    // 合同
+    if (this.paramObj.page_type.indexOf('contract') >= 0) {
+      this.paramObj.addSelectedIndex = this.param[3]; //  被选中的附加要求
+    } else {
+      this.paramObj.order_no = this.param[3];
+      this.paramObj.order_flag_no = this.param[4]; // 订单状态
+    }
+
+    // 查询合同头详情
+    this.axios.post('/SlmContractHeatInfoService/doQueryDetailWeb', [
+      {object: { contract_pk: this.paramObj.contract_pk }}
+    ]).then(function (response) {
+      if (response) {
+        _this.headRow = response.data.data;
+        _this.findLeftList(_this.headRow.customer_no);
+      }
+    });
+    // 查询合同行详情
+    this.axios.post('/SlmContractLineInfoService/doQueryDetailWeb', [
+      {object: {contract_line_no: this.paramObj.contract_line_no}}
+    ]).then(function (response) {
+      if (response) {
+        _this.lineRow = response.data.data;
+      }
+    });
+
+    // 面包屑设置
+    this.setBreadCrumb()
+  },
+  computed: {
+    visibleFlag () {
+      if (this.paramObj.page_type.indexOf('contract') >= 0) {
+        if (this.lineRow.line_flag_no === '102601') {
+          return true;
+        } else {
+          return false;
+        }
+      } else {
+        if (this.paramObj.order_flag_no === '103401') {
+          return true;
+        } else {
+          return false;
+        }
+      }
+    }
+  },
+  methods: {
+    setBreadCrumb () {
+      if (this.paramObj.page_type === 'contract-0') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-04', 'xsgl-04-01']
+        });
+      } else if (this.paramObj.page_type === 'contract-1') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-04', 'xsgl-04-04']
+        });
+      } else if (this.paramObj.page_type === 'contract-2') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-04', 'xsgl-04-08']
+        });
+      } else if (this.paramObj.page_type === 'contract-3') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-04', 'xsgl-04-09']
+        });
+      } else if (this.paramObj.page_type === 'order-0') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-05', 'xsgl-05-01']
+        });
+      } else if (this.paramObj.page_type === 'order-1') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-05', 'xsgl-05-02']
+        });
+      } else if (this.paramObj.page_type === 'order-2') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-05', 'xsgl-05-03']
+        });
+      } else if (this.paramObj.page_type === 'order-3') {
+        this.$store.commit('setBreadcrumb', {
+          breadcrumb: ['xsgl', 'xsgl-05', 'xsgl-05-04']
+        });
+      }
+    },
+
+    // 查询要求项
+    findAskItmeList () {
+      let _this = this;
+      // memo1: this.leftList[0].add_ask_no
+      this.axios.post('/PbModelDbService/findAskItemCmdDb', [{}]).then(function (response) {
+        if (response) {
+          _this.askItemList = response.data.data;
+        }
+      });
+    },
+    // 查询要求分项
+    findAskSubItmeList () {
+      let _this = this;
+      this.axios.post('/PbModelDbService/findAskItemCmdDb', [{memo1: this.data1[this.scopeIndex].ask_itme}]).then(function (response) {
+        if (response) {
+          _this.askSubItemList = response.data.data;
+        }
+      });
+    },
+    // 查询标准要求说明
+    findCustomerValList () {
+      let _this = this;
+      this.axios.post('/PbModelDbService/findAskItemCmdDb', [{memo1: this.data1[this.scopeIndex].ask_sub_itme}]).then(function (response) {
+        if (response) {
+          _this.customerValList = response.data.data;
+        }
+      });
+    },
+    // 要求项获得焦点
+    askItmeFocus (index) {
+      this.scopeIndex = index;
+      this.findAskItmeList();
+    },
+    // 要求分项获得焦点
+    askSubItmeFocus (index) {
+      this.scopeIndex = index;
+      this.findAskSubItmeList();
+    },
+    // 客户标准说明获得焦点
+    customerValFocus (index) {
+      this.scopeIndex = index;
+      this.findCustomerValList();
+    },
+    handleFilterMethod () {
+    },
+    handleChoose () {
+      let _this = this;
+      if (this.leftIndex === 0) {
+        _this.$message.warning('该选项为标准项,不能被选择')
+        return;
+      }
+      if (this.leftData.add_ask_no) {
+        this.chooseLoading = true;
+        console.log('order_no', this.paramObj.order_no);
+        this.axios.post('/SlmCustomerAddAskService/doSelectWeb', [{
+          object: {
+            add_ask_no: this.leftData.add_ask_no
+          },
+          memo1: this.paramObj.page_type.split('-')[0] === 'order' ? this.paramObj.order_no : this.paramObj.contract_line_no,
+          memo2: this.paramObj.page_type.split('-')[0] === 'order' ? '1' : '0' //  0合同行 1订单
+        }]).then(function (response) {
+          if (response) {
+            if (response.data.state === '200') {
+              _this.$message.success('操作成功!');
+            } else {
+              _this.$message.error(response.data.msgInfo);
+            }
+          }
+          _this.chooseLoading = false;
+        }).catch(function () {
+          _this.chooseLoading = false;
+        });
+      }
+    },
+    handleUnuse () {
+      let _this = this;
+      if (this.leftData.add_ask_no) {
+        this.UnuseLoading = true;
+        this.axios.post('/SlmCustomerAddAskService/doDisableWeb', [{object: {add_ask_no: this.leftData.add_ask_no}}]).then(function (response) {
+          if (response) {
+            if (response.data.state === '200') {
+              _this.$message.success('操作成功');
+              _this.data1 = [];
+              _this.findLeftList(_this.headRow.customer_no);
+              // 去掉标红
+              $('.add-list-row').removeClass('add-list-row-check');
+            } else {
+              _this.$message.error(response.data.msgInfo);
+            }
+          }
+          _this.UnuseLoading = false;
+        }).catch(function () {
+          _this.UnuseLoading = false
+        });
+      }
+    },
+    handleSelectAll (selection) {
+      this.selection = selection;
+    },
+    handleSelect (selection) {
+      this.selection = selection;
+    },
+    handleSave () {
+      // 校验:选择了不止1行数据,且这些数据的 ‘用户标准说明’ 不能超过4000字
+      if (this.selection.length > 0) {
+        // 判断数据中是否有空行,字数是否超长
+        for (let i in this.selection) {
+          if (this.selection[i].ask_itme_desc) {
+            if (this.selection[i].ask_sub_itme_desc) {
+              if (this.selection[i].customer_val_desc || this.selection[i].ask_sub_itme_val_desc) {
+                //
+              } else {
+                this.$message.error('您的客户要求标准说明未填写');
+                return;
+              }
+            } else {
+              this.$message.error('请选择要求分项');
+              return;
+            }
+          } else {
+            this.$message.error('请选择要求项');
+            return;
+          }
+          if (this.selection[i].customer_val_desc.length > 4000) {
+            this.$message.error('勾选的第' + (parseInt(i) + 1) + '条数据标准说明超长');
+            return;
+          }
+        }
+      } else {
+        this.$message.error('必须勾选一行');
+        return;
+      }
+      let _this = this;
+      let param = JSON.parse(JSON.stringify(this.selection));
+      for (let item of param) {
+        if (item.add_ask_type !== '0') {
+          item.ask_sub_itme_val = item.customer_val;
+          item.ask_sub_itme_val_desc = item.customer_val_desc;
+        }
+      }
+      this.saveLoading = true;
+      this.axios.post('/SlmCustomerAddAskService/doAddWeb',
+        [
+          {
+            object: {
+              customer_no: this.headRow.customer_no,
+              customer_nm: this.headRow.customer_name,
+              list: param
+            }
+          }
+        ]
+      ).then(function (response) {
+        if (response) {
+          if (response.data.state === '200') {
+            _this.$message.success('保存成功');
+            _this.data1 = [];
+            _this.data1ToCompare = [];
+            _this.findLeftList(_this.headRow.customer_no);
+          } else {
+            _this.$message.error(response.data.msgInfo);
+          }
+        }
+        _this.saveLoading = false;
+      }).catch(function () {
+        _this.saveLoading = false;
+      });
+    },
+    addRow () {
+      let obj = this.data1[this.data1.length - 1];
+      if (obj.ask_itme && obj.ask_sub_itme && obj.customer_val_desc) {
+        this.data1.push({
+          ask_itme: '',
+          ask_itme_desc: '',
+          ask_sub_itme: '',
+          ask_sub_itme_desc: '',
+          ask_sub_itme_val: '',
+          ask_sub_itme_val_desc: '',
+          customer_no: this.headRow.customer_no,
+          customer_nm: this.headRow.customer_name,
+          add_ask_type: '2',
+          add_ask_status: '',
+          review_desc: '',
+          valid_flag: '',
+          customer_val: '',
+          customer_val_desc: ''
+        });
+      } else {
+        this.$message.info('请填写新增项');
+      }
+    },
+    handleAskItme (param) {
+      let obj = this.askItemList.find((value, index, arr) => {
+        return value.text === param;
+      });
+      this.data1[this.scopeIndex].ask_itme = obj.id;
+      if (this.scopeIndex <= this.data1ToCompare.length - 1) {
+        /**
+         * 获得焦点的行<=查询出来的表格数据的长度,则判断是否做出了修改为修改项
+         * 如果是修改项,类型就改为修改项,反之改为原来的类型
+         * 如果大于,那么一定是新增项
+         * */
+        let obj2 = this.data1ToCompare[this.scopeIndex];
+        if (obj2.ask_itme === this.data1[this.scopeIndex].ask_itme &&
+          obj2.ask_sub_itme === this.data1[this.scopeIndex].ask_sub_itme &&
+          obj2.customer_val_desc === this.data1[this.scopeIndex].customer_val_desc
+        ) {
+          this.data1[this.scopeIndex].add_ask_type = this.data1ToCompare[this.scopeIndex].add_ask_type;
+        } else {
+          this.data1[this.scopeIndex].add_ask_type = '1';
+        }
+      }
+    },
+    handleAskSubItme (param) {
+      let obj = this.askSubItemList.find((value, index, arr) => {
+        return value.text === param;
+      });
+      this.data1[this.scopeIndex].ask_sub_itme = obj.id;
+      if (this.scopeIndex <= this.data1ToCompare.length - 1) {
+        /**
+         * 获得焦点的行<=查询出来的表格数据的长度,则判断是否做出了修改为修改项
+         * 如果是修改项,类型就改为修改项,反之改为原来的类型
+         * 如果大于,那么一定是新增项
+         * */
+        let obj2 = this.data1ToCompare[this.scopeIndex];
+        if (obj2.ask_itme === this.data1[this.scopeIndex].ask_itme &&
+          obj2.ask_sub_itme === this.data1[this.scopeIndex].ask_sub_itme &&
+          obj2.customer_val_desc === this.data1[this.scopeIndex].customer_val_desc
+        ) {
+          this.data1[this.scopeIndex].add_ask_type = this.data1ToCompare[this.scopeIndex].add_ask_type;
+        } else {
+          this.data1[this.scopeIndex].add_ask_type = '1';
+        }
+      }
+    },
+    handleCustomerVal (param) {
+      let len = _charLength(param)
+      if (len > 4000) {
+        this.$message.error('字数不能超过4000字,当前已输入' + len + '字');
+        this.isLong = true;
+      } else {
+        this.isLong = false;
+      }
+      if (param) {
+        let obj = this.customerValList.find((value, index, arr) => {
+          return value.text === param;
+        });
+        if (obj) {
+          this.data1[this.scopeIndex].customer_val = obj.id;
+        } else {
+          // 下拉选择找不到obj说明是手动输入的文字,列表当中没有
+          this.data1[this.scopeIndex].customer_val_desc = param;
+        }
+      } else {
+        // 清空了下拉选择所以进入else
+        this.data1[this.scopeIndex].customer_val_desc = '';
+      }
+      if (this.scopeIndex <= this.data1ToCompare.length - 1) {
+        /**
+         * 获得焦点的行<=查询出来的表格数据的长度,则判断是否做出了修改为修改项
+         * 如果是修改项,类型就改为修改项,反之改为原来的类型
+         * 如果大于,那么一定是新增项
+         * */
+        let obj2 = this.data1ToCompare[this.scopeIndex];
+        if (obj2.ask_itme === this.data1[this.scopeIndex].ask_itme &&
+          obj2.ask_sub_itme === this.data1[this.scopeIndex].ask_sub_itme &&
+          obj2.customer_val_desc === this.data1[this.scopeIndex].customer_val_desc
+        ) {
+          this.data1[this.scopeIndex].add_ask_type = this.data1ToCompare[this.scopeIndex].add_ask_type;
+        } else {
+          this.data1[this.scopeIndex].add_ask_type = '1';
+        }
+      }
+    },
+    showDetail (row) {
+      this.DetailRow = row;
+      $('#additionalDetailSlider').slider('show');
+    },
+    findRightTb (item, index) {
+      this.leftData = item;
+      this.leftIndex = index;
+      $('.add-list-row').removeClass('add-list-row-check');
+      $('#item' + index).addClass('add-list-row-check');
+      this.doAxios();
+    },
+    doAxios () {
+      let _this = this;
+      let memo1 = '';
+      let addAskNo = '';
+      if (this.leftIndex === 0) {
+        memo1 = this.leftData.add_ask_no;
+      } else {
+        addAskNo = this.leftData.add_ask_no;
+      }
+      this.axios.post('/SlmCustomerAddAskService/doQueryListWeb', [{object: {add_ask_no: addAskNo}, memo1: memo1}]).then(function (response) {
+        if (response) {
+          for (let item of response.data.data) {
+            if (_this.leftIndex === 0) {
+              item.add_ask_type = '0';
+            }
+            if (item.add_ask_type === '0') {
+              // 标准项,内容展示在标准说明一列
+              item.customer_val = '';
+              item.customer_val_desc = '';
+            } else {
+              // 非标准项,内容展示在客户要求说明一列
+              item.customer_val = item.ask_sub_itme_val;
+              item.customer_val_desc = item.ask_sub_itme_val_desc;
+              item.ask_sub_itme_val = '';
+              item.ask_sub_itme_val_desc = '';
+            }
+          }
+          _this.data1 = response.data.data;
+          _this.data1ToCompare = JSON.parse(JSON.stringify(response.data.data));
+          _this.data1.push({
+            ask_itme: '',
+            ask_itme_desc: '',
+            ask_sub_itme: '',
+            ask_sub_itme_desc: '',
+            ask_sub_itme_val: '',
+            ask_sub_itme_val_desc: '',
+            customer_no: _this.headRow.customer_no,
+            customer_nm: _this.headRow.customer_name,
+            add_ask_type: '2',
+            add_ask_status: '',
+            review_desc: '',
+            valid_flag: '',
+            customer_val: '',
+            customer_val_desc: ''
+          });
+        }
+      });
+    },
+    findLeftList (customerNo) {
+      let _this = this;
+      this.axios.post('/SlmCustomerAddAskService/doQueryWeb', [{object: {customer_no: customerNo}, memo1: this.param[1]}]).then(function (response) {
+        if (response) {
+          _this.leftList = response.data.data;
+          // 左边列表查询完毕之后去查询要求项,避免要求项里面拿不到标准项的主键
+          if (_this.paramObj.addSelectedIndex !== '') {
+            for (let index in _this.leftList) {
+              if (_this.leftList[index].add_ask_no === _this.paramObj.addSelectedIndex) {
+                setTimeout(function () {
+                  _this.findRightTb(_this.leftList[index], index);
+                }, 300)
+              }
+            }
+          }
+          _this.findAskItmeList();
+        }
+      });
+    },
+
+    // 返回操作
+    handleBack () {
+      if (this.paramObj.page_type === 'contract-0') {
+        this.$router.push({name: 'contractMaintain'});
+      } else if (this.paramObj.page_type === 'contract-1') {
+        this.$router.push({name: 'effective'});
+      } else if (this.paramObj.page_type === 'contract-2') {
+        this.$router.push({name: 'close-case'});
+      } else if (this.paramObj.page_type === 'contract-3') {
+        this.$router.push({name: 'contract-tracing'});
+      } else if (this.paramObj.page_type === 'order-0') {
+        this.$router.push({name: 'order-info'});
+      } else if (this.paramObj.page_type === 'order-1') {
+        this.$router.push({name: 'order-issued'});
+      } else if (this.paramObj.page_type === 'order-2') {
+        this.$router.push({name: 'order-tracing'});
+      } else if (this.paramObj.page_type === 'order-3') {
+        this.$router.push({name: 'order-close'});
+      }
+    }
+  }
+}
+function _charLength (str, chineseLen) {
+  if (!str || str.length <= 0) { return 0; };
+  // str = mytrim(str);
+  let chineseLength = 3; // utf-8编码,中文长度
+  if (chineseLen && chineseLen > 0) {
+    chineseLength = chineseLen
+  }
+  let objValue = str;
+  let objLength = 0;
+  let compareChar = '';
+  let regExp = new RegExp("^[A-Za-z0-9 -_`~!@#$%^&*()-+=|,<.>/?;:'\\\"]$");
+  for (let count = 0; count < objValue.length; count++) {
+    compareChar = objValue.substring(count, count + 1);
+    if (regExp.test(compareChar)) {
+      objLength += 1;
+    } else if (compareChar === '\\') {
+      objLength += 1;
+    } else {
+      objLength += chineseLength;
+    }
+  }
+  return objLength;
+}
+</script>
+<style scoped>
+  .ytg-return-div {
+    width: 100px;
+    padding-left: 15px;
+    position: relative;
+    top: 10px;
+    display: inline-block;
+    cursor: pointer;
+  }
+  .additional {
+    height: 100%;
+    position: relative;
+    border-top: 1px solid #ccc;
+  }
+  .ytg-return-div {
+    display: inline;
+    position: relative;
+    top: 8px;
+    left: 0px;
+    float: left;
+    text-align: left;
+    padding-left: 0;
+    cursor: pointer;
+  }
+
+  .ctr-tec-top {
+    height: 5%;
+    display: inline-block;
+    width: 100%;
+    padding: 5px 20px;
+    text-align: right;
+    border-bottom: 1px solid #cccccc;
+  }
+
+  .add-l ul {
+    padding: 0 20px;
+  }
+  .add-l li {
+    border-bottom: 1px solid #ccc;
+    height: 30px;
+    line-height: 30px;
+    margin-left: 10px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    cursor: pointer;
+  }
+  .ytg-additional-icon {
+    vertical-align: middle;
+    margin-right: 3px;
+  }
+  .add-r {
+    padding: 20px;
+  }
+  .addHead {
+    height: 40px;
+    line-height: 40px;
+    padding-right: 20px;
+    text-align: right;
+    border-bottom: 1px solid #ccc;
+  }
+  .col-l {
+    height: 100%;
+    border-right: 1px solid #ccc;
+    overflow: auto;
+  }
+  .col-r {
+    height: 100%;
+    border-left: 1px solid #ccc;
+    transform: translateX(-1px);
+    overflow: auto;
+  }
+  .add-list-row { cursor: pointer; }
+  .add-list-row span { vertical-align: middle; }
+  .add-list-row-check { color: #FF474E; }
+</style>

+ 71 - 0
src/components/common/customerDialog.vue

@@ -0,0 +1,71 @@
+<template>
+  <div>
+    <el-dialog append-to-body title="客户信息" :visible.sync="showProcess" width="400px">
+      <el-table height="580" ref="processTab" :data="processData" border highlight-current-row @selection-change="handleSelect">
+        <el-table-column type="selection" width="50" align="center"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="客户名称" prop="text" min-width="120"></el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="Cancel">取消</el-button>
+        <el-button type="primary" size="small" @click="OK">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+export default {
+  props: ['customer', 'customerCodeList'],
+  data () {
+    return {
+      selection: [],
+      showProcess: false,
+      processData: []
+    }
+  },
+  methods: {
+    handleSelect (selection) {
+      this.selection = selection;
+    },
+    OK () {
+      let processCode = [], processDesc = [], code = '', desc = '';
+      for (let item of this.selection) {
+        processCode.push(item.id);
+        processDesc.push(item.text);
+      }
+      code = processCode.join(',');
+      desc = processDesc.join(',');
+      this.$emit('getCustomer', code, desc);
+      this.showProcess = false;
+    },
+    Cancel () {
+      this.showProcess = false;
+    },
+    findProcess () {
+      let _this = this;
+      // 客户信息
+      this.axios.post('/PbModelDbService/findSlmCustomerInfoCmdDb').then(function (response) {
+        if (response) {
+          _this.processData = response.data.data;
+          _this.selection = [];
+          if (_this.customerCodeList) {
+            _this.$nextTick(function () {
+              for (let j = 0; j < _this.processData.length; j++) {
+                if (_this.customerCodeList.indexOf(_this.processData[j].id) >= 0) {
+                  _this.$refs.processTab.toggleRowSelection(_this.processData[j], true);
+                }
+              }
+            });
+          }
+        }
+      });
+    }
+  },
+  watch: {
+    customer: function () {
+      this.findProcess();
+      this.showProcess = true;
+    }
+  }
+}
+</script>
+<style scoped></style>

+ 137 - 0
src/components/common/dataDetail.vue

@@ -0,0 +1,137 @@
+<!-- 资产管理详情组件 -->
+<template>
+  <div class="sui-slider" v-bind:id="id?id:'dataDetail'">
+    <div class="sui-slider-main">
+      <div class="sui-slider-title" style="z-index: 10086;">
+        <h2>
+          <span class="sui-slider-title-text">资产变更</span>
+        </h2>
+        <span class="sui-icons sui-icons-close sui-slider-title-x"></span>
+      </div>
+      <div class="sui-slider-content" style="position: absolute; top: 0; left: 0; padding-top: 80px; padding-bottom: 70px; width: 100%; height: 100%;">
+        <!-- 这里添加slider内容 -->
+        <table class="sui-table sui-table-bgg" v-show="!showType" style="margin-bottom: 16px;">
+          <tbody>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">物品名称</td>
+            <td style="width: 30%;">{{ row.object_name }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">批次号</td>
+            <td style="width: 30%;">{{ row.batch_no }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">规格型号</td>
+            <td style="width: 30%;">{{ row.spec }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">商品条码</td>
+            <td style="width: 30%;">{{ row.sn_code }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">数量</td>
+            <td style="width: 30%;">{{ row.numbers ? row.numbers : row.number1 }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">单位</td>
+            <td style="width: 30%;">{{ row.measure_unit_name }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">单价</td>
+            <td style="width: 30%;">{{ row.price }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">金额</td>
+            <td style="width: 30%;">{{ row.amount ?  row.amount : (row.number1 * (10000 * row.price)) / 10000}}</td>
+          </tr>
+          <tr v-show="!ismaterialStorage && !isDetail">
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">余量</td>
+            <td colspan="3">{{ row.number2 }}</td>
+          </tr>
+          </tbody>
+        </table>
+        <table class="sui-table sui-table-bgg" v-show="showType" style="margin-bottom: 16px;">
+          <tbody>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">资产名称</td>
+            <td style="width: 30%;">{{ row.assets_name }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">资产类别</td>
+            <td style="width: 30%;">{{ row.assets_type_name }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">SN号</td>
+            <td style="width: 30%;">{{ row.sn_code }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">单位</td>
+            <td style="width: 30%;">{{ row.measure_unit_name }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">存放区域</td>
+            <td style="width: 30%;">{{ row.area_name }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">规格型号</td>
+            <td style="width: 30%;">{{ row.spec }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">存放地点</td>
+            <td style="width: 30%;">{{ row.assets_address }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">单价</td>
+            <td style="width: 30%;">{{ row.price }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">所属部门</td>
+            <td style="width: 30%;">{{ row.owe_dept_name }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">使用期限(月)</td>
+            <td style="width: 30%;">{{ row.limit_time }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">使用部门</td>
+            <td style="width: 30%;">{{ row.use_dept_name }}</td>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">使用人</td>
+            <td style="width: 30%;">{{ row.user_name }}</td>
+          </tr>
+          <tr>
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">状态</td>
+            <td colspan="3">{{ row.valid_flag_name }}</td>
+          </tr>
+          <tr style="height: 50px;">
+            <td class="st-table-tdl oa-document-td" style="width: 20%;">备注</td>
+            <td colspan="3">{{ row.memo }}</td>
+          </tr>
+          </tbody>
+        </table>
+        <div is="fileList" :fileListData="row.annexList" :fileName="'annex_name'" :fileListFlag="'1'" :pathName="'save_path'" ></div>
+      </div>
+    </div>
+    <div class="sui-slider-cover"></div>
+  </div>
+</template>
+<script>
+import fileList from '@/components/common/fileList.vue';
+export default {
+  components: {
+    fileList
+  },
+  props: ['id', 'row', 'showType', 'ismaterialStorage', 'isDetail'],
+  data () {
+    return {
+
+    }
+  },
+  computed: {
+  },
+  watch: {
+    row: function () {
+      if (this.row.valid_flag === '1') {
+        this.row.valid_flag_name = '空闲';
+      } else if (this.row.valid_flag === '2') {
+        this.row.valid_flag_name = '使用';
+      } else if (this.row.valid_flag === '4') {
+        this.row.valid_flag_name = '借用';
+      } else if (this.row.valid_flag === '5') {
+        this.row.valid_flag_name = '维修';
+      } else if (this.row.valid_flag === '3') {
+        this.row.valid_flag_name = '报废';
+      }
+    }
+  },
+  methods: {
+
+  },
+  created () {
+  }
+}
+</script>
+<style>
+
+</style>

+ 101 - 0
src/components/common/deliveryStateDialog.vue

@@ -0,0 +1,101 @@
+<template>
+  <div>
+    <el-dialog append-to-body title="交货状态" :visible.sync="showProcess" width="600px">
+      <el-table height="580" ref="processTab" :data="processData" border highlight-current-row @selection-change="handleSelect">
+        <el-table-column type="selection" width="50" align="center"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="交货状态编码" prop="deliveryStateCode" min-width="120"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="交货状态" prop="deliveryStateDesc" min-width="120"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="备注" prop="memo" min-width="120"></el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="Cancel">取消</el-button>
+        <el-button type="primary" size="small" @click="OK">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+export default {
+  /**
+   * delivery: 如果这个变量发生变化就显示弹框
+   * deliveryCodeList: 已经勾选的交货状态,以英文逗号分隔的字符串
+   * delivery_psc: 产品码,如果有值则查询交货状态与产品码关联表,反之则查询交货状态表
+   * */
+  props: ['delivery', 'deliveryCodeList', 'delivery_psc'],
+  data () {
+    return {
+      selection: [],
+      showProcess: false,
+      processData: []
+    }
+  },
+  methods: {
+    handleSelect (selection) {
+      this.selection = selection;
+    },
+    OK () {
+      let processCode = [], processDesc = [], code = '', desc = '';
+      for (let item of this.selection) {
+        processCode.push(item.deliveryStateCode);
+        processDesc.push(item.deliveryStateDesc);
+      }
+      code = processCode.join(',');
+      desc = processDesc.join(',');
+      this.$emit('getDelivery', code, desc);
+      this.showProcess = false;
+    },
+    Cancel () {
+      this.showProcess = false;
+    },
+    findProcess () {
+      let _this = this;
+      // 交货状态
+      this.axios.post('market.Qms.com.service.BaseDeliverystateService/GetDeliveryState', [{model: {deliveryStateCode: '', validflag: '1'}}]).then(function (response) {
+        if (response) {
+          _this.processData = response.data.result;
+          _this.selection = [];
+          if (_this.deliveryCodeList) {
+            _this.$nextTick(function () {
+              for (let j = 0; j < _this.processData.length; j++) {
+                if (_this.deliveryCodeList.indexOf(_this.processData[j].deliveryStateCode) >= 0) {
+                  _this.$refs.processTab.toggleRowSelection(_this.processData[j], true);
+                }
+              }
+            });
+          }
+        }
+      });
+    },
+    findProcessPsc () {
+      let _this = this;
+      // 交货状态
+      this.axios.post('/QmsApiService/GetPscDelivery', [{object: {psc: this.delivery_psc}}]).then(function (response) {
+        if (response) {
+          _this.processData = response.data.data;
+          _this.selection = [];
+          if (_this.deliveryCodeList) {
+            _this.$nextTick(function () {
+              for (let j = 0; j < _this.processData.length; j++) {
+                if (_this.deliveryCodeList.indexOf(_this.processData[j].deliveryStateCode) >= 0) {
+                  _this.$refs.processTab.toggleRowSelection(_this.processData[j], true);
+                }
+              }
+            });
+          }
+        }
+      });
+    }
+  },
+  watch: {
+    delivery: function () {
+      if (this.delivery_psc) {
+        this.findProcessPsc();
+      } else {
+        this.findProcess();
+      }
+      this.showProcess = true;
+    }
+  }
+}
+</script>
+<style scoped></style>

+ 81 - 0
src/components/common/deptSelector.vue

@@ -0,0 +1,81 @@
+<template>
+  <div class="" style="padding: 0 20px 20px 20px;">
+    <div style="overflow: hidden;">
+      <el-input
+        suffix-icon="el-icon-search"
+        v-model="filterText"
+        placeholder="输入关键字进行过滤" size="small" style="width: 200px;">
+      </el-input>
+      <span style="color: #666; display: inline-block; padding-left: 20px;">当前选中:<span style="color: #000; font-size: 14px;" v-if="sedNode">{{sedNode.text}}</span></span>
+      <el-button :disabled="!sedNode" @click="selectSubmit" type="primary" icon="el-icon-check" size="small" style="float: right;">确认选择</el-button>
+    </div>
+    <el-tree style="padding-top: 10px;"
+      @current-change="currentChange"
+      :data="data2"
+      :props="defaultProps"
+      :show-checkbox="showCheckbox"
+      highlight-current
+      default-expand-all
+      :filter-node-method="filterNode"
+      ref="tree2">
+    </el-tree>
+  </div>
+</template>
+<script>
+export default {
+  // parentId 父节点ID
+  // extendParam 扩展参数,用于多次用到控制,原样emit到父组件
+  // showCheckbox 多选控制,默认单选
+  props: ['parentId', 'extendParam', 'showCheckbox'],
+  data () {
+    return {
+      filterText: '',
+      sedNode: null,
+      data2: [],
+      defaultProps: {
+        children: 'children',
+        label: 'text'
+      }
+    };
+  },
+  watch: {
+    filterText (val) {
+      this.$refs.tree2.filter(val);
+    },
+    parentId () {
+      this.findDepartment();
+    }
+  },
+  mounted () {
+    this.findDepartment();
+  },
+  methods: {
+    selectSubmit () {
+      // deptSelectorEmit emit 事件
+      this.$emit('deptSelectorEmit', this.sedNode);
+    },
+    currentChange (oData, nNode) {
+      this.sedNode = oData;
+    },
+    filterNode (value, data) {
+      if (!value) return true;
+      return data.text.indexOf(value) !== -1;
+    },
+    findDepartment () {
+      let _this = this;
+      let memo1 = '20171218221814830158';
+      if (this.parentId) {
+        memo1 = this.parentId;
+      }
+      // 部门科室
+      this.axios.post('/PbModelDbService/findAuthDepartmentCmdDb', [{'memo1': memo1}]).then(function (response) {
+        if (response) {
+          _this.data2 = response.data.data;
+        }
+      });
+    }
+  }
+}
+</script>
+<style scoped>
+</style>

+ 135 - 0
src/components/common/fileList.vue

@@ -0,0 +1,135 @@
+<!-- 文件列表组件 -->
+<template>
+  <div>
+    <ul :class="fileListFlag==='1'?'st-filelist-ul fileList-padding':'st-filelist-ul'" style="padding-bottom: 0;"
+        v-if="fileListData  && fileListData.length>0">
+      <li v-for="(item, indexs) in fileListData" :key="indexs">
+        <template
+          v-if="typeList.indexOf(item.annex_type)>= 0">
+          <div class="st-filelist-text st-ellipsis">
+            <a @click="showPDF(item[path_name], item[file_name])">{{ item[file_name] }}</a>
+          </div>
+        </template>
+        <template v-else>
+          <div class="st-filelist-text st-ellipsis">
+            <a target="_blank" :href="$store.state.fileBaseUrl + item[path_name]">{{ item[file_name] }}</a>
+          </div>
+        </template>
+        <template v-if="item.is_image === '1'">
+          <div class="st-filelist-icon-img" @click="showImg(item[path_name])">
+            <img :src="$store.state.imgBaseUrl + item[path_name]" alt="暂无" class="ivu-table-ellipsis"
+                 style="max-height: 100%; max-width: 100%;">
+          </div>
+          <a v-if="isDownFile" class="st-icons st-icons-download st-filelist-icon-download" @click="downFile(item[path_name],item[file_name])"></a>
+        </template>
+        <template
+          v-else-if="typeList.indexOf(item.annex_type) >= 0 && !isDownFile">
+          <span class="st-icons st-icons-file st-filelist-icon-file" @click="showPDF(item[path_name], item[file_name])"></span>
+          <a class="st-icons st-icons-download st-filelist-icon-download" @click="downFile(item[path_name],item[file_name])"></a>
+        </template>
+        <template v-else>
+          <span class="st-icons st-icons-file st-filelist-icon-file"></span>
+          <a class="st-icons st-icons-download st-filelist-icon-download" @click="downFile(item[path_name],item[file_name])"></a>
+        </template>
+      </li>
+    </ul>
+    <!-- 显示图片Modal -->
+    <el-dialog visible.sync="imgModal" width="800" :show-close="false">
+      <div slot="header" style="display:none;"></div>
+      <div style="padding: 12px; text-align: center;">
+        <img v-if="imgModalObj.path" :src="$store.state.imgBaseUrl + imgModalObj.path" :title="imgModalObj.name"
+             style="max-width: 100%;">
+      </div>
+      <div slot="footer" style="display:none;"></div>
+    </el-dialog>
+    <div id="hiddenDivId001" class="oa-fileList-hiddendiv"></div>
+    <a style="display: none;" id="downFile"><span id="downdown">下载</span></a>
+  </div>
+</template>
+<script>
+// isDownFile: 控制是否显示下载按钮
+import {ctx} from '@/config/config.js';
+export default {
+  // isDown 判断是否点击了下载
+  props: ['fileListData', 'fileName', 'pathName', 'fileListFlag', 'isDownFile', 'isDown'],
+  data () {
+    return {
+      path_name: this.pathName ? this.pathName : 'save_path',
+      file_name: this.fileName ? this.fileName : 'annex_name',
+      typeList: '.doc,.xls,.ppt,.docx,.xlsx,.pptx,.pdf',
+      imgModal: false,
+      imgModalObj: {
+        path: '',
+        name: ''
+      }
+    }
+  },
+
+  computed: {
+    isDownStatus: function () {
+      return this.isDown;
+    }
+  },
+
+  methods: {
+    showImg (path, name) {
+      this.imgModalObj.path = path;
+      this.imgModalObj.name = name;
+      this.imgModal = true;
+    },
+    downFile (data, data2) {
+      let _this = this;
+      $('#downFile').attr('href', _this.$store.state.fileDownloadUrl + '?fid=' + data + '&oglName=' + data2);
+      console.log(_this.isDownStatus);
+      if (_this.isDownStatus) {
+        _this.$emit('downloadFile');
+        _this.isDownStatus = false;
+      }
+      $('#downdown').click();
+    },
+    showPDF (data, fn) {
+      let sFileName = '&fn=';
+      if (fn && fn.length > 0) {
+        sFileName += encodeURIComponent(fn);
+      }
+      let _this = this;
+      if (!(data.indexOf('.pdf') > 0)) {
+        $('#hiddenDivId001').show();
+        _this.axios.post('/FileInfoService/toPdfWeb',
+          [
+            {
+              'save_path': data
+            }
+          ]
+        ).then(function (response) {
+          // 获得数据
+          if (response) {
+            window.open(ctx + '/static/lib/pdf/web/viewer.html?file=' + window.btoa(window.encodeURIComponent(response.data.msgInfo)) + sFileName);
+          }
+          $('#hiddenDivId001').hide();
+        }).catch(function (response) {
+          $('#hiddenDivId001').hide();
+        });
+      } else {
+        window.open(ctx + '/static/lib/pdf/web/viewer.html?file=' + window.btoa(window.encodeURIComponent(_this.$store.state.imgBaseUrl + data)) + sFileName);
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+  .fileList-padding {
+    padding: 20px 0 0 0;
+    overflow: hidden;
+  }
+
+  .oa-fileList-hiddendiv {
+    height: 100%;
+    width: 100%;
+    z-index: 20001;
+    position: absolute;
+    top: 0px;
+    right: 0px;
+    display: none;
+  }
+</style>

+ 128 - 0
src/components/common/gradeDialog.vue

@@ -0,0 +1,128 @@
+<!--炼钢牌号-->
+<template>
+  <div style="position: relative;">
+    <el-dialog append-to-body title="炼钢牌号" :visible.sync="showGrade" width="600px">
+      <div style="position: absolute;top: 15px;right: 50px;">
+        <el-input style="width: 200px;" type="text" v-model="gradeName" size="small" @keyup.enter.native="findGrade" placeholder="炼钢牌号名称"></el-input>
+        <el-button type="primary" size="small" @click="findGrade">查询</el-button>
+        <el-button size="small" @click="handleReset">重置</el-button>
+      </div>
+      <el-table height="528" ref="gradeTab" :data="gradeData" border highlight-current-row @row-click="getClickRow">
+        <el-table-column :show-overflow-tooltip="true" label="炼钢牌号代码" prop="gradeCode" min-width="100"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="炼钢牌号名称" prop="gradeName" min-width="100"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="备注" prop="memo" min-width="100"></el-table-column>
+      </el-table>
+      <div class="std-page">
+        <el-pagination
+          @size-change="handlePageSize"
+          @current-change="handlePageIndex"
+          :current-page="pageIndex"
+          :page-size="50"
+          layout="total, prev, pager, next, jumper"
+          :total="total">
+        </el-pagination>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="Cancel">取消</el-button>
+        <el-button type="primary" size="small" @click="OK">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+export default {
+  props: ['grade', 'gradeCodeList'],
+  data () {
+    return {
+      gradeName: '',
+      gradeData: [],
+      showGrade: false,
+      tableRow: {},
+      pageIndex: 1,
+      pageSize: 20,
+      total: 0
+    }
+  },
+  methods: {
+    /**
+     * @param: row,需要选中的行
+     * 设置表格当前选中行
+     * */
+    setCurrent (row) {
+      let index = 0;
+      if (row && row.gradeCode) {
+        for (let i = 0; i < this.gradeData.length; i++) {
+          if (this.gradeData[i].gradeCode === row.gradeCode) {
+            index = i;
+          }
+        }
+      }
+      this.$refs.gradeTab.setCurrentRow(this.gradeData[index]);
+      this.getClickRow(this.gradeData[index]);
+    },
+    handleReset () {
+      this.gradeName = '';
+      this.findGrade();
+    },
+    handlePageIndex (pageIndex) {
+      this.pageIndex = pageIndex;
+      this.findGrade();
+    },
+    handlePageSize (pageSize) {
+      this.pageIndex = 1;
+      this.pageSize = pageSize;
+      this.findGrade();
+    },
+    getClickRow (row) {
+      this.tableRow = row;
+    },
+    Cancel () {
+      this.showGrade = false;
+    },
+    OK () {
+      let code = '', desc = '';
+      code = this.tableRow.gradeCode;
+      desc = this.tableRow.gradeName;
+      this.$emit('getGrade', code, desc);
+      this.showGrade = false;
+    },
+    findGrade () {
+      let _this = this;
+      this.axios.post('/market.Qms.com.service.BaseGradeService/GetGrade', [{
+        pageIndex: this.pageIndex,
+        pageSize: 50,
+        model: {
+          gradeName: this.gradeName,
+          validflag: '1'
+        }
+      }]).then(function (response) {
+        if (response) {
+          _this.gradeData = response.data.result;
+          _this.total = response.data.total;
+          // setCurrentRow
+          let obj = {};
+          if (_this.tableRow && _this.tableRow.gradeCode) {
+            obj = JSON.parse(JSON.stringify(_this.tableRow));
+          } else {
+            for (let item of _this.gradeData) {
+              if (_this.gradeCodeList === item.gradeCode) {
+                obj = JSON.parse(JSON.stringify(item));
+              }
+            }
+          }
+          _this.$nextTick(function () {
+            _this.setCurrent(obj);
+          });
+        }
+      });
+    }
+  },
+  watch: {
+    grade: function () {
+      this.findGrade();
+      this.showGrade = true;
+    }
+  }
+}
+</script>
+<style scoped></style>

+ 280 - 0
src/components/common/mlineDetail.vue

@@ -0,0 +1,280 @@
+<template>
+  <div class="sui-slider" id="lineDetailSlider">
+    <div class="sui-slider-main">
+      <div class="sui-slider-title">
+        <h2>
+          <span class="sui-slider-title-text">合同行明细</span>
+        </h2>
+        <span class="sui-icons sui-icons-close sui-slider-title-x"></span>
+      </div>
+      <div class="sui-slider-content">
+        <table class="ytg-table ytg-table-bgg">
+          <tr><!--1-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">产品规范码</td>
+            <td style="width: 20%;">{{ row.psc }}</td>
+            <td rowspan="4" style="width: 15%;" class="ytg-table-tdl">订货价</td>
+            <td style="width: 15%;" class="ytg-table-tdl">含税</td>
+            <td style="width: 20%;">{{ row.order_price1 }}</td>
+            <!--
+            <td rowspan="4" style="width: 15%;" class="ytg-table-tdl">内径</td>
+            <td style="width: 15%;" class="ytg-table-tdl">内径</td>
+            <td style="width: 20%;">{{ row.diameter_inn }}</td>
+            -->
+          </tr>
+          <tr><!--2-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">品种分类</td>
+            <td style="width: 20%;">{{ row.prod_cls_name }}</td>
+            <td style="width: 15%;" class="ytg-table-tdl">不含税</td>
+            <td style="width: 20%;">{{ row.order_price2 }}</td>
+            <!--
+            <td style="width: 15%;" class="ytg-table-tdl">内径上限</td>
+            <td style="width: 20%;">{{ row.diameter_inn_max }}</td>
+            -->
+          </tr>
+          <tr><!--3-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">产品名称</td>
+            <td style="width: 20%;">{{ row.prod_name }}</td>
+            <td style="width: 15%;" class="ytg-table-tdl">是否含税</td>
+            <td style="width: 20%;" v-if="row.is_tax === '1'">含税</td>
+            <td style="width: 20%;" v-else-if="row.is_tax === '0'">不含税</td>
+            <td style="width: 20%;" v-else></td>
+            <!--
+            <td style="width: 15%;" class="ytg-table-tdl">内径下限</td>
+            <td style="width: 20%;">{{ row.diameter_inn_min }}</td>
+            -->
+          </tr>
+          <tr><!--4-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">标准名称</td>
+            <td style="width: 20%;">{{ row.std_name }}</td>
+            <td style="width: 15%;" class="ytg-table-tdl">税率</td>
+            <td style="width: 20%;">{{ row.tax_rate }}%</td>
+            <!--内径的计量单位
+            <td style="width: 15%;" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.diameter_inn_unit_name }}</td>
+            -->
+          </tr>
+          <tr><!--5-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">标准类别</td>
+            <td style="width: 20%;">{{ row.std_type_name }}</td>
+
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">运费</td>
+            <td>{{ row.trade_price }}</td>
+            <!--
+            <td rowspan="4" style="width: 15%;" class="ytg-table-tdl">外径</td>
+            <td style="width: 15%;" class="ytg-table-tdl">外径</td>
+            <td style="width: 20%">{{ row.diameter_out }}</td>
+            -->
+          </tr>
+          <tr><!--6-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">钢级(牌号)</td>
+            <td style="width: 20%;">{{ row.steel_name }}</td>
+
+            <!--
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">标准类别</td>
+            <td style="width: 20%;">{{ row.std_type_name }}</td>
+            -->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">币种</td>
+            <td style="width: 20%;">{{ row.currency_name }}</td>
+
+            <!--
+            <td style="width: 15%" class="ytg-table-tdl">外径上限</td>
+            <td style="width: 20%">{{ row.diameter_out_max }}</td>
+            -->
+          </tr>
+          <tr><!--7-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">产品形态</td>
+            <td style="width: 20%;">{{ row.prod_figure_name }}</td>
+
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">测算价</td>
+            <td style="width: 20%;">{{ row.measure_price }}</td>
+            <!--
+
+            <td style="width: 15%" class="ytg-table-tdl">外径下限</td>
+            <td style="width: 20%;">{{ row.diameter_out_min }}</td>
+            -->
+          </tr>
+          <tr><!--8-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">冶金规范码</td>
+            <td style="width: 20%;">{{ row.msc}}</td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">测算序号</td>
+            <td style="width: 20%;">{{ row.measure_no }}</td>
+            <!--
+            <td style="width: 15%" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.diameter_out_unit_name }}</td>
+            -->
+          </tr>
+          <tr><!--9-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">冶金规范类型</td>
+            <td style="width: 20%;">{{ row.msc_type_name }}</td>
+            <td rowspan="2" style="width: 15%" class="ytg-table-tdl">宽度</td>
+            <td style="width: 15%" class="ytg-table-tdl">宽度</td>
+            <td style="width: 20%;">{{ row.width }}</td>
+
+          </tr>
+          <tr><!--10-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">用途码</td>
+            <td style="width: 20%;">{{ row.use_desc }}</td>
+            <!--
+            <td rowspan="3" style="width: 15%;" class="ytg-table-tdl">交货量误差</td>
+            <td style="width: 15%;" class="ytg-table-tdl">上限</td>
+            <td style="width: 20%;">{{ row.delivery_error_max }}</td>
+            -->
+            <td style="width: 15%" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.width_unit_name }}</td>
+            <!--
+            <td style="width: 15%" class="ytg-table-tdl">厚度上限</td>
+            <td style="width: 20%;">{{ row.thick_max }}</td>
+            -->
+          </tr>
+          <tr><!--11-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">计重方式</td>
+            <td style="width: 20%;">{{ row.weight_type_name }}</td>
+
+            <!--
+            <td style="width: 15%;" class="ytg-table-tdl">下限</td>
+            <td style="width: 20%;">{{ row.delivery_error_min }}</td>
+            -->
+            <td rowspan="2" style="width: 15%" class="ytg-table-tdl">厚度</td>
+            <td style="width: 15%" class="ytg-table-tdl">厚度</td>
+            <td style="width: 20%;">{{ row.thick }}</td>
+
+            <!--
+            <td style="width: 15%" class="ytg-table-tdl">厚度下限</td>
+            <td style="width: 20%;">{{ row.thick_min }}</td>
+            -->
+          </tr>
+          <tr><!--12-->
+            <td rowspan="2" style="width: 15%;" class="ytg-table-tdl">重量</td>
+            <td style="width: 15%;" class="ytg-table-tdl">重量</td>
+            <td style="width: 20%;">{{ row.estimate_weight }}</td>
+            <td style="width: 15%" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.thick_unit_name }}</td>
+
+            <!--
+            <td style="width: 15%;" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.delivery_unit_name }}</td>
+            -->
+
+          </tr>
+          <tr><!--13-->
+            <td style="width: 15%;" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.estimate_weight_unit_name }}</td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">其他</td>
+            <td>{{ row.spec_other }}</td>
+
+          </tr>
+          <tr><!--14-->
+            <td rowspan="4" style="width: 15%;" class="ytg-table-tdl">交货量误差</td>
+            <td style="width: 15%;" class="ytg-table-tdl">误差率</td>
+            <td style="width: 20%;">{{ row.delivery_error_rate }}%</td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">切边方式</td>
+            <td style="width: 20%;">{{ row.cut_edge_type_name }}</td>
+          </tr>
+          <tr><!--15-->
+            <td style="width: 15%;" class="ytg-table-tdl">上限</td>
+            <td style="width: 20%;">{{ row.delivery_error_max }}</td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">交货状态</td>
+            <td style="width: 20%;">{{ row.delivery_state_desc }}</td>
+
+          </tr>
+          <tr><!--16-->
+            <td style="width: 15%;" class="ytg-table-tdl">下限</td>
+            <td style="width: 20%;">{{ row.delivery_error_min }}</td>
+            <td style="width: 15%;"  class="ytg-table-tdl">最终用户</td>
+            <td colspan="2" style="width: 35%;">{{ row.user_name }}</td>
+
+          </tr>
+          <tr><!--17-->
+            <td style="width: 15%;" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.delivery_unit_name }}</td>
+            <td style="width: 30%" class="ytg-table-tdl" colspan="2">创建人</td>
+            <td style="width: 20%;" >{{ row.create_man_name }}</td>
+            <!--
+            <td style="width: 15%" class="ytg-table-tdl">宽度上限</td>
+            <td style="width: 20%;">{{ row.width_max }}</td>
+            -->
+          </tr>
+          <tr><!--18-->
+            <td rowspan="3" style="width: 15%;" class="ytg-table-tdl">单重</td>
+            <td style="width: 15%;" class="ytg-table-tdl">单重上限</td>
+            <td style="width: 20%;">{{ row.single_weight_max }}</td>
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">创建时间</td>
+            <td style="width: 20%;" colspan="2">{{ row.create_time }}</td>
+            <!--
+            <td style="width: 15%" class="ytg-table-tdl">宽度下限</td>
+            <td style="width: 20%;">{{ row.width_min }}</td>
+            -->
+          </tr>
+          <tr><!--19-->
+            <td style="width: 15%;" class="ytg-table-tdl">单重下限</td>
+            <td style="width: 20%;">{{ row.single_weight_min }}</td>
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">修改人</td>
+            <td style="width: 20%;" colspan="2">{{ row.update_man_name }}</td>
+
+          </tr>
+          <tr><!--20-->
+            <td style="width: 15%;" class="ytg-table-tdl">计量单位</td>
+            <td style="width: 20%;">{{ row.single_weight_unit_name }}</td>
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">修改时间</td>
+            <td style="width: 20%;">{{ row.update_time }}</td>
+          </tr>
+          <tr><!--21-->
+            <td style="width: 30%;" class="ytg-table-tdl" colspan="2">是否指定产线</td>
+            <td v-if="row.is_prod_line==='0'" style="width: 20%;">未指定</td>
+            <td v-else-if="row.is_prod_line==='1'" style="width: 20%;">已指定</td>
+            <td v-else></td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">运输方案</td>
+            <td style="width: 70%;">{{ row.solutions_name }}</td>
+          </tr>
+          <tr><!--22-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">状态</td>
+            <td v-if="row.is_prod_line==='0'" style="width: 20%;">无效</td>
+            <td v-else-if="row.is_prod_line==='1'" style="width: 20%;">有效</td>
+            <td v-else ></td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">附加要求编号</td>
+            <td style="width: 70%;">{{ row.add_ask_no }}</td>
+          </tr>
+          <tr><!--23-->
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">删除人</td>
+            <td style="width: 20%;">{{ row.delete_man_name }}</td>
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">附加要求说明</td>
+            <td style="width: 70%;">{{ row.add_ask_desc }}</td>
+          </tr>
+          <tr><!--24-->
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">删除时间</td>
+            <td style="width: 20%;">{{ row.delete_time }}</td>
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">客户alpha编号</td>
+            <td colspan="4" style="width: 70%;">{{ row.customer_alpha_no }}</td>
+          </tr>
+          <tr><!--25-->
+            <td colspan="2" style="width: 30%;" class="ytg-table-tdl">备注</td>
+            <td style="width:20%;">{{ row.memo }}</td>
+            <td colspan="2" style="width: 30%" class="ytg-table-tdl">客户alpha说明</td>
+            <td style="width: 70%;">{{ row.customer_alpha_desc }}</td>
+          </tr>
+          <tr><!--26-->
+
+          </tr>
+        </table>
+      </div>
+    </div>
+    <div class="sui-slider-cover"></div>
+    <!-- child slider -->
+  </div>
+</template>
+<script>
+export default {
+  props: ['row'],
+  data () {
+    return {
+    }
+  },
+  mounted () {
+  },
+  methods: {
+  }
+}
+</script>
+<style scoped>
+  .ytg-table td { padding: 5px 12px }
+</style>

+ 173 - 0
src/components/common/modalType.vue

@@ -0,0 +1,173 @@
+<!--各种不同的modal-->
+<template>
+  <div>
+
+    <div v-if="modal_type === 1">
+      <Modal v-model="modal_first" width="370" :closable="false"  padding="0"
+             @on-cancel="cancel">
+        <div class="ivu-modal-header  create-header">
+          <p class="create-header-title" slot="header" >
+            <span>{{modal_name}}</span></p>
+        </div>
+        <div class="modal-content" style="text-align:center">
+          <textarea class="Content_textArea" v-model="reason"  placeholder="请输入..." rows="3" cols="20"></textarea>
+        </div>
+        <div slot="footer" class="modal-footer">
+          <button class="modal-refuse" @click="cancel1">取消</button>
+          <span class="modal-separative">丨</span>
+          <button class="modal-agree" @click="agree1">确定</button>
+        </div>
+      </Modal>
+    </div>
+
+    <div v-if="modal_type === 2">
+      <Modal v-model="modal_second" width="300" :closable="false"  padding="0"
+             @on-cancel="cancel"
+             v-if="modal_type === 2">
+
+        <div class="modal-content" style="text-align:center">
+          <div style="margin: 20px 0px 15px;">
+            <span class="st-icons st-icons-jurapp" ></span>
+          </div>
+          <div>
+            <span v-if="modal_name === '退回'">确定退回吗?</span>
+            <span v-else>确定撤回吗?</span>
+          </div>
+        </div>
+        <div slot="footer" class="modal-footer">
+          <button class="modal-refuse" style="width:40%" @click="cancel1">取消</button>
+          <span class="modal-separative" style="margin-right:0px">丨</span>
+          <button class="modal-agree" @click="agree1">确定</button>
+        </div>
+      </Modal>
+    </div>
+
+  </div>
+
+</template>
+<script>
+export default {
+  /**
+   * modal_type: 模态框的类型(1:表示审批Modal框,2:表示撤回(退回模态框))
+   * modal_flag_first:1:审批模态狂的model值
+   * modal_flag_second:2 撤回模态框的model值
+   * modal_name:模态框的标题
+   */
+  props: ['modal_type', 'modal_flag_first', 'modal_flag_second', 'modal_name'],
+  data () {
+    return {
+      reason: '',
+      aprrove_flag: true,
+      modal_first: false,
+      modal_second: false
+    }
+  },
+
+  watch: {
+    // 防止prop的值更改
+    modal_flag_first: function (obj) {
+      this.modal_first = obj;
+    },
+
+    modal_flag_second: function (obj) {
+      this.modal_second = obj;
+    },
+
+    reason () {
+      if (this.reason.length > 200) {
+        this.$Message.error('内容不能超过200字符');
+        this.aprrove_flag = false;
+      } else {
+        this.aprrove_flag = true;
+      }
+    }
+  },
+
+  methods: {
+    agree1 () {
+      if (this.aprrove_flag) {
+        this.$emit('agree', this.modal_type, this.reason);
+        this.reason = '';
+      }
+    },
+
+    cancel () {
+      this.$emit('cancel', this.modal_type);
+    },
+
+    cancel1 () {
+      this.reason = '';
+      this.$emit('cancel', this.modal_type);
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .create-header{
+    background-color:#f5f5f5;
+    margin:-15px -15px 0 -15px;
+  }
+  .create-header-title{
+    color:#666;font-size:16px;text-align:center;
+    margin-top:1px;
+  }
+
+  .Content_textArea{
+    overflow:auto;
+    background-attachment:fixed;
+    background-repeat:no-repeat;
+    border-style:   solid;
+    border-color:  #FFFFFF;
+    margin-top: 10px;
+    resize:none;
+    width: 340px;
+    height:200px;
+  }
+
+  .Content_textArea:focus {
+    outline: none;
+  }
+
+  .modal-footer{
+    background:#f5f5f5;
+    margin:-12px -17px -11px -17px;
+  }
+
+  .modal-refuse{
+    float:left;
+    border:none;
+    height:50px;
+    background:none;
+    font-size:14px;
+    color:#666;
+    width:45%;
+    cursor: pointer;
+  }
+
+  .modal-refuse:focus{
+    outline: none;
+  }
+  .modal-separative{
+    text-align:center;
+    line-height:50px;
+    height:50px;
+    font-size:25px;
+    font-weight: 100;
+    margin-right:6px;
+    color:#cccccc;
+  }
+  .modal-agree{
+    float:right;
+    border:none;
+    height:50px;
+    background:none;
+    font-size:14px;
+    color:#666;
+    width:45%;
+    cursor: pointer;
+  }
+  .modal-agree:focus{
+    outline: none;
+  }
+</style>

+ 236 - 0
src/components/common/mtitleDetail.vue

@@ -0,0 +1,236 @@
+<!-- 合同头详情组件 -->
+<template>
+  <div class="sui-slider" id="titleDetailSlider">
+    <div class="sui-slider-main">
+      <div class="sui-slider-title">
+        <h2>
+          <span class="sui-slider-title-text">详情</span>
+        </h2>
+        <span class="sui-icons sui-icons-close sui-slider-title-x"></span>
+      </div>
+      <div class="sui-slider-content">
+        <table class="sui-table sui-table-bgg">
+          <tbody>
+          <tr>
+            <td class="sui-table-tdl" style="width: 120px">合同号</td>
+            <td>{{titleRowDet.contract_no}}</td>
+            <td class="sui-table-tdl" style="width: 120px">销售组织</td>
+            <td>{{titleRowDet.sale_org_name}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">管理卡号</td>
+            <td>{{titleRowDet.manage_no}}</td>
+            <td class="sui-table-tdl">销售区域</td>
+            <td>{{titleRowDet.sale_area_name}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">文本合同号</td>
+            <td>{{titleRowDet.txt_contract_no}}</td>
+            <td class="sui-table-tdl">计价方式</td>
+            <td>{{titleRowDet.price_type_name}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">评审单号</td>
+            <td>{{titleRowDet.review_report_no}}</td>
+            <td class="sui-table-tdl">合同总额(含税)</td>
+            <td>{{titleRowDet.tax_total_price}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">合同类型</td>
+            <td>{{titleRowDet.contract_type_name}}</td>
+            <td class="sui-table-tdl">合同总额(不含税)</td>
+            <td>{{titleRowDet.not_tax_total_price}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">意向/正式</td>
+            <td>{{titleRowDet.is_order_contract === '1'? '意向合同':'正式合同' }}</td>
+            <td class="sui-table-tdl">是否含税</td>
+            <td>{{titleRowDet.is_tax === 1? '含税':'不含税'}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">协议号</td>
+            <td>{{titleRowDet.protcl_no}}</td>
+            <td class="sui-table-tdl">税率</td>
+            <td>{{titleRowDet.tax_rate}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">客户名称</td>
+            <td>{{titleRowDet.customer_name}}</td>
+            <td class="sui-table-tdl">币种</td>
+            <td>{{titleRowDet.currency_name}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">客户简称</td>
+            <td>{{titleRowDet.customer_abr}}</td>
+            <td class="sui-table-tdl">付款方式</td>
+            <td>{{titleRowDet.payment_type_name}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">法人代表</td>
+            <td>{{titleRowDet.legal_man}}</td>
+            <td class="sui-table-tdl">开户银行</td>
+            <td>{{titleRowDet.back}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">委托代理人</td>
+            <td>{{titleRowDet.agent_man}}</td>
+            <td class="sui-table-tdl">公司注册地址</td>
+            <td>{{titleRowDet.address}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">贸易类型</td>
+            <td>{{titleRowDet.trade_type_name}}</td>
+            <td class="sui-table-tdl">纳税人识别号</td>
+            <td>{{titleRowDet.tax_registra_number}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">结算单位</td>
+            <td>{{titleRowDet.balance_unit_name}}</td>
+            <td class="sui-table-tdl">开票电话</td>
+            <td>{{titleRowDet.telphone}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">订货单位</td>
+            <td>{{titleRowDet.order_unit_name}}</td>
+            <td class="sui-table-tdl">账号</td>
+            <td>{{titleRowDet.account}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">供货单位</td>
+            <td>{{titleRowDet.supply_unit_name}}</td>
+            <td class="sui-table-tdl">联系电话</td>
+            <td>{{titleRowDet.phone}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">供货地址</td>
+            <td>{{titleRowDet.supplier_address}}</td>
+            <td class="sui-table-tdl">传真</td>
+            <td>{{titleRowDet.fax}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">合同年度</td>
+            <td>{{titleRowDet.contract_year}}</td>
+
+            <td class="sui-table-tdl">邮编</td>
+            <td>{{titleRowDet.zip_code}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">合同范本</td>
+            <td>{{titleRowDet.contract_model_name}}</td>
+
+            <td class="sui-table-tdl">合同状态</td>
+            <td>{{titleRowDet.contract_flag_name}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">合同前状态</td>
+            <td>{{titleRowDet.p_contract_flag_name}}</td>
+            <td class="sui-table-tdl">打印人</td>
+            <td>{{titleRowDet.print_man_name}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">生效人</td>
+            <td>{{titleRowDet.effect_man_name}}</td>
+            <td class="sui-table-tdl">打印时间</td>
+            <td>{{titleRowDet.print_time|filterDate('yyyy-MM-dd')}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">结案人</td>
+            <td>{{titleRowDet.close_man_name}}</td>
+            <td class="sui-table-tdl">打印次数</td>
+            <td>{{titleRowDet.print_num}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">订价方式</td>
+            <td>{{titleRowDet.make_price_type_name}}</td>
+            <td class="sui-table-tdl">有效开始日期</td>
+            <td>{{titleRowDet.effec_start_date|filterDate('yyyy-MM-dd')}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">是否控制付款比例</td>
+            <td>{{titleRowDet.is_control_payment == '0'? '合同头控制': '合同行控制' }}</td>
+            <td class="sui-table-tdl">有效结束日期</td>
+            <td>{{titleRowDet.effec_end_date|filterDate('yyyy-MM-dd')}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">创建人</td>
+            <td>{{titleRowDet.create_man_name}}</td>
+            <td class="sui-table-tdl">交货日期</td>
+            <td>{{titleRowDet.deliver_date|filterDate('yyyy-MM-dd')}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">创建时间</td>
+            <td>{{titleRowDet.create_time}}</td>
+            <td class="sui-table-tdl">有效标志</td>
+            <td>{{titleRowDet.valid_flag == 1? '有效': '无效'}}</td>
+
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">修改人</td>
+            <td>{{titleRowDet.update_man_name}}</td>
+            <td class="sui-table-tdl">签订日期</td>
+            <td>{{titleRowDet.sign_date|filterDate('yyyy-MM-dd')}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">修改时间</td>
+            <td>{{titleRowDet.update_time}}</td>
+            <td class="sui-table-tdl">签订地点</td>
+            <td>{{titleRowDet.sign_address}}</td>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">删除人</td>
+            <td>{{titleRowDet.delete_man_name}}</td>
+            <td class="sui-table-tdl">当地法规</td>
+            <td >{{titleRowDet.local_law}}</td>
+          </tr>
+          <tr>
+          </tr>
+          <tr>
+            <td class="sui-table-tdl">删除时间</td>
+            <td>{{titleRowDet.delete_time}}</td>
+            <td class="sui-table-tdl">备注</td>
+            <td >{{titleRowDet.memo}}</td>
+          </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+    <div class="sui-slider-cover"></div>
+    <!-- child slider -->
+  </div>
+</template>
+<script>
+export default {
+  props: ['titleRowDet'],
+  data () {
+    return {
+    }
+  },
+  methods: {
+  }
+}
+</script>
+<style scoped>
+  .sui-table td { padding: 5px 12px }
+
+  .sui-table tr td:first-child,.sui-table tr td:nth-child(3) {
+    padding-right: 5px
+  }
+
+  .sui-table tr td:last-child,.sui-table tr td:nth-child(2) {
+    padding-left: 5px
+  }
+</style>

+ 124 - 0
src/components/common/orderDeatil.vue

@@ -0,0 +1,124 @@
+<template>
+  <div>
+    <el-table :data="params.data" v-loading="params.loading" :ref="'multipleTable' + params.index" class="xg-ytg-line-hei">
+      <el-table-column type="index" align="center" label="序号" width="40px"></el-table-column>
+      <el-table-column white-space-nowrap label="计划号" align="left" prop="PACT_INDEX" min-width="110"></el-table-column>
+      <el-table-column white-space-nowrap label="订单号" align="left" prop="ORDER_NO" show-overflow-tooltip min-width="140" :filter-method="filterColumn"></el-table-column>
+      <el-table-column white-space-nowrap label="生产订单号" align="left" prop="PROD_ORDER_NO" show-overflow-tooltip min-width="100" :filter-method="filterColumn"></el-table-column>
+      <el-table-column white-space-nowrap label="设计子板规格(长度:mm 重量:t)">
+        <el-table-column white-space-nowrap label="厚" prop="CHILD_THK" align="right" min-width="50"></el-table-column>
+        <el-table-column white-space-nowrap label="宽" prop="CHILD_WTH" align="right" min-width="50"></el-table-column>
+        <el-table-column white-space-nowrap label="长" prop="CHILD_LEN" align="right" min-width="50"></el-table-column>
+        <el-table-column white-space-nowrap label="重" prop="CHILD_WGT" align="right" min-width="50">
+          <template slot-scope="scope">
+            <span>{{scope.row.CHILD_WGT | weightTrans}}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column white-space-nowrap label="订单要求规格(长度:mm 重量:t)">
+        <el-table-column white-space-nowrap label="厚" prop="THICK" align="right" min-width="50"></el-table-column>
+        <el-table-column white-space-nowrap label="宽" prop="WIDTH" align="right" min-width="50"></el-table-column>
+        <el-table-column white-space-nowrap label="长" prop="LENGTH" align="right" min-width="50"></el-table-column>
+        <el-table-column white-space-nowrap label="重" prop="SINGLE_WEIGHT" align="right" min-width="50">
+          <template slot-scope="scope">
+            <span>{{scope.row.SINGLE_WEIGHT | weightTrans}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column white-space-nowrap label="长度上限" prop="LENGTH_MAX" align="right" min-width="60"></el-table-column>
+        <el-table-column white-space-nowrap label="长度下限" prop="LENGTH_MIN" align="right" min-width="60"></el-table-column>
+        <el-table-column white-space-nowrap label="宽度上限" prop="WIDTH_MAX" align="right" min-width="60"></el-table-column>
+        <el-table-column white-space-nowrap label="宽度下限" prop="WIDTH_MIN" align="right" min-width="60"></el-table-column>
+        <el-table-column white-space-nowrap label="单重上限" prop="SINGLE_WEIGHT_MAX" align="right" min-width="60">
+          <template slot-scope="scope">
+            <span>{{scope.row.SINGLE_WEIGHT_MAX | weightTrans}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column white-space-nowrap label="单重下限" prop="SINGLE_WEIGHT_MIN" align="right" min-width="60">
+          <template slot-scope="scope">
+            <span>{{scope.row.SINGLE_WEIGHT_MIN | weightTrans}}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+      <el-table-column white-space-nowrap label="定尺方式" prop="FIX_SIZE_DESC" align="left" show-overflow-tooltip min-width="80"></el-table-column>
+      <el-table-column white-space-nowrap label="切边方式" prop="CUT_EDGE_TYPE_NAME" align="left" show-overflow-tooltip min-width="80"></el-table-column>
+      <el-table-column white-space-nowrap label="交货重量下限(t)" prop="DELIVERY_ERROR_MAX" align="right" min-width="60">
+        <template slot-scope="scope">
+          <span>{{scope.row.DELIVERY_ERROR_MAX | weightTrans}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column white-space-nowrap label="交货重量上限(t)" prop="DELIVERY_ERROR_MIN" align="right" min-width="60">
+        <template slot-scope="scope">
+          <span>{{scope.row.DELIVERY_ERROR_MIN | weightTrans}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="取样要求" prop="SAMPING" align="left" min-width="100"></el-table-column>
+      <el-table-column label="特殊要求" align="left" show-overflow-tooltip prop="SPECIAL" min-width="80">
+        <template slot-scope="props">
+          <el-button type="text" size="small" @click="showSpecialDetail(props.row)">{{props.row.SPECIAL}}</el-button>
+        </template>
+      </el-table-column>
+      <el-table-column label="附加要求" align="left" show-overflow-tooltip prop="ADD_ASK_DESC" min-width="80"></el-table-column>
+      <el-table-column label="检验机构" align="left" show-overflow-tooltip prop="ORG" min-width="80"></el-table-column>
+      <el-table-column white-space-nowrap label="收货单位" align="left" show-overflow-tooltip prop="RECIVER_UNIT_NAM" min-width="100"></el-table-column>
+      <el-table-column label="工艺要求" align="left" prop="PROCESS" show-overflow-tooltip min-width="80"></el-table-column>
+      <el-table-column white-space-nowrap label="交货日期" prop="DELIVER_DATE" min-width="100"></el-table-column>
+      <el-table-column white-space-nowrap label="交货状态" prop="DELIVERY_STATE_DESC" min-width="80" :filter-method="filterColumn"></el-table-column>
+    </el-table>
+  </div>
+</template>
+<script>
+import {formatDate} from '@/utils/util.js';
+export default {
+  props: ['params', 'isshow'],
+  data () {
+    return {
+      isSearch: true
+    }
+  },
+  mounted () {
+    this.getOrderDetailData(this.params)
+  },
+  methods: {
+    showSpecialDetail (row) {
+      this.$emit('showdetail', row)
+    },
+    getOrderDetailData (row) {
+      let _this = this;
+      let designNo = row.design_no || row.DESIGN_NO || row.object_type
+      if (designNo) {
+        _this.$set(row, 'loading', true)
+        _this.axios.post('/PlnSlabdesignMultinfoService/doQueryWaitApplyFictitiousChildWeb', [{object: {design_no: designNo}}])
+          .then(function (response) {
+            if (response) {
+              for (let item of response.data.data) {
+                item.DELIVER_DATE = formatDate(item.DELIVER_DATE, 'yyyy-MM-dd')
+              }
+              _this.$set(row, 'data', response.data.data)
+              _this.$refs['multipleTable' + row.index].clearFilter();
+              _this.setFilterDatas(_this.$refs['multipleTable' + row.index].columns, row.data, ['ORDER_NO', 'PROD_ORDER_NO', 'DELIVERY_STATE_DESC']);
+            }
+            _this.$set(row, 'loading', false)
+            console.log('执行了', row.loading)
+          }).catch(function () {
+            _this.$set(row, 'loading', false)
+          })
+      }
+    }
+  },
+  watch: {
+    // params: {
+    //   // console.log('执行了监听')
+    //   handler () {
+    //     console.log('监听到了变化')
+    //     if ('isShow' in this.params) {
+    //       this.getOrderDetailData(this.params)
+    //     }
+    //   },
+    //   deep: true
+    // }
+    isshow () {
+      this.getOrderDetailData(this.params)
+    }
+  }
+}
+</script>

+ 40 - 0
src/components/common/print.vue

@@ -0,0 +1,40 @@
+<template>
+  <div>
+    <Button class="oa-search-header-form-b2 ivu-btn" type="primary" @click="printTable()">打印</Button>
+    <div  id="print-table" style="display: none;width: 100%;text-align: center">
+      <p style=" margin: 20px 0; font-size: 20px; width: 1050px;" v-show="printTitle">{{printTitle}}</p>
+      <Table stripe border :columns="printTableTitle" :data="printTableData" id="print-table-t">
+      </Table>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: ['printTableTitle', 'printTableData', 'printTitle'],
+  data () {
+    return {
+    }
+  },
+  methods: {
+    printTable () {
+      $('#print-table-t table').attr({width: '1050px', border: '1px'});
+      let obj = document.getElementById('print-table');
+      let newIframe = document.createElement('IFRAME');
+      let doc = null;
+      newIframe.setAttribute('style', 'width:0px;height:0px;position:absolute;left:-2000px;top:-2000px;');
+      newIframe.setAttribute('align', 'center');
+      document.body.appendChild(newIframe);
+      doc = newIframe.contentWindow.document;
+      doc.write('<div style="width:100%;height:auto;margin:0 auto;"align="center">' + obj.innerHTML + '</div>');
+      doc.close();
+      newIframe.contentWindow.focus();
+      newIframe.contentWindow.print();
+    }
+  }
+}
+</script>
+<style>
+/*#print-table-t tr {*/
+  /*border: 1px solid #ccc;*/
+/*}*/
+</style>

+ 78 - 0
src/components/common/processDialog.vue

@@ -0,0 +1,78 @@
+<template>
+  <div>
+    <el-dialog append-to-body title="工序信息" :visible.sync="showProcess" width="600px">
+      <el-table height="580" ref="processTab" :data="processData" border highlight-current-row @selection-change="handleSelect">
+        <el-table-column type="selection" width="50" align="center"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序代码" prop="processCode" min-width="120"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序描述" prop="processDesc" min-width="120"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="备注" prop="memo" min-width="120"></el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="Cancel">取消</el-button>
+        <el-button type="primary" size="small" @click="OK">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+export default {
+  props: ['process', 'codeList'],
+  data () {
+    return {
+      selection: [],
+      showProcess: false,
+      processData: []
+    }
+  },
+  methods: {
+    handleSelect (selection) {
+      this.selection = selection;
+    },
+    OK () {
+      let processCode = [], processDesc = [], code = '', desc = '';
+      for (let item of this.selection) {
+        processCode.push(item.processCode);
+        processDesc.push(item.processDesc);
+      }
+      code = processCode.join(',');
+      desc = processDesc.join(',');
+      this.$emit('getProcess', code, desc);
+      this.showProcess = false;
+    },
+    Cancel () {
+      this.showProcess = false;
+    },
+    findProcess () {
+      let _this = this;
+      // 一级工序点
+      this.axios.post('/ComBaseProcessService/doQueryProcessWeb', [
+        {
+          object: {processDesc: ''},
+          memo1: '0'
+        }
+      ]).then(function (response) {
+        if (response) {
+          _this.processData = response.data.data.rows;
+          _this.selection = [];
+          if (_this.codeList) {
+            _this.$nextTick(function () {
+              for (let j = 0; j < _this.processData.length; j++) {
+                if (_this.codeList.indexOf(_this.processData[j].processCode) >= 0) {
+                  _this.$refs.processTab.toggleRowSelection(_this.processData[j], true);
+                }
+              }
+            });
+          }
+        }
+      });
+    }
+  },
+  watch: {
+    process: function () {
+      this.findProcess();
+      this.showProcess = true;
+    }
+  }
+}
+</script>
+<style scoped></style>

+ 269 - 0
src/components/common/processPointDialog.vue

@@ -0,0 +1,269 @@
+<!-- 工序点弹窗 -->
+<template>
+  <div>
+    <el-dialog append-to-body title="工序点信息" :visible.sync="showProcess" width="1080px" >
+      <el-table height="580" ref="processTab" :data="tableProcessPoint" v-loading="tableProcessPointLoading" border highlight-current-row
+                  @select-all="handleSelectAllPoint" @select="handleSelectPoint" drag-row="true" @changeRowOrder="rowDrag" row-click="showRow">
+        <el-table-column type="selection" width="50" align="center">
+          <!--<template slot-scope="prop">-->
+            <!--<el-checkbox  v-model="prop.row.isSelection" :true-label="'1'" :false-label="'0'">-->
+            <!--</el-checkbox>-->
+          <!--</template>-->
+        </el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="发送检验计划" align="center" min-width="85">
+          <template slot-scope="scope">
+            <span v-if="scope.row.send_checkplan === '1'">是</span>
+            <span v-else-if="scope.row.send_checkplan === '0'">否</span>
+          </template>
+        </el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="执行返回" align="center" min-width="60">
+          <template slot-scope="scope">
+            <span v-if="scope.row.return_result === '1'">是</span>
+            <span v-else-if="scope.row.return_result === '0'">否</span>
+          </template>
+        </el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="必经项" align="center" min-width="55">
+          <template slot-scope="scope">
+            <span v-if="scope.row.choose === '1'">是</span>
+            <span v-else-if="scope.row.choose === '0'">否</span>
+          </template>
+        </el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序点代码"  sortable align="center" prop="process_point_code" min-width="95"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序点名称" prop="process_point_desc" min-width="100"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序点类型" sortable align="center" prop="base_name" min-width="110"
+                         :filter-method="filterColumn"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序点顺序号" align="center" prop="process_point_seq" min-width="85" sort-by="process_point_seq" ></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="标准成本" sortable prop="cost" align="right" min-width="80">
+          <template slot-scope="scope"><span>{{scope.row.cost | formatNum}}</span></template>
+        </el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="工序名称" align="center" prop="process_desc" min-width="80"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="二级工序" align="center" prop="process_desc_c" min-width="80"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" label="备注" prop="memo" min-width="150"></el-table-column>
+      </el-table>
+      <el-checkbox  v-model="isChoose" :true-label="'1'" :false-label="'0'" @change="isOnlyWay">勾选必经项</el-checkbox>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" @click="doCancel">取消</el-button>
+        <el-button type="primary" size="small" @click="doEnsure">确定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import {compareArray} from '@/utils/util.js';
+export default {
+  // props: ['process', 'codeList'],
+  props: ['processCodeC', 'processPointData'],
+  data () {
+    return {
+      filtersColumns: ['base_name'],
+      tableProcessPoint: [], // 二级工序点
+      tableProcessPointLoading: false,
+      selection: [],
+      showProcess: false,
+      isChoose: '0' // 勾选必经项
+    }
+  },
+  methods: {
+    rowDrag (startIndex, endIndex) {
+      let temp = this.changeRowOrder(this.tableProcessPoint, startIndex, endIndex); // 将全局方法changeRowOrder的返回值保存
+      this.tableProcessPoint = temp; // 赋值data内数据
+      this.$refs.processTab.clearSelection();
+      let select = [];
+      for (let item of this.tableProcessPoint) {
+        if (item.lil_seq !== 99999 && item.lil_seq !== null && item.lil_seq) {
+          item.drag = true;
+          select.push(item);
+        }
+      }
+      console.log(select, this.tableProcessPoint);
+      let arr = [];
+      let j = 1;
+      for (let i in this.tableProcessPoint) {
+        setTimeout(() => {
+          if (this.tableProcessPoint[i].drag) {
+            arr.push(this.tableProcessPoint[i]);
+            this.$refs.processTab.toggleRowSelection(this.tableProcessPoint[i], true);
+            this.tableProcessPoint[i].lil_seq = j;
+            this.tableProcessPoint[i].process_point_seq = j;
+            j++;
+          } else {
+            this.tableProcessPoint[i].lil_seq = 99999;
+            this.tableProcessPoint[i].process_point_seq = '';
+          }
+        }, 50)
+      }
+      setTimeout(() => {
+        this.tableProcessPoint.sort(sortlilSeq);
+      }, 200);
+      console.log(arr, 'arr');
+    },
+    showRow (row) {
+      console.log(row);
+    },
+    // 查询二级工序点
+    doSearchProcessPoint () {
+      console.log(this.processCodeC, this.processPointData, 'param');
+      let _this = this;
+      _this.tableProcessPointLoading = true;
+      _this.axios.post('/ComBaseProcessRStationService/doQueryProcessRStationWeb',
+        [
+          {
+            object: {
+              processCdoeC: _this.processCodeC.process_code_c,
+              processCdoe: _this.processCodeC.process_code
+            }
+          }
+        ]
+      ).then(function (response) {
+        if (response.data.data) {
+          for (let i in response.data.data) {
+            // response.data.data[i].process_point_seq = parseInt(i) + 1;
+            response.data.data[i].process_point_seq = '';
+            response.data.data[i].guid = '';
+          }
+          _this.tableProcessPoint = response.data.data;
+          // 清空过滤
+          _this.$refs.processTab.clearFilter();
+          // 设置过滤数据 setFilterDatas(列数组对象, 数据, 需要过滤的字段, 列名转义对象)
+          _this.setFilterDatas(_this.$refs.processTab.columns, _this.tableProcessPoint, _this.filtersColumns,
+            {
+            }
+          );
+          if (_this.processPointData.length > 0) { // 当该二级工序存在对应工序点时
+            let obj = [];
+            for (let i in _this.processPointData) {
+              for (let j in _this.tableProcessPoint) {
+                if (_this.tableProcessPoint[j].process_point_code === _this.processPointData[i].process_point_code) {
+                  _this.tableProcessPoint[j].guid = _this.processPointData[i].guid
+                  _this.tableProcessPoint[j].process_point_seq = parseInt(i) + 1;
+                  obj.push(_this.tableProcessPoint[j]);
+                  // _this.handleSelectPoint(obj);
+                }
+              }
+            }
+            obj.sort(sortSeq);
+            setTimeout(() => {
+              let val = [];
+              for (let item of obj) {
+                val.push(item);
+                _this.$refs.processTab.toggleRowSelection(item, true);
+                _this.handleSelectPoint(val);
+              }
+            }, 20)
+          }
+        }
+        _this.tableProcessPointLoading = false;
+      }).catch(function (response) {
+        _this.tableProcessPointLoading = false;
+      })
+    },
+    // 单选 按勾选的顺序进行排序
+    handleSelectPoint (selection) {
+      // let indexs = compareArray(selection, this.tableProcessPoint, 'process_point_code');
+      // let objTrue = [];
+      // let objFalse = [];
+      // for (let i = 0; i < this.tableProcessPoint.length; i++) {
+      //   let flag = false;
+      //   for (let j = 0; j < indexs.length; j++) {
+      //     if (indexs[j] === i) {
+      //       flag = true;
+      //     }
+      //   }
+      //   if (flag) {
+      //     objTrue.push(this.tableProcessPoint[i]);
+      //   } else {
+      //     objFalse.push(this.tableProcessPoint[i]);
+      //   }
+      // }
+      // let obj = [...objTrue, ...objFalse];
+      // for (let i in obj) {
+      //   obj[i].process_point_seq = parseInt(i) + 1;
+      // }
+      // this.tableProcessPoint = Object.assign([], obj);
+      // setTimeout(() => {
+      //   for (let i = 0; i < objTrue.length; i++) {
+      //     this.$refs.processTab.toggleRowSelection(this.tableProcessPoint[i], true);
+      //   }
+      //   this.tableProcessPointLoading = false;
+      // }, 2);
+      // this.selection = selection;
+      // this.tableProcessPointLoading = true;
+      for (let n in this.tableProcessPoint) {
+        this.tableProcessPoint[n].lil_seq = 99999;
+        this.tableProcessPoint[n].process_point_seq = '';
+      }
+      for (let i in selection) {
+        selection[i].lil_seq = parseInt(i) + 1;
+        selection[i].process_point_seq = parseInt(i) + 1;
+      }
+      this.tableProcessPoint.sort(sortlilSeq);
+      this.selection = selection;
+    },
+    // 多选
+    handleSelectAllPoint (selection) {
+      this.selection = selection;
+    },
+    // 勾选必经项
+    isOnlyWay () {
+      if (this.isChoose === '1') {
+        let objTrue = [];
+        let objFalse = [];
+        for (let i in this.tableProcessPoint) {
+          if (this.tableProcessPoint[i].choose === '1') {
+            objTrue.push(this.tableProcessPoint[i]);
+          } else {
+            objFalse.push(this.tableProcessPoint[i]);
+          }
+        }
+        objTrue.sort(sortCode);
+        this.tableProcessPoint = [...objTrue, ...objFalse];
+        for (let i in this.tableProcessPoint) {
+          this.tableProcessPoint[i].process_point_seq = parseInt(i) + 1;
+        }
+        setTimeout(() => {
+          for (let i = 0; i < objTrue.length; i++) {
+            this.$refs.processTab.toggleRowSelection(this.tableProcessPoint[i], true);
+          }
+        }, 2);
+      } else {
+        this.selection = [];
+        this.tableProcessPoint = Object.assign([], this.tableProcessPoint);
+      }
+    },
+    // 取消
+    doCancel () {
+      this.showProcess = false;
+    },
+    // 确定
+    doEnsure () {
+      this.showProcess = false;
+      this.$emit('chooseProcessPointSuccess', this.selection);
+    }
+  },
+  watch: {
+    processCodeC (value) {
+      this.isChoose = '0';
+      this.selection = [];
+      if (value.process_code_c) {
+        this.showProcess = true;
+        this.doSearchProcessPoint();
+      } else {
+        this.tableProcessPoint = [];
+      }
+    }
+  }
+}
+function sortCode (a, b) {
+  if (/^\d/.test(a.process_point_code) ^ / ^\D/.test(b.process_point_code)) return a.process_point_code > b.process_point_code ? 1 : (a.process_point_code === b.process_point_code ? 0 : -1);
+  return a.process_point_code > b.process_point_code ? -1 : (a === b ? 0 : 1);
+}
+function sortlilSeq (a, b) {
+  //  按顺序号排序
+  return a.lil_seq > b.lil_seq ? 1 : (a.lil_seq === b.lil_seq ? 0 : -1);
+}
+function sortSeq (a, b) {
+  //  按顺序号排序
+  return a.process_point_seq > b.process_point_seq ? 1 : (a.process_point_seq === b.process_point_seq ? 0 : -1);
+}
+</script>
+<style scoped></style>

Some files were not shown because too many files changed in this diff