plg-xiongt 2 bulan lalu
induk
melakukan
72be2298f5
100 mengubah file dengan 5843 tambahan dan 0 penghapusan
  1. 29 0
      upcloud-wms-qingniu-web/.gitignore
  2. 19 0
      upcloud-wms-qingniu-web/.prettierrc
  3. 3 0
      upcloud-wms-qingniu-web/Dockerfile
  4. 9 0
      upcloud-wms-qingniu-web/README.md
  5. 42 0
      upcloud-wms-qingniu-web/babel.config.js
  6. 49 0
      upcloud-wms-qingniu-web/config/plugin.config.js
  7. 115 0
      upcloud-wms-qingniu-web/config/themePluginConfig.js
  8. 52 0
      upcloud-wms-qingniu-web/dataApiToNumScript.js
  9. 4 0
      upcloud-wms-qingniu-web/deploy.js
  10. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/dist.tar
  11. 31 0
      upcloud-wms-qingniu-web/docs/add-page-loading-animate.md
  12. 69 0
      upcloud-wms-qingniu-web/docs/main.html
  13. 38 0
      upcloud-wms-qingniu-web/docs/webpack-bundle-analyzer.md
  14. 23 0
      upcloud-wms-qingniu-web/jest.config.js
  15. 32 0
      upcloud-wms-qingniu-web/nginxtest.yml
  16. 87 0
      upcloud-wms-qingniu-web/package.json
  17. 10 0
      upcloud-wms-qingniu-web/pipeline_control.yaml
  18. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/public/favicon.ico
  19. 133 0
      upcloud-wms-qingniu-web/public/index.html
  20. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/public/load.gif
  21. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/public/logo_blue.png
  22. 598 0
      upcloud-wms-qingniu-web/public/printTemplate/acceptanceCheckSheet.grf
  23. 442 0
      upcloud-wms-qingniu-web/public/printTemplate/curingSheet.grf
  24. 489 0
      upcloud-wms-qingniu-web/public/printTemplate/inventorySheet.grf
  25. 506 0
      upcloud-wms-qingniu-web/public/printTemplate/printOnShelf.grf
  26. 564 0
      upcloud-wms-qingniu-web/public/printTemplate/receiptSheet.grf
  27. 366 0
      upcloud-wms-qingniu-web/public/printTemplate/shiftSheet.grf
  28. 40 0
      upcloud-wms-qingniu-web/public/scanBatch.html
  29. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/public/期初库存导入模板.xlsx
  30. 11 0
      upcloud-wms-qingniu-web/sh.exe.stackdump
  31. 36 0
      upcloud-wms-qingniu-web/src/App.vue
  32. 73 0
      upcloud-wms-qingniu-web/src/api/index.js
  33. 19 0
      upcloud-wms-qingniu-web/src/api/lang.js
  34. 91 0
      upcloud-wms-qingniu-web/src/api/login.js
  35. 70 0
      upcloud-wms-qingniu-web/src/api/manage.js
  36. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/20230223154621.png
  37. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/Shape.png
  38. 8 0
      upcloud-wms-qingniu-web/src/assets/WechatIMG196.svg
  39. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/bgoms.png
  40. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/code_plg.png
  41. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/head-top.png
  42. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it01.png
  43. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it02.png
  44. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it03.png
  45. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it04.png
  46. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it05.png
  47. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it06.png
  48. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/it07.png
  49. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/login_bg.png
  50. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/login_bg_n.png
  51. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/oms-center.png
  52. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/oms-left.png
  53. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/order.png
  54. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/person.png
  55. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/slogn_blue.png
  56. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/slogn_white.png
  57. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/admin/systeminfo.png
  58. 69 0
      upcloud-wms-qingniu-web/src/assets/background.svg
  59. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/check-circle-o.png
  60. 12 0
      upcloud-wms-qingniu-web/src/assets/css/font.less
  61. 93 0
      upcloud-wms-qingniu-web/src/assets/css/reset.less
  62. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/default_user_icon.jpg
  63. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/enterprise.png
  64. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/font/Alibaba-PuHuiTi-Regular.otf
  65. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/font/Montserrat-SemiBold.otf
  66. 1 0
      upcloud-wms-qingniu-web/src/assets/icons/bx-analyse.svg
  67. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/ill_log_in_2.png
  68. 13 0
      upcloud-wms-qingniu-web/src/assets/ill_log_in_2.svg
  69. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/logo.png
  70. 10 0
      upcloud-wms-qingniu-web/src/assets/logo.svg
  71. 18 0
      upcloud-wms-qingniu-web/src/assets/logo2.svg
  72. 18 0
      upcloud-wms-qingniu-web/src/assets/logo3.svg
  73. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/noAuthorized.png
  74. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/noAuthorized_bg.png
  75. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/provided.png
  76. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/provided_w.png
  77. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/queren.png
  78. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/search.png
  79. TEMPAT SAMPAH
      upcloud-wms-qingniu-web/src/assets/suoqu.png
  80. 9 0
      upcloud-wms-qingniu-web/src/assets/title.svg
  81. 173 0
      upcloud-wms-qingniu-web/src/blocks/CascaderZone/index.js
  82. 221 0
      upcloud-wms-qingniu-web/src/blocks/CascaderZone/index.search.js
  83. 60 0
      upcloud-wms-qingniu-web/src/blocks/CascaderZone/wms.index.js
  84. 29 0
      upcloud-wms-qingniu-web/src/blocks/ImgsUpload/api.js
  85. 100 0
      upcloud-wms-qingniu-web/src/blocks/ImgsUpload/index.vue
  86. 165 0
      upcloud-wms-qingniu-web/src/blocks/ImgsUpload/upload.vue
  87. 166 0
      upcloud-wms-qingniu-web/src/blocks/ImgsUpload/view.vue
  88. 110 0
      upcloud-wms-qingniu-web/src/blocks/PictureView/PictureView.vue
  89. 5 0
      upcloud-wms-qingniu-web/src/blocks/PictureView/index.js
  90. 47 0
      upcloud-wms-qingniu-web/src/blocks/SwitchValue.vue
  91. 5 0
      upcloud-wms-qingniu-web/src/blocks/index.js
  92. 89 0
      upcloud-wms-qingniu-web/src/components/ArticleListContent/ArticleListContent.vue
  93. 3 0
      upcloud-wms-qingniu-web/src/components/ArticleListContent/index.js
  94. 24 0
      upcloud-wms-qingniu-web/src/components/AvatarList/Item.jsx
  95. 72 0
      upcloud-wms-qingniu-web/src/components/AvatarList/List.jsx
  96. 9 0
      upcloud-wms-qingniu-web/src/components/AvatarList/index.js
  97. 60 0
      upcloud-wms-qingniu-web/src/components/AvatarList/index.less
  98. 64 0
      upcloud-wms-qingniu-web/src/components/AvatarList/index.md
  99. 27 0
      upcloud-wms-qingniu-web/src/components/ConfigProvider/index.js
  100. 113 0
      upcloud-wms-qingniu-web/src/components/Dialog.js

+ 29 - 0
upcloud-wms-qingniu-web/.gitignore

@@ -0,0 +1,29 @@
+.DS_Store
+node_modules
+_plglib
+/dist
+/vue.config
+.history
+__*
+
+
+# local env files
+.env.local
+.env.*.local
+
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+/.vscode/*.json
+/yarn.lock

+ 19 - 0
upcloud-wms-qingniu-web/.prettierrc

@@ -0,0 +1,19 @@
+{
+  "arrowParens": "always",
+  "bracketSameLine": false,
+  "bracketSpacing": true,
+  "embeddedLanguageFormatting": "auto",
+  "htmlWhitespaceSensitivity": "css",
+  "insertPragma": false,
+  "jsxSingleQuote": false,
+  "proseWrap": "preserve",
+  "quoteProps": "as-needed",
+  "requirePragma": false,
+  "semi": true,
+  "singleQuote": false,
+  "tabWidth": 2,
+  "trailingComma": "es5",
+  "useTabs": false,
+  "vueIndentScriptAndStyle": false,
+  "printWidth": 200
+}

+ 3 - 0
upcloud-wms-qingniu-web/Dockerfile

@@ -0,0 +1,3 @@
+FROM harbor.cloud.prolog.org/base-solution/nginx:bate
+
+COPY dist /usr/share/nginx/html/

+ 9 - 0
upcloud-wms-qingniu-web/README.md

@@ -0,0 +1,9 @@
+# .gitignore 生效
+```
+# 让其对已经跟踪的文件也起作用
+git rm -r --cached .                #清除缓存 -r 表示递归删除(如果有文件夹的话) . 表示所有文件
+
+git status --ignored                  #查看一下具体效果
+git add .                             #重新trace file
+git commit -m "update .gitignore"     #提交和注释
+```

+ 42 - 0
upcloud-wms-qingniu-web/babel.config.js

@@ -0,0 +1,42 @@
+const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV)
+
+const plugins = []
+if (IS_PROD) {
+  plugins.push('transform-remove-console')
+}
+
+// lazy load ant-design-vue
+// if your use import on Demand, Use this code
+plugins.push(
+  [
+    'import',
+    {
+      libraryName: 'ant-design-vue',
+      libraryDirectory: 'es',
+      style: true // `style: true` 会加载 less 文件
+    }
+  ],
+  [
+    'import',
+    {
+      libraryName: 'plglib',
+      libraryDirectory: 'components',
+      style: 'css' // `style: true` 会加载 less 文件
+    },
+    'plglib'
+  ]
+)
+
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset',
+    [
+      '@babel/preset-env',
+      {
+        useBuiltIns: 'entry',
+        corejs: 3
+      }
+    ]
+  ],
+  plugins
+}

+ 49 - 0
upcloud-wms-qingniu-web/config/plugin.config.js

@@ -0,0 +1,49 @@
+const ThemeColorReplacer = require('webpack-theme-color-replacer')
+const generate = require('@ant-design/colors/lib/generate').default
+
+const getAntdSerials = (color) => {
+  // 淡化(即less的tint)
+  const lightens = new Array(9).fill().map((t, i) => {
+    return ThemeColorReplacer.varyColor.lighten(color, i / 10)
+  })
+  const colorPalettes = generate(color)
+  const rgb = ThemeColorReplacer.varyColor.toNum3(color.replace('#', '')).join(',')
+  return lightens.concat(colorPalettes).concat(rgb)
+}
+
+const themePluginOption = {
+  fileName: 'css/theme-colors-[contenthash:8].css',
+  matchColors: getAntdSerials('#1890ff'), // 主色系列
+  // 改变样式选择器,解决样式覆盖问题
+  changeSelector (selector) {
+    switch (selector) {
+      case '.ant-calendar-today .ant-calendar-date':
+        return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector
+      case '.ant-btn:focus,.ant-btn:hover':
+        return '.ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger)'
+      case '.ant-btn.active,.ant-btn:active':
+        return '.ant-btn.active:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:active:not(.ant-btn-primary):not(.ant-btn-danger)'
+      case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
+      case '.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon':
+        return ':not(.ant-steps-item-process)' + selector
+      // fixed https://github.com/vueComponent/ant-design-vue-pro/issues/876
+      case '.ant-steps-item-process .ant-steps-item-icon':
+        return ':not(.ant-steps-item-custom)' + selector
+      case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover':
+      case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover':
+        return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover'
+      case '.ant-menu-horizontal > .ant-menu-item-selected > a':
+      case '.ant-menu-horizontal>.ant-menu-item-selected>a':
+        return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item-selected > a'
+      case '.ant-menu-horizontal > .ant-menu-item > a:hover':
+      case '.ant-menu-horizontal>.ant-menu-item>a:hover':
+        return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item > a:hover'
+      default :
+        return selector
+    }
+  }
+}
+
+const createThemeColorReplacerPlugin = () => new ThemeColorReplacer(themePluginOption)
+
+module.exports = createThemeColorReplacerPlugin

+ 115 - 0
upcloud-wms-qingniu-web/config/themePluginConfig.js

@@ -0,0 +1,115 @@
+export default {
+  theme: [
+    {
+      key: 'dark',
+      fileName: 'dark.css',
+      theme: 'dark'
+    },
+    {
+      key: '#F5222D',
+      fileName: '#F5222D.css',
+      modifyVars: {
+        '@primary-color': '#F5222D'
+      }
+    },
+    {
+      key: '#FA541C',
+      fileName: '#FA541C.css',
+      modifyVars: {
+        '@primary-color': '#FA541C'
+      }
+    },
+    {
+      key: '#FAAD14',
+      fileName: '#FAAD14.css',
+      modifyVars: {
+        '@primary-color': '#FAAD14'
+      }
+    },
+    {
+      key: '#13C2C2',
+      fileName: '#13C2C2.css',
+      modifyVars: {
+        '@primary-color': '#13C2C2'
+      }
+    },
+    {
+      key: '#52C41A',
+      fileName: '#52C41A.css',
+      modifyVars: {
+        '@primary-color': '#52C41A'
+      }
+    },
+    {
+      key: '#2F54EB',
+      fileName: '#2F54EB.css',
+      modifyVars: {
+        '@primary-color': '#2F54EB'
+      }
+    },
+    {
+      key: '#722ED1',
+      fileName: '#722ED1.css',
+      modifyVars: {
+        '@primary-color': '#722ED1'
+      }
+    },
+
+    {
+      key: '#F5222D',
+      theme: 'dark',
+      fileName: 'dark-#F5222D.css',
+      modifyVars: {
+        '@primary-color': '#F5222D'
+      }
+    },
+    {
+      key: '#FA541C',
+      theme: 'dark',
+      fileName: 'dark-#FA541C.css',
+      modifyVars: {
+        '@primary-color': '#FA541C'
+      }
+    },
+    {
+      key: '#FAAD14',
+      theme: 'dark',
+      fileName: 'dark-#FAAD14.css',
+      modifyVars: {
+        '@primary-color': '#FAAD14'
+      }
+    },
+    {
+      key: '#13C2C2',
+      theme: 'dark',
+      fileName: 'dark-#13C2C2.css',
+      modifyVars: {
+        '@primary-color': '#13C2C2'
+      }
+    },
+    {
+      key: '#52C41A',
+      theme: 'dark',
+      fileName: 'dark-#52C41A.css',
+      modifyVars: {
+        '@primary-color': '#52C41A'
+      }
+    },
+    {
+      key: '#2F54EB',
+      theme: 'dark',
+      fileName: 'dark-#2F54EB.css',
+      modifyVars: {
+        '@primary-color': '#2F54EB'
+      }
+    },
+    {
+      key: '#722ED1',
+      theme: 'dark',
+      fileName: 'dark-#722ED1.css',
+      modifyVars: {
+        '@primary-color': '#722ED1'
+      }
+    }
+  ]
+}

+ 52 - 0
upcloud-wms-qingniu-web/dataApiToNumScript.js

@@ -0,0 +1,52 @@
+const fs = require("fs");
+
+const asd = /id: (["'][\w\d]+["']),(\n?\s+(.+)){0,2}\n?\s+params:\s/;
+const asdg = /id: ["'][\w\d]+["'],(\n?\s+(.+)){0,2}\n?\s+params:\s/g;
+
+class Main {
+  pathList = [];
+  pathListLength = 0;
+
+  read_dir(path) {
+    this.__read(path);
+    this.handleFile();
+  }
+
+  __read(path) {
+    fs.readdirSync(path).forEach(filename => {
+      let sub_path = path + '/' + filename;
+      let stat = fs.statSync(sub_path);
+      if (stat.isDirectory()) {
+        this.__read(sub_path);
+      } else if (stat.isFile()) {
+        if (!this.pathList.some(tt => tt === sub_path)) {
+          this.pathList.push(sub_path);
+        }
+      }
+    });
+    this.pathListLength = this.pathList.length
+  }
+
+  handleFile() {
+    let path = this.pathList.pop();
+    let content = fs.readFileSync(path, {
+      encoding: 'utf-8',
+    });
+    this.appendProps(path, content);
+    console.log(`正在替换${this.pathListLength - this.pathList.length}/${this.pathListLength}`)
+    if (this.pathList.length > 0) this.handleFile();
+  }
+
+  appendProps(path, content) {
+    if (!asd.test(content)) { return; }
+    let newContent = content.replace(asdg, (substring) => {
+      return substring.replace('id:', "num:");
+    });
+    fs.writeFileSync(path, newContent);
+  }
+
+}
+
+let main = new Main();
+main.read_dir('/Users/mlie/Documents/prolog/upcloud-wms-hnsy-web/src/views/kzyWMS');
+main.read_dir('/Users/mlie/Documents/prolog/upcloud-wms-hnsy-web/src/views/EIS');

+ 4 - 0
upcloud-wms-qingniu-web/deploy.js

@@ -0,0 +1,4 @@
+var tar = require('tar-fs')
+var fs = require('fs')
+
+tar.pack('./dist').pipe(fs.createWriteStream('dist.tar'))

TEMPAT SAMPAH
upcloud-wms-qingniu-web/dist.tar


+ 31 - 0
upcloud-wms-qingniu-web/docs/add-page-loading-animate.md

@@ -0,0 +1,31 @@
+为首屏增加 加载动画
+====
+
+
+
+## 需求
+
+> 为了缓解用户第一次访问时,加载 JS 过大所导致用户等待白屏时间过长导致的用户体验不好,进行的一个优化动效。
+
+
+
+## 实现方案
+
+1. 将 动画加载 dom 元素放在 #app 内,Vue 生命周期开始时,会自动清掉 #app 下的所有元素。
+2. 将 动画加载 dom 元素放在 body 下,Vue 生命周期开始时 App.vue (created, mounted) 调用 `@/utils/utll` 下的 removeLoadingAnimate(#id, timeout) 则会移除加载动画
+
+最后一步:
+​	将样式插入到 `public/index.html` 文件的 `<head></head>` 最好写成内联 `<style>动画样式</style>` 
+
+
+
+----
+
+目前提供有两个样式,均在 `public/loading` 文件夹内。且 pro 已经默认使用了一套 loading 动画方案,可以直接参考 `public/index.html`
+
+
+## 写在最后
+
+目前 pro 有页面 overflow 显示出浏览器滚动条时,页面会抖动一下的问题。
+
+欢迎各位提供能解决的方案和实现 demo。如果在条件允许的情况下,建议请直接使用 pro 进行改造,也欢迎直接 PR 到 pro 的仓库

+ 69 - 0
upcloud-wms-qingniu-web/docs/main.html

@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en" id="plg_app">
+<head>
+  <meta charset="UTF-8">
+  <!--     <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ -->
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+
+  <meta http-equiv="X-UA-Compatible" content="ie=edge">
+  <title>菠菜云运维管理平台</title>
+
+  <link rel="stylesheet" href="./prologui/dist/vendors/layui-master/dist/css/layui.rem.css" />
+  <link rel="stylesheet" href="./prologui/dist/css/prolog.all-0.0.1.css" />
+  <!-- 页面上使用css文件 -->
+  <link rel="stylesheet" href="./styles/dist_css/style.css" />
+  <link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/font_799562_g9fbb4vlkl4.css" />
+
+
+  <script src="./prologui/dist/vendors/jquery/jquery-3.3.1.min.js"></script>
+  <script src="./prologui/dist/vendors/echarts/dist/echarts.js"></script>
+  <script src="./prologui/dist/vendors/layui-master/dist/layui.all.js"></script>
+
+
+  <script src="./prologui/dist/vendors/vipspa-master/build/vipspa.js"></script>
+  <script src="./prologui/dist/vendors/dhtmlx/grid/codebase/dhtmlxgrid.js"></script>
+  <script src="./prologui/dist/vendors/dhtmlx/form/codebase/dhtmlxform.js"></script>
+  <script src="./prologui/dist/vendors/zTree_v3/js/jquery.ztree.core.min.js"></script>
+  <script src="./prologui/dist/js/prolog.min-0.0.1.js"></script>
+  <script src="./javascripts/api/index.js"></script>
+  <script src="./javascripts/util.js"></script>
+  <script src="./javascripts/adminPlant.js"></script>
+  <!-- 国际化插件 -->
+  <script src="./prologui/dist/vendors/jquery-i18next/lib/i18next.min.js"></script>
+  <script src="./prologui/dist/vendors/jquery-i18next/lib/i18nextXHRBackend.js"></script>
+  <script src="./prologui/dist/vendors/jquery-i18next/lib/i18nextBrowserLanguageDetector.js"></script>
+  <script src="./prologui/dist/vendors/jquery-i18next/lib/jquery-i18next.min.js"></script>
+  <script src="./javascripts/language/index.js"></script>
+  <script>
+  window.global_fun={}
+
+  </script>
+  <style>
+    body{
+      padding:0px;
+      background:rgb(240, 242, 245);
+    }
+    .plg-tab-container{padding: 0px;}
+  </style>
+</head>
+
+<body class="layui-layout-admin">
+</body>
+<script>
+  var path = window.location.hash;
+  path='../jq/'+path.substring(1);
+  $.ajax({
+    url:path,
+    type:'GET',
+    dataType:'html',
+    data:{},
+    success:function(data){
+      debugger
+      $("body").html(data);
+    }
+  });
+</script>
+
+
+</html>

+ 38 - 0
upcloud-wms-qingniu-web/docs/webpack-bundle-analyzer.md

@@ -0,0 +1,38 @@
+先增加依赖
+
+```bash
+// npm
+$ npm install --save-dev webpack-bundle-analyzer
+
+// or yarn
+$ yarn add webpack-bundle-analyzer -D
+```
+
+配置文件 `vue.config.js` 增加 `configureWebpack.plugins` 参数
+
+```
+const path = require('path')
+const webpack = require('webpack')
+const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+
+function resolve (dir) {
+  return path.join(__dirname, dir)
+}
+
+// vue.config.js
+module.exports = {
+  configureWebpack: {
+    plugins: [
+      // Ignore all locale files of moment.js
+      new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
+      // 依赖大小分析工具
+      new BundleAnalyzerPlugin(),
+    ]
+  },
+
+
+  ...
+}
+```
+
+启动 `cli` 的 `build` 命令进行项目编译,编译完成时,会自动运行一个 http://localhost:8888 的地址,完整显示了支持库依赖

+ 23 - 0
upcloud-wms-qingniu-web/jest.config.js

@@ -0,0 +1,23 @@
+module.exports = {
+  moduleFileExtensions: [
+    'js',
+    'jsx',
+    'json',
+    'vue'
+  ],
+  transform: {
+    '^.+\\.vue$': 'vue-jest',
+    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
+    '^.+\\.jsx?$': 'babel-jest'
+  },
+  moduleNameMapper: {
+    '^@/(.*)$': '<rootDir>/src/$1'
+  },
+  snapshotSerializers: [
+    'jest-serializer-vue'
+  ],
+  testMatch: [
+    '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
+  ],
+  testURL: 'http://localhost/'
+}

+ 32 - 0
upcloud-wms-qingniu-web/nginxtest.yml

@@ -0,0 +1,32 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+    name: nginxtest-config
+    namespace: kzytest
+data:
+  default.conf: |
+                server {
+                        listen       80;
+                        server_name  localhost;
+                        charset utf-8;
+                        location / {
+                            index index.html;
+                            root /usr/share/nginx/html;   
+                            try_files $uri $uri/ /index.html =404;
+                        }
+
+                        location ^~/japi/ {
+                          proxy_pass   http://192.168.1.88:30022/;
+                        }
+
+                        location ^~/api/ {
+                          proxy_pass  http://192.168.1.88:30022/;
+                          proxy_set_header  X-Real-IP $remote_addr;
+                        }
+
+                        error_page   500 502 503 504  /50x.html;
+                        location = /50x.html {
+                                root   html;
+                        }
+ 
+                }

+ 87 - 0
upcloud-wms-qingniu-web/package.json

@@ -0,0 +1,87 @@
+{
+  "name": "plglib-wms",
+  "version": "1.0.0",
+  "private": true,
+  "scripts": {
+    "serve": "cross-env vue-cli-service serve",
+    "build": "vue-cli-service build && node deploy.js",
+    "test:unit": "vue-cli-service test:unit",
+    "lint": "vue-cli-service lint",
+    "build:preview": "vue-cli-service build --mode preview ",
+    "lint:nofix": "vue-cli-service lint --no-fix",
+    "test:plglib": "vue-cli-service serve --mode plglib",
+    "upplglib": "node updatePlglib",
+    "deploy": "npm run build"
+  },
+  "dependencies": {
+    "ant-design-vue": "^1.7.2",
+    "axios": "^0.19.0",
+    "core-js": "^3.1.2",
+    "echarts": "^5.1.1",
+    "enquire.js": "^2.1.6",
+    "lodash.clonedeep": "^4.5.0",
+    "lodash.difference": "^4.5.0",
+    "lodash.get": "^4.4.2",
+    "lodash.pick": "^4.4.0",
+    "lodash.omit": "^4.5.0",
+    "md5": "^2.2.1",
+    "moment": "^2.24.0",
+    "monaco-editor": "^0.22.3",
+    "nprogress": "^0.2.0",
+    "pinyin-match": "^1.2.1",
+    "plglib": "^2.0.1",
+    "plglib-echarts": "^2.0.1",
+    "quagga": "^0.12.1",
+    "store": "^2.0.12",
+    "v-viewer": "^1.5.1",
+    "viser-vue": "^2.4.6",
+    "vue": "^2.7.0",
+    "vue-baidu-map": "^0.21.22",
+    "vue-clipboard2": "^0.2.1",
+    "vue-container-query": "^0.1.0",
+    "vue-copy-to-clipboard": "^1.0.3",
+    "vue-cropper": "0.4.9",
+    "vue-i18n": "^8.17.4",
+    "vue-json-editor": "^1.4.3",
+    "vue-json-viewer": "^2.2.18",
+    "vue-ls": "^3.2.2",
+    "vue-quill-editor": "^3.0.6",
+    "vue-router": "^3.1.2",
+    "vue-svg-component-runtime": "^1.0.1",
+    "vuedraggable": "^2.24.3",
+    "vuex": "^3.6.2",
+    "wangeditor": "^3.1.1",
+    "plg-platform-setting": "^1.0.2"
+  },
+  "devDependencies": {
+    "@ant-design/colors": "^3.2.1",
+    "@vue/cli-plugin-babel": "^4.0.4",
+    "@vue/cli-plugin-eslint": "^4.0.4",
+    "@vue/cli-plugin-router": "^4.0.4",
+    "@vue/cli-plugin-unit-jest": "^4.0.4",
+    "@vue/cli-plugin-vuex": "^4.0.4",
+    "@vue/cli-service": "^4.0.4",
+    "@vue/eslint-config-standard": "^4.0.0",
+    "@vue/test-utils": "^1.0.0-beta.29",
+    "babel-eslint": "^10.0.1",
+    "babel-plugin-import": "^1.12.2",
+    "babel-plugin-transform-remove-console": "^6.9.4",
+    "cross-env": "^7.0.3",
+    "eslint": "^5.16.0",
+    "eslint-plugin-html": "^5.0.0",
+    "eslint-plugin-vue": "^5.2.3",
+    "git-revision-webpack-plugin": "^3.0.6",
+    "less": "^3.0.4",
+    "less-loader": "^5.0.0",
+    "monaco-editor-webpack-plugin": "^3.1.0",
+    "opencollective": "^1.0.3",
+    "opencollective-postinstall": "^2.0.2",
+    "tar-fs": "^2.1.1",
+    "vue-svg-icon-loader": "^2.1.1",
+    "vue-template-compiler": "^2.7.0",
+    "webpack": "4.46.0",
+    "webpack-bundle-analyzer": "^4.3.0",
+    "webpack-cli": "^4.6.0",
+    "webpack-theme-color-replacer": "^1.3.12"
+  }
+}

+ 10 - 0
upcloud-wms-qingniu-web/pipeline_control.yaml

@@ -0,0 +1,10 @@
+#代码缓存开关 true开 false关
+BUILD_CACHE=true
+#代码编辑开关  ture开  false关
+BUILD_CODE=true
+#代码扫描开关 true扫描 false不扫描
+SONAR_SCAN=false
+#构建镜像开关 true构建 false不构建
+BUILD_IMAGE=true
+#发布开关 true发布 False不发布
+DEPLOY=true

TEMPAT SAMPAH
upcloud-wms-qingniu-web/public/favicon.ico


+ 133 - 0
upcloud-wms-qingniu-web/public/index.html

@@ -0,0 +1,133 @@
+<!DOCTYPE html>
+<html lang="zh-cmn-Hans">
+
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+  <title>login for Upcloud Solution</title>
+  <link rel="stylesheet" href="//at.alicdn.com/t/font_2436719_5x981id8c69.css">
+  <!-- <script type="text/javascript" src="http://api.map.baidu.com/api?v=3.0&ak=vfZgs8WTqtPblvooiR0Qo4Zo2M0qxinS"></script> -->
+  <style>
+    #loading-mask {
+      position: fixed;
+      left: 0;
+      top: 0;
+      height: 100%;
+      width: 100%;
+      background: #fff;
+      user-select: none;
+      z-index: 9999;
+      overflow: hidden;
+    }
+
+    .loading-wrapper {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      transform: translate(-50%, -100%);
+    }
+
+    .loading-dot {
+      animation: antRotate 1.2s infinite linear;
+      transform: rotate(45deg);
+      position: relative;
+      display: inline-block;
+      font-size: 64px;
+      width: 64px;
+      height: 64px;
+      box-sizing: border-box;
+    }
+
+    .loading-dot i {
+      width: 22px;
+      height: 22px;
+      position: absolute;
+      display: block;
+      background-color: #1890ff;
+      border-radius: 100%;
+      transform: scale(0.75);
+      transform-origin: 50% 50%;
+      opacity: 0.3;
+      animation: antSpinMove 1s infinite linear alternate;
+    }
+
+    .loading-dot i:nth-child(1) {
+      top: 0;
+      left: 0;
+    }
+
+    .loading-dot i:nth-child(2) {
+      top: 0;
+      right: 0;
+      -webkit-animation-delay: 0.4s;
+      animation-delay: 0.4s;
+    }
+
+    .loading-dot i:nth-child(3) {
+      right: 0;
+      bottom: 0;
+      -webkit-animation-delay: 0.8s;
+      animation-delay: 0.8s;
+    }
+
+    .loading-dot i:nth-child(4) {
+      bottom: 0;
+      left: 0;
+      -webkit-animation-delay: 1.2s;
+      animation-delay: 1.2s;
+    }
+
+    @keyframes antRotate {
+      to {
+        -webkit-transform: rotate(405deg);
+        transform: rotate(405deg);
+      }
+    }
+
+    @-webkit-keyframes antRotate {
+      to {
+        -webkit-transform: rotate(405deg);
+        transform: rotate(405deg);
+      }
+    }
+
+    @keyframes antSpinMove {
+      to {
+        opacity: 1;
+      }
+    }
+
+    @-webkit-keyframes antSpinMove {
+      to {
+        opacity: 1;
+      }
+    }
+  </style>
+  <!-- require cdn assets css -->
+  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
+    <link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" />
+    <% } %>
+</head>
+
+<body>
+  <noscript>
+    <strong>系统需要脚本支持,请勿限制</strong>
+  </noscript>
+  <div id="app">
+    <div id="loading-mask">
+      <div class="loading-wrapper">
+        <img style="width:60px;" src="<%= BASE_URL %>load.gif" />
+      </div>
+    </div>
+  </div>
+  </div>
+  <!-- require cdn assets js -->
+  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
+    <script type="text/javascript" src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
+    <% } %>
+      <!-- built files will be auto injected -->
+</body>
+
+</html>

TEMPAT SAMPAH
upcloud-wms-qingniu-web/public/load.gif


TEMPAT SAMPAH
upcloud-wms-qingniu-web/public/logo_blue.png


+ 598 - 0
upcloud-wms-qingniu-web/public/printTemplate/acceptanceCheckSheet.grf

@@ -0,0 +1,598 @@
+{
+	"Version":"6.5.0.0",
+	"Font":{
+		"Name":"宋体",
+		"Size":105000,
+		"Weight":400,
+		"Charset":134
+	},
+	"Printer":{
+		"Size":256,
+		"Width":30,
+		"Height":9.3,
+		"LeftMargin":0.5,
+		"TopMargin":0.8,
+		"RightMargin":0.5,
+		"BottomMargin":0.5
+	},
+	"DetailGrid":{
+		"Recordset":{
+			"Field":[
+				{
+					"Name":"oddCaseQty"
+				},
+				{
+					"Name":"pieceQty"
+				},
+				{
+					"Name":"expiredDate"
+				},
+				{
+					"Name":"specification"
+				},
+				{
+					"Name":"oddPieceQty"
+				},
+				{
+					"Name":"conversionRate"
+				},
+				{
+					"Name":"itemNum"
+				},
+				{
+					"Name":"badQty"
+				},
+				{
+					"Name":"manufacturerName"
+				},
+				{
+					"Name":"itemName"
+				},
+				{
+					"Name":"uom"
+				},
+				{
+					"Name":"productionDate"
+				},
+				{
+					"Name":"lpQty"
+				},
+				{
+					"Name":"manufacturerLotNum"
+				}
+			]
+		},
+		"Column":[
+			{
+				"Name":"Column2",
+				"Width":2.77813
+			},
+			{
+				"Name":"Column3",
+				"Width":3.78354
+			},
+			{
+				"Name":"Column4",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column5",
+				"Width":2.61938
+			},
+			{
+				"Name":"Column13",
+				"Width":3.20146
+			},
+			{
+				"Name":"Column6",
+				"Width":1.19063
+			},
+			{
+				"Name":"Column14",
+				"Width":1.21708
+			},
+			{
+				"Name":"Column7",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column9",
+				"Width":2.38125
+			},
+			{
+				"Name":"Column10",
+				"Width":2.40771
+			},
+			{
+				"Name":"Column8",
+				"Width":1.5875
+			},
+			{
+				"Name":"Column11",
+				"Width":1.40229
+			},
+			{
+				"Name":"Column15",
+				"Width":1.40229
+			},
+			{
+				"Name":"Column16",
+				"Width":1.21708
+			}
+		],
+		"ColumnContent":{
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnContentCell":[
+				{
+					"Column":"Column2",
+					"DataField":"itemNum"
+				},
+				{
+					"Column":"Column3",
+					"DataField":"itemName"
+				},
+				{
+					"Column":"Column4",
+					"DataField":"specification"
+				},
+				{
+					"Column":"Column5",
+					"DataField":"manufacturerName"
+				},
+				{
+					"Column":"Column13",
+					"DataField":"manufacturerLotNum"
+				},
+				{
+					"Column":"Column6",
+					"DataField":"oddPieceQty"
+				},
+				{
+					"Column":"Column14",
+					"DataField":"oddCaseQty"
+				},
+				{
+					"Column":"Column7",
+					"DataField":"pieceQty"
+				},
+				{
+					"Column":"Column9",
+					"DataField":"productionDate"
+				},
+				{
+					"Column":"Column10",
+					"DataField":"expiredDate"
+				},
+				{
+					"Column":"Column8",
+					"DataField":"uom"
+				},
+				{
+					"Column":"Column11",
+					"DataField":"conversionRate"
+				},
+				{
+					"Column":"Column15",
+					"DataField":"lpQty"
+				},
+				{
+					"Column":"Column16",
+					"DataField":"badQty"
+				}
+			]
+		},
+		"ColumnTitle":{
+			"Height":0.608542,
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnTitleCell":[
+				{
+					"GroupTitle":false,
+					"Column":"Column2",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品编号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column3",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品名称"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column4",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品规格"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column5",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产厂家"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column13",
+					"TextAlign":"MiddleCenter",
+					"Text":"批号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column6",
+					"TextAlign":"MiddleCenter",
+					"Text":"零散数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column14",
+					"TextAlign":"MiddleCenter",
+					"Text":"整件数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column7",
+					"TextAlign":"MiddleCenter",
+					"Text":"数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column9",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产日期"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column10",
+					"TextAlign":"MiddleCenter",
+					"Text":"有效期至"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column8",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装单位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column11",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column15",
+					"TextAlign":"MiddleCenter",
+					"Text":"合格数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column16",
+					"TextAlign":"MiddleCenter",
+					"Text":"不合格数"
+				}
+			]
+		}
+	},
+	"ReportHeader":[
+		{
+			"Name":"ReportHeader1",
+			"Height":2.98979,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox6",
+					"Left":0.105833,
+					"Top":2.16958,
+					"Width":1.905,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"供应商名称:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"vendorName",
+					"Left":2.01083,
+					"Top":2.16958,
+					"Width":3.70417,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"companyName",
+					"Left":8.59896,
+					"Width":5.3975,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox11",
+					"Left":21.4313,
+					"Top":0.873125,
+					"Width":2,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"打印时间:"
+				},
+				{
+					"Type":"SystemVarBox",
+					"Name":"SystemVarBox2",
+					"Left":23.4421,
+					"Top":0.873125,
+					"Width":3.78354,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Format":"yyyy/MM/dd HH:mm:ss",
+					"SystemVar":"CurrentDateTime"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox24",
+					"Left":7.09083,
+					"Top":2.16958,
+					"Width":2.09021,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"联系人电话:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"vendorPhone",
+					"Left":9.15458,
+					"Top":2.16958,
+					"Width":4.52438,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox34",
+					"Left":7.01146,
+					"Top":0.873125,
+					"Width":2.19604,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"仓库:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"warehouseName",
+					"Left":9.2075,
+					"Top":0.873125,
+					"Width":4.39208,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox35",
+					"Left":21.4313,
+					"Top":2.16958,
+					"Width":1.95792,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"收货人:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"rcvUser",
+					"Left":23.3892,
+					"Top":2.16958,
+					"Width":3.81,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox36",
+					"Left":0.105833,
+					"Top":0.0529167,
+					"Width":1.905,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"备注:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"remark",
+					"Left":2.01083,
+					"Top":0.0529167,
+					"Width":3.70417,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox38",
+					"Left":0.079375,
+					"Top":0.687917,
+					"Width":1.93146,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"单据编号:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"rqcNo",
+					"Left":2.01083,
+					"Top":0.687917,
+					"Width":3.67771,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox40",
+					"Left":13.9965,
+					"Width":5.3975,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"验收单"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox41",
+					"Left":21.4577,
+					"Top":1.53458,
+					"Width":1.93146,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"暂存区:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"preAreaName",
+					"Left":23.3892,
+					"Top":1.53458,
+					"Width":3.81,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"Before",
+			"RepeatOnPage":true
+		}
+	],
+	"ReportFooter":[
+		{
+			"Name":"ReportFooter1",
+			"Height":1.00542,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox22",
+					"Left":21.6165,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"质检员:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"rqcUser",
+					"Left":24.0771,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"After"
+		}
+	]
+}

+ 442 - 0
upcloud-wms-qingniu-web/public/printTemplate/curingSheet.grf

@@ -0,0 +1,442 @@
+{
+	"Version":"6.5.0.0",
+	"Font":{
+		"Name":"宋体",
+		"Size":105000,
+		"Weight":400,
+		"Charset":134
+	},
+	"Printer":{
+		"LeftMargin":0.5,
+		"TopMargin":0.8,
+		"RightMargin":0.5,
+		"BottomMargin":0.5
+	},
+	"DetailGrid":{
+		"Recordset":{
+			"Field":[
+				{
+					"Name":"locatorName"
+				},
+				{
+					"Name":"itemName"
+				},
+				{
+					"Name":"qualityStatus"
+				},
+				{
+					"Name":"manufacturerName"
+				},
+				{
+					"Name":"itemCode"
+				},
+				{
+					"Name":"showProductionDate"
+				},
+				{
+					"Name":"itemHealthCategoryName"
+				},
+				{
+					"Name":"remark"
+				},
+				{
+					"Name":"upkeepQty"
+				},
+				{
+					"Name":"showExpiredDate"
+				},
+				{
+					"Name":"lotNum"
+				}
+			]
+		},
+		"Column":[
+			{
+				"Name":"Column1",
+				"Width":0.978958
+			},
+			{
+				"Name":"Column2",
+				"Width":1.98438
+			},
+			{
+				"Name":"Column3",
+				"Width":2.01083
+			},
+			{
+				"Name":"Column4",
+				"Width":2.01083
+			},
+			{
+				"Name":"Column5",
+				"Width":1.98438
+			},
+			{
+				"Name":"Column6",
+				"Width":1.61396
+			},
+			{
+				"Name":"Column7",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column8",
+				"Width":1.5875
+			},
+			{
+				"Name":"Column9",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column10",
+				"Width":1.61396
+			},
+			{
+				"Name":"Column11",
+				"Width":1.5875
+			},
+			{
+				"Name":"Column12",
+				"Width":1
+			}
+		],
+		"ColumnContent":{
+			"Font":{
+				"Name":"宋体",
+				"Size":90000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnContentCell":[
+				{
+					"Column":"Column1",
+					"FreeCell":true,
+					"Control":[
+						{
+							"Type":"SystemVarBox",
+							"Name":"SystemVarBox12",
+							"Anchor":"[Left|Top|Right|Bottom]",
+							"Dock":"Fill",
+							"Center":"Both",
+							"TextAlign":"MiddleCenter",
+							"SystemVar":"RowNo"
+						}
+					]
+				},
+				{
+					"Column":"Column2",
+					"DataField":"itemCode"
+				},
+				{
+					"Column":"Column3",
+					"DataField":"itemName"
+				},
+				{
+					"Column":"Column4",
+					"DataField":"itemHealthCategoryName"
+				},
+				{
+					"Column":"Column5",
+					"DataField":"locatorName"
+				},
+				{
+					"Column":"Column6",
+					"DataField":"upkeepQty"
+				},
+				{
+					"Column":"Column7",
+					"DataField":"lotNum"
+				},
+				{
+					"Column":"Column8",
+					"DataField":"manufacturerName"
+				},
+				{
+					"Column":"Column9",
+					"DataField":"showProductionDate"
+				},
+				{
+					"Column":"Column10",
+					"DataField":"showExpiredDate"
+				},
+				{
+					"Column":"Column11",
+					"DataField":"qualityStatus"
+				},
+				{
+					"Column":"Column12",
+					"WordWrap":true,
+					"CanGrow":true,
+					"DataField":"remark"
+				}
+			]
+		},
+		"ColumnTitle":{
+			"Height":0.608542,
+			"Font":{
+				"Name":"宋体",
+				"Size":90000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnTitleCell":[
+				{
+					"GroupTitle":false,
+					"Column":"Column1",
+					"TextAlign":"MiddleCenter",
+					"Text":"序号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column2",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品编码"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column3",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品名称"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column4",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品大类"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column5",
+					"TextAlign":"MiddleCenter",
+					"Text":"货位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column6",
+					"TextAlign":"MiddleCenter",
+					"Text":"养护数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column7",
+					"TextAlign":"MiddleCenter",
+					"Text":"批号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column8",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产厂家"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column9",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产日期"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column10",
+					"TextAlign":"MiddleCenter",
+					"Text":"有效期至"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column11",
+					"TextAlign":"MiddleCenter",
+					"Text":"质量状况"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column12",
+					"TextAlign":"MiddleCenter",
+					"Text":"备注"
+				}
+			]
+		}
+	},
+	"ReportHeader":[
+		{
+			"Name":"ReportHeader1",
+			"Height":2.40771,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox6",
+					"Left":0.105833,
+					"Top":1.5875,
+					"Width":1.5875,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"养护单号:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"billNo",
+					"Left":1.69333,
+					"Top":1.5875,
+					"Width":4.02167,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox8",
+					"Left":7.19667,
+					"Top":0.396875,
+					"Width":5.34458,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"养护单"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox11",
+					"Left":14.261,
+					"Top":1.5875,
+					"Width":2,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"打印时间:"
+				},
+				{
+					"Type":"SystemVarBox",
+					"Name":"SystemVarBox2",
+					"Left":16.2719,
+					"Top":1.5875,
+					"Width":3.78354,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Format":"yyyy/MM/dd HH:mm:ss",
+					"SystemVar":"CurrentDateTime"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox24",
+					"Left":10.2658,
+					"Top":1.5875,
+					"Width":1.00542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"货主:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"cargoOwnerName",
+					"Left":11.2448,
+					"Top":1.5875,
+					"Width":2.96333,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox34",
+					"Left":5.82083,
+					"Top":1.5875,
+					"Width":0.873125,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"仓库:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"warehouseName",
+					"Left":6.6675,
+					"Top":1.5875,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"Before",
+			"RepeatOnPage":true
+		}
+	],
+	"ReportFooter":[
+		{
+			"Name":"ReportFooter1",
+			"Height":1.00542,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox22",
+					"Left":13.4673,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"养护员:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"operBy",
+					"Left":15.9279,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"After"
+		}
+	]
+}

+ 489 - 0
upcloud-wms-qingniu-web/public/printTemplate/inventorySheet.grf

@@ -0,0 +1,489 @@
+{
+	"Version":"6.5.0.0",
+	"Font":{
+		"Name":"宋体",
+		"Size":105000,
+		"Weight":400,
+		"Charset":134
+	},
+	"Printer":{
+		"LeftMargin":0.5,
+		"TopMargin":0.8,
+		"RightMargin":0.5,
+		"BottomMargin":0.5
+	},
+	"DetailGrid":{
+		"Recordset":{
+			"Field":[
+				{
+					"Name":"itemCode"
+				},
+				{
+					"Name":"itemName"
+				},
+				{
+					"Name":"itemHealthCategory"
+				},
+				{
+					"Name":"warehouseLocatorCode"
+				},
+				{
+					"Name":"uom"
+				},
+				{
+					"Name":"conversionRate"
+				},
+				{
+					"Name":"pieceQuantityAccount"
+				},
+				{
+					"Name":"manufacturerLotNum"
+				},
+				{
+					"Name":"manufacturerName"
+				},
+				{
+					"Name":"batchProductionDateShow"
+				},
+				{
+					"Name":"batchExpiredDateShow"
+				},
+				{
+					"Name":"stockStatusName"
+				},
+				{
+					"Name":"operBy"
+				}
+			]
+		},
+		"Column":[
+			{
+				"Name":"Column1",
+				"Width":0.978958
+			},
+			{
+				"Name":"Column2",
+				"Width":1.98438
+			},
+			{
+				"Name":"Column3",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column4",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column5",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column13",
+				"Width":1.21708
+			},
+			{
+				"Name":"Column6",
+				"Width":1.19063
+			},
+			{
+				"Name":"Column14",
+				"Width":1.21708
+			},
+			{
+				"Name":"Column7",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column8",
+				"Width":1.5875
+			},
+			{
+				"Name":"Column9",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column10",
+				"Width":1.61396
+			},
+			{
+				"Name":"Column11",
+				"Width":1.19063
+			}
+		],
+		"ColumnContent":{
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnContentCell":[
+				{
+					"Column":"Column1",
+					"FreeCell":true,
+					"Control":[
+						{
+							"Type":"SystemVarBox",
+							"Name":"SystemVarBox12",
+							"Anchor":"[Left|Top|Right|Bottom]",
+							"Dock":"Fill",
+							"Center":"Both",
+							"TextAlign":"MiddleCenter",
+							"SystemVar":"RowNo"
+						}
+					]
+				},
+				{
+					"Column":"Column2",
+					"DataField":"itemCode"
+				},
+				{
+					"Column":"Column3",
+					"DataField":"itemName"
+				},
+				{
+					"Column":"Column4",
+					"DataField":"itemHealthCategory"
+				},
+				{
+					"Column":"Column5",
+					"DataField":"warehouseLocatorCode"
+				},
+				{
+					"Column":"Column13",
+					"DataField":"uom"
+				},
+				{
+					"Column":"Column6",
+					"DataField":"conversionRate"
+				},
+				{
+					"Column":"Column14",
+					"DataField":"pieceQuantityAccount"
+				},
+				{
+					"Column":"Column7",
+					"DataField":"manufacturerLotNum"
+				},
+				{
+					"Column":"Column8",
+					"DataField":"manufacturerName"
+				},
+				{
+					"Column":"Column9",
+					"DataField":"batchProductionDateShow"
+				},
+				{
+					"Column":"Column10",
+					"DataField":"batchExpiredDateShow"
+				},
+				{
+					"Column":"Column11",
+					"DataField":"stockStatusName"
+				}
+			]
+		},
+		"ColumnTitle":{
+			"Height":0.608542,
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnTitleCell":[
+				{
+					"GroupTitle":false,
+					"Column":"Column1",
+					"TextAlign":"MiddleCenter",
+					"Text":"序号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column2",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品编码"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column3",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品名称"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column4",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品大类"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column5",
+					"TextAlign":"MiddleCenter",
+					"Text":"货位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column13",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装单位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column6",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column14",
+					"TextAlign":"MiddleCenter",
+					"Text":"库存数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column7",
+					"TextAlign":"MiddleCenter",
+					"Text":"批号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column8",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产厂家"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column9",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产日期"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column10",
+					"TextAlign":"MiddleCenter",
+					"Text":"有效期至"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column11",
+					"TextAlign":"MiddleCenter",
+					"Text":"质量状况"
+				}
+			]
+		}
+	},
+	"ReportHeader":[
+		{
+			"Name":"ReportHeader1",
+			"Height":3.20146,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox6",
+					"Left":0.105833,
+					"Top":1.5875,
+					"Width":1.5875,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"盘点单号:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"checkHeaderId",
+					"Left":1.69333,
+					"Top":1.5875,
+					"Width":4.02167,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox8",
+					"Left":7.19667,
+					"Top":0.396875,
+					"Width":5.34458,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"盘点单"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox11",
+					"Left":14.261,
+					"Top":1.5875,
+					"Width":2,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"打印时间:"
+				},
+				{
+					"Type":"SystemVarBox",
+					"Name":"SystemVarBox2",
+					"Left":16.2719,
+					"Top":1.5875,
+					"Width":3.78354,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Format":"yyyy/MM/dd HH:mm:ss",
+					"SystemVar":"CurrentDateTime"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox24",
+					"Left":0.105833,
+					"Top":2.24896,
+					"Width":1.00542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"货主:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"cargoOwnerName",
+					"Left":1.08479,
+					"Top":2.24896,
+					"Width":4.52438,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox34",
+					"Left":5.82083,
+					"Top":1.5875,
+					"Width":0.873125,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"仓库:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"warehouseName",
+					"Left":6.6675,
+					"Top":1.5875,
+					"Width":4.33917,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox35",
+					"Left":5.84729,
+					"Top":2.27542,
+					"Width":1.64042,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"盘点方式:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"checkMethodName",
+					"Left":7.46125,
+					"Top":2.27542,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"Before",
+			"RepeatOnPage":true
+		}
+	],
+	"ReportFooter":[
+		{
+			"Name":"ReportFooter1",
+			"Height":1.00542,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox22",
+					"Left":13.4673,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"盘点员:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"operBy",
+					"Left":15.9279,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"After"
+		}
+	]
+}

+ 506 - 0
upcloud-wms-qingniu-web/public/printTemplate/printOnShelf.grf

@@ -0,0 +1,506 @@
+{
+	"Version":"6.5.0.0",
+	"Font":{
+		"Name":"宋体",
+		"Size":105000,
+		"Weight":400,
+		"Charset":134
+	},
+	"Printer":{
+		"Size":256,
+		"Width":30,
+		"Height":9.3,
+		"LeftMargin":0.5,
+		"TopMargin":0.8,
+		"RightMargin":0.5,
+		"BottomMargin":0.5
+	},
+	"DetailGrid":{
+		"Recordset":{
+			"Field":[
+				{
+					"Name":"itemNum"
+				},
+				{
+					"Name":"whAreaName"
+				},
+				{
+					"Name":"itemName"
+				},
+				{
+					"Name":"oddCaseQty"
+				},
+				{
+					"Name":"whLocatorCodeRecommend"
+				},
+				{
+					"Name":"pieceQty"
+				},
+				{
+					"Name":"specification"
+				},
+				{
+					"Name":"manufacturerLotNum"
+				},
+				{
+					"Name":"manufacturerName"
+				},
+				{
+					"Name":"containerCode"
+				},
+				{
+					"Name":"oddPieceQty"
+				},
+				{
+					"Name":"whLocatorCode"
+				}
+			]
+		},
+		"Column":[
+			{
+				"Name":"Column2",
+				"Width":2.77813
+			},
+			{
+				"Name":"Column3",
+				"Width":3.78354
+			},
+			{
+				"Name":"Column4",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column5",
+				"Width":2.61938
+			},
+			{
+				"Name":"Column13",
+				"Width":3.20146
+			},
+			{
+				"Name":"Column6",
+				"Width":1.19063
+			},
+			{
+				"Name":"Column14",
+				"Width":1.21708
+			},
+			{
+				"Name":"Column7",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column9",
+				"Width":2.59292
+			},
+			{
+				"Name":"Column10",
+				"Width":2.59292
+			},
+			{
+				"Name":"Column8",
+				"Width":2.40771
+			},
+			{
+				"Name":"Column11",
+				"Width":3.01625
+			}
+		],
+		"ColumnContent":{
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnContentCell":[
+				{
+					"Column":"Column2",
+					"DataField":"itemNum"
+				},
+				{
+					"Column":"Column3",
+					"DataField":"itemName"
+				},
+				{
+					"Column":"Column4",
+					"DataField":"specification"
+				},
+				{
+					"Column":"Column5",
+					"DataField":"manufacturerName"
+				},
+				{
+					"Column":"Column13",
+					"DataField":"manufacturerLotNum"
+				},
+				{
+					"Column":"Column6",
+					"DataField":"oddPieceQty"
+				},
+				{
+					"Column":"Column14",
+					"DataField":"oddCaseQty"
+				},
+				{
+					"Column":"Column7",
+					"DataField":"pieceQty"
+				},
+				{
+					"Column":"Column9",
+					"DataField":"whLocatorCodeRecommend"
+				},
+				{
+					"Column":"Column10",
+					"DataField":"whLocatorCode"
+				},
+				{
+					"Column":"Column8",
+					"DataField":"containerCode"
+				},
+				{
+					"Column":"Column11",
+					"DataField":"whLocatorCode"
+				}
+			]
+		},
+		"ColumnTitle":{
+			"Height":0.608542,
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnTitleCell":[
+				{
+					"GroupTitle":false,
+					"Column":"Column2",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品编号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column3",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品名称"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column4",
+					"TextAlign":"MiddleCenter",
+					"Text":"计量规格"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column5",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产厂家"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column13",
+					"TextAlign":"MiddleCenter",
+					"Text":"批号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column6",
+					"TextAlign":"MiddleCenter",
+					"Text":"零散数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column14",
+					"TextAlign":"MiddleCenter",
+					"Text":"整件数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column7",
+					"TextAlign":"MiddleCenter",
+					"Text":"数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column9",
+					"TextAlign":"MiddleCenter",
+					"Text":"推荐货位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column10",
+					"TextAlign":"MiddleCenter",
+					"Text":"实际货位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column8",
+					"TextAlign":"MiddleCenter",
+					"Text":"托盘号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column11",
+					"TextAlign":"MiddleCenter",
+					"Text":"库区"
+				}
+			]
+		}
+	},
+	"ReportHeader":[
+		{
+			"Name":"ReportHeader1",
+			"Height":2.98979,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox6",
+					"Left":0.105833,
+					"Top":2.16958,
+					"Width":1.905,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"采购单号:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"poNo",
+					"Left":2.01083,
+					"Top":2.16958,
+					"Width":3.70417,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"companyName",
+					"Left":8.59896,
+					"Width":5.3975,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox11",
+					"Left":21.4313,
+					"Top":0.873125,
+					"Width":2,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"打印时间:"
+				},
+				{
+					"Type":"SystemVarBox",
+					"Name":"SystemVarBox2",
+					"Left":23.4421,
+					"Top":0.873125,
+					"Width":3.78354,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Format":"yyyy/MM/dd HH:mm:ss",
+					"SystemVar":"CurrentDateTime"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox34",
+					"Left":7.01146,
+					"Top":0.873125,
+					"Width":2.19604,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"供应商:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"vendorName",
+					"Left":9.2075,
+					"Top":0.873125,
+					"Width":4.39208,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox38",
+					"Left":0.079375,
+					"Top":0.687917,
+					"Width":1.93146,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"单据编号:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"billNo",
+					"Left":2.01083,
+					"Top":0.687917,
+					"Width":3.67771,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox40",
+					"Left":13.9965,
+					"Width":5.3975,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"上架单"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox41",
+					"Left":21.4577,
+					"Top":1.53458,
+					"Width":1.93146,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"上架时间:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"inStockTime",
+					"Left":23.3892,
+					"Top":1.40229,
+					"Width":3.81,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"Before",
+			"RepeatOnPage":true
+		}
+	],
+	"ReportFooter":[
+		{
+			"Name":"ReportFooter1",
+			"Height":1.00542,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox22",
+					"Left":21.6165,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"质检员:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"operBy",
+					"Left":24.0771,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox43",
+					"Left":0.211667,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"备注:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox44",
+					"Left":2.67229,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"After"
+		}
+	]
+}

+ 564 - 0
upcloud-wms-qingniu-web/public/printTemplate/receiptSheet.grf

@@ -0,0 +1,564 @@
+{
+	"Version":"6.5.0.0",
+	"Font":{
+		"Name":"宋体",
+		"Size":105000,
+		"Weight":400,
+		"Charset":134
+	},
+	"Printer":{
+		"Size":256,
+		"Width":30,
+		"Height":9.3,
+		"LeftMargin":0.5,
+		"TopMargin":0.8,
+		"RightMargin":0.5,
+		"BottomMargin":0.5
+	},
+	"DetailGrid":{
+		"Recordset":{
+			"Field":[
+				{
+					"Name":"itemNum"
+				},
+				{
+					"Name":"itemName"
+				},
+				{
+					"Name":"oddCaseQty"
+				},
+				{
+					"Name":"productionDate"
+				},
+				{
+					"Name":"uom"
+				},
+				{
+					"Name":"pieceQty"
+				},
+				{
+					"Name":"expiredDate"
+				},
+				{
+					"Name":"manufacturerLotNum"
+				},
+				{
+					"Name":"manufacturerName"
+				},
+				{
+					"Name":"specification"
+				},
+				{
+					"Name":"oddPieceQty"
+				},
+				{
+					"Name":"conversionRate"
+				}
+			]
+		},
+		"Column":[
+			{
+				"Name":"Column2",
+				"Width":2.77813
+			},
+			{
+				"Name":"Column3",
+				"Width":3.78354
+			},
+			{
+				"Name":"Column4",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column5",
+				"Width":2.61938
+			},
+			{
+				"Name":"Column13",
+				"Width":3.20146
+			},
+			{
+				"Name":"Column6",
+				"Width":1.19063
+			},
+			{
+				"Name":"Column14",
+				"Width":1.21708
+			},
+			{
+				"Name":"Column7",
+				"Width":1.79917
+			},
+			{
+				"Name":"Column9",
+				"Width":2.59292
+			},
+			{
+				"Name":"Column10",
+				"Width":2.59292
+			},
+			{
+				"Name":"Column8",
+				"Width":2.40771
+			},
+			{
+				"Name":"Column11",
+				"Width":3.01625
+			}
+		],
+		"ColumnContent":{
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnContentCell":[
+				{
+					"Column":"Column2",
+					"DataField":"itemNum"
+				},
+				{
+					"Column":"Column3",
+					"DataField":"itemName"
+				},
+				{
+					"Column":"Column4",
+					"DataField":"specification"
+				},
+				{
+					"Column":"Column5",
+					"DataField":"manufacturerName"
+				},
+				{
+					"Column":"Column13",
+					"DataField":"manufacturerLotNum"
+				},
+				{
+					"Column":"Column6",
+					"DataField":"oddPieceQty"
+				},
+				{
+					"Column":"Column14",
+					"DataField":"oddCaseQty"
+				},
+				{
+					"Column":"Column7",
+					"DataField":"pieceQty"
+				},
+				{
+					"Column":"Column9",
+					"DataField":"productionDate"
+				},
+				{
+					"Column":"Column10",
+					"DataField":"expiredDate"
+				},
+				{
+					"Column":"Column8",
+					"DataField":"uom"
+				},
+				{
+					"Column":"Column11",
+					"DataField":"conversionRate"
+				}
+			]
+		},
+		"ColumnTitle":{
+			"Height":0.608542,
+			"Font":{
+				"Name":"宋体",
+				"Size":75000,
+				"Weight":400,
+				"Charset":134
+			},
+			"ColumnTitleCell":[
+				{
+					"GroupTitle":false,
+					"Column":"Column2",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品编号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column3",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品名称"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column4",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品规格"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column5",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产厂家"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column13",
+					"TextAlign":"MiddleCenter",
+					"Text":"批号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column6",
+					"TextAlign":"MiddleCenter",
+					"Text":"零散数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column14",
+					"TextAlign":"MiddleCenter",
+					"Text":"整件数"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column7",
+					"TextAlign":"MiddleCenter",
+					"Text":"数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column9",
+					"TextAlign":"MiddleCenter",
+					"Text":"生产日期"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column10",
+					"TextAlign":"MiddleCenter",
+					"Text":"有效期至"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column8",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装单位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column11",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装数"
+				}
+			]
+		}
+	},
+	"ReportHeader":[
+		{
+			"Name":"ReportHeader1",
+			"Height":2.98979,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox6",
+					"Left":0.105833,
+					"Top":1.79917,
+					"Width":1.905,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"供应商名称:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"vendorName",
+					"Left":2.01083,
+					"Top":1.79917,
+					"Width":3.70417,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"companyName",
+					"Left":8.59896,
+					"Width":5.3975,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox11",
+					"Left":21.4313,
+					"Top":0.873125,
+					"Width":2,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"打印时间:"
+				},
+				{
+					"Type":"SystemVarBox",
+					"Name":"SystemVarBox2",
+					"Left":23.4421,
+					"Top":0.873125,
+					"Width":3.78354,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Format":"yyyy/MM/dd HH:mm:ss",
+					"SystemVar":"CurrentDateTime"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox34",
+					"Left":7.01146,
+					"Top":0.873125,
+					"Width":2.19604,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"仓库:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"warehouseName",
+					"Left":9.2075,
+					"Top":0.873125,
+					"Width":4.39208,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox38",
+					"Left":0.079375,
+					"Top":0.873125,
+					"Width":1.93146,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"收货单号:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"rcvNo",
+					"Left":2.01083,
+					"Top":0.873125,
+					"Width":3.67771,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox40",
+					"Left":13.9965,
+					"Width":5.3975,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"收货单"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox41",
+					"Left":21.4048,
+					"Top":1.77271,
+					"Width":1.98438,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"联系人电话:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"vendorPhone",
+					"Left":23.3892,
+					"Top":1.77271,
+					"Width":3.81,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox45",
+					"Left":0.211667,
+					"Top":0.185208,
+					"Width":1.79917,
+					"Height":0.608542,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"备注:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"remark",
+					"Left":2.01083,
+					"Top":0.185208,
+					"Width":3.78354,
+					"Height":0.582083,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"Before",
+			"RepeatOnPage":true
+		}
+	],
+	"ReportFooter":[
+		{
+			"Name":"ReportFooter1",
+			"Height":1.00542,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox22",
+					"Left":21.6165,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"录单人:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"operaterUser",
+					"Left":24.0771,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox43",
+					"Left":0.211667,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"收货人:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"rcvUser",
+					"Left":2.67229,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox47",
+					"Left":11.3242,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"供应商签字:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox48",
+					"Left":13.7848,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"After"
+		}
+	]
+}

+ 366 - 0
upcloud-wms-qingniu-web/public/printTemplate/shiftSheet.grf

@@ -0,0 +1,366 @@
+{
+	"Version":"6.5.0.0",
+	"Font":{
+		"Name":"宋体",
+		"Size":105000,
+		"Weight":400,
+		"Charset":134
+	},
+	"Printer":{
+		"LeftMargin":0.5,
+		"TopMargin":0.8,
+		"RightMargin":0.5,
+		"BottomMargin":0.5
+	},
+	"DetailGrid":{
+		"Recordset":{
+			"Field":[
+				{
+					"Name":"itemCode"
+				},
+				{
+					"Name":"itemName"
+				},
+				{
+					"Name":"uom"
+				},
+				{
+					"Name":"caseConversionRate"
+				},
+				{
+					"Name":"oddPieceQuantity"
+				},
+				{
+					"Name":"outWarehouseAreaCategory"
+				},
+				{
+					"Name":"inWarehouseAreaCategory"
+				},
+				{
+					"Name":"outLocatorCode"
+				},
+				{
+					"Name":"inLocatorCode"
+				}
+			]
+		},
+		"Column":[
+			{
+				"Name":"Column1",
+				"Width":0.978958
+			},
+			{
+				"Name":"Column2",
+				"Width":2.40771
+			},
+			{
+				"Name":"Column3",
+				"Width":2.59292
+			},
+			{
+				"Name":"Column4",
+				"Width":2.01083
+			},
+			{
+				"Name":"Column5",
+				"Width":1.98438
+			},
+			{
+				"Name":"Column6",
+				"Width":1.61396
+			},
+			{
+				"Name":"Column7",
+				"Width":2.38125
+			},
+			{
+				"Name":"Column8",
+				"Width":2.19604
+			},
+			{
+				"Name":"Column9",
+				"Width":2.01083
+			},
+			{
+				"Name":"Column10",
+				"Width":1.79917
+			}
+		],
+		"ColumnContent":{
+			"Height":0.608542,
+			"ColumnContentCell":[
+				{
+					"Column":"Column1",
+					"FreeCell":true,
+					"Control":[
+						{
+							"Type":"SystemVarBox",
+							"Name":"SystemVarBox12",
+							"Anchor":"[Left|Top|Right|Bottom]",
+							"Dock":"Fill",
+							"Center":"Both",
+							"TextAlign":"MiddleCenter",
+							"SystemVar":"RowNo"
+						}
+					]
+				},
+				{
+					"Column":"Column2",
+					"DataField":"itemCode"
+				},
+				{
+					"Column":"Column3",
+					"DataField":"itemName"
+				},
+				{
+					"Column":"Column4",
+					"DataField":"uom"
+				},
+				{
+					"Column":"Column5",
+					"DataField":"caseConversionRate"
+				},
+				{
+					"Column":"Column6",
+					"DataField":"oddPieceQuantity"
+				},
+				{
+					"Column":"Column7",
+					"DataField":"outWarehouseAreaCategory"
+				},
+				{
+					"Column":"Column8",
+					"DataField":"inWarehouseAreaCategory"
+				},
+				{
+					"Column":"Column9",
+					"DataField":"outLocatorCode"
+				},
+				{
+					"Column":"Column10",
+					"DataField":"inLocatorCode"
+				}
+			]
+		},
+		"ColumnTitle":{
+			"Height":0.608542,
+			"ColumnTitleCell":[
+				{
+					"GroupTitle":false,
+					"Column":"Column1",
+					"TextAlign":"MiddleCenter",
+					"Text":"序号"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column2",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品编码"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column3",
+					"TextAlign":"MiddleCenter",
+					"Text":"商品名称"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column4",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装单位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column5",
+					"TextAlign":"MiddleCenter",
+					"Text":"包装数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column6",
+					"TextAlign":"MiddleCenter",
+					"Text":"数量"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column7",
+					"TextAlign":"MiddleCenter",
+					"Text":"原区域"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column8",
+					"TextAlign":"MiddleCenter",
+					"Text":"目标区域"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column9",
+					"TextAlign":"MiddleCenter",
+					"Text":"移除货位"
+				},
+				{
+					"GroupTitle":false,
+					"Column":"Column10",
+					"TextAlign":"MiddleCenter",
+					"Text":"移入货位"
+				}
+			]
+		}
+	},
+	"ReportHeader":[
+		{
+			"Name":"ReportHeader1",
+			"Height":2.40771,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox8",
+					"Left":7.19667,
+					"Top":0.396875,
+					"Width":5.34458,
+					"Height":0.8,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":180000,
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"移位单"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox11",
+					"Left":14.261,
+					"Top":1.5875,
+					"Width":2,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"打印时间:"
+				},
+				{
+					"Type":"SystemVarBox",
+					"Name":"SystemVarBox2",
+					"Left":16.2719,
+					"Top":1.5875,
+					"Width":3.78354,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Format":"yyyy/MM/dd HH:mm:ss",
+					"SystemVar":"CurrentDateTime"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox24",
+					"Left":4.52438,
+					"Top":1.5875,
+					"Width":1.00542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"货主:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"cargoOwnerName",
+					"Left":5.50333,
+					"Top":1.5875,
+					"Width":2.96333,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox34",
+					"Left":0.079375,
+					"Top":1.5875,
+					"Width":0.873125,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleRight",
+					"Text":"仓库:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"warehouseName",
+					"Left":0.926042,
+					"Top":1.5875,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"Before",
+			"RepeatOnPage":true
+		}
+	],
+	"ReportFooter":[
+		{
+			"Name":"ReportFooter1",
+			"Height":1.00542,
+			"Control":[
+				{
+					"Type":"StaticBox",
+					"Name":"StaticBox22",
+					"Left":13.4673,
+					"Top":0.211667,
+					"Width":2.5,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Bold":true,
+						"Charset":134
+					},
+					"TextAlign":"MiddleCenter",
+					"Text":"操作员:"
+				},
+				{
+					"Type":"StaticBox",
+					"Name":"operBy",
+					"Left":15.9279,
+					"Top":0.211667,
+					"Width":3.54542,
+					"Height":0.6,
+					"Font":{
+						"Name":"微软雅黑",
+						"Size":105000,
+						"Weight":400,
+						"Charset":134
+					}
+				}
+			],
+			"NewPage":"After"
+		}
+	]
+}

+ 40 - 0
upcloud-wms-qingniu-web/public/scanBatch.html

@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+	<head>
+		<meta charset="utf-8">
+		<style>
+			html,body { width: 100%; height: 100%; overflow: hidden; margin: 0; padding: 0; }
+			textarea {
+				    width: 99%;
+				    height: 99%;
+				    margin: 0;
+				    padding:10px;
+					box-sizing: border-box;
+					border: 1px solid #dcdfe6;
+			}
+		</style>
+		<title></title>
+	</head>
+	<body>
+		<textarea id="scanVal" onkeydown="myFunction(event)"  placeholder="请扫描单个或多个监管码"></textarea>
+	</body>
+	<script type="text/javascript">
+		// 自动聚焦
+		document.getElementById("scanVal").focus();
+		
+		function myFunction(event){
+			var x = event.keyCode;
+			    if (x == 13) {  // 13 是 回车 键
+			        console.log ("你按下了回车键!");
+					
+			  window.parent.postMessage({  //参数是对象
+					   cmd: '***',
+					   params: {
+						 success: true              
+					   }
+				   }, '*');
+			    }
+		}
+		
+	</script>
+</html>

TEMPAT SAMPAH
upcloud-wms-qingniu-web/public/期初库存导入模板.xlsx


+ 11 - 0
upcloud-wms-qingniu-web/sh.exe.stackdump

@@ -0,0 +1,11 @@
+Stack trace:
+Frame        Function    Args
+00000010002  0018006021E (00180241C10, 001802340B9, 00000010002, 000FFFFBA40)
+00000010002  00180048859 (00000000001, 00180328B20, 00000000001, 00180328B20)
+00000010002  00180048892 (00000000001, 00180328E30, 00000010002, 00000000008)
+00000010002  001800598BC (001800C0322, 00000000000, 00000000000, 00000000000)
+000FFFFCCD0  0018005994E (000FFFFCDF0, 000FFFFCCD0, FFFFFFFFFFFFFFD8, 00000000000)
+000FFFFCCD0  00180048FE1 (00000000000, 00000000000, 00000000000, 00000000000)
+00000000000  00180047963 (00000000000, 00000000000, 00000000000, 00000000000)
+000FFFFFFF0  00180047A14 (00000000000, 00000000000, 00000000000, 00000000000)
+End of stack trace

+ 36 - 0
upcloud-wms-qingniu-web/src/App.vue

@@ -0,0 +1,36 @@
+<template>
+  <a-config-provider :locale="locale">
+    <div id="app">
+      <router-view />
+    </div>
+  </a-config-provider>
+</template>
+
+<script>
+import { domTitle, setDocumentTitle } from '@/utils/domUtil'
+import { i18nRender } from '@/locales'
+import zhCN from '@/locales/lang/zh-CN'
+import enUS from '@/locales/lang/en-US'
+
+export default {
+  data() {
+    return {}
+  },
+  mounted(){
+
+      //document.body.style.zoom =1.2
+
+  },
+  computed: {
+    locale() {
+      // 只是为了切换语言时,更新标题
+      const { title } = this.$route.meta
+      title && setDocumentTitle(`${i18nRender(title)} - ${domTitle}`)
+      const { lang } = this.$store.getters
+      const antLocale = require(`@/locales/lang/${lang}`).default.antLocale
+
+      return antLocale
+    },
+  },
+}
+</script>

+ 73 - 0
upcloud-wms-qingniu-web/src/api/index.js

@@ -0,0 +1,73 @@
+const powerService = '/api/service-platform-power-base'
+const filePropsBaseUrl = '/api/service-filemanagement'
+const oms = '/api/upcloud-base-chain'
+
+import { ACCESS_TOKEN } from '@/store/mutation-types'
+import Vue from 'vue'
+
+const api = {
+  //'/api/auth/login'
+  Login: '/api/auth/login',
+  Logout: '/api/auth/logout',
+  ForgePassword: '/api/auth/forge-password',
+  Register: '/api/auth/register',
+  SendSms: '/api/account/sms',
+  SendSmsErr: '/api/account/sms_err',
+  // get my info
+  UserInfo: powerService + '/user/info',
+  PlatformSettings: {
+    baseUrl: powerService
+  },
+  //图片文件上传接口
+  fileProps: {
+    baseUrl: filePropsBaseUrl,
+    uploadFile: filePropsBaseUrl + '/file/uploadfile',
+    /**获取文件图片 */
+    getImages(id) {
+      const token = Vue.ls.get(ACCESS_TOKEN)
+      return filePropsBaseUrl + '/file/view/' + id + '?access_token=' + token
+    }
+  },
+  enterprise: {
+    baseUrl: powerService,
+    list: powerService + '/enterprise/search',
+    pwdReset: '/api/service-platform-power-base/userpower/updatePassword' // 企业用户密码重置
+  },
+  //仓配物流基础
+  warehouseBase: {
+    baseUrl: '/api/upcloud-wms-base'
+  },
+  // 获取商品资料 品类
+  goods: {
+    detail: '/api/upcloud-base-item/item/master/info',
+    category: '/api/upcloud-base-item/item/category/query',
+    levelAdd: '/api/upcloud-base-item/item/category/add',
+    levelEdit: '/api/upcloud-base-item/item/category/edit',
+    levelDel: '/api/upcloud-base-item/item/category/del',
+
+    dataAdd: '/api/upcloud-base-item/item/master/add', // 新增商品资料
+    dataEdit: '/api/upcloud-base-item/item/master/edit' // 修改商品资料
+  },
+  // 供应商
+  supplier: {
+    add: '/api/upcloud-base-chain/suppliermst/add', // 新增供应商
+    edit: '/api/upcloud-base-chain/suppliermst/update', // 修改供应商
+    detail: '/api/upcloud-base-chain/suppliermst' // 获取供应商详情
+  },
+  // 客户
+  customer: {
+    add: '/api/upcloud-base-chain/customermst/add', // 新增客户
+    edit: '/api/upcloud-base-chain/customermst/update', // 修改客户
+    detail: '/api/upcloud-base-chain/customermst' // 获取供应商详情
+  },
+  // 货主
+  shipper: {
+    add: '/api/upcloud-base-chain/cargoownermst/add', // 新增货主
+    edit: '/api/upcloud-base-chain/cargoownermst/update', // 修改客户
+    detail: '/api/upcloud-base-chain/cargoownermst' // 获取供应商详情
+  },
+  OMS: {
+    baseUrl: oms
+  }
+}
+export default api

+ 19 - 0
upcloud-wms-qingniu-web/src/api/lang.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+const langApi = {
+  lang: '/api/service-internationalize-platform/pageLanguage/internationalize'
+}
+
+/**
+ * login func
+ * @param parameter
+ * @returns {*}
+ */
+export function loadLangData(parameter) {
+  return request({
+    url: langApi.lang,
+    method: 'get',
+    params: parameter
+  })
+}

+ 91 - 0
upcloud-wms-qingniu-web/src/api/login.js

@@ -0,0 +1,91 @@
+import request from '@/utils/request'
+import qs from 'qs'
+const powerService = '/api/service-platform-power-base'
+
+const userApi = {
+  Login: '/api/auth/login',
+  Logout: '/api/auth/logout',
+  UserMenu: '/api/user/nav',
+  //UserInfo: powerService + '/user/info',
+  UserInfo: '/api/user/info',
+  Renew: '/api/token/refresh',
+  UpdateUserInfo: powerService + '/userpower/updatePassword'
+}
+
+/**
+ * login func
+ * parameter: {
+ *     username: '',
+ *     password: '',
+ *     remember_me: true,
+ *     captcha: '12345'
+ * }
+ * @param parameter
+ * @returns {*}
+ */
+export function login(parameter) {
+  return request({
+    url: userApi.Login,
+    method: 'post',
+    data: qs.stringify(parameter),
+    headers: {
+      'content-type': 'application/x-www-form-urlencoded'
+    }
+  })
+}
+
+export function getInfo() {
+  return request({
+    url: userApi.UserInfo,
+    method: 'get',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+/**
+ * token 续订
+ */
+export function tokenRenew() {
+  return request({
+    url: userApi.Renew,
+    method: 'get'
+  })
+}
+
+export function getSmsCaptcha(parameter) {
+  return axios({
+    url: api.SendSms,
+    method: 'post',
+    data: parameter
+  })
+}
+
+export function getCurrentUserNav() {
+  return request({
+    url: userApi.UserMenu,
+    method: 'get'
+  })
+}
+
+export function logout() {
+  return request({
+    url: userApi.Logout,
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    }
+  })
+}
+
+export function setUserInfo(parameter) {
+  return request({
+    url: userApi.UpdateUserInfo,
+    method: 'post',
+    data: qs.stringify(parameter),
+    headers: {
+      'content-type': 'application/x-www-form-urlencoded'
+    }
+  })
+}

+ 70 - 0
upcloud-wms-qingniu-web/src/api/manage.js

@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+
+const api = {
+  user: '/user',
+  role: '/role',
+  service: '/service',
+  permission: '/permission',
+  permissionNoPager: '/permission/no-pager',
+  orgTree: '/org/tree'
+}
+
+export default api
+
+export function getUserList (parameter) {
+  return request({
+    url: api.user,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getRoleList (parameter) {
+  return request({
+    url: api.role,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getServiceList (parameter) {
+  return request({
+    url: api.service,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getPermissions (parameter) {
+  return request({
+    url: api.permissionNoPager,
+    method: 'get',
+    params: parameter
+  })
+}
+
+export function getOrgTree (parameter) {
+  return request({
+    url: api.orgTree,
+    method: 'get',
+    params: parameter
+  })
+}
+
+// id == 0 add     post
+// id != 0 update  put
+export function saveService (parameter) {
+  return request({
+    url: api.service,
+    method: parameter.id === 0 ? 'post' : 'put',
+    data: parameter
+  })
+}
+
+export function saveSub (sub) {
+  return request({
+    url: '/sub',
+    method: sub.id === 0 ? 'post' : 'put',
+    data: sub
+  })
+}

TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/20230223154621.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/Shape.png


File diff ditekan karena terlalu besar
+ 8 - 0
upcloud-wms-qingniu-web/src/assets/WechatIMG196.svg


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/bgoms.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/code_plg.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/head-top.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it01.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it02.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it03.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it04.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it05.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it06.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/it07.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/login_bg.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/login_bg_n.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/oms-center.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/oms-left.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/order.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/person.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/slogn_blue.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/slogn_white.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/admin/systeminfo.png


+ 69 - 0
upcloud-wms-qingniu-web/src/assets/background.svg

@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
+    <title>Group 21</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
+            <g id="Group-21" transform="translate(77.000000, 73.000000)">
+                <g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
+                    <ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
+                    <ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
+                    <path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
+                    <path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
+                    <path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
+                    <path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
+                    <g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
+                        <ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
+                        <path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
+                    </g>
+                </g>
+                <g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
+                    <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
+                    <ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
+                    <ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
+                    <ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
+                    <path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
+                    <g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
+                        <ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
+                        <path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
+                    </g>
+                    <ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
+                    <ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
+                    <ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
+                    <path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
+                </g>
+                <g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
+                    <ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
+                    <g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
+                        <ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
+                        <path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
+                    </g>
+                    <path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
+                    <ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
+                    <ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
+                    <path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
+                </g>
+                <g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
+                    <g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
+                        <circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
+                        <path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
+                    </g>
+                    <circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
+                    <path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
+                    <path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
+                    <polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
+                    <path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
+                    <path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
+                    <path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
+                    <circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
+                    <circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
+                    <circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
+                    <circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
+                    <circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/check-circle-o.png


+ 12 - 0
upcloud-wms-qingniu-web/src/assets/css/font.less

@@ -0,0 +1,12 @@
+@font-face {
+    font-family: plgFont1;
+    src: url("../font/Montserrat-SemiBold.otf");
+     font-weight: bold;
+  }
+
+  @font-face {
+    font-family: alibabaPHFont1;
+    src: url("../font/Alibaba-PuHuiTi-Regular.otf");
+     font-weight: bold;
+  }
+  

+ 93 - 0
upcloud-wms-qingniu-web/src/assets/css/reset.less

@@ -0,0 +1,93 @@
+.min-line {
+  .ant-form-item {
+    margin-bottom: 0;
+  }
+}
+.ant-modal-confirm .ant-modal-body {
+  padding: 24px @modal-body-padding @modal-body-padding;
+}
+
+.ant-modal-close-x {
+  line-height: 46px;
+  height: 46px;
+}
+
+.ant-modal-header {
+  padding: @drawer-header-padding;
+}
+
+.ant-tabs,
+.ant-tabs-nav-container,
+.ant-menu-vertical .ant-menu-item,
+.ant-menu-vertical-left .ant-menu-item,
+.ant-menu-vertical-right .ant-menu-item,
+.ant-menu-inline .ant-menu-item,
+.ant-menu-vertical .ant-menu-submenu-title,
+.ant-menu-vertical-left .ant-menu-submenu-title,
+.ant-menu-vertical-right .ant-menu-submenu-title,
+.ant-menu-inline .ant-menu-submenu-title {
+  font-size: 14px;
+}
+
+.mb-20 {
+  margin-bottom: 20px;
+}
+.mb-15 {
+  margin-bottom: 15px;
+}
+.mb-10 {
+  margin-bottom: 10px;
+}
+.mb-5 {
+  margin-bottom: 5px;
+}
+
+.mr-20 {
+  margin-right: 20px;
+}
+.mr-15 {
+  margin-right: 15px;
+}
+.mr-10 {
+  margin-right: 10px;
+}
+.mr-5 {
+  margin-right: 5px;
+}
+.ant-input-clear-icon {
+  color: rgba(0, 0, 0, 0.4)!important;
+}
+.pointer {
+  cursor: pointer;
+}
+
+.text-nowrap {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.f-12 {
+  font-size: 12px;
+}
+.f-14 {
+  font-size: 14px;
+}
+.contnet_load {
+  position: absolute;
+  z-index: 2;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  background: rgba(255, 255, 255, 0.6);
+  img {
+    margin-top: 33%;
+  }
+}
+.delete {
+  color: red;
+  &:active,
+  &:hover {
+    color: rgba(red, 0.5);
+  }
+}

TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/default_user_icon.jpg


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/enterprise.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/font/Alibaba-PuHuiTi-Regular.otf


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/font/Montserrat-SemiBold.otf


+ 1 - 0
upcloud-wms-qingniu-web/src/assets/icons/bx-analyse.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1551058675966" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7872" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M85.333333 512h85.333334a340.736 340.736 0 0 1 99.712-241.621333 337.493333 337.493333 0 0 1 108.458666-72.96 346.453333 346.453333 0 0 1 261.546667-1.749334A106.154667 106.154667 0 0 0 746.666667 298.666667C805.802667 298.666667 853.333333 251.136 853.333333 192S805.802667 85.333333 746.666667 85.333333c-29.397333 0-55.978667 11.776-75.221334 30.933334-103.722667-41.514667-222.848-40.874667-325.76 2.517333a423.594667 423.594667 0 0 0-135.68 91.264 423.253333 423.253333 0 0 0-91.306666 135.637333A426.88 426.88 0 0 0 85.333333 512z m741.248 133.205333c-17.109333 40.618667-41.685333 77.141333-72.96 108.416s-67.797333 55.850667-108.458666 72.96a346.453333 346.453333 0 0 1-261.546667 1.749334A106.154667 106.154667 0 0 0 277.333333 725.333333C218.197333 725.333333 170.666667 772.864 170.666667 832S218.197333 938.666667 277.333333 938.666667c29.397333 0 55.978667-11.776 75.221334-30.933334A425.173333 425.173333 0 0 0 512 938.666667a425.941333 425.941333 0 0 0 393.258667-260.352A426.325333 426.325333 0 0 0 938.666667 512h-85.333334a341.034667 341.034667 0 0 1-26.752 133.205333z" p-id="7873"></path><path d="M512 318.378667c-106.752 0-193.621333 86.869333-193.621333 193.621333S405.248 705.621333 512 705.621333s193.621333-86.869333 193.621333-193.621333S618.752 318.378667 512 318.378667z m0 301.909333c-59.690667 0-108.288-48.597333-108.288-108.288S452.309333 403.712 512 403.712s108.288 48.597333 108.288 108.288-48.597333 108.288-108.288 108.288z" p-id="7874"></path></svg>

TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/ill_log_in_2.png


File diff ditekan karena terlalu besar
+ 13 - 0
upcloud-wms-qingniu-web/src/assets/ill_log_in_2.svg


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/logo.png


+ 10 - 0
upcloud-wms-qingniu-web/src/assets/logo.svg

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="120px" height="84px" viewBox="0 0 120 84" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <g id="UPCloud-logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g>
+            <path d="M92.4719239,16.0069621 L112.369956,27.6141472 C116.910017,30.2625163 119.701746,35.1230206 119.701746,40.3790661 L119.701746,68.8360085 C119.701746,76.9976689 113.085413,83.6140019 104.923753,83.6140019 L63.5453715,83.6140019 C56.382868,83.6140019 50.4104911,78.5184643 49.0555483,71.7546967 C52.8083067,74.4202435 57.4267299,75.9883264 62.4043102,75.9883264 C74.8641496,75.9883264 85.0735212,66.1627658 85.0735212,53.9024573 L85.0735212,53.9024573 L85.0735212,37.3423344 C85.0735212,35.1478255 83.2945202,33.3688245 81.1000112,33.3688245 L81.1000112,33.3688245 L70.7688854,33.3688245 L70.7688854,53.9024573 L70.7677134,54.033209 C70.6928018,58.2100387 67.0357139,61.6836906 62.4043102,61.6836906 C57.7246628,61.6836906 54.0397351,58.1372941 54.0397351,53.9024573 L54.0397351,53.9024573 L54.0397351,33.3688245 L50.5363344,33.3680583 C51.8051151,31.0139933 53.7100741,29.0077858 56.0991688,27.6141472 L75.9972005,16.0069621 C81.0874031,13.0376772 87.3817212,13.0376772 92.4719239,16.0069621 Z" id="形状结合" fill="#007AFF"></path>
+            <path d="M44.9167012,3.11724906 L64.6983112,17.1292228 C68.6096689,19.8997678 70.9343681,24.3952404 70.9343681,29.1884271 L70.934,33.3685887 L70.7688854,33.3688245 L70.7688854,53.9024573 L70.7677134,54.033209 C70.6928018,58.2100387 67.0357139,61.6836906 62.4043102,61.6836906 C57.7246628,61.6836906 54.0397351,58.1372941 54.0397351,53.9024573 L54.0397351,53.9024573 L54.0397351,33.3688245 L43.7086093,33.3688245 C41.5141003,33.3688245 39.7350993,35.1478255 39.7350993,37.3423344 L39.7350993,37.3423344 L39.7350993,53.9024573 L39.7381542,54.2695288 C39.8445421,60.6566637 42.7224548,66.3574263 47.2328726,70.3140979 L14.7779934,70.3138079 C6.61633299,70.3138079 2.84766359e-15,63.6974749 0,55.5358145 L0,29.1884271 C4.74207444e-15,24.3952404 2.32469924,19.8997678 6.23605694,17.1292228 L26.0176669,3.11724906 C31.6791452,-0.892964715 39.255223,-0.892964715 44.9167012,3.11724906 Z" id="形状结合" fill="#FAD20C"></path>
+        </g>
+    </g>
+</svg>

+ 18 - 0
upcloud-wms-qingniu-web/src/assets/logo2.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="29px" height="30px" viewBox="0 0 29 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <title>UPCloud solution  logo</title>
+    <desc>Created with Sketch.</desc>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="菜单" transform="translate(-25.000000, -17.000000)" fill="#FFFFFF">
+            <g id="编组" transform="translate(25.000000, 17.000000)">
+                <path d="M15.5755845,0.396892077 L27.3302501,7.84365796 C28.0696645,8.31208862 28.5177866,9.12646036 28.5177866,10.0017665 L28.5177866,22.9393389 C28.5177866,24.3502785 27.373994,25.4940711 25.9630543,25.4940711 L2.55473227,25.4940711 C1.1437926,25.4940711 6.16879485e-16,24.3502785 0,22.9393389 L0,9.99586607 C-5.5088882e-16,9.12378107 0.44485349,8.31194186 1.17988575,7.84262339 L12.8335422,0.40175798 C13.6691793,-0.131796739 14.738059,-0.133693524 15.5755845,0.396892077 Z M3.25672804,9.29707437 L3.22387486,9.29665422 C2.51437376,9.29665422 1.93920949,9.8718185 1.93920949,10.5813196 L1.93920949,10.5813196 L1.93920949,22.9397835 C1.93920949,23.4364343 2.34182448,23.8390492 2.83847525,23.8390492 L2.83847525,23.8390492 L26.1185419,23.8390492 C26.2622691,23.8390492 26.4035631,23.8019514 26.528752,23.7313454 C26.9304445,23.5047926 27.0724233,22.9954992 26.8458706,22.5938067 L26.8458706,22.5938067 L23.6864579,16.9919669 C21.2819804,12.7286751 16.8622119,9.99321246 11.974008,9.7429515 L11.974008,9.7429515 L3.28955973,9.29833455 C3.26768268,9.29721451 3.24578056,9.29665422 3.22387486,9.29665422 Z" id="形状结合"></path>
+                <path d="M16.0355877,25.4940711 L12.600776,25.4940711 C11.7648462,25.4940711 11.0869565,24.825348 11.0869565,24.0007218 L11.0869565,23.8339921 L17.5494071,23.8339921 L17.5494071,24.0007218 C17.5494071,24.825348 16.8715174,25.4940711 16.0355877,25.4940711" id="Fill-3备份-3"></path>
+                <path d="M10.1976285,26.916996 C10.1976285,26.4585779 10.5692498,26.0869565 11.027668,26.0869565 L17.6679842,26.0869565 C18.1264024,26.0869565 18.4980237,26.4585779 18.4980237,26.916996 C18.4980237,27.3754142 18.1264024,27.7470356 17.6679842,27.7470356 L11.027668,27.7470356 C10.5692498,27.7470356 10.1976285,27.3754142 10.1976285,26.916996 Z" id="Fill-5备份-3"></path>
+                <path d="M11.2648221,29.1699605 C11.2648221,28.7115423 11.6364435,28.3399209 12.0948617,28.3399209 L16.3636364,28.3399209 C16.8220545,28.3399209 17.1936759,28.7115423 17.1936759,29.1699605 C17.1936759,29.6283786 16.8220545,30 16.3636364,30 L12.0948617,30 C11.6364435,30 11.2648221,29.6283786 11.2648221,29.1699605 Z" id="Fill-5备份-4"></path>
+                <path d="M16.4936116,22.6482213 C16.1800755,22.6482213 15.8767714,22.4799633 15.718907,22.1849656 C15.4912462,21.7588577 15.6531302,21.2293184 16.0806795,21.0024251 C17.3677123,20.3191956 18.1672659,18.9622058 18.1672659,17.4606307 C18.1672659,15.2696348 16.4541456,13.4872655 14.3478261,13.4872655 C12.241872,13.4872655 10.5287517,15.2696348 10.5287517,17.4606307 C10.5287517,18.8718855 11.2585088,20.1899065 12.4337211,20.8997221 C12.8477495,21.149924 12.980034,21.6874755 12.7289858,22.1001082 C12.4779377,22.5127409 11.9385679,22.6445794 11.524174,22.3943776 C9.82822872,21.3698976 8.77470356,19.4789982 8.77470356,17.4606307 C8.77470356,14.3059754 11.274953,11.7391304 14.3478261,11.7391304 C17.4210646,11.7391304 19.9209486,14.3059754 19.9209486,17.4606307 C19.9209486,19.60938 18.7654694,21.5578221 16.9050821,22.5455184 C16.7738939,22.6150796 16.6328392,22.6482213 16.4936116,22.6482213" id="Fill-9备份-3"></path>
+                <path d="M12.0224217,17.4901186 C11.7021187,17.4901186 11.4426877,17.2269219 11.4426877,16.9019695 C11.4426877,15.5264358 12.6188231,14.4071146 14.0645348,14.4071146 C14.3848378,14.4071146 14.6442688,14.6703113 14.6442688,14.9948961 C14.6442688,15.3198485 14.3848378,15.5830452 14.0645348,15.5830452 C13.2579798,15.5830452 12.6021558,16.1748702 12.6021558,16.9019695 C12.6021558,17.2269219 12.3423625,17.4901186 12.0224217,17.4901186" id="Fill-11备份-3"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 18 - 0
upcloud-wms-qingniu-web/src/assets/logo3.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="250px" height="250px" viewBox="0 0 250 250" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 62 (91390) - https://sketch.com -->
+    <title>upcloud</title>
+    <desc>Created with Sketch.</desc>
+    <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="画板备份-11" transform="translate(-109.000000, -2016.000000)">
+            <g id="编组-7" transform="translate(109.000000, 2016.000000)">
+                <g id="编组-2备份">
+                    <g id="编组">
+                        <path d="M25,0 C38.6690476,0 49.775881,10.9701429 49.9966507,24.5865793 L50,25 L50,125.445302 C50,149.500777 61.3079695,170.911388 78.8933331,184.64648 L40.3339002,217.446524 C16.0061792,195.027189 0.593044594,163.073628 0.0167455195,127.513221 L0,125.445302 L0,25 C0,11.1928813 11.1928813,0 25,0 Z M225,0 C238.669048,0 249.775881,10.9701429 249.996651,24.5865793 L250,25 L250,125.445302 C250,161.598766 234.664417,194.170325 210.145215,217.002687 L171.626865,184.236484 C188.613821,170.726697 199.612239,149.999309 199.989951,126.686559 L200,125.445302 L200,25 C200,11.1928813 211.192881,0 225,0 Z" id="形状结合" fill="#FFFFFF" fill-rule="nonzero"></path>
+                        <path d="M125,175.5 L183,223.890655 L164.906152,227.2773 L164.726027,244.010136 C151.484018,248.003379 138.242009,250 125,250 C111.757991,250 98.5159817,248.003379 85.2739726,244.010136 L85.2739726,227.2773 L67,223.890655 L125,175.5 Z" id="矩形" fill="#FF553D"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/noAuthorized.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/noAuthorized_bg.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/provided.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/provided_w.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/queren.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/search.png


TEMPAT SAMPAH
upcloud-wms-qingniu-web/src/assets/suoqu.png


File diff ditekan karena terlalu besar
+ 9 - 0
upcloud-wms-qingniu-web/src/assets/title.svg


+ 173 - 0
upcloud-wms-qingniu-web/src/blocks/CascaderZone/index.js

@@ -0,0 +1,173 @@
+import { Cascader, Icon } from 'ant-design-vue'
+// console.log(Cascader.props)
+export default {
+  name: 'pCascaderZone',
+  //extends: Cascader,
+  props: {
+    ...Cascader.props,
+    url: { type: String, default: '/api/oms-std-maindata/zone/get-by-pid' },
+    placeholder: { type: String, default: '省/市/区/乡(镇)街道' },
+    method: { type: String, default: 'post' },
+    paramKey: { type: String, default: 'fatherid' },
+    baseId: { type: String, default: '01' },
+    paramValue: { type: String | Array },
+    fieldNames: {
+      type: Object,
+      default() {
+        return { label: 'zname', value: 'zoneid', children: 'children' }
+      }
+    }
+  },
+
+  data() {
+    return {
+      vOptions: this.options,
+      vParams: { [this.paramKey]: this.paramValue },
+      inputValue: this.value,
+      ext: true,
+      loading: false,
+      visible: false
+    }
+  },
+
+  created() {},
+  watch: {
+    paramValue(v) {
+      this.getTreeList && this.getTreeList([this.baseId, ...v])
+    },
+    options(value) {
+      this.vOptions = value
+    }
+  },
+  mounted() {
+    if (this.paramValue && this.options.length == 0) {
+      this.getTreeList([this.baseId, ...this.paramValue])
+    } else if (this.options.length == 0) {
+      this.getTreeList([this.baseId])
+    }
+  },
+  methods: {
+    resultTreeNodes(data, key) {
+      let map = {}
+      data.forEach(item => {
+        delete item.children
+        map[item[key]] = item
+      })
+      let value = []
+      data.forEach(item => {
+        var p = map[item[this.paramKey]]
+        if (p) {
+          if (!p.children) {
+            p.children = []
+          }
+          p.children.push(item)
+        } else {
+          if (item[this.paramKey] == this.baseId) {
+            value.push(item)
+          }
+        }
+      }, this)
+      return value
+    },
+    getTreeList(params) {
+      this.getZone({ [this.paramKey]: params.join(',') }).then(data => {
+        this.vOptions = this.resultTreeNodes(data, this.fieldNames.value)
+      })
+    },
+
+    getZone(params) {
+      let _this = this
+
+      const { url, method } = this
+      let config = {
+        url,
+        method
+      }
+
+      if (method == 'post') {
+        config.data = params
+      } else if (method == 'get') {
+        config.params = params
+      }
+      this.loading = true
+      return this.axios(config)
+        .then(respose => {
+          this.loading = false
+          if (respose.success) {
+            respose.data.forEach(item => {
+              if (item.zlevel < 5) {
+                item.isLeaf = false
+              } else {
+                item.isLeaf = true
+              }
+            })
+            return respose.data
+          } else {
+            _this.$error({ content: respose.message })
+          }
+        })
+        .catch(err => {
+          _this.$error({ content: JSON.stringify(err) })
+        })
+    },
+    handleLoadData(selectedOptions) {
+      let targetOption = null
+      if (selectedOptions.length > 0) {
+        targetOption = selectedOptions[selectedOptions.length - 1]
+        targetOption.loading = true
+        this.vParams = { [this.paramKey]: targetOption[this.fieldNames.value] }
+      }
+
+      return this.getZone(this.vParams).then(data => {
+        if (targetOption && selectedOptions.length > 0) {
+          targetOption.loading = false
+          targetOption.children = data
+          this.vOptions = [...this.vOptions]
+        } else {
+          this.vOptions = data
+        }
+        this.$emit('loadData', this.vOptions)
+      })
+    },
+    onChange(...args) {
+      this.$emit('change', args)
+    },
+
+    onPopupVisibleChange(open) {
+      if (this.disabled) return
+      this.visible = open
+      this.$emit('popupVisibleChange', this.visible)
+    }
+  },
+  render(h) {
+    const { fieldNames, placeholder, value, disabled } = this.$props
+    let config = {
+      props: {
+        ...this.$props,
+        disabled,
+        options: this.vOptions,
+        placeholder,
+        fieldNames,
+        changeOnSelect: true,
+        value,
+        popupVisible: this.visible,
+        loadData: this.handleLoadData
+      },
+      scopedSlots: {
+        suffixIcon: () => {
+          return this._c(Icon, {
+            props: {
+              type: this.loading ? 'loading' : this.visible ? 'up' : 'down'
+            }
+          })
+        }
+      },
+      on: {
+        change: this.onChange,
+        popupVisibleChange: this.onPopupVisibleChange
+      }
+    }
+
+    return h(Cascader, config)
+  }
+}

+ 221 - 0
upcloud-wms-qingniu-web/src/blocks/CascaderZone/index.search.js

@@ -0,0 +1,221 @@
+import { Cascader, Icon } from 'ant-design-vue'
+import Vue from 'vue'
+const PinyinMatch = require('pinyin-match').default
+
+export default {
+  name: 'pCascaderZone',
+  //extends: Cascader,
+  props: {
+    ...Cascader.props,
+    url: { type: String, default: '/api/oms-std-maindata/zone/get-by-pid' },
+    placeholder: { type: String, default: '省/市/区/乡(镇)街道' },
+    method: { type: String, default: 'post' },
+    paramKey: { type: String, default: 'fatherid' },
+    baseId: { type: String, default: '01' },
+    paramValue: { type: String | Array },
+    fieldNames: {
+      type: Object,
+      default() {
+        return { label: 'zname', value: 'zoneid', children: 'children' }
+      }
+    }
+  },
+  data() {
+    return {
+      vOptions: this.options,
+      vParams: { [this.paramKey]: this.paramValue },
+      inputValue: this.value,
+      ext: true,
+      loading: false,
+      visible: false,
+      menusVNode: null
+    }
+  },
+  created() {},
+  watch: {
+    paramValue(v) {
+      if (!this.disabled) {
+        this.getTreeList && this.getTreeList([this.baseId, ...v])
+      }
+    },
+    options(value) {
+      this.vOptions = value
+    }
+  },
+  mounted() {
+    if (this.paramValue && this.options.length == 0) {
+      this.getTreeList([this.baseId, ...this.paramValue])
+    } else if (this.options.length == 0) {
+      this.getTreeList([this.baseId])
+    }
+  },
+  methods: {
+    resultTreeNodes(data, key) {
+      let map = {}
+      data.forEach(item => {
+        delete item.children
+        map[item[key]] = item
+      })
+      let value = []
+      data.forEach(item => {
+        var p = map[item[this.paramKey]]
+        if (p) {
+          if (!p.children) {
+            p.children = []
+          }
+          p.children.push(item)
+        } else {
+          if (item[this.paramKey] == this.baseId) {
+            value.push(item)
+          }
+        }
+      }, this)
+
+      this.resetOption = () => {
+        let value = [...value]
+        return value
+      }
+      return value
+    },
+    getTreeList(params) {
+      this.getZone({ [this.paramKey]: params.join(',') }).then(data => {
+        this.vOptions = this.resultTreeNodes(data, this.fieldNames.value)
+      })
+    },
+
+    getZone(params) {
+      let _this = this
+      const { url, method } = this
+      let config = {
+        url,
+        method
+      }
+      if (method == 'post') {
+        config.data = params
+      } else if (method == 'get') {
+        config.params = params
+      }
+      this.loading = true
+      return this.axios(config)
+        .then(respose => {
+          this.loading = false
+          if (respose.success) {
+            respose.data.forEach(item => {
+              if (item.zlevel < 5) {
+                item.isLeaf = false
+              } else {
+                item.isLeaf = true
+              }
+            })
+            return respose.data
+          } else {
+            _this.$error({ content: respose.message })
+          }
+        })
+        .catch(err => {
+          _this.$error({ content: JSON.stringify(err) })
+        })
+    },
+    handleLoadData(selectedOptions) {
+      let targetOption = null
+      if (selectedOptions.length > 0) {
+        targetOption = selectedOptions[selectedOptions.length - 1]
+        targetOption.loading = true
+        this.vParams = { [this.paramKey]: targetOption[this.fieldNames.value] }
+      }
+
+      return this.getZone(this.vParams)
+        .then(data => {
+          if (targetOption && selectedOptions.length > 0) {
+            targetOption.loading = false
+            targetOption.children = data
+            this.vOptions = [...this.vOptions]
+          } else {
+            this.vOptions = data
+          }
+          this.$emit('loadData', this.vOptions)
+        })
+        .then(() => {
+          this.$nextTick(() => {
+            this.renderSearchInput()
+          })
+        })
+    },
+    onChange(...args) {
+      this.$emit('change', args)
+      this.renderSearchInput()
+    },
+    renderSearchInput() {
+      if (this.menusVNode) {
+        let ele = this.menusVNode.$el.querySelector('.ant-cascader-menus-content')
+        Array.prototype.slice.call(ele.children).forEach(eleChild => {
+          if (!eleChild.querySelector('input')) {
+            let MyComponent = Vue.extend({
+              render(h) {
+                return h('p-input')
+              }
+            })
+            MyComponent = new MyComponent().$mount()
+            eleChild.insertBefore(MyComponent.$el, eleChild.firstElementChild)
+          }
+        })
+      }
+    },
+    onPopupVisibleChange(open) {
+      this.visible = open
+      if (open && !this.menusVNode) {
+        this.$nextTick(() => {
+          this.menusVNode = this.$children[0].$children[0].$children[0].$children[0].$children[2].$children[0].$children[0]
+          this.renderSearchInput()
+        })
+      }
+
+      this.$emit('popupVisibleChange', this.visible)
+    },
+    onSearch(inputValue) {
+      let path = [...this.vOptions]
+      let filterMenus = path.filter(option => {
+        let pingying = PinyinMatch.match(option[this.fieldNames.label], inputValue)
+        if (pingying && pingying.length > 0) {
+          return option
+        }
+      }, this)
+      this.vOptions = [...this.vOptions]
+    },
+
+    resetOption() {
+      return []
+    }
+  },
+  render(h) {
+    const { fieldNames, placeholder, value } = this.$props
+    let config = {
+      props: {
+        ...this.$props,
+        options: this.vOptions,
+        placeholder,
+        fieldNames,
+        changeOnSelect: true,
+        value,
+        popupVisible: this.visible,
+        loadData: this.handleLoadData,
+        showSearch: false
+      },
+      scopedSlots: {
+        suffixIcon: () => {
+          return this._c(Icon, {
+            props: {
+              type: this.loading ? 'loading' : this.visible ? 'up' : 'down'
+            }
+          })
+        }
+      },
+      on: {
+        change: this.onChange,
+        popupVisibleChange: this.onPopupVisibleChange
+      }
+    }
+
+    return h(Cascader, config)
+  }
+}

+ 60 - 0
upcloud-wms-qingniu-web/src/blocks/CascaderZone/wms.index.js

@@ -0,0 +1,60 @@
+import pCascaderZone from './index'
+
+export default {
+  name: 'pCascaderZoneWms',
+  mixins: [pCascaderZone],
+  props: {
+    url: { type: String, default: '/api/upcloud-base-common/region/children2' },
+    placeholder: { type: String, default: '省/市/区' },
+    method: { type: String, default: 'get' },
+    paramKey: { type: String, default: 'fatherName' },
+    paramValue: { type: String | Array },
+    baseId: { type: String, default: '中国' },
+    fieldNames: {
+      type: Object,
+      default() {
+        return { label: 'regionsName', value: 'regionsName', children: 'children' }
+      }
+    }
+  },
+
+  methods: {
+    getZone(params) {
+      let _this = this
+      const { url, method } = this
+      if (this.disabled || !url) return
+
+      let config = {
+        url,
+        method
+      }
+      if (method == 'post') {
+        config.data = params
+      } else if (method == 'get') {
+        config.params = params
+      }
+      this.loading = true
+      return this.axios(config)
+        .then(respose => {
+          this.loading = false
+          if (respose.success) {
+            respose.data.forEach(item => {
+              if (item.levelId < 3) {
+                item.isLeaf = false
+              } else {
+                item.isLeaf = true
+              }
+            })
+            return respose.data
+          } else {
+            _this.$error({ content: respose.message })
+          }
+        })
+        .catch(err => {
+          this.loading = false
+
+          //   _this.$error({ content: JSON.stringify(err) })
+        })
+    }
+  }
+}

+ 29 - 0
upcloud-wms-qingniu-web/src/blocks/ImgsUpload/api.js

@@ -0,0 +1,29 @@
+import request from '@/utils/request'
+import qs from 'qs'
+
+const api = {
+  queryItem: '/api/oms-std-maindata/sysFile/querySysPicture',
+
+  uploadItem: '/api/oms-std-business/biz-file/upload'
+}
+
+export function queryList(parameter) {
+  return request({
+    url: api.queryItem,
+    method: 'post',
+    data: parameter
+  })
+}
+
+export function uploadItem(parameter) {
+  return request({
+    url: api.uploadItem,
+    method: 'post',
+    header: {
+      'Content-Type': 'application/x-www-form-urlencoded'
+    },
+    // data: qs.stringify(parameter)
+    data: parameter,
+    timeout: 36000000
+  })
+}

+ 100 - 0
upcloud-wms-qingniu-web/src/blocks/ImgsUpload/index.vue

@@ -0,0 +1,100 @@
+<template>
+  <p-modal :title="isView?$lang('查看图片'):$lang('上传图片')"
+           :visible="value"
+           :width="isView?580:900"
+           :confirm-loading="confirmLoading"
+           @ok="handleOk"
+           @cancel="handleCancel">
+    <div class="box"
+         v-if="value">
+      <div class="box-left">
+        <p-view ref="view"
+                :uploadId="id" />
+      </div>
+      <div v-if="!isView"
+           class="box-right">
+        <p-upload :uploadId="id"
+                  @uploadEnd="uploadEnd" />
+      </div>
+    </div>
+  </p-modal>
+</template>
+
+<script>
+import PUpload from "./upload";
+import PView from "./view";
+
+export default {
+
+  components: {
+    'p-upload': PUpload,
+    'p-view': PView
+  },
+
+  props: {
+    value: {
+      type: Boolean,
+      default: false
+    },
+    id: {
+      type: String,
+      default: ''//1000000035
+    },
+    isView: {
+      type: Boolean,
+      default: false
+    }
+  },
+
+  data() {
+    return {
+      confirmLoading: false,
+    }
+  },
+
+  methods: {
+
+    uploadEnd() {
+      this.$refs.view.queryList();
+    },
+
+    handleOk(e) {
+      this.$emit('completed')
+      this.handleCancel();
+    },
+    handleCancel(e) {
+      this.$emit('input', false)
+      this.confirmLoading = false;
+    },
+
+  }
+
+}
+</script>
+
+<style scoped>
+.box {
+  overflow: hidden;
+  height: 50vh;
+}
+.box > div {
+  padding: 10px 15px;
+  height: 100%;
+  overflow: hidden;
+  box-sizing: border-box;
+  background: #f7f7f7;
+}
+.box > div > h2 {
+  margin-bottom: 20px;
+  font-size: 14px;
+  color: #333333;
+}
+.box-left {
+  float: left;
+  width: 550px;
+}
+.box-right {
+  float: right;
+  width: calc(100% - 560px);
+}
+</style>

+ 165 - 0
upcloud-wms-qingniu-web/src/blocks/ImgsUpload/upload.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="upload">
+    <h2 style="margin-bottom:20px;font-size:14px;color:#333333;">
+      {{$lang('上传')}}
+    </h2>
+    <div class="upload-list">
+      <div v-for="item of fileList"
+           :key="item.uid"
+           class="img-item">
+        <a-avatar :size="38"
+                  :src="item.url"
+                  shape="square" />
+        <span>{{item.name}}</span>
+        <a-icon type="delete"
+                @click="handleRemove(item)" />
+      </div>
+
+      <a-upload name="file"
+                style="width:100%;display:block;"
+                listType="picture"
+                :accept="accept"
+                :file-list="[]"
+                :multiple="true"
+                :before-upload="beforeUpload"
+                @change="fileChange">
+        <p-button style="width:270px;"
+                  type="dashed">
+          <a-icon type="plus" />添加
+        </p-button>
+      </a-upload>
+    </div>
+
+    <p-button type="primary"
+              class="btn"
+              :loading="confirmLoading"
+              @click="handleOk">上传图片</p-button>
+
+  </div>
+</template>
+
+<script>
+import { uploadItem } from "./api";
+
+function getFileURL(file) {
+  let getUrl = null;
+  if (window.createObjectURL !== undefined) { // basic
+    getUrl = window.createObjectURL(file);
+  } else if (window.URL !== undefined) { // mozilla(firefox)
+    getUrl = window.URL.createObjectURL(file);
+  } else if (window.webkitURL !== undefined) { // webkit or chrome
+    getUrl = window.webkitURL.createObjectURL(file);
+  }
+  return getUrl;
+}
+
+export default {
+
+  props: {
+    uploadId: {
+      type: String,
+      default: ''
+    },
+    accept: {
+      type: String,
+      default: '.jpg,.png'
+    },
+  },
+
+  data() {
+    return {
+      fileList: [],
+      confirmLoading: false,
+    };
+  },
+
+  methods: {
+
+    beforeUpload(file) {
+      file.url = getFileURL(file);
+      this.fileList = [...this.fileList, file];
+      // console.log(this.fileList)
+      return false;
+    },
+
+    handleRemove(file) {
+      const index = this.fileList.indexOf(file);
+      const newFileList = this.fileList.slice();
+      newFileList.splice(index, 1);
+      this.fileList = newFileList;
+    },
+
+    handleOk() {
+      if (this.fileList.length === 0) {
+        this.error = '请选择上传文件';
+        return;
+      }
+      const enterpriseId = this.$store.state.user.info.enterpriseId;
+      let uploadList = [];
+      this.fileList.forEach(file => {
+        let formData = new FormData();
+        formData.append('files', file)
+        formData.append('bizId', this.uploadId)
+        formData.append('bizType', 0)
+        formData.append('enterpriseid', enterpriseId)
+        uploadList.push(uploadItem(formData));
+      });
+      this.confirmLoading = true;
+      Promise.all(uploadList).then(res => {
+        this.fileList = [];
+        this.uploadEnd(res);
+      });
+    },
+
+    uploadEnd(resList) {
+      this.confirmLoading = false;
+      let errItem = resList.find(tt => !tt.success);
+      if (errItem) {
+        this.error = errItem.message;
+      }
+      this.$emit('uploadEnd');
+    },
+
+    fileChange() {
+      this.error = '';
+    },
+
+  }
+
+}
+</script>
+
+<style scoped>
+.upload {
+  position: relative;
+  height: 100%;
+}
+.upload-list {
+  height: calc(100% - 80px);
+  padding-right: 10px;
+  overflow-y: auto;
+}
+.btn {
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+}
+.img-item {
+  padding: 4px;
+  margin-bottom: 8px;
+  border: 1px solid #e5e5e5;
+  background: #fff;
+  overflow: hidden;
+}
+.img-item span {
+  padding-left: 10px;
+  color: #333;
+}
+.img-item i {
+  margin-top: 12px;
+  float: right;
+  font-size: 16px;
+  color: #666;
+  cursor: pointer;
+}
+</style>

+ 166 - 0
upcloud-wms-qingniu-web/src/blocks/ImgsUpload/view.vue

@@ -0,0 +1,166 @@
+<template>
+  <div style="height: 100%;overflow-y: auto;">
+
+    <h2 style="margin-bottom:20px;font-size:14px;color:#333333;">
+      {{$lang('图片')}}
+    </h2>
+
+    <viewer :options="opts"
+            :images="fileList.map(t => t.fileUrl)"
+            class="viewer"
+            @inited="inited"
+            ref="viewer">
+      <template slot-scope="scope">
+        <div class="img-list"
+             ref="imglist">
+          <div v-for="(item,i) of fileList"
+               :key="i"
+               class="img-item">
+            <a-avatar :size="90"
+                      :src="item.fileUrl"
+                      shape="square" />
+            <div class="img-item-ops">
+              <div>
+                <a-icon type="eye"
+                        @click="toView(i)" />
+              </div>
+            </div>
+          </div>
+        </div>
+      </template>
+    </viewer>
+
+    <!-- <div class="img-list"
+         ref="imglist">
+      <div v-for="(item,i) of fileList"
+           :key="i"
+           class="img-item">
+        <a-avatar :size="90"
+                  :src="item.fileUrl"
+                  shape="square" />
+        <div class="img-item-ops">
+          <div>
+            <a-icon type="eye"
+                    @click="toView(i)" />
+            <a-icon type="printer" />
+            <a-icon type="delete" />
+          </div>
+        </div>
+      </div>
+    </div> -->
+
+  </div>
+</template>
+
+<script>
+import 'viewerjs/dist/viewer.css'
+import Viewer from "v-viewer"
+//import Viewer from "v-viewer/src/component.vue"
+import { queryList } from "./api";
+
+export default {
+  components: {
+    viewer: Viewer
+  },
+
+  props: {
+    uploadId: {
+      type: String,
+      default: ''
+    },
+  },
+
+  data() {
+    return {
+      fileList: [],
+      opts: {
+        "inline": false, "button": true,
+        "navbar": false, "title": false,
+        "toolbar": true, "tooltip": false,
+        "movable": false, "zoomable": true,
+        "rotatable": false, "scalable": false,
+        "transition": true, "fullscreen": true,
+        "keyboard": false,
+        // "url": "data-source"
+      }
+    };
+  },
+
+  created() {
+    this.queryList();
+  },
+
+  methods: {
+
+    queryList() {
+      queryList({
+        bizId: this.uploadId,
+        bizType: 0,
+        enterpriseid: this.$store.state.user.info.enterpriseId,
+      }).then(res => {
+        if (!res.success) {
+          this.$message.error(res.message)
+          return
+        }
+        this.fileList = res.data;
+      });
+    },
+
+    inited(viewer) {
+      this.$viewer = viewer
+    },
+
+    toView(i) {
+      console.log(this.$viewer)
+      this.$viewer.show();
+    },
+
+  },
+
+}
+</script>
+
+<style scoped>
+.img-list {
+  display: flex;
+  flex-wrap: wrap;
+}
+.img-item {
+  position: relative;
+  flex: 0 0 90px;
+  border: 1px solid #dfdfdf;
+  margin-right: 10px;
+  margin-bottom: 10px;
+}
+.img-item:nth-child(5n) {
+  margin-right: 0px;
+}
+.img-item-ops {
+  display: none;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.4);
+}
+.img-item-ops > div {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 26px;
+  line-height: 26px;
+  background: rgba(0, 0, 0, 0.5);
+  text-align: center;
+}
+.img-item-ops > div > i {
+  margin: 0px 10px 0;
+  font-size: 14px;
+  color: #fff;
+  cursor: pointer;
+}
+.img-item:hover .img-item-ops {
+  display: block;
+}
+</style>

+ 110 - 0
upcloud-wms-qingniu-web/src/blocks/PictureView/PictureView.vue

@@ -0,0 +1,110 @@
+<template>
+  <p-card>
+    <div slot="title" style="display: flex; align-items: center; cursor: pointer" @click="backPage('back')">
+      <a-icon type="arrow-left" style="color: #1990ff" class="mr-10" />
+      {{title}}
+    </div>
+    <p-table-edit
+      :row-select-type="1"
+      dragging
+      :rowSelectType="false"
+      ref="cardTable"
+      :bordered="true"
+      rowKey="id"
+      auto-width
+      :remoteUrl="remoteUrl"
+      :remoteData="remoteUrl.params"
+      :editor-row-table="false"
+      :data-source="list"
+      :columns="columns"
+    >
+      <span slot="action" slot-scope="text, record">
+        <div style="display: flex">
+          <div>
+            <a @click="upLoadChange(text, record)" style="margin-right: 10px">上传</a>
+            <imgsUpload v-model="isUpload" :id="uploadId" :isView="lookats"></imgsUpload>
+          </div>
+          <div>
+            <a @click="grid2Main03Table_checkClick(text, record)">查看</a>
+          </div>
+        </div>
+      </span>
+    </p-table-edit>
+  </p-card>
+</template>
+<script>
+import imgsUpload from '@/blocks/ImgsUpload/index'
+
+export default {
+  components: { imgsUpload },
+  props: {
+    pUrl: {
+      type: String,
+      default: '/api/oms-std-maindata/pubCertificate/pubCertificateQuery/v1.0'
+    },
+    params: {
+      type: Object,
+      default() {
+        return {}
+      }
+    },
+    columns: {
+      type: Array,
+      default() {
+        return []
+      }
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      remoteUrl: {
+        url: this.pUrl,
+        params: this.params,
+        headers: {
+          'Content-Type': 'application/JSON'
+        },
+        method: 'post',
+        timeout: 30000,
+      },
+      isUpload: false,
+      lookats: false,
+      uploadId: '',
+      list: []
+    }
+  },
+  created() {},
+  watch: {
+    // params: {
+    //   handler(newVal, oldVal) {
+    //   },
+    //   deep: true,
+    //   immediate: true
+    // },
+  },
+  computed: {},
+  methods: {
+    upLoadChange(text, record) {
+      this.uploadId = record.id
+      this.isUpload = true
+      this.lookats = false
+    },
+    grid2Main03Table_checkClick(text, record) {
+      this.uploadId = record.id
+      this.isUpload = true
+      this.lookats = true
+    },
+    backPage() {
+      this.$emit('back')
+    }
+  }
+}
+</script>
+<style lang="less">
+.ant-upload-list-text {
+  display: none;
+}
+</style>

+ 5 - 0
upcloud-wms-qingniu-web/src/blocks/PictureView/index.js

@@ -0,0 +1,5 @@
+import PictureView from "./PictureView.vue";
+
+export default [
+  PictureView
+];

+ 47 - 0
upcloud-wms-qingniu-web/src/blocks/SwitchValue.vue

@@ -0,0 +1,47 @@
+<template>
+  <a-switch :checked='replacechecked'
+            :disabled="disabled"
+            @change="change"></a-switch>
+</template>
+<script>
+export default {
+  name: 'SwitchValue',
+  props: {
+    value: {},
+    checked: {},
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    defaultvalue: {
+      type: Object,
+      default() {
+        return {
+          on: 1,
+          off: 0
+        }
+      }
+    }
+
+
+  },
+  computed: {
+    replacechecked() {
+      return this.value === this.defaultvalue.on ? true : false
+    }
+  },
+  data() {
+    return {
+    }
+  },
+  mounted() { },
+  methods: {
+    change(checked) {
+      this.$emit('change', checked ? this.defaultvalue.on : this.defaultvalue.off)
+      this.$emit('input', checked ? this.defaultvalue.on : this.defaultvalue.off)
+    },
+  }
+}
+</script>
+<style lang='less'>
+</style>

+ 5 - 0
upcloud-wms-qingniu-web/src/blocks/index.js

@@ -0,0 +1,5 @@
+import SwitchValue from "./SwitchValue.vue";
+
+export default [
+  SwitchValue
+];

+ 89 - 0
upcloud-wms-qingniu-web/src/components/ArticleListContent/ArticleListContent.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="antd-pro-components-article-list-content-index-listContent">
+    <div class="description">
+      <slot>
+        {{ description }}
+      </slot>
+    </div>
+    <div class="extra">
+      <a-avatar :src="avatar" size="small" />
+      <a :href="href">{{ owner }}</a> 发布在 <a :href="href">{{ href }}</a>
+      <em>{{ updateAt | moment }}</em>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'ArticleListContent',
+  props: {
+    prefixCls: {
+      type: String,
+      default: 'antd-pro-components-article-list-content-index-listContent'
+    },
+    description: {
+      type: String,
+      default: ''
+    },
+    owner: {
+      type: String,
+      required: true
+    },
+    avatar: {
+      type: String,
+      required: true
+    },
+    href: {
+      type: String,
+      required: true
+    },
+    updateAt: {
+      type: String,
+      required: true
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+@import '../index.less';
+
+.antd-pro-components-article-list-content-index-listContent {
+  .description {
+    max-width: 720px;
+    line-height: 22px;
+  }
+  .extra {
+    margin-top: 16px;
+    color: @text-color-secondary;
+    line-height: 22px;
+
+    & /deep/ .ant-avatar {
+      position: relative;
+      top: 1px;
+      width: 20px;
+      height: 20px;
+      margin-right: 8px;
+      vertical-align: top;
+    }
+
+    & > em {
+      margin-left: 16px;
+      color: @disabled-color;
+      font-style: normal;
+    }
+  }
+}
+
+@media screen and (max-width: @screen-xs) {
+  .antd-pro-components-article-list-content-index-listContent {
+    .extra {
+      & > em {
+        display: block;
+        margin-top: 8px;
+        margin-left: 0;
+      }
+    }
+  }
+}
+</style>

+ 3 - 0
upcloud-wms-qingniu-web/src/components/ArticleListContent/index.js

@@ -0,0 +1,3 @@
+import ArticleListContent from './ArticleListContent'
+
+export default ArticleListContent

+ 24 - 0
upcloud-wms-qingniu-web/src/components/AvatarList/Item.jsx

@@ -0,0 +1,24 @@
+import PropTypes from 'ant-design-vue/es/_util/vue-types'
+import { Tooltip, Avatar } from 'ant-design-vue'
+import { getSlotOptions } from 'ant-design-vue/lib/_util/props-util'
+import { warning } from 'ant-design-vue/lib/vc-util/warning'
+
+export const AvatarListItemProps = {
+  tips: PropTypes.string.def(null),
+  src: PropTypes.string.def('')
+}
+
+const Item = {
+  __ANT_AVATAR_CHILDREN: true,
+  name: 'AvatarListItem',
+  props: AvatarListItemProps,
+  created () {
+    warning(getSlotOptions(this.$parent).__ANT_AVATAR_LIST, 'AvatarListItem must be a subcomponent of AvatarList')
+  },
+  render () {
+    const AvatarDom = <Avatar size={this.$parent.size} src={this.src} />
+    return this.tips && <Tooltip title={this.tips}>{AvatarDom}</Tooltip> || <AvatarDom />
+  }
+}
+
+export default Item

+ 72 - 0
upcloud-wms-qingniu-web/src/components/AvatarList/List.jsx

@@ -0,0 +1,72 @@
+import './index.less'
+
+import PropTypes from 'ant-design-vue/es/_util/vue-types'
+import Avatar from 'ant-design-vue/es/avatar'
+import Item from './Item.jsx'
+import { filterEmpty } from '@/components/_util/util'
+
+/**
+ * size: `number`、 `large`、`small`、`default` 默认值: default
+ * maxLength: number
+ * excessItemsStyle: CSSProperties
+ */
+const AvatarListProps = {
+  prefixCls: PropTypes.string.def('ant-pro-avatar-list'),
+  size: {
+    validator: val => {
+      return typeof val === 'number' || ['small', 'large', 'default'].includes(val)
+    },
+    default: 'default'
+  },
+  maxLength: PropTypes.number.def(0),
+  excessItemsStyle: PropTypes.object.def({
+    color: '#f56a00',
+    backgroundColor: '#fde3cf'
+  })
+}
+
+const AvatarList = {
+  __ANT_AVATAR_LIST: true,
+  Item,
+  name: 'AvatarList',
+  props: AvatarListProps,
+  render (h) {
+    const { prefixCls, size } = this.$props
+    const className = {
+      [`${prefixCls}`]: true,
+      [`${size}`]: true
+    }
+    const items = filterEmpty(this.$slots.default)
+    const itemsDom = items && items.length ? <ul class={`${prefixCls}-items`}>{this.getItems(items)}</ul> : null
+
+    return (
+      <div class={className}>
+        {itemsDom}
+      </div>
+    )
+  },
+  methods: {
+    getItems (items) {
+      const className = {
+        [`${this.prefixCls}-item`]: true,
+        [`${this.size}`]: true
+      }
+      const totalSize = items.length
+
+      if (this.maxLength > 0) {
+        items = items.slice(0, this.maxLength)
+        items.push((<Avatar size={this.size} style={this.excessItemsStyle}>{`+${totalSize - this.maxLength}`}</Avatar>))
+      }
+      return items.map((item) => (
+        <li class={className}>{item}</li>
+      ))
+    }
+  }
+}
+
+AvatarList.install = function (Vue) {
+  Vue.component(AvatarList.name, AvatarList)
+  Vue.component(AvatarList.Item.name, AvatarList.Item)
+}
+
+export default AvatarList

+ 9 - 0
upcloud-wms-qingniu-web/src/components/AvatarList/index.js

@@ -0,0 +1,9 @@
+import AvatarList from './List'
+import Item from './Item'
+
+export {
+  AvatarList,
+  Item as AvatarListItem
+}
+
+export default AvatarList

+ 60 - 0
upcloud-wms-qingniu-web/src/components/AvatarList/index.less

@@ -0,0 +1,60 @@
+@import "../index";
+
+@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list";
+@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item";
+
+.@{avatar-list-prefix-cls} {
+  display: inline-block;
+
+  ul {
+    list-style: none;
+    display: inline-block;
+    padding: 0;
+    margin: 0 0 0 8px;
+    font-size: 0;
+  }
+}
+
+.@{avatar-list-item-prefix-cls} {
+  display: inline-block;
+  font-size: @font-size-base;
+  margin-left: -8px;
+  width: @avatar-size-base;
+  height: @avatar-size-base;
+
+  :global {
+    .ant-avatar {
+      border: 1px solid #fff;
+      cursor: pointer;
+    }
+  }
+
+  &.large {
+    width: @avatar-size-lg;
+    height: @avatar-size-lg;
+  }
+
+  &.small {
+    width: @avatar-size-sm;
+    height: @avatar-size-sm;
+  }
+
+  &.mini {
+    width: 20px;
+    height: 20px;
+
+    :global {
+      .ant-avatar {
+        width: 20px;
+        height: 20px;
+        line-height: 20px;
+
+        .ant-avatar-string {
+          font-size: 12px;
+          line-height: 18px;
+        }
+      }
+    }
+  }
+}
+

+ 64 - 0
upcloud-wms-qingniu-web/src/components/AvatarList/index.md

@@ -0,0 +1,64 @@
+# AvatarList 用户头像列表
+
+
+一组用户头像,常用在项目/团队成员列表。可通过设置 `size` 属性来指定头像大小。
+
+
+
+引用方式:
+
+```javascript
+import AvatarList from '@/components/AvatarList'
+const AvatarListItem = AvatarList.Item
+
+export default {
+    components: {
+        AvatarList,
+        AvatarListItem
+    }
+}
+```
+
+
+
+## 代码演示  [demo](https://pro.loacg.com/test/home)
+
+```html
+<avatar-list size="mini">
+    <avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" />
+    <avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" />
+    <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
+</avatar-list>
+```
+或
+```html
+<avatar-list :max-length="3">
+    <avatar-list-item tips="Jake" src="https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png" />
+    <avatar-list-item tips="Andy" src="https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png" />
+    <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
+    <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
+    <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
+    <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
+    <avatar-list-item tips="Niko" src="https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png" />
+</avatar-list>
+```
+
+
+
+## API
+
+### AvatarList
+
+| 参数               | 说明       | 类型                                 | 默认值       |
+| ---------------- | -------- | ---------------------------------- | --------- |
+| size             | 头像大小     | `large`、`small` 、`mini`, `default` | `default` |
+| maxLength        | 要显示的最大项目 | number                             | -         |
+| excessItemsStyle | 多余的项目风格  | CSSProperties                      | -         |
+
+### AvatarList.Item
+
+| 参数   | 说明     | 类型        | 默认值 |
+| ---- | ------ | --------- | --- |
+| tips | 头像展示文案 | string | -   |
+| src  | 头像图片连接 | string    | -   |
+

+ 27 - 0
upcloud-wms-qingniu-web/src/components/ConfigProvider/index.js

@@ -0,0 +1,27 @@
+import PropTypes from 'ant-design-vue/es/_util/vue-types'
+
+const ProConfigProviderProps = {
+  i18nRender: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]).def(false),
+  contentWidth: PropTypes.oneOf(['Fluid', 'Fixed']).def('Fluid'),
+  breadcrumbRender: PropTypes.func,
+}
+
+const ConfigProvider = {
+  name: 'ProConfigProvider',
+  props: ProConfigProviderProps,
+  provide () {
+    const _self = this
+    return {
+      locale: _self.$props.i18nRender,
+      contentWidth: _self.$props.contentWidth,
+      breadcrumbRender: _self.$props.breadcrumbRender,
+    }
+  },
+  render () {
+    const { $scopedSlots } = this
+    const children = this.children || $scopedSlots.default
+    return children()
+  }
+}
+
+export default ConfigProvider

+ 113 - 0
upcloud-wms-qingniu-web/src/components/Dialog.js

@@ -0,0 +1,113 @@
+import Modal from 'ant-design-vue/es/modal'
+export default (Vue) => {
+  function dialog (component, componentProps, modalProps) {
+    const _vm = this
+    modalProps = modalProps || {}
+    if (!_vm || !_vm._isVue) {
+      return
+    }
+    let dialogDiv = document.querySelector('body>div[type=dialog]')
+    if (!dialogDiv) {
+      dialogDiv = document.createElement('div')
+      dialogDiv.setAttribute('type', 'dialog')
+      document.body.appendChild(dialogDiv)
+    }
+
+    const handle = function (checkFunction, afterHandel) {
+      if (checkFunction instanceof Function) {
+        const res = checkFunction()
+        if (res instanceof Promise) {
+          res.then(c => {
+            c && afterHandel()
+          })
+        } else {
+          res && afterHandel()
+        }
+      } else {
+        // checkFunction && afterHandel()
+        checkFunction || afterHandel()
+      }
+    }
+
+    const dialogInstance = new Vue({
+      data () {
+        return {
+          visible: true
+        }
+      },
+      router: _vm.$router,
+      store: _vm.$store,
+      mounted () {
+        this.$on('close', (v) => {
+          this.handleClose()
+        })
+      },
+      methods: {
+        handleClose () {
+          handle(this.$refs._component.onCancel, () => {
+            this.visible = false
+            this.$refs._component.$emit('close')
+            this.$refs._component.$emit('cancel')
+            dialogInstance.$destroy()
+          })
+        },
+        handleOk () {
+          handle(this.$refs._component.onOK || this.$refs._component.onOk, () => {
+            this.visible = false
+            this.$refs._component.$emit('close')
+            this.$refs._component.$emit('ok')
+            dialogInstance.$destroy()
+          })
+        }
+      },
+      render: function (h) {
+        const that = this
+        const modalModel = modalProps && modalProps.model
+        if (modalModel) {
+          delete modalProps.model
+        }
+        const ModalProps = Object.assign({}, modalModel && { model: modalModel } || {}, {
+          attrs: Object.assign({}, {
+            ...(modalProps.attrs || modalProps)
+          }, {
+            visible: this.visible
+          }),
+          on: Object.assign({}, {
+            ...(modalProps.on || modalProps)
+          }, {
+            ok: () => {
+              that.handleOk()
+            },
+            cancel: () => {
+              that.handleClose()
+            }
+          })
+        })
+
+        const componentModel = componentProps && componentProps.model
+        if (componentModel) {
+          delete componentProps.model
+        }
+        const ComponentProps = Object.assign({}, componentModel && { model: componentModel } || {}, {
+          ref: '_component',
+          attrs: Object.assign({}, {
+            ...((componentProps && componentProps.attrs) || componentProps)
+          }),
+          on: Object.assign({}, {
+            ...((componentProps && componentProps.on) || componentProps)
+          })
+        })
+
+        return h(Modal, ModalProps, [h(component, ComponentProps)])
+      }
+    }).$mount(dialogDiv)
+  }
+
+  Object.defineProperty(Vue.prototype, '$dialog', {
+    get: () => {
+      return function () {
+        dialog.apply(this, arguments)
+      }
+    }
+  })
+}

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini