Browse Source

Merge branch 'deploy_0804' of jianguan-web/qpls-md-html into master

李磊 4 years ago
parent
commit
de547decc3
100 changed files with 2955 additions and 1029 deletions
  1. 3 3
      .env
  2. 1 1
      .env.development
  3. 2 2
      .env.practice
  4. 1 1
      .env.preview
  5. 227 5
      package-lock.json
  6. 2 0
      package.json
  7. 1 1
      public/index.html
  8. BIN
      public/logo.png
  9. BIN
      public/logo1.png
  10. 7 2
      src/App.vue
  11. 19 0
      src/api/product.js
  12. 9 1
      src/api/purchase.js
  13. 19 0
      src/api/reportData.js
  14. 8 4
      src/api/sales.js
  15. 47 0
      src/api/salesman.js
  16. 47 0
      src/api/stockImport.js
  17. BIN
      src/assets/bg_movie@2x.png
  18. BIN
      src/assets/def_img@2x.png
  19. BIN
      src/assets/icon_movie.png
  20. BIN
      src/assets/logo.png
  21. BIN
      src/assets/logo1.png
  22. BIN
      src/assets/normalbtn_login.png
  23. BIN
      src/assets/selectedbtn_login.png
  24. 1 1
      src/components/GlobalHeader/GlobalHeader.vue
  25. 1 1
      src/components/Menu/SideMenu.vue
  26. 31 5
      src/components/MultiTab/MultiTab.vue
  27. 1 0
      src/components/NoticeIcon/NoticeIcon.vue
  28. 109 39
      src/components/UploadFile/index.vue
  29. 15 8
      src/components/custom.less
  30. 5 5
      src/components/global.less
  31. 27 6
      src/components/tools/Logo.vue
  32. 43 2
      src/components/tools/UserMenu.vue
  33. 213 136
      src/config/router.config.js
  34. 108 10
      src/layouts/BasicLayout.vue
  35. 4 1
      src/layouts/PageView.vue
  36. 4 4
      src/layouts/RouteView.vue
  37. 3 4
      src/layouts/UserLayout.vue
  38. 48 0
      src/libs/JGPrint.js
  39. 187 0
      src/libs/LodopFuncs.js
  40. 4 0
      src/main.js
  41. 1 0
      src/permission.js
  42. 5 1
      src/store/getters.js
  43. 49 13
      src/store/modules/app.js
  44. 1 1
      src/utils/request.js
  45. 51 2
      src/views/Home.vue
  46. 20 6
      src/views/allocationManagement/chainTransferIn/detail.vue
  47. 22 7
      src/views/allocationManagement/chainTransferIn/edit.vue
  48. 26 13
      src/views/allocationManagement/chainTransferIn/list.vue
  49. 17 8
      src/views/allocationManagement/chainTransferOut/detail.vue
  50. 21 11
      src/views/allocationManagement/chainTransferOut/edit.vue
  51. 23 10
      src/views/allocationManagement/chainTransferOut/list.vue
  52. 1 0
      src/views/allocationManagement/storeTransferOut/basicInfoModal.vue
  53. 21 10
      src/views/allocationManagement/storeTransferOut/detail.vue
  54. 25 13
      src/views/allocationManagement/storeTransferOut/edit.vue
  55. 23 10
      src/views/allocationManagement/storeTransferOut/list.vue
  56. 12 31
      src/views/allocationManagement/warehouseAllocation/detail.vue
  57. 24 16
      src/views/allocationManagement/warehouseAllocation/edit.vue
  58. 22 14
      src/views/allocationManagement/warehouseAllocation/list.vue
  59. 18 4
      src/views/basicData/bulkPartsTypeManagement/list.vue
  60. 18 4
      src/views/basicData/customerTypeManagement/list.vue
  61. 18 4
      src/views/basicData/expenseType/list.vue
  62. 19 5
      src/views/basicData/storeTransferOutTypeManagement/list.vue
  63. 309 0
      src/views/bulkManagement/bulkImport/list.vue
  64. 7 9
      src/views/bulkManagement/bulkReturnGoods/detailModal.vue
  65. 19 3
      src/views/bulkManagement/bulkReturnGoods/edit.vue
  66. 19 3
      src/views/bulkManagement/bulkReturnGoods/grabEdit.vue
  67. 23 10
      src/views/bulkManagement/bulkReturnGoods/list.vue
  68. 20 7
      src/views/bulkManagement/bulkWarehousingOrder/detail.vue
  69. 25 10
      src/views/bulkManagement/bulkWarehousingOrder/edit.vue
  70. 26 13
      src/views/bulkManagement/bulkWarehousingOrder/list.vue
  71. 19 7
      src/views/customerManagement/customerInfo/edit.vue
  72. 23 10
      src/views/customerManagement/customerInfo/list.vue
  73. 15 8
      src/views/financialManagement/companyCollectionPayment/detail.vue
  74. 22 9
      src/views/financialManagement/companyCollectionPayment/list.vue
  75. 15 3
      src/views/financialManagement/companyReceivablePayable/collectionPayment.vue
  76. 17 5
      src/views/financialManagement/companyReceivablePayable/detail.vue
  77. 21 4
      src/views/financialManagement/companyReceivablePayable/list.vue
  78. 18 5
      src/views/financialManagement/expenseManagement/edit.vue
  79. 23 6
      src/views/financialManagement/expenseManagement/list.vue
  80. 24 11
      src/views/financialManagement/financialCollection/list.vue
  81. 24 11
      src/views/financialManagement/financialPayment/list.vue
  82. 28 7
      src/views/financialManagement/inventoryCheckAudit/list.vue
  83. 0 161
      src/views/financialManagement/inventoryReview/detail.vue
  84. 0 184
      src/views/financialManagement/inventoryReview/list.vue
  85. 23 6
      src/views/financialManagement/ledgerRecord/list.vue
  86. 18 6
      src/views/financialManagement/warehousingAudit/detail.vue
  87. 23 6
      src/views/financialManagement/warehousingAudit/list.vue
  88. 22 9
      src/views/financialManagement/withdrawalManagement/list.vue
  89. 18 8
      src/views/inventoryManagement/inventoryChecking/detailModal.vue
  90. 23 6
      src/views/inventoryManagement/inventoryChecking/list.vue
  91. 20 8
      src/views/inventoryManagement/inventoryChecking/makeInventory.vue
  92. 15 3
      src/views/inventoryManagement/inventoryChecking/overall.vue
  93. 26 9
      src/views/inventoryManagement/inventoryChecking/selfDisk.vue
  94. 303 0
      src/views/inventoryManagement/inventoryImport/list.vue
  95. 13 9
      src/views/inventoryManagement/inventoryQuery/detailModal.vue
  96. 35 18
      src/views/inventoryManagement/inventoryQuery/list.vue
  97. 21 9
      src/views/inventoryManagement/inventoryQuery/warehouseDetail.vue
  98. 26 13
      src/views/inventoryManagement/inventoryWarning/list.vue
  99. 17 4
      src/views/inventoryManagement/satelliteWarehouseInventory/list.vue
  100. 21 4
      src/views/inventoryManagement/warehouse/list.vue

+ 3 - 3
.env

@@ -1,10 +1,10 @@
 NODE_ENV=production
 NODE_ENV=production
 VUE_APP_PREVIEW=false
 VUE_APP_PREVIEW=false
-VUE_APP_API_BASE_URL=http://qpls-md.360arrow.com/qpls-md
-VUE_APP_WX_BASE_URL=//qpls-md.360arrow.com/qpls-md/websocket/
+VUE_APP_API_BASE_URL=https://iscm.360arrow.com/qpls-md
+VUE_APP_WX_BASE_URL=//iscm.360arrow.com/qpls-md/websocket/
 VUE_APP_ENVTIPS=
 VUE_APP_ENVTIPS=
 VUE_APP_VERSION=V1.0.1
 VUE_APP_VERSION=V1.0.1
-VUE_APP_PRO_NAME=箭冠汽配连锁系统
+VUE_APP_PRO_NAME=iSCM智慧供应链系统
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司

+ 1 - 1
.env.development

@@ -4,7 +4,7 @@ VUE_APP_API_BASE_URL=/api
 VUE_APP_WX_BASE_URL=//192.168.16.103:8503/qpls-md/websocket/
 VUE_APP_WX_BASE_URL=//192.168.16.103:8503/qpls-md/websocket/
 VUE_APP_VERSION=V1.0.1
 VUE_APP_VERSION=V1.0.1
 VUE_APP_ENVTIPS=开发环境
 VUE_APP_ENVTIPS=开发环境
-VUE_APP_PRO_NAME=箭冠汽配连锁系统
+VUE_APP_PRO_NAME=iSCM智慧供应链系统
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司

+ 2 - 2
.env.practice

@@ -1,10 +1,10 @@
 NODE_ENV=production
 NODE_ENV=production
 VUE_APP_PREVIEW=false
 VUE_APP_PREVIEW=false
-VUE_APP_API_BASE_URL=http://t.qpls.360arrow.com/qpls-md
+VUE_APP_API_BASE_URL=https://t.qpls.360arrow.com/qpls-md
 VUE_APP_WX_BASE_URL=//t.qpls.360arrow.com/qpls-md/websocket/
 VUE_APP_WX_BASE_URL=//t.qpls.360arrow.com/qpls-md/websocket/
 VUE_APP_VERSION=V1.0.1
 VUE_APP_VERSION=V1.0.1
 VUE_APP_ENVTIPS=练习环境
 VUE_APP_ENVTIPS=练习环境
-VUE_APP_PRO_NAME=箭冠汽配连锁系统
+VUE_APP_PRO_NAME=iSCM智慧供应链系统
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司

+ 1 - 1
.env.preview

@@ -4,7 +4,7 @@ VUE_APP_API_BASE_URL=http://qpls-md.360arrow.com.cn/qpls-md
 VUE_APP_WX_BASE_URL=//qpls-md.360arrow.com.cn/qpls-md/websocket/
 VUE_APP_WX_BASE_URL=//qpls-md.360arrow.com.cn/qpls-md/websocket/
 VUE_APP_VERSION=V1.0.1
 VUE_APP_VERSION=V1.0.1
 VUE_APP_ENVTIPS=预发布环境
 VUE_APP_ENVTIPS=预发布环境
-VUE_APP_PRO_NAME=箭冠汽配连锁系统
+VUE_APP_PRO_NAME=iSCM智慧供应链系统
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_LOGO=@/assets/logo.png
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_THEME_COLOR=#ed1c24
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司
 VUE_APP_COM_NAME=陕西山海高科信息技术有限公司

+ 227 - 5
package-lock.json

@@ -1,5 +1,5 @@
 {
 {
-  "name": "chelingzhu",
+  "name": "qpls-md",
   "version": "2.0.0",
   "version": "2.0.0",
   "lockfileVersion": 1,
   "lockfileVersion": 1,
   "requires": true,
   "requires": true,
@@ -2255,6 +2255,14 @@
       "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
       "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
       "dev": true
       "dev": true
     },
     },
+    "aes-decrypter": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-1.0.3.tgz",
+      "integrity": "sha1-nAa4pUNaWtCduTP4oBSvzxhMw04=",
+      "requires": {
+        "pkcs7": "^0.2.3"
+      }
+    },
     "ajv": {
     "ajv": {
       "version": "6.10.2",
       "version": "6.10.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
@@ -5578,6 +5586,11 @@
         }
         }
       }
       }
     },
     },
+    "dom-walk": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+    },
     "domain-browser": {
     "domain-browser": {
       "version": "1.2.0",
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -5868,6 +5881,11 @@
         "is-symbol": "^1.0.2"
         "is-symbol": "^1.0.2"
       }
       }
     },
     },
+    "es5-shim": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.2.tgz",
+      "integrity": "sha512-n0XTVMGps+Deyr38jtqKPR5F5hb9owYeRQcKJW39eFvzUk/u/9Ww315werRzbiNMnHCUw/YHDPBphTlEnzdi+A=="
+    },
     "escape-html": {
     "escape-html": {
       "version": "1.0.3",
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -7978,6 +7996,22 @@
       "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
       "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
       "dev": true
       "dev": true
     },
     },
+    "global": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz",
+      "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=",
+      "requires": {
+        "min-document": "^2.19.0",
+        "process": "~0.5.1"
+      },
+      "dependencies": {
+        "process": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz",
+          "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8="
+        }
+      }
+    },
     "globals": {
     "globals": {
       "version": "11.12.0",
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -8682,6 +8716,11 @@
       "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
       "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
       "dev": true
       "dev": true
     },
     },
+    "individual": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz",
+      "integrity": "sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c="
+    },
     "infer-owner": {
     "infer-owner": {
       "version": "1.0.4",
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
       "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
@@ -8986,6 +9025,11 @@
       "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
       "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
       "dev": true
       "dev": true
     },
     },
+    "is-function": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+      "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+    },
     "is-generator-fn": {
     "is-generator-fn": {
       "version": "1.0.0",
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz",
       "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz",
@@ -11452,6 +11496,11 @@
         "yallist": "^3.0.2"
         "yallist": "^3.0.2"
       }
       }
     },
     },
+    "m3u8-parser": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-2.1.0.tgz",
+      "integrity": "sha1-yBcDKewc1RXQ1Yu4t2LamJbLA2g="
+    },
     "make-dir": {
     "make-dir": {
       "version": "2.1.0",
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
@@ -11692,6 +11741,14 @@
       "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
       "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
       "dev": true
       "dev": true
     },
     },
+    "min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+      "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
+      "requires": {
+        "dom-walk": "^0.1.0"
+      }
+    },
     "mini-css-extract-plugin": {
     "mini-css-extract-plugin": {
       "version": "0.8.0",
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz",
       "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz",
@@ -11858,6 +11915,11 @@
       "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
       "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
       "dev": true
       "dev": true
     },
     },
+    "mux.js": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-4.3.2.tgz",
+      "integrity": "sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ=="
+    },
     "mz": {
     "mz": {
       "version": "2.7.0",
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
       "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -12678,6 +12740,11 @@
         }
         }
       }
       }
     },
     },
+    "parse-headers": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz",
+      "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw=="
+    },
     "parse-json": {
     "parse-json": {
       "version": "2.2.0",
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
@@ -12812,6 +12879,11 @@
         "pinkie": "^2.0.0"
         "pinkie": "^2.0.0"
       }
       }
     },
     },
+    "pkcs7": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-0.2.3.tgz",
+      "integrity": "sha1-ItYGZtAQZcXyRDkJjkpIMEUic74="
+    },
     "pkg-dir": {
     "pkg-dir": {
       "version": "3.0.0",
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
@@ -13681,8 +13753,7 @@
     "process": {
     "process": {
       "version": "0.11.10",
       "version": "0.11.10",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "dev": true
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
     },
     },
     "process-nextick-args": {
     "process-nextick-args": {
       "version": "2.0.1",
       "version": "2.0.1",
@@ -14441,6 +14512,14 @@
         "aproba": "^1.1.1"
         "aproba": "^1.1.1"
       }
       }
     },
     },
+    "rust-result": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz",
+      "integrity": "sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=",
+      "requires": {
+        "individual": "^2.0.0"
+      }
+    },
     "rw": {
     "rw": {
       "version": "1.3.3",
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
       "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
@@ -14484,6 +14563,14 @@
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
       "dev": true
       "dev": true
     },
     },
+    "safe-json-parse": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz",
+      "integrity": "sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=",
+      "requires": {
+        "rust-result": "^1.0.0"
+      }
+    },
     "safe-regex": {
     "safe-regex": {
       "version": "1.1.0",
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
       "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
@@ -14532,6 +14619,11 @@
         "ajv-keywords": "^3.1.0"
         "ajv-keywords": "^3.1.0"
       }
       }
     },
     },
+    "screenfull": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.1.0.tgz",
+      "integrity": "sha512-dYaNuOdzr+kc6J6CFcBrzkLCfyGcMg+gWkJ8us93IQ7y1cevhQAugFsaCdMHb6lw8KV3xPzSxzH7zM1dQap9mA=="
+    },
     "select": {
     "select": {
       "version": "1.1.2",
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
@@ -16034,6 +16126,11 @@
       "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
       "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
       "dev": true
       "dev": true
     },
     },
+    "tsml": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tsml/-/tsml-1.0.1.tgz",
+      "integrity": "sha1-ifghi52eJX9H1/a1bQHFpNLGj8M="
+    },
     "tty-browserify": {
     "tty-browserify": {
       "version": "0.0.0",
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
       "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
@@ -16309,6 +16406,11 @@
         "requires-port": "^1.0.0"
         "requires-port": "^1.0.0"
       }
       }
     },
     },
+    "url-toolkit": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.3.tgz",
+      "integrity": "sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ=="
+    },
     "use": {
     "use": {
       "version": "3.1.1",
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
       "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -16423,6 +16525,99 @@
         "extsprintf": "^1.2.0"
         "extsprintf": "^1.2.0"
       }
       }
     },
     },
+    "video.js": {
+      "version": "6.13.0",
+      "resolved": "https://registry.npmjs.org/video.js/-/video.js-6.13.0.tgz",
+      "integrity": "sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==",
+      "requires": {
+        "babel-runtime": "^6.9.2",
+        "global": "4.3.2",
+        "safe-json-parse": "4.0.0",
+        "tsml": "1.0.1",
+        "videojs-font": "2.1.0",
+        "videojs-ie8": "1.1.2",
+        "videojs-vtt.js": "0.12.6",
+        "xhr": "2.4.0"
+      }
+    },
+    "videojs-contrib-hls": {
+      "version": "5.15.0",
+      "resolved": "https://registry.npmjs.org/videojs-contrib-hls/-/videojs-contrib-hls-5.15.0.tgz",
+      "integrity": "sha512-18zbMYZ0XRBKTPEayA9bFTWWrqhT9b4G8+zf0czJLD7Epe5PcK1I/3dflTHQeQ5rwlWir+/XnFU3sMg/B2MMcw==",
+      "requires": {
+        "aes-decrypter": "1.0.3",
+        "global": "^4.3.0",
+        "m3u8-parser": "2.1.0",
+        "mux.js": "4.3.2",
+        "url-toolkit": "^2.1.3",
+        "video.js": "^5.19.1 || ^6.2.0",
+        "videojs-contrib-media-sources": "4.7.2",
+        "webwackify": "0.1.6"
+      }
+    },
+    "videojs-contrib-media-sources": {
+      "version": "4.7.2",
+      "resolved": "https://registry.npmjs.org/videojs-contrib-media-sources/-/videojs-contrib-media-sources-4.7.2.tgz",
+      "integrity": "sha512-e6iCHWBFuV05EGo7v+pS9iepObXnJ9joms467gzi8ZjpKVb3ifha9M0Ja24Rd8JfvYpzjltsgDVtGFDvIg4hQQ==",
+      "requires": {
+        "global": "^4.3.0",
+        "mux.js": "4.3.2",
+        "video.js": "^5.17.0 || ^6.2.0",
+        "webwackify": "0.1.6"
+      }
+    },
+    "videojs-flash": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/videojs-flash/-/videojs-flash-2.2.1.tgz",
+      "integrity": "sha512-mHu6TD12EKkxMvr8tg4AcfV/DuVLff427nneoZom3N9Dd2bv0sJOWwdLPQH1v5BCuAuXAVuAOba56ovTl+G3tQ==",
+      "requires": {
+        "global": "^4.4.0",
+        "video.js": "^6 || ^7",
+        "videojs-swf": "5.4.2"
+      },
+      "dependencies": {
+        "global": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+          "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+          "requires": {
+            "min-document": "^2.19.0",
+            "process": "^0.11.10"
+          }
+        }
+      }
+    },
+    "videojs-font": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-2.1.0.tgz",
+      "integrity": "sha1-olkwpn9snPvyu4jay4xrRR8JM3k="
+    },
+    "videojs-hotkeys": {
+      "version": "0.2.27",
+      "resolved": "https://registry.npmjs.org/videojs-hotkeys/-/videojs-hotkeys-0.2.27.tgz",
+      "integrity": "sha512-pwtm1QocRmzJy1PWQsmFVHyeldYHHpLdeATK3FsFHVMmNpz6CROkAn8TFy2UILr8Ghgq134K8jEKNue8HWpudQ=="
+    },
+    "videojs-ie8": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/videojs-ie8/-/videojs-ie8-1.1.2.tgz",
+      "integrity": "sha1-oj09hgitcZK2nGB3/E64SJmNNdk=",
+      "requires": {
+        "es5-shim": "^4.5.1"
+      }
+    },
+    "videojs-swf": {
+      "version": "5.4.2",
+      "resolved": "https://registry.npmjs.org/videojs-swf/-/videojs-swf-5.4.2.tgz",
+      "integrity": "sha512-FGg+Csioa8/A/EacvFefBdb9Z0rSiMlheHDunZnN3xXfUF43jvjawcWFQnZvrv1Cs1nE1LBrHyUZjF7j2mKOLw=="
+    },
+    "videojs-vtt.js": {
+      "version": "0.12.6",
+      "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz",
+      "integrity": "sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==",
+      "requires": {
+        "global": "^4.3.1"
+      }
+    },
     "viewerjs": {
     "viewerjs": {
       "version": "1.10.1",
       "version": "1.10.1",
       "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.10.1.tgz",
       "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.10.1.tgz",
@@ -16695,6 +16890,18 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
       "dev": true
     },
     },
+    "vue-video-player": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/vue-video-player/-/vue-video-player-5.0.2.tgz",
+      "integrity": "sha512-IZXeRGGSX4YIp54G0Q5cB7iqh6Ok6Dpa2jRkjdyvMWw7MShJuh54/d5QNb1CZ+CvZUzX/TH7osnpir7mBNcFvQ==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "video.js": "^6.6.0",
+        "videojs-contrib-hls": "^5.12.2",
+        "videojs-flash": "^2.1.0",
+        "videojs-hotkeys": "^0.2.20"
+      }
+    },
     "vuex": {
     "vuex": {
       "version": "3.1.1",
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.1.tgz",
       "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.1.tgz",
@@ -17156,6 +17363,11 @@
       "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
       "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
       "dev": true
       "dev": true
     },
     },
+    "webwackify": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/webwackify/-/webwackify-0.1.6.tgz",
+      "integrity": "sha512-pGcw1T3HpNnM/UTRQqqRkkkzythSLts05mB+7Gr00B+0VbL0m39dFL5g20rSIEUt9Wrpw+/8k+snxRlUFHhcqA=="
+    },
     "whatwg-encoding": {
     "whatwg-encoding": {
       "version": "1.0.5",
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
@@ -17288,6 +17500,17 @@
         "async-limiter": "~1.0.0"
         "async-limiter": "~1.0.0"
       }
       }
     },
     },
+    "xhr": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.4.0.tgz",
+      "integrity": "sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=",
+      "requires": {
+        "global": "~4.3.0",
+        "is-function": "^1.0.1",
+        "parse-headers": "^2.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
     "xml-name-validator": {
     "xml-name-validator": {
       "version": "3.0.0",
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
       "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
@@ -17297,8 +17520,7 @@
     "xtend": {
     "xtend": {
       "version": "4.0.2",
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "dev": true
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
     },
     },
     "y18n": {
     "y18n": {
       "version": "4.0.0",
       "version": "4.0.0",

+ 2 - 0
package.json

@@ -26,6 +26,7 @@
     "mockjs2": "1.0.7",
     "mockjs2": "1.0.7",
     "moment": "^2.24.0",
     "moment": "^2.24.0",
     "nprogress": "^0.2.0",
     "nprogress": "^0.2.0",
+    "screenfull": "^5.1.0",
     "v-runtime-template": "^1.10.0",
     "v-runtime-template": "^1.10.0",
     "v-viewer": "^1.6.4",
     "v-viewer": "^1.6.4",
     "viser-vue": "^2.4.6",
     "viser-vue": "^2.4.6",
@@ -37,6 +38,7 @@
     "vue-quill-editor": "^3.0.6",
     "vue-quill-editor": "^3.0.6",
     "vue-router": "^3.1.2",
     "vue-router": "^3.1.2",
     "vue-svg-component-runtime": "^1.0.1",
     "vue-svg-component-runtime": "^1.0.1",
+    "vue-video-player": "^5.0.2",
     "vuex": "^3.1.1",
     "vuex": "^3.1.1",
     "wangeditor": "^3.1.1"
     "wangeditor": "^3.1.1"
   },
   },

+ 1 - 1
public/index.html

@@ -4,7 +4,7 @@
     <meta charset="utf-8">
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
-    <link rel="icon" href="<%= BASE_URL %>logo.png">
+    <!-- <link rel="icon" href="<%= BASE_URL %>logo.png"> -->
     <title><%= VUE_APP_PRO_NAME %></title>
     <title><%= VUE_APP_PRO_NAME %></title>
     <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(.75);transform-origin:50% 50%;opacity:.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:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.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>
     <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(.75);transform-origin:50% 50%;opacity:.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:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.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 -->
     <!-- require cdn assets css -->

BIN
public/logo.png


BIN
public/logo1.png


+ 7 - 2
src/App.vue

@@ -33,6 +33,12 @@ export default {
     window.addEventListener('beforeunload', () => {
     window.addEventListener('beforeunload', () => {
       sessionStorage.setItem('store', JSON.stringify(this.$store.state))
       sessionStorage.setItem('store', JSON.stringify(this.$store.state))
     })
     })
+
+    this.$message.config({
+      top: `100px`,
+      duration: 3,
+      maxCount: 3
+    })
   }
   }
 }
 }
 </script>
 </script>
@@ -44,13 +50,12 @@ export default {
     position: fixed;
     position: fixed;
     z-index: 100000;
     z-index: 100000;
     background: red;
     background: red;
-    width: 230px;
     text-align: center;
     text-align: center;
     color: #fff;
     color: #fff;
     font-size: 30px;
     font-size: 30px;
     top: 0;
     top: 0;
     left: 0;
     left: 0;
     width: 50%;
     width: 50%;
-    margin-left: 25%;
+    margin-left: 20%;
   }
   }
 </style>
 </style>

+ 19 - 0
src/api/product.js

@@ -22,6 +22,25 @@ export const productList = (params) => {
     method: 'post'
     method: 'post'
   })
   })
 }
 }
+// 查询最近上下线产品
+export const queryNewProductPage = (params) => {
+  const url = `/product/queryNewProductPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 产品详情
+export const productDetail = (params) => {
+  const url = `/product/findBySn/${params.sn}`
+  return axios({
+    url: url,
+    method: 'get'
+  })
+}
 //  产品  价格变更记录  列表  分页
 //  产品  价格变更记录  列表  分页
 export const productPriceChangeList = (params) => {
 export const productPriceChangeList = (params) => {
   const url = `/product/priceChange/queryPage/${params.pageNo}/${params.pageSize}`
   const url = `/product/priceChange/queryPage/${params.pageNo}/${params.pageSize}`

+ 9 - 1
src/api/purchase.js

@@ -159,7 +159,7 @@ export const purchaseDetailBatchInsert = params => {
     method: 'post'
     method: 'post'
   })
   })
 }
 }
-// 销售 详情  导出
+// 采购 详情  导出
 export const purchaseDetailExport = params => {
 export const purchaseDetailExport = params => {
   return axios.request({
   return axios.request({
     url: `/purchase/excel/${params.sn}`,
     url: `/purchase/excel/${params.sn}`,
@@ -167,3 +167,11 @@ export const purchaseDetailExport = params => {
     responseType: 'blob'
     responseType: 'blob'
   })
   })
 }
 }
+// 采购 详情 导出产品
+export const purchaseExportDetail = params => {
+  return axios.request({
+    url: `/purchase/exportDetail/${params.sn}`,
+    method: 'get',
+    responseType: 'blob'
+  })
+}

+ 19 - 0
src/api/reportData.js

@@ -64,6 +64,25 @@ export const reportBigCustomerCount = (params) => {
     method: 'post'
     method: 'post'
   })
   })
 }
 }
+// 连锁大客户报表-分页列表
+export const reportBigCustomerLinkageList = (params) => {
+  const url = `report/reportBigCustomer/linkageReportPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 连锁大客户报表-列表合计
+export const reportBigCustomerLinkageCount = (params) => {
+  return axios({
+    url: 'report/reportBigCustomer/linkageReportCount',
+    data: params,
+    method: 'post'
+  })
+}
 // 连锁销售报表-分页列表
 // 连锁销售报表-分页列表
 export const reportSalesBillList = (params) => {
 export const reportSalesBillList = (params) => {
   const url = `/report/reportSalesBill/reportPage/${params.pageNo}/${params.pageSize}`
   const url = `/report/reportSalesBill/reportPage/${params.pageNo}/${params.pageSize}`

+ 8 - 4
src/api/sales.js

@@ -133,11 +133,15 @@ export const supperCodeByVin = (params) => {
 }
 }
 // 销售 详情  打印
 // 销售 详情  打印
 export const salesDetailPrint = params => {
 export const salesDetailPrint = params => {
-  return axios.request({
+  const data = {
     url: `/sales/print/${params.sn}/${params.type}`,
     url: `/sales/print/${params.sn}/${params.type}`,
-    method: 'get',
-    responseType: 'blob'
-  })
+    method: 'get'
+  }
+  // 喷墨打印
+  if(params.type=='INK'){
+    data.responseType = 'blob'
+  }
+  return axios.request(data)
 }
 }
 // 销售 详情  导出
 // 销售 详情  导出
 export const salesDetailExport = params => {
 export const salesDetailExport = params => {

+ 47 - 0
src/api/salesman.js

@@ -0,0 +1,47 @@
+import { axios } from '@/utils/request'
+
+//  业务员列表  分页
+export const employeeList = (params) => {
+  const url = `/employee/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+export const employeeAllList = (params) => {
+  const url = `/employee/queryList`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 新增/编辑业务员
+export const employeeSave = params => {
+  return axios({
+    url: '/employee/save',
+    data: params,
+    method: 'post'
+  })
+}
+
+// 审核
+export const employeeAudit = params => {
+  return axios({
+    url: `/employee/audit/${params.id}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 业务员详情
+export const employeeDetail = params => {
+  return axios({
+    url: `/employee/queryById/${params.id}`,
+    data: {},
+    method: 'get'
+  })
+}

+ 47 - 0
src/api/stockImport.js

@@ -0,0 +1,47 @@
+import { axios } from '@/utils/request'
+
+//  库存/散件导入  列表  分页
+export const stockImportList = (params) => {
+  const url = `/stockImportDetail/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  散件导入  取消导入
+export const stockImportCancel = (params) => {
+  return axios({
+    url: `/stockImport/cancelImport`,
+    data: params,
+    method: 'post'
+  })
+}
+//  散件导入  确认导入
+export const stockImportFinish = (params) => {
+  return axios({
+    url: `/stockImport/finishImport`,
+    data: params,
+    method: 'post'
+  })
+}
+//  散件导入  错误导出
+export const stockImportExportError = (params) => {
+  return axios({
+    url: '/stockImportDetail/exportForSpareParts',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+//  库存导入  错误导出
+export const stockImportKCExportError = (params) => {
+  return axios({
+    url: '/stockImportDetail/exportForStock',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}

BIN
src/assets/bg_movie@2x.png


BIN
src/assets/def_img@2x.png


BIN
src/assets/icon_movie.png


BIN
src/assets/logo.png


BIN
src/assets/logo1.png


BIN
src/assets/normalbtn_login.png


BIN
src/assets/selectedbtn_login.png


+ 1 - 1
src/components/GlobalHeader/GlobalHeader.vue

@@ -13,7 +13,7 @@
         <div v-else :class="['top-nav-header-index', theme]">
         <div v-else :class="['top-nav-header-index', theme]">
           <div class="header-index-wide">
           <div class="header-index-wide">
             <div class="header-index-left">
             <div class="header-index-left">
-              <logo class="top-nav-header" :show-title="device !== 'mobile'"/>
+              <logo ref="logo" class="top-nav-header" :show-title="device !== 'mobile'"/>
               <s-menu v-if="device !== 'mobile'" mode="horizontal" :menu="menus" :theme="theme" />
               <s-menu v-if="device !== 'mobile'" mode="horizontal" :menu="menus" :theme="theme" />
               <a-icon v-else class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle" />
               <a-icon v-else class="trigger" :type="collapsed ? 'menu-fold' : 'menu-unfold'" @click="toggle" />
             </div>
             </div>

+ 1 - 1
src/components/Menu/SideMenu.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <a-layout-sider
   <a-layout-sider
     :class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]"
     :class="['sider', isDesktop() ? null : 'shadow', theme, fixSiderbar ? 'ant-fixed-sidemenu' : null ]"
-    width="230px"
+    width="160px"
     :collapsible="collapsible"
     :collapsible="collapsible"
     v-model="collapsed"
     v-model="collapsed"
     :trigger="null">
     :trigger="null">

+ 31 - 5
src/components/MultiTab/MultiTab.vue

@@ -12,6 +12,7 @@ export default {
       newTabIndex: 0
       newTabIndex: 0
     }
     }
   },
   },
+  inject: ['reloadView'],
   created () {
   created () {
     // bind event
     // bind event
     events.$on('open', val => {
     events.$on('open', val => {
@@ -43,6 +44,17 @@ export default {
     onEdit (targetKey, action) {
     onEdit (targetKey, action) {
       this[action](targetKey)
       this[action](targetKey)
     },
     },
+    onChange (targetKey) {
+      const index = this.tabsList.indexOf(targetKey)
+      if (index >= 0) {
+        const row = this.pages[index]
+        if (row && row.fullPath && row.fullPath.indexOf('/list') == -1) { // 非列表页
+          this.$store.state.app.isNewSubTab = true
+        } else {
+          this.$store.state.app.isNewSubTab = false
+        }
+      }
+    },
     remove (targetKey) {
     remove (targetKey) {
       this.pages = this.pages.filter(page => page.name !== targetKey)
       this.pages = this.pages.filter(page => page.name !== targetKey)
       this.tabsList = this.tabsList.filter(name => name !== targetKey)
       this.tabsList = this.tabsList.filter(name => name !== targetKey)
@@ -54,8 +66,10 @@ export default {
     selectedLastPath () {
     selectedLastPath () {
       this.activeKey = this.tabsList[this.tabsList.length - 1]
       this.activeKey = this.tabsList[this.tabsList.length - 1]
     },
     },
-
     // content menu
     // content menu
+    refashThat (e) {
+      this.reloadView()
+    },
     closeThat (e) {
     closeThat (e) {
       // 判断是否为最后一个标签页,如果是最后一个,则无法被关闭
       // 判断是否为最后一个标签页,如果是最后一个,则无法被关闭
       if (this.tabsList.length > 1) {
       if (this.tabsList.length > 1) {
@@ -100,9 +114,16 @@ export default {
       this[key](route)
       this[key](route)
     },
     },
     renderTabPaneMenu (e) {
     renderTabPaneMenu (e) {
+      // return (
+      //   <a-menu {...{ on: { click: ({ key, item, domEvent }) => { this.closeMenuClick(key, e) } } }}>
+      //     {this.activeKey == e ? (<a-menu-item key="refashThat">刷新页面</a-menu-item>) : ''}
+      //     <a-menu-item key="closeRight">关闭右侧</a-menu-item>
+      //     <a-menu-item key="closeLeft">关闭左侧</a-menu-item>
+      //     <a-menu-item key="closeAll">关闭全部</a-menu-item>
+      //   </a-menu>
+      // )
       return (
       return (
         <a-menu {...{ on: { click: ({ key, item, domEvent }) => { this.closeMenuClick(key, e) } } }}>
         <a-menu {...{ on: { click: ({ key, item, domEvent }) => { this.closeMenuClick(key, e) } } }}>
-          <a-menu-item key="closeThat">关闭当前标签</a-menu-item>
           <a-menu-item key="closeRight">关闭右侧</a-menu-item>
           <a-menu-item key="closeRight">关闭右侧</a-menu-item>
           <a-menu-item key="closeLeft">关闭左侧</a-menu-item>
           <a-menu-item key="closeLeft">关闭左侧</a-menu-item>
           <a-menu-item key="closeAll">关闭全部</a-menu-item>
           <a-menu-item key="closeAll">关闭全部</a-menu-item>
@@ -134,13 +155,14 @@ export default {
       if (index < 0) { // 不存在
       if (index < 0) { // 不存在
         this.tabsList.push(newVal.name)
         this.tabsList.push(newVal.name)
         this.pages.push(newVal)
         this.pages.push(newVal)
+        this.$store.state.app.isNewTab = true
       } else { // 已存在
       } else { // 已存在
         this.pages.splice(index, 1, newVal)
         this.pages.splice(index, 1, newVal)
+        this.$store.state.app.isNewTab = false
       }
       }
     },
     },
     activeKey: function (newPathKey) {
     activeKey: function (newPathKey) {
       const row = this.pages.find(item => item.name == newPathKey)
       const row = this.pages.find(item => item.name == newPathKey)
-      // console.log(row, '+++', row.fullPath)
       if (row.fullPath.indexOf('/list') == -1) {
       if (row.fullPath.indexOf('/list') == -1) {
         this.$router.push({ path: row.fullPath })
         this.$router.push({ path: row.fullPath })
       } else {
       } else {
@@ -150,7 +172,7 @@ export default {
     }
     }
   },
   },
   render () {
   render () {
-    const { onEdit, $data: { pages } } = this
+    const { onEdit, onChange, refashThat, $data: { pages } } = this
     const panes = pages.map(page => {
     const panes = pages.map(page => {
       return (
       return (
         <a-tab-pane
         <a-tab-pane
@@ -159,6 +181,10 @@ export default {
         >
         >
           <span slot="tab">
           <span slot="tab">
             {this.renderTabPane(page.meta.customTitle || page.meta.title, page.name)}
             {this.renderTabPane(page.meta.customTitle || page.meta.title, page.name)}
+            {this.activeKey == 'page.name' ? (<a-icon
+              {...{ on: { click: refashThat } }}
+              style={{ marginLeft: '8px', fontSize: '12px' }}
+              type="reload" />) : ''}
           </span>
           </span>
         </a-tab-pane>)
         </a-tab-pane>)
     })
     })
@@ -171,7 +197,7 @@ export default {
             type={'editable-card'}
             type={'editable-card'}
             v-model={this.activeKey}
             v-model={this.activeKey}
             tabBarStyle={{ background: '#FFF', margin: 0, paddingLeft: '16px', paddingTop: '1px' }}
             tabBarStyle={{ background: '#FFF', margin: 0, paddingLeft: '16px', paddingTop: '1px' }}
-            {...{ on: { edit: onEdit } }}>
+            {...{ on: { edit: onEdit, 'change': onChange } }}>
             {panes}
             {panes}
           </a-tabs>
           </a-tabs>
         </div>
         </div>

+ 1 - 0
src/components/NoticeIcon/NoticeIcon.vue

@@ -49,6 +49,7 @@
   <span @click="fetchNotice" class="header-notice" ref="noticeRef">
   <span @click="fetchNotice" class="header-notice" ref="noticeRef">
     <a-badge :count="unreadCount">
     <a-badge :count="unreadCount">
       <a-icon style="font-size: 16px; padding: 0 5px" type="bell" />
       <a-icon style="font-size: 16px; padding: 0 5px" type="bell" />
+      <span>公告</span>
     </a-badge>
     </a-badge>
   </span>
   </span>
 </template>
 </template>

+ 109 - 39
src/components/UploadFile/index.vue

@@ -4,11 +4,13 @@
       :action="action"
       :action="action"
       :listType="listType"
       :listType="listType"
       :fileList="fileList"
       :fileList="fileList"
+      :disabled="disabled"
       @preview="handlePreview"
       @preview="handlePreview"
       @change="handleChange"
       @change="handleChange"
+      :remove="handleRemove"
       :beforeUpload="beforeUpload"
       :beforeUpload="beforeUpload"
-      :preview-file="previewFile"
       :data="params"
       :data="params"
+      :headers="headers"
       :value="comVal"
       :value="comVal"
     >
     >
       <div v-if="fileList.length < maxNums && listType=='picture-card'">
       <div v-if="fileList.length < maxNums && listType=='picture-card'">
@@ -19,7 +21,7 @@
         <a-button> <a-icon type="upload" /> {{ upText }} </a-button>
         <a-button> <a-icon type="upload" /> {{ upText }} </a-button>
       </div>
       </div>
     </a-upload>
     </a-upload>
-    <a-modal :visible="previewVisible" :footer="null" @cancel="handleCancel">
+    <a-modal :visible="previewVisible" :footer="null" centered :maskClosable="false" @cancel="handleCancel">
       <video v-if="fileType=='video/mp4'" controls="controls" style="width: 100%" :src="previewImage" />
       <video v-if="fileType=='video/mp4'" controls="controls" style="width: 100%" :src="previewImage" />
       <img v-else alt="example" style="width: 100%" :src="previewImage" />
       <img v-else alt="example" style="width: 100%" :src="previewImage" />
     </a-modal>
     </a-modal>
@@ -43,9 +45,7 @@ export default {
     },
     },
     previewFile: {
     previewFile: {
       type: Function,
       type: Function,
-      default: function () {
-
-      }
+      default: function () {}
     },
     },
     action: {
     action: {
       type: String,
       type: String,
@@ -57,7 +57,7 @@ export default {
     },
     },
     upText: {
     upText: {
       type: String,
       type: String,
-      default: '上传'
+      default: ''
     },
     },
     value: {
     value: {
       type: String
       type: String
@@ -66,14 +66,21 @@ export default {
       type: Object,
       type: Object,
       default: function () {
       default: function () {
         return {
         return {
-          savePathType: 'ali' // 存储类型 local 服务器本地,ali 阿里云
+          savePathType: 'ali' // 存储类型 local 服务器本地,ali 阿里云, web
         }
         }
       }
       }
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    uploadType: { //  上传类型  img图片;attach附件;import导入
+      type: String,
+      default: 'img'
     }
     }
   },
   },
   watch: {
   watch: {
     value (a, b) {
     value (a, b) {
-      console.log(a, '=--====')
       this.comVal = a || ''
       this.comVal = a || ''
       if (a == undefined) {
       if (a == undefined) {
         this.fileList = []
         this.fileList = []
@@ -86,26 +93,47 @@ export default {
       previewImage: '',
       previewImage: '',
       fileList: [],
       fileList: [],
       comVal: this.value,
       comVal: this.value,
-      params: this.uploadParams
+      params: this.uploadParams,
+      headers: {
+        'access-token': this.$store.getters.token
+      }
     }
     }
   },
   },
   methods: {
   methods: {
     setFileList (a) {
     setFileList (a) {
       const temp = []
       const temp = []
       if (a && a.length > 0) {
       if (a && a.length > 0) {
-        a.split(',').map((item, index) => {
-          if (item) {
-            temp.push({
-              uid: index,
-              name: item,
-              status: 'done',
-              url: item,
-              response: {
-                data: item
-              }
-            })
-          }
-        })
+        if (this.uploadType == 'img' || this.uploadType == 'import') { // 图片/导入
+          a.split(',').map((item, index) => {
+            if (item) {
+              temp.push({
+                uid: index,
+                name: item,
+                status: 'done',
+                url: item,
+                response: {
+                  data: item
+                }
+              })
+            }
+          })
+        } else if (this.uploadType == 'attach') { // 附件
+          a.map((item, index) => {
+            if (item) {
+              const arr = []
+              arr.push(item) //  包裹成与新上传文件数据返回结构一致
+              temp.push({
+                uid: index,
+                name: item.fileName,
+                status: 'done',
+                url: item.filePath,
+                response: {
+                  data: arr
+                }
+              })
+            }
+          })
+        }
       }
       }
       this.fileList = temp
       this.fileList = temp
     },
     },
@@ -116,39 +144,60 @@ export default {
       if (this.listType == 'text') {
       if (this.listType == 'text') {
         return
         return
       }
       }
-      console.log(file, '8888888888')
       this.previewImage = file.url || file.thumbUrl
       this.previewImage = file.url || file.thumbUrl
-      // this.previewImage = file.response.data
       this.previewVisible = true
       this.previewVisible = true
     },
     },
+    handleRemove (file) {
+      this.$emit('remove')
+    },
     handleChange ({ file, fileList }) {
     handleChange ({ file, fileList }) {
-      if (file.status == 'error') {
-        this.$message.error('上传失败,请重试!')
-        return
+      // console.log(file, fileList, '-----change')
+      if (file.response && (file.response.status == 500 || file.response.status == 900)) {
+        if (file.status == 'error' || file.status == 'done') {
+          this.$message.error(file.response.message || '上传失败,请重试!')
+          this.$emit('remove')
+          return
+        }
       }
       }
       this.fileList = this.validaFile(file, fileList)
       this.fileList = this.validaFile(file, fileList)
       this.$emit('change', this.formatFile())
       this.$emit('change', this.formatFile())
+      this.$emit('input', this.formatFile())
     },
     },
     // 格式化文件列表数据,给表单
     // 格式化文件列表数据,给表单
     formatFile () {
     formatFile () {
+      const _this = this
       const a = this.fileList
       const a = this.fileList
-      const temp = []
+      let temp = []
+      let obj = null
       if (a && a.length) {
       if (a && a.length) {
-        a.map(item => {
-          if (item.response && item.status == 'done') {
-            temp.push(item.response.data)
-          }
-        })
+        if (this.uploadType == 'img' || this.uploadType == 'import') { // 图片/导入    将接口的返回图片地址逗号拼接后返回页面
+          a.map(item => {
+            if (item.response && item.status == 'done') {
+              temp.push(item.response.data)
+            }
+          })
+          obj = temp.join(',')
+        } else if (this.uploadType == 'attach') { // 附件    将接口的返回数据返回页面
+          a.map(item => {
+            if (item.response && item.status == 'done') {
+              if (_this.maxNums == 1) {
+                temp = [item.response.data]
+              } else {
+                temp = [...temp, ...item.response.data]
+              }
+            }
+          })
+          obj = JSON.stringify(temp)
+        }
       }
       }
-      return temp.join(',')
+      return obj
     },
     },
     // 文件校验
     // 文件校验
     validaFile (file, filesList) {
     validaFile (file, filesList) {
       if (filesList.length == 0) {
       if (filesList.length == 0) {
         return []
         return []
       }
       }
-
-      console.log(file, filesList, this.beforeUpload(file, 0))
+      // console.log(file, filesList, this.beforeUpload(file, 0))
       if (!this.beforeUpload(file, 0) && file.status != 'removed') {
       if (!this.beforeUpload(file, 0) && file.status != 'removed') {
         const index = filesList.findIndex(item => item.uid == file.uid)
         const index = filesList.findIndex(item => item.uid == file.uid)
         filesList.splice(index, 1)
         filesList.splice(index, 1)
@@ -159,16 +208,30 @@ export default {
     beforeUpload (file, tip) {
     beforeUpload (file, tip) {
       // 不限制
       // 不限制
       if (this.fileType == '*') {
       if (this.fileType == '*') {
+        // 文件大小
+        const isLt2M = file.size / 1024 / 1024 < this.fileSize
+        if (!isLt2M) {
+          if (tip != 0) {
+            this.$message.error('上传文件不能超过 ' + this.fileSize + 'MB!')
+          }
+          return isLt2M
+        }
         return true
         return true
       }
       }
-
       const isType = this.fileType.indexOf(file.type) >= 0 && file.type != ''
       const isType = this.fileType.indexOf(file.type) >= 0 && file.type != ''
-      if (!isType) {
+      // 文件格式限制为.xls、.xlsx时,上传.csv文件的type为application/vnd.ms-excel,与.xls一致,无法限制,因此更改为:
+      if (!isType || file.name.indexOf('.csv') >= 0) {
         if (tip != 0) {
         if (tip != 0) {
           this.$message.error('请上传正确的格式!')
           this.$message.error('请上传正确的格式!')
         }
         }
-        return isType
+        return isType && !(file.name.indexOf('.csv') >= 0)
       }
       }
+      // if (!isType) {
+      //   if (tip != 0) {
+      //     this.$message.error('请上传正确的格式!')
+      //   }
+      //   return isType
+      // }
 
 
       // 文件大小
       // 文件大小
       const isLt2M = file.size / 1024 / 1024 < this.fileSize
       const isLt2M = file.size / 1024 / 1024 < this.fileSize
@@ -192,10 +255,12 @@ export default {
   .upload-file{
   .upload-file{
     float: left;
     float: left;
     overflow: hidden;
     overflow: hidden;
+    height: 80px;
     /* you can make up upload button and sample style by using stylesheets */
     /* you can make up upload button and sample style by using stylesheets */
     .ant-upload-select-picture-card i {
     .ant-upload-select-picture-card i {
       font-size: 32px;
       font-size: 32px;
       color: #999;
       color: #999;
+      margin-top: 9px;
     }
     }
     .ant-upload-select-picture-card .ant-upload-text {
     .ant-upload-select-picture-card .ant-upload-text {
       margin-top: 8px;
       margin-top: 8px;
@@ -207,11 +272,16 @@ export default {
         padding: 4px 0;
         padding: 4px 0;
       }
       }
     }
     }
+    .ant-upload-list-picture-card-container{
+      height: 80px;
+      width: 80px;
+    }
     .ant-upload.ant-upload-select-picture-card,
     .ant-upload.ant-upload-select-picture-card,
     .ant-upload-list-picture-card .ant-upload-list-item{
     .ant-upload-list-picture-card .ant-upload-list-item{
       width:80px;
       width:80px;
       height:80px;
       height:80px;
       padding: 4px;
       padding: 4px;
+      margin: 0;
     }
     }
     .ant-upload-list-item-info{
     .ant-upload-list-item-info{
       padding: 0 22px 0 4px;
       padding: 0 22px 0 4px;

+ 15 - 8
src/components/custom.less

@@ -1,9 +1,12 @@
 // 自定义样式文件   覆盖框架样式
 // 自定义样式文件   覆盖框架样式
 
 
 body{
 body{
-  font-size: 13px!important;
+  font-size: 12px!important;
   span,td,label,.ant-btn-sm{
   span,td,label,.ant-btn-sm{
-    font-size: 13px!important;
+    font-size: 12px!important;
+  }
+  .ant-form-item-label > label{
+    color: #333!important;
   }
   }
 }
 }
 // 查询条件样式
 // 查询条件样式
@@ -14,6 +17,7 @@ body{
       .ant-input,.ant-select-selection{
       .ant-input,.ant-select-selection{
         border-radius: 2px;
         border-radius: 2px;
         padding: 0px 11px;
         padding: 0px 11px;
+        font-size: 12px;
       }
       }
       .ant-form-item-label{
       .ant-form-item-label{
         line-height: 32px!important;
         line-height: 32px!important;
@@ -44,7 +48,7 @@ body{
     }
     }
   }
   }
   .table-page-search-submitButtons {
   .table-page-search-submitButtons {
-    margin-bottom: 10px;
+    margin-bottom: 9px;
   }
   }
 }
 }
 // 菜单样式
 // 菜单样式
@@ -95,11 +99,11 @@ body{
 // 页签样式
 // 页签样式
 .multi-tab-con{
 .multi-tab-con{
   .ant-tabs-nav-container{
   .ant-tabs-nav-container{
-    height: 25px!important;
+    height: 31px!important;
     .ant-tabs-tab{
     .ant-tabs-tab{
       padding: 0 8px!important;
       padding: 0 8px!important;
-      height: 24px!important;
-      line-height: 24px!important;
+      height: 30px!important;
+      line-height: 30px!important;
     }
     }
   }
   }
 }
 }
@@ -135,16 +139,19 @@ body{
       .ant-table-header tr th, .ant-table-thead tr th{
       .ant-table-header tr th, .ant-table-thead tr th{
         background: #fafafa!important;
         background: #fafafa!important;
         font-weight: bold;
         font-weight: bold;
+        color: #333!important;
+        padding: 5px 5px 2px!important;
       }
       }
     }
     }
   }
   }
   .ant-table-row{
   .ant-table-row{
     .ant-table-row-cell-break-word, td{
     .ant-table-row-cell-break-word, td{
-      padding: 6px 4px!important;
+      padding: 2px 4px!important;
+      color: #333!important;
     }
     }
   }
   }
   .ant-pagination.ant-table-pagination{
   .ant-pagination.ant-table-pagination{
-    margin: 10px 0;
+    margin: 10px 0 0;
   }
   }
   .ant-table-small > .ant-table-content > .ant-table-body{
   .ant-table-small > .ant-table-content > .ant-table-body{
     margin: 0;
     margin: 0;

+ 5 - 5
src/components/global.less

@@ -108,8 +108,8 @@ body {
             margin:0 25px;
             margin:0 25px;
           }
           }
           .ant-menu.ant-menu-horizontal{
           .ant-menu.ant-menu-horizontal{
-            max-width: calc(100vw - 190px - 238px - 25px);
-            flex: 1 1 calc(100vw - 190px - 238px - 25px);
+            max-width: calc(100vw - 160px - 238px - 25px);
+            flex: 1 1 calc(100vw - 160px - 238px - 25px);
           }
           }
         }
         }
         .header-index-right{
         .header-index-right{
@@ -133,7 +133,7 @@ body {
       transition: width 0.2s;
       transition: width 0.2s;
 
 
       &.ant-header-side-opened {
       &.ant-header-side-opened {
-        width: calc(100% - 230px);
+        width: calc(100% - 160px);
       }
       }
 
 
       &.ant-header-side-closed {
       &.ant-header-side-closed {
@@ -151,7 +151,7 @@ body {
       right:0;
       right:0;
       margin: auto;
       margin: auto;
       &.ant-header-side-opened {
       &.ant-header-side-opened {
-        width: calc(100% - 230px);
+        width: calc(100% - 160px);
       }
       }
       
       
       &.ant-header-side-closed {
       &.ant-header-side-closed {
@@ -448,7 +448,7 @@ body {
   }
   }
   &.ant-layout-sider-collapsed{
   &.ant-layout-sider-collapsed{
     .logo{
     .logo{
-      padding-left: 20px;
+      // padding-left: 20px;
     }
     }
   }
   }
   &.light {
   &.light {

+ 27 - 6
src/components/tools/Logo.vue

@@ -3,15 +3,16 @@
     <router-link :to="{name:'index'}">
     <router-link :to="{name:'index'}">
       <!-- <LogoSvg alt="logo" /> -->
       <!-- <LogoSvg alt="logo" /> -->
       <!-- <img :src="LogoSvg" /> -->
       <!-- <img :src="LogoSvg" /> -->
-      <img :src="logo" alt="logo" />
-      <h1 v-if="showTitle">{{ title }}</h1>
+      <img :src="logo" alt="logo" height="42" class="img_box"/>
+      <!-- <h1 v-if="showTitle">{{ title }}</h1> -->
     </router-link>
     </router-link>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-import LogoSvg from '@/assets/logo.png'
-
+import LogoMax from '@/assets/normalbtn_login.png'
+import LogoMin from '@/assets/selectedbtn_login.png'
+import { mapState } from 'vuex'
 export default {
 export default {
   name: 'Logo',
   name: 'Logo',
   components: {
   components: {
@@ -31,9 +32,29 @@ export default {
   },
   },
   data () {
   data () {
     return {
     return {
-      LogoSvg: LogoSvg,
-      logo: require(process.env.VUE_APP_LOGO) //  logo
+      // LogoSvg: LogoSvg,
+      // logo: LogoSvg //  logo
     }
     }
+  },
+  computed: {
+	  ...mapState({
+		  sidebar: state => state.app.sidebar
+	  }),
+	 logo () {
+      return this.sidebar ? LogoMax : LogoMin
+	 }
   }
   }
 }
 }
 </script>
 </script>
+<style lang="less" scoped="scoped">
+	.logo{
+		padding-right: 10px;
+		img{
+			width: auto !important;
+			height: auto !important;
+			max-width: 100%;
+			max-height: 100%;
+		}
+	}
+
+</style>

+ 43 - 2
src/components/tools/UserMenu.vue

@@ -1,6 +1,10 @@
 <template>
 <template>
   <div class="user-wrapper">
   <div class="user-wrapper">
     <div class="content-box">
     <div class="content-box">
+      <p class="help-cont" v-if="showHelp" @click="showVideo">
+        <img style="width: 22px;height: 22px;vertical-align: middle;margin: 0 5px;" src="../../assets/icon_movie.png"/>
+        <span style="vertical-align: middle;">帮助</span>
+      </p>
       <notice-icon class="action"/>
       <notice-icon class="action"/>
       <a-dropdown>
       <a-dropdown>
         <span class="action ant-dropdown-link user-dropdown-menu">
         <span class="action ant-dropdown-link user-dropdown-menu">
@@ -29,21 +33,24 @@
           </a-menu-item>
           </a-menu-item>
         </a-menu>
         </a-menu>
       </a-dropdown>
       </a-dropdown>
+      <a-icon type="fullscreen" title="全屏" :style="{ fontSize: '20px', color: '#08c', marginLeft: '5px' }" @click="screen" />
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
+import screenfull from 'screenfull'
 import NoticeIcon from '@/components/NoticeIcon'
 import NoticeIcon from '@/components/NoticeIcon'
 import { mapActions, mapGetters } from 'vuex'
 import { mapActions, mapGetters } from 'vuex'
 import defaultAvatar from '@/assets/avatar2.jpg'
 import defaultAvatar from '@/assets/avatar2.jpg'
+import store from '../../store'
 export default {
 export default {
   name: 'UserMenu',
   name: 'UserMenu',
   components: {
   components: {
     NoticeIcon
     NoticeIcon
   },
   },
   computed: {
   computed: {
-    ...mapGetters(['nickname', 'avatar', 'authOrgs', 'userInfo']),
+    ...mapGetters(['nickname', 'avatar', 'authOrgs', 'userInfo', 'nowRoute']),
     authOrgsList () { //  过滤掉当前登录账户(不可由自己切换为自己)
     authOrgsList () { //  过滤掉当前登录账户(不可由自己切换为自己)
       const _this = this
       const _this = this
       const arr = []
       const arr = []
@@ -55,15 +62,28 @@ export default {
         })
         })
       }
       }
       return arr
       return arr
+    },
+    // 是否显示帮助视频按钮
+    showHelp () {
+      const isSaleOrder = this.nowRoute.indexOf('salesQuery') > -1 // 当前展示是否为销售单模块
+      const isSalesReturn = this.nowRoute.indexOf('salesReturn') > -1 // 当前展示是否为销售退货模块
+      const isPurchaseOrder = this.nowRoute.indexOf('purchaseOrder') > -1 // 当前展示是否为采购单管理模块
+      const isPurchaseReturn = this.nowRoute.indexOf('purchaseReturn') > -1 // 当前展示是否为采购退货模块
+      return isSaleOrder || isSalesReturn || isPurchaseOrder || isPurchaseReturn
     }
     }
   },
   },
   data () {
   data () {
     return {
     return {
-      defaultAvatar: defaultAvatar
+      defaultAvatar: defaultAvatar,
+      isFullscreen: false
     }
     }
   },
   },
   methods: {
   methods: {
     ...mapActions(['Logout', 'SetOrgSn', 'Login']),
     ...mapActions(['Logout', 'SetOrgSn', 'Login']),
+    // 打开视频播放弹窗
+    showVideo () {
+      store.commit('IS_ShOW_VIDEO', true)
+    },
     handleLogout () {
     handleLogout () {
       this.$confirm({
       this.$confirm({
         title: '提示',
         title: '提示',
@@ -86,6 +106,14 @@ export default {
         }
         }
       })
       })
     },
     },
+    screen () {
+      // 如果不允许进入全屏,发出不允许提示
+      if (!screenfull.isEnabled) {
+        this.$message.info('您的浏览器不能全屏')
+        return false
+      }
+      screenfull.toggle()
+    },
     // 切换角色
     // 切换角色
     changeRoles (sn) {
     changeRoles (sn) {
       return this.SetOrgSn(sn).then(() => {
       return this.SetOrgSn(sn).then(() => {
@@ -108,3 +136,16 @@ export default {
   }
   }
 }
 }
 </script>
 </script>
+<style scoped="scoped">
+.help-cont{
+	display: inline-block;
+	cursor: pointer;
+	transition: all 0.3s;
+	padding: 0 5px;
+  margin: 0;
+  vertical-align: bottom;
+}
+.help-cont:hover {
+	background-color: rgba(0, 0, 0, 0.04);
+}
+</style>

+ 213 - 136
src/config/router.config.js

@@ -48,6 +48,28 @@ export const asyncRouterMap = [
         },
         },
         hidden: true
         hidden: true
       },
       },
+      // 新品列表
+      {
+        path: '/newProduct/:onlineFalg',
+        name: 'newProduct',
+        component: () => import(/* webpackChunkName: "home" */ '@/views/productManagement/newProduct/list'),
+        meta: {
+          title: '新品信息',
+          icon: 'home'
+        },
+        hidden: true
+      },
+      // 产品详情
+      {
+        path: '/viewProduct/:sn',
+        name: 'viewProduct',
+        component: () => import(/* webpackChunkName: "home" */ '@/views/productManagement/newProduct/detail'),
+        meta: {
+          title: '产品详情',
+          icon: 'home'
+        },
+        hidden: true
+      },
       // 销售管理
       // 销售管理
       {
       {
         path: '/salesManagement',
         path: '/salesManagement',
@@ -63,7 +85,7 @@ export const asyncRouterMap = [
             path: '/salesManagement/salesQuery',
             path: '/salesManagement/salesQuery',
             redirect: '/salesManagement/salesQuery/list',
             redirect: '/salesManagement/salesQuery/list',
             name: 'salesQuery',
             name: 'salesQuery',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '销售单查询',
               title: '销售单查询',
               icon: 'monitor',
               icon: 'monitor',
@@ -117,36 +139,11 @@ export const asyncRouterMap = [
               }
               }
             ]
             ]
           },
           },
-          {
-            path: '/salesManagement/outboundOrder',
-            redirect: '/salesManagement/outboundOrder/list',
-            name: 'outboundOrder',
-            component: RouteView,
-            meta: {
-              title: '出库',
-              icon: 'export',
-              permission: 'M_outboundList'
-            },
-            hideChildrenInMenu: true,
-            children: [
-              {
-                path: 'list',
-                name: 'outboundOrderList',
-                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/outboundOrder/list.vue'),
-                meta: {
-                  title: '出库列表',
-                  icon: 'export',
-                  hidden: true,
-                  permission: 'M_outboundList'
-                }
-              }
-            ]
-          },
           {
           {
             path: '/salesManagement/urgentItemsOffset',
             path: '/salesManagement/urgentItemsOffset',
             redirect: '/salesManagement/urgentItemsOffset/list',
             redirect: '/salesManagement/urgentItemsOffset/list',
             name: 'urgentItemsOffset',
             name: 'urgentItemsOffset',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '急件冲减',
               title: '急件冲减',
               icon: 'rocket',
               icon: 'rocket',
@@ -182,7 +179,7 @@ export const asyncRouterMap = [
             path: '/salesManagement/salesReturn',
             path: '/salesManagement/salesReturn',
             redirect: '/salesManagement/salesReturn/list',
             redirect: '/salesManagement/salesReturn/list',
             name: 'salesReturn',
             name: 'salesReturn',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '销售退货',
               title: '销售退货',
               icon: 'fund',
               icon: 'fund',
@@ -236,69 +233,11 @@ export const asyncRouterMap = [
               }
               }
             ]
             ]
           },
           },
-          // {    二期
-          //   path: '/salesManagement/quotation',
-          //   redirect: '/salesManagement/quotation/list',
-          //   name: 'quotation',
-          //   component: RouteView,
-          //   meta: {
-          //     title: '报价单',
-          //     icon: 'idcard'
-          //     // permission: 'M_goodsManage_list'
-          //   },
-          //   hideChildrenInMenu: true,
-          //   children: [
-          //     {
-          //       path: 'list',
-          //       name: 'quotationList',
-          //       component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/quotation/list.vue'),
-          //       meta: {
-          //         title: '报价单列表',
-          //         icon: 'idcard',
-          //         hidden: true
-          //         // permission: 'M_goodsManage_list'
-          //       }
-          //     },
-          //     {
-          //       path: 'add',
-          //       name: 'quotationAdd',
-          //       component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/quotation/edit.vue'),
-          //       meta: {
-          //         title: '新增报价单',
-          //         icon: 'idcard',
-          //         hidden: true
-          //         // permission: 'M_goodsManage_list'
-          //       }
-          //     },
-          //     {
-          //       path: 'edit/:id',
-          //       name: 'quotationEdit',
-          //       component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/quotation/edit.vue'),
-          //       meta: {
-          //         title: '编辑报价单',
-          //         icon: 'idcard',
-          //         hidden: true
-          //         // permission: 'M_goodsManage_list'
-          //       }
-          //     },
-          //     {
-          //       path: 'detail/:id',
-          //       name: 'quotationDetail',
-          //       component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/quotation/detail.vue'),
-          //       meta: {
-          //         title: '报价单详情',
-          //         icon: 'idcard',
-          //         hidden: true
-          //         // permission: 'M_goodsManage_list'
-          //       }
-          //     }
-          //   ]
-          // },
           {
           {
             path: '/salesManagement/giftRecord',
             path: '/salesManagement/giftRecord',
             redirect: '/salesManagement/giftRecord/list',
             redirect: '/salesManagement/giftRecord/list',
             name: 'giftRecord',
             name: 'giftRecord',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '赠品记录',
               title: '赠品记录',
               icon: 'file-search',
               icon: 'file-search',
@@ -318,6 +257,31 @@ export const asyncRouterMap = [
                 }
                 }
               }
               }
             ]
             ]
+          },
+          {
+            path: '/salesManagement/salesman',
+            redirect: '/salesManagement/salesman/list',
+            name: 'salesman',
+            component: BlankLayout,
+            meta: {
+              title: '业务员管理',
+              icon: 'file-search',
+              permission: 'M_salesman_list'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesmanList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/salesman/list.vue'),
+                meta: {
+                  title: '业务员列表',
+                  icon: 'file-search',
+                  hidden: true,
+                  permission: 'M_salesman_list'
+                }
+              }
+            ]
           }
           }
         ]
         ]
       },
       },
@@ -336,7 +300,7 @@ export const asyncRouterMap = [
             path: '/purchasingManagement/purchaseOrder',
             path: '/purchasingManagement/purchaseOrder',
             redirect: '/purchasingManagement/purchaseOrder/list',
             redirect: '/purchasingManagement/purchaseOrder/list',
             name: 'purchaseOrder',
             name: 'purchaseOrder',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '采购单管理',
               title: '采购单管理',
               icon: 'money-collect',
               icon: 'money-collect',
@@ -405,7 +369,7 @@ export const asyncRouterMap = [
             path: '/purchasingManagement/purchaseReturn',
             path: '/purchasingManagement/purchaseReturn',
             redirect: '/purchasingManagement/purchaseReturn/list',
             redirect: '/purchasingManagement/purchaseReturn/list',
             name: 'purchaseReturn',
             name: 'purchaseReturn',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '采购退货',
               title: '采购退货',
               icon: 'money-collect',
               icon: 'money-collect',
@@ -461,6 +425,44 @@ export const asyncRouterMap = [
           }
           }
         ]
         ]
       },
       },
+      // 出库管理
+      {
+        path: '/outboundOrderManagement',
+        redirect: '/outboundOrderManagement/outboundOrder',
+        component: PageView,
+        meta: {
+          title: '出库管理',
+          icon: 'logout',
+          permission: 'M_outboundList'
+        },
+        children: [
+          {
+            path: '/outboundOrderManagement/outboundOrder',
+            redirect: '/outboundOrderManagement/outboundOrder/list',
+            name: 'outboundOrder',
+            component: BlankLayout,
+            meta: {
+              title: '出库',
+              icon: 'logout',
+              permission: 'M_outboundList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'outboundOrderList',
+                component: () => import(/* webpackChunkName: "outboundOrderManagement" */ '@/views/outboundOrderManagement/outboundOrder/list.vue'),
+                meta: {
+                  title: '出库列表',
+                  icon: 'logout',
+                  hidden: true,
+                  permission: 'M_outboundList'
+                }
+              }
+            ]
+          }
+        ]
+      },
       // 财务管理
       // 财务管理
       {
       {
         path: '/financialManagement',
         path: '/financialManagement',
@@ -476,7 +478,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/warehousingAudit',
             path: '/financialManagement/warehousingAudit',
             redirect: '/financialManagement/warehousingAudit/list',
             redirect: '/financialManagement/warehousingAudit/list',
             name: 'warehousingAudit',
             name: 'warehousingAudit',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '入库审核',
               title: '入库审核',
               icon: 'pull-request',
               icon: 'pull-request',
@@ -512,7 +514,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/inventoryCheckAudit',
             path: '/financialManagement/inventoryCheckAudit',
             redirect: '/financialManagement/inventoryCheckAudit/list',
             redirect: '/financialManagement/inventoryCheckAudit/list',
             name: 'inventoryCheckAudit',
             name: 'inventoryCheckAudit',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '盘点审核',
               title: '盘点审核',
               icon: 'laptop',
               icon: 'laptop',
@@ -537,7 +539,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/financialPayment',
             path: '/financialManagement/financialPayment',
             redirect: '/financialManagement/financialPayment/list',
             redirect: '/financialManagement/financialPayment/list',
             name: 'financialPayment',
             name: 'financialPayment',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '财务付款',
               title: '财务付款',
               icon: 'pay-circle',
               icon: 'pay-circle',
@@ -562,7 +564,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/financialCollection',
             path: '/financialManagement/financialCollection',
             redirect: '/financialManagement/financialCollection/list',
             redirect: '/financialManagement/financialCollection/list',
             name: 'financialCollection',
             name: 'financialCollection',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '财务收款',
               title: '财务收款',
               icon: 'money-collect',
               icon: 'money-collect',
@@ -587,7 +589,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/expenseManagement',
             path: '/financialManagement/expenseManagement',
             redirect: '/financialManagement/expenseManagement/list',
             redirect: '/financialManagement/expenseManagement/list',
             name: 'expenseManagement',
             name: 'expenseManagement',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '费用管理',
               title: '费用管理',
               icon: 'pound',
               icon: 'pound',
@@ -634,7 +636,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/companyReceivablePayable',
             path: '/financialManagement/companyReceivablePayable',
             redirect: '/financialManagement/companyReceivablePayable/list',
             redirect: '/financialManagement/companyReceivablePayable/list',
             name: 'companyReceivablePayable',
             name: 'companyReceivablePayable',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '单位应收应付管理',
               title: '单位应收应付管理',
               icon: 'transaction',
               icon: 'transaction',
@@ -681,7 +683,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/companyCollectionPayment',
             path: '/financialManagement/companyCollectionPayment',
             redirect: '/financialManagement/companyCollectionPayment/list',
             redirect: '/financialManagement/companyCollectionPayment/list',
             name: 'companyCollectionPayment',
             name: 'companyCollectionPayment',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '单位收付款记录',
               title: '单位收付款记录',
               icon: 'file-protect',
               icon: 'file-protect',
@@ -717,7 +719,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/withdrawalManagement',
             path: '/financialManagement/withdrawalManagement',
             redirect: '/financialManagement/withdrawalManagement/list',
             redirect: '/financialManagement/withdrawalManagement/list',
             name: 'withdrawalManagement',
             name: 'withdrawalManagement',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '提现管理',
               title: '提现管理',
               icon: 'dollar',
               icon: 'dollar',
@@ -742,7 +744,7 @@ export const asyncRouterMap = [
             path: '/financialManagement/ledgerRecord',
             path: '/financialManagement/ledgerRecord',
             redirect: '/financialManagement/ledgerRecord/list',
             redirect: '/financialManagement/ledgerRecord/list',
             name: 'ledgerRecord',
             name: 'ledgerRecord',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '分账记录',
               title: '分账记录',
               icon: 'profile',
               icon: 'profile',
@@ -780,7 +782,7 @@ export const asyncRouterMap = [
             path: '/allocationManagement/warehouseAllocation',
             path: '/allocationManagement/warehouseAllocation',
             redirect: '/allocationManagement/warehouseAllocation/list',
             redirect: '/allocationManagement/warehouseAllocation/list',
             name: 'warehouseAllocation',
             name: 'warehouseAllocation',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '仓库调拨',
               title: '仓库调拨',
               icon: 'gateway',
               icon: 'gateway',
@@ -838,7 +840,7 @@ export const asyncRouterMap = [
             path: '/allocationManagement/chainTransferIn',
             path: '/allocationManagement/chainTransferIn',
             redirect: '/allocationManagement/chainTransferIn/list',
             redirect: '/allocationManagement/chainTransferIn/list',
             name: 'chainTransferIn',
             name: 'chainTransferIn',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '连锁调入',
               title: '连锁调入',
               icon: 'cluster',
               icon: 'cluster',
@@ -885,7 +887,7 @@ export const asyncRouterMap = [
             path: '/allocationManagement/chainTransferOut',
             path: '/allocationManagement/chainTransferOut',
             redirect: '/allocationManagement/chainTransferOut/list',
             redirect: '/allocationManagement/chainTransferOut/list',
             name: 'chainTransferOut',
             name: 'chainTransferOut',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '连锁调出',
               title: '连锁调出',
               icon: 'pull-request',
               icon: 'pull-request',
@@ -943,7 +945,7 @@ export const asyncRouterMap = [
             path: '/allocationManagement/storeTransferOut',
             path: '/allocationManagement/storeTransferOut',
             redirect: '/allocationManagement/storeTransferOut/list',
             redirect: '/allocationManagement/storeTransferOut/list',
             name: 'storeTransferOut',
             name: 'storeTransferOut',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '店内调出',
               title: '店内调出',
               icon: 'interaction',
               icon: 'interaction',
@@ -1014,7 +1016,7 @@ export const asyncRouterMap = [
             path: '/inventoryManagement/inventoryQuery',
             path: '/inventoryManagement/inventoryQuery',
             redirect: '/inventoryManagement/inventoryQuery/list',
             redirect: '/inventoryManagement/inventoryQuery/list',
             name: 'inventoryQuery',
             name: 'inventoryQuery',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '库存查询',
               title: '库存查询',
               icon: 'monitor',
               icon: 'monitor',
@@ -1070,7 +1072,7 @@ export const asyncRouterMap = [
             path: '/inventoryManagement/inventoryChecking',
             path: '/inventoryManagement/inventoryChecking',
             redirect: '/inventoryManagement/inventoryChecking/list',
             redirect: '/inventoryManagement/inventoryChecking/list',
             name: 'inventoryChecking',
             name: 'inventoryChecking',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '库存盘点',
               title: '库存盘点',
               icon: 'reconciliation',
               icon: 'reconciliation',
@@ -1124,11 +1126,36 @@ export const asyncRouterMap = [
               }
               }
             ]
             ]
           },
           },
+          {
+            path: '/inventoryManagement/inventoryImport',
+            redirect: '/inventoryManagement/inventoryImport/list',
+            name: 'inventoryImport',
+            component: BlankLayout,
+            meta: {
+              title: '库存导入',
+              icon: 'frown',
+              permission: 'M_inventoryImport'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'inventoryImportList',
+                component: () => import(/* webpackChunkName: "shop" */ '@/views/inventoryManagement/inventoryImport/list.vue'),
+                meta: {
+                  title: '库存导入列表',
+                  icon: 'frown',
+                  hidden: true,
+                  permission: 'M_inventoryImport'
+                }
+              }
+            ]
+          },
           {
           {
             path: '/inventoryManagement/warehouse',
             path: '/inventoryManagement/warehouse',
             redirect: '/inventoryManagement/warehouse/list',
             redirect: '/inventoryManagement/warehouse/list',
             name: 'warehouse',
             name: 'warehouse',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '仓库管理',
               title: '仓库管理',
               icon: 'deployment-unit',
               icon: 'deployment-unit',
@@ -1170,14 +1197,14 @@ export const asyncRouterMap = [
         meta: {
         meta: {
           title: '散件管理',
           title: '散件管理',
           icon: 'gold',
           icon: 'gold',
-          permission: 'M_bulkWarehousingOrderList'
+          permission: 'M_bulkManagement'
         },
         },
         children: [
         children: [
           {
           {
             path: '/bulkManagement/bulkWarehousingOrder',
             path: '/bulkManagement/bulkWarehousingOrder',
             redirect: '/bulkManagement/bulkWarehousingOrder/list',
             redirect: '/bulkManagement/bulkWarehousingOrder/list',
             name: 'bulkWarehousingOrder',
             name: 'bulkWarehousingOrder',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '散件入库',
               title: '散件入库',
               icon: 'gold',
               icon: 'gold',
@@ -1235,7 +1262,7 @@ export const asyncRouterMap = [
             path: '/bulkManagement/bulkReturnGoods',
             path: '/bulkManagement/bulkReturnGoods',
             redirect: '/bulkManagement/bulkReturnGoods/list',
             redirect: '/bulkManagement/bulkReturnGoods/list',
             name: 'bulkReturnGoods',
             name: 'bulkReturnGoods',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '散件退货',
               title: '散件退货',
               icon: 'frown',
               icon: 'frown',
@@ -1277,6 +1304,31 @@ export const asyncRouterMap = [
                 }
                 }
               }
               }
             ]
             ]
+          },
+          {
+            path: '/bulkManagement/bulkImport',
+            redirect: '/bulkManagement/bulkImport/list',
+            name: 'bulkImport',
+            component: BlankLayout,
+            meta: {
+              title: '散件导入',
+              icon: 'frown',
+              permission: 'M_bulkImport'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'bulkImportList',
+                component: () => import(/* webpackChunkName: "shop" */ '@/views/bulkManagement/bulkImport/list.vue'),
+                meta: {
+                  title: '散件导入列表',
+                  icon: 'frown',
+                  hidden: true,
+                  permission: 'M_bulkImport'
+                }
+              }
+            ]
           }
           }
         ]
         ]
       },
       },
@@ -1295,9 +1347,9 @@ export const asyncRouterMap = [
             path: '/reportData/chainStockReport',
             path: '/reportData/chainStockReport',
             redirect: '/reportData/chainStockReport/list',
             redirect: '/reportData/chainStockReport/list',
             name: 'chainStockReport',
             name: 'chainStockReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
-              title: '连锁库存总表(天)',
+              title: '连锁库存总表',
               icon: 'profile',
               icon: 'profile',
               permission: 'M_chainStockReportList'
               permission: 'M_chainStockReportList'
             },
             },
@@ -1320,9 +1372,9 @@ export const asyncRouterMap = [
             path: '/reportData/chainSalesReport',
             path: '/reportData/chainSalesReport',
             redirect: '/reportData/chainSalesReport/list',
             redirect: '/reportData/chainSalesReport/list',
             name: 'chainSalesReport',
             name: 'chainSalesReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
-              title: '连锁销售报表(天)',
+              title: '连锁销售报表',
               icon: 'profile',
               icon: 'profile',
               permission: 'M_chainSalesReportList'
               permission: 'M_chainSalesReportList'
             },
             },
@@ -1345,9 +1397,9 @@ export const asyncRouterMap = [
             path: '/reportData/chainSalesDetailReport',
             path: '/reportData/chainSalesDetailReport',
             redirect: '/reportData/chainSalesDetailReport/list',
             redirect: '/reportData/chainSalesDetailReport/list',
             name: 'chainSalesDetailReport',
             name: 'chainSalesDetailReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
-              title: '连锁销售明细报表(天)',
+              title: '连锁销售明细报表',
               icon: 'profile',
               icon: 'profile',
               permission: 'M_chainSalesDetailReportList'
               permission: 'M_chainSalesDetailReportList'
             },
             },
@@ -1370,7 +1422,7 @@ export const asyncRouterMap = [
             path: '/reportData/chainReceivedSendStorageReport',
             path: '/reportData/chainReceivedSendStorageReport',
             redirect: '/reportData/chainReceivedSendStorageReport/list',
             redirect: '/reportData/chainReceivedSendStorageReport/list',
             name: 'chainReceivedSendStorageReport',
             name: 'chainReceivedSendStorageReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '连锁收发存报表',
               title: '连锁收发存报表',
               icon: 'profile',
               icon: 'profile',
@@ -1395,9 +1447,9 @@ export const asyncRouterMap = [
             path: '/reportData/customerReport',
             path: '/reportData/customerReport',
             redirect: '/reportData/customerReport/list',
             redirect: '/reportData/customerReport/list',
             name: 'customerReport',
             name: 'customerReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
-              title: '大客户报表(天)',
+              title: '大客户报表',
               icon: 'profile',
               icon: 'profile',
               permission: 'M_customerReportList'
               permission: 'M_customerReportList'
             },
             },
@@ -1416,11 +1468,36 @@ export const asyncRouterMap = [
               }
               }
             ]
             ]
           },
           },
+          {
+            path: '/reportData/chainCustomerReport',
+            redirect: '/reportData/chainCustomerReport/list',
+            name: 'chainCustomerReport',
+            component: BlankLayout,
+            meta: {
+              title: '连锁大客户报表',
+              icon: 'profile',
+              permission: 'M_chainCustomerReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'chainCustomerReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainCustomerReport/list.vue'),
+                meta: {
+                  title: '连锁大客户报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_chainCustomerReportList'
+                }
+              }
+            ]
+          },
           {
           {
             path: '/reportData/stockIncomeReport',
             path: '/reportData/stockIncomeReport',
             redirect: '/reportData/stockIncomeReport/list',
             redirect: '/reportData/stockIncomeReport/list',
             name: 'stockIncomeReport',
             name: 'stockIncomeReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '库存总入报表',
               title: '库存总入报表',
               icon: 'profile',
               icon: 'profile',
@@ -1445,7 +1522,7 @@ export const asyncRouterMap = [
             path: '/reportData/stockExpenditureReport',
             path: '/reportData/stockExpenditureReport',
             redirect: '/reportData/stockExpenditureReport/list',
             redirect: '/reportData/stockExpenditureReport/list',
             name: 'stockExpenditureReport',
             name: 'stockExpenditureReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '库存总出报表',
               title: '库存总出报表',
               icon: 'profile',
               icon: 'profile',
@@ -1470,7 +1547,7 @@ export const asyncRouterMap = [
             path: '/reportData/receivedSendStorageReport',
             path: '/reportData/receivedSendStorageReport',
             redirect: '/reportData/receivedSendStorageReport/list',
             redirect: '/reportData/receivedSendStorageReport/list',
             name: 'receivedSendStorageReport',
             name: 'receivedSendStorageReport',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '收发存报表',
               title: '收发存报表',
               icon: 'profile',
               icon: 'profile',
@@ -1508,7 +1585,7 @@ export const asyncRouterMap = [
             path: '/customerManagement/customerInfo',
             path: '/customerManagement/customerInfo',
             redirect: '/customerManagement/customerInfo/list',
             redirect: '/customerManagement/customerInfo/list',
             name: 'customerInfo',
             name: 'customerInfo',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '客户管理',
               title: '客户管理',
               icon: 'idcard',
               icon: 'idcard',
@@ -1568,7 +1645,7 @@ export const asyncRouterMap = [
             path: '/productManagement/productInfo',
             path: '/productManagement/productInfo',
             redirect: '/productManagement/productInfo/list',
             redirect: '/productManagement/productInfo/list',
             name: 'productInfo',
             name: 'productInfo',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '产品信息管理(自建)',
               title: '产品信息管理(自建)',
               icon: 'file-text',
               icon: 'file-text',
@@ -1581,7 +1658,7 @@ export const asyncRouterMap = [
                 name: 'productInfoList',
                 name: 'productInfoList',
                 component: () => import(/* webpackChunkName: "shop" */ '@/views/productManagement/productInfo/list.vue'),
                 component: () => import(/* webpackChunkName: "shop" */ '@/views/productManagement/productInfo/list.vue'),
                 meta: {
                 meta: {
-                  title: '产品信息列表',
+                  title: '产品信息列表(自建)',
                   icon: 'file-text',
                   icon: 'file-text',
                   hidden: true,
                   hidden: true,
                   permission: 'M_dealerProductList'
                   permission: 'M_dealerProductList'
@@ -1615,7 +1692,7 @@ export const asyncRouterMap = [
             path: '/productManagement/productInfoJg',
             path: '/productManagement/productInfoJg',
             redirect: '/productManagement/productInfoJg/list',
             redirect: '/productManagement/productInfoJg/list',
             name: 'productInfoJg',
             name: 'productInfoJg',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '产品信息管理(箭冠)',
               title: '产品信息管理(箭冠)',
               icon: 'file-text',
               icon: 'file-text',
@@ -1628,7 +1705,7 @@ export const asyncRouterMap = [
                 name: 'productInfoJgList',
                 name: 'productInfoJgList',
                 component: () => import(/* webpackChunkName: "shop" */ '@/views/productManagement/productInfoJg/list.vue'),
                 component: () => import(/* webpackChunkName: "shop" */ '@/views/productManagement/productInfoJg/list.vue'),
                 meta: {
                 meta: {
-                  title: '产品信息列表',
+                  title: '产品信息列表(箭冠)',
                   icon: 'file-text',
                   icon: 'file-text',
                   hidden: true,
                   hidden: true,
                   permission: 'M_productInfoList'
                   permission: 'M_productInfoList'
@@ -1640,7 +1717,7 @@ export const asyncRouterMap = [
             path: '/productManagement/productBrand',
             path: '/productManagement/productBrand',
             redirect: '/productManagement/productBrand/list',
             redirect: '/productManagement/productBrand/list',
             name: 'productBrand',
             name: 'productBrand',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '产品品牌管理',
               title: '产品品牌管理',
               icon: 'sketch',
               icon: 'sketch',
@@ -1665,7 +1742,7 @@ export const asyncRouterMap = [
             path: '/productManagement/productCategory',
             path: '/productManagement/productCategory',
             redirect: '/productManagement/productCategory/list',
             redirect: '/productManagement/productCategory/list',
             name: 'productCategory',
             name: 'productCategory',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '产品分类管理',
               title: '产品分类管理',
               icon: 'sliders',
               icon: 'sliders',
@@ -1690,7 +1767,7 @@ export const asyncRouterMap = [
             path: '/productManagement/priceChangeRecord',
             path: '/productManagement/priceChangeRecord',
             redirect: '/productManagement/priceChangeRecord/list',
             redirect: '/productManagement/priceChangeRecord/list',
             name: 'priceChangeRecord',
             name: 'priceChangeRecord',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '价格变更记录',
               title: '价格变更记录',
               icon: 'sketch',
               icon: 'sketch',
@@ -1728,7 +1805,7 @@ export const asyncRouterMap = [
             path: '/supplierManagement/supplierInfo',
             path: '/supplierManagement/supplierInfo',
             redirect: '/supplierManagement/supplierInfo/list',
             redirect: '/supplierManagement/supplierInfo/list',
             name: 'supplierInfo',
             name: 'supplierInfo',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '供应商管理',
               title: '供应商管理',
               icon: 'team',
               icon: 'team',
@@ -1766,7 +1843,7 @@ export const asyncRouterMap = [
             path: '/storeManagement/bind',
             path: '/storeManagement/bind',
             redirect: '/storeManagement/bind/list',
             redirect: '/storeManagement/bind/list',
             name: 'storeManagementBind',
             name: 'storeManagementBind',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '中心店/配送店绑定',
               title: '中心店/配送店绑定',
               icon: 'link',
               icon: 'link',
@@ -1791,7 +1868,7 @@ export const asyncRouterMap = [
             path: '/storeManagement/userAuthorization',
             path: '/storeManagement/userAuthorization',
             redirect: '/storeManagement/userAuthorization/list',
             redirect: '/storeManagement/userAuthorization/list',
             name: 'storeManagementUserAuth',
             name: 'storeManagementUserAuth',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '中心店用户授权',
               title: '中心店用户授权',
               icon: 'link',
               icon: 'link',
@@ -1829,7 +1906,7 @@ export const asyncRouterMap = [
             path: '/basicData/storeTransferOutTypeManagement',
             path: '/basicData/storeTransferOutTypeManagement',
             redirect: '/basicData/storeTransferOutTypeManagement/list',
             redirect: '/basicData/storeTransferOutTypeManagement/list',
             name: 'storeTransferOutTypeManagement',
             name: 'storeTransferOutTypeManagement',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '店内调出类型管理',
               title: '店内调出类型管理',
               icon: 'interaction',
               icon: 'interaction',
@@ -1854,7 +1931,7 @@ export const asyncRouterMap = [
             path: '/basicData/bulkPartsTypeManagement',
             path: '/basicData/bulkPartsTypeManagement',
             redirect: '/basicData/bulkPartsTypeManagement/list',
             redirect: '/basicData/bulkPartsTypeManagement/list',
             name: 'bulkPartsTypeManagement',
             name: 'bulkPartsTypeManagement',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '散件入库类型管理',
               title: '散件入库类型管理',
               icon: 'gold',
               icon: 'gold',
@@ -1879,7 +1956,7 @@ export const asyncRouterMap = [
             path: '/basicData/expenseType',
             path: '/basicData/expenseType',
             redirect: '/basicData/expenseType/list',
             redirect: '/basicData/expenseType/list',
             name: 'expenseType',
             name: 'expenseType',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '费用类型管理',
               title: '费用类型管理',
               icon: 'pay-circle',
               icon: 'pay-circle',
@@ -1904,7 +1981,7 @@ export const asyncRouterMap = [
           //   path: '/basicData/processSettings',
           //   path: '/basicData/processSettings',
           //   redirect: '/basicData/processSettings/setup',
           //   redirect: '/basicData/processSettings/setup',
           //   name: 'processSettings',
           //   name: 'processSettings',
-          //   component: RouteView,
+          //   component: BlankLayout,
           //   meta: {
           //   meta: {
           //     title: '业务自动化设置',
           //     title: '业务自动化设置',
           //     icon: 'sliders'
           //     icon: 'sliders'
@@ -1929,7 +2006,7 @@ export const asyncRouterMap = [
             path: '/basicData/customerTypeManagement',
             path: '/basicData/customerTypeManagement',
             redirect: '/basicData/customerTypeManagement/list',
             redirect: '/basicData/customerTypeManagement/list',
             name: 'customerTypeManagement',
             name: 'customerTypeManagement',
-            component: RouteView,
+            component: BlankLayout,
             meta: {
             meta: {
               title: '客户类型管理',
               title: '客户类型管理',
               icon: 'idcard',
               icon: 'idcard',

+ 108 - 10
src/layouts/BasicLayout.vue

@@ -39,19 +39,35 @@
         @toggle="toggle"
         @toggle="toggle"
       />
       />
       <!-- layout content -->
       <!-- layout content -->
-      <a-layout-content :style="{ height: '100%', margin: '24px 20px 0', paddingTop: multiTab&&fixedHeader ? '66px' : (!multiTab&&fixedHeader?'45px':'0') }">
+      <a-layout-content :style="{ height: '100%', margin: '30px 20px 0', paddingTop: multiTab&&fixedHeader ? '66px' : (!multiTab&&fixedHeader?'45px':'0') }">
         <transition name="page-transition">
         <transition name="page-transition">
-          <route-view/>
+          <route-view v-if="isRouterAlive"/>
         </transition>
         </transition>
       </a-layout-content>
       </a-layout-content>
-
+      <!-- 视频播放弹窗 -->
+      <a-modal
+        v-model="isShowVideoVal"
+        wrapClassName="vidio_cont"
+        :footer="null"
+        centered
+        :maskClosable="false"
+        :destroyOnClose="true"
+        :width="1000"
+        @cancel="closeVido">
+        <video-player
+          class="video-player vjs-custom-skin"
+          ref="videoPlayer"
+          :playsinline="true"
+          :options="playerOptions"
+        ></video-player>
+      </a-modal>
       <!-- layout footer -->
       <!-- layout footer -->
       <a-layout-footer>
       <a-layout-footer>
         <!-- <global-footer /> -->
         <!-- <global-footer /> -->
       </a-layout-footer>
       </a-layout-footer>
 
 
       <!-- Setting Drawer (show in development mode) -->
       <!-- Setting Drawer (show in development mode) -->
-      <setting-drawer v-if="!production"></setting-drawer>
+      <!-- <setting-drawer v-if="!production"></setting-drawer> -->
     </a-layout>
     </a-layout>
   </a-layout>
   </a-layout>
 
 
@@ -59,7 +75,7 @@
 
 
 <script>
 <script>
 import { triggerWindowResizeEvent } from '@/utils/util'
 import { triggerWindowResizeEvent } from '@/utils/util'
-import { mapState, mapActions } from 'vuex'
+import { mapState, mapActions, mapGetters } from 'vuex'
 import { mixin, mixinDevice } from '@/utils/mixin'
 import { mixin, mixinDevice } from '@/utils/mixin'
 import config from '@/config/defaultSettings'
 import config from '@/config/defaultSettings'
 
 
@@ -69,10 +85,15 @@ import GlobalHeader from '@/components/GlobalHeader'
 import GlobalFooter from '@/components/GlobalFooter'
 import GlobalFooter from '@/components/GlobalFooter'
 import SettingDrawer from '@/components/SettingDrawer'
 import SettingDrawer from '@/components/SettingDrawer'
 import { asyncRouterMap } from '@/config/router.config'
 import { asyncRouterMap } from '@/config/router.config'
-
+import store from '@/store'
 export default {
 export default {
   name: 'BasicLayout',
   name: 'BasicLayout',
   mixins: [mixin, mixinDevice],
   mixins: [mixin, mixinDevice],
+  provide () {
+    return {
+      reloadView: this.reloadView
+    }
+  },
   components: {
   components: {
     RouteView,
     RouteView,
     SideMenu,
     SideMenu,
@@ -84,7 +105,8 @@ export default {
     return {
     return {
       production: config.production,
       production: config.production,
       collapsed: false,
       collapsed: false,
-      menus: []
+      menus: [],
+      isRouterAlive: true
     }
     }
   },
   },
   computed: {
   computed: {
@@ -94,14 +116,66 @@ export default {
       multiTab: state => state.app.multiTab,
       multiTab: state => state.app.multiTab,
       fixedHeader: state => state.app.fixedHeader
       fixedHeader: state => state.app.fixedHeader
     }),
     }),
+    ...mapGetters(['nowRoute', 'isShowVideo']),
+    isShowVideoVal: {
+      get () {
+        return this.$store.state.app.isShowVideo
+      },
+      set (newValue) {
+        this.$store.state.app.isShowVideo = newValue
+      }
+    },
     contentPaddingLeft () {
     contentPaddingLeft () {
       if (!this.fixSidebar || this.isMobile()) {
       if (!this.fixSidebar || this.isMobile()) {
         return '0'
         return '0'
       }
       }
       if (this.sidebarOpened) {
       if (this.sidebarOpened) {
-        return '230px'
+        return '160px'
       }
       }
       return '80px'
       return '80px'
+    },
+    playerOptions () {
+      const playerOptions = {
+        playbackRates: [0.7, 1.0, 1.5, 2.0], // 播放速度
+        autoplay: true, // 如果true,浏览器准备好时开始回放。
+        muted: false, // 默认情况下将会消除任何音频。
+        loop: false, // 导致视频一结束就重新开始。
+        preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
+        language: 'zh-CN',
+        aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
+        fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
+        sources: [{
+          type: '', // 这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目
+          src: '' // url地址
+        }],
+        poster: '../assets/bg_movie@2x.png', // 你的封面地址
+        // width: document.documentElement.clientWidth, //播放器宽度
+        notSupportedMessage: '此视频暂无法播放,请稍后再试', // 允许覆盖Video.js无法播放媒体源时显示的默认信息。
+        controlBar: {
+          timeDivider: true,
+          durationDisplay: true,
+          remainingTimeDisplay: false,
+          fullscreenToggle: true // 全屏按钮
+        }
+      }
+      const isSaleOrder = this.nowRoute.indexOf('salesQuery') > -1 // 当前展示是否为销售单模块
+      const isSalesReturn = this.nowRoute.indexOf('salesReturn') > -1 // 当前展示是否为销售退货模块
+      const isPurchaseOrder = this.nowRoute.indexOf('purchaseOrder') > -1 // 当前展示是否为采购单管理模块
+      const isPurchaseReturn = this.nowRoute.indexOf('purchaseReturn') > -1 // 当前展示是否为采购退货模块
+      if (isSaleOrder) {
+        playerOptions.sources[0].src = 'https://jianguan-images.oss-cn-beijing.aliyuncs.com/helpvideo/1xiaoshou.mp4'
+      }
+      if (isSalesReturn) {
+        playerOptions.sources[0].src = 'https://jianguan-images.oss-cn-beijing.aliyuncs.com/helpvideo/2xiaoshoutuihuo.mp4'
+      }
+      if (isPurchaseOrder) {
+        playerOptions.sources[0].src = 'https://jianguan-images.oss-cn-beijing.aliyuncs.com/helpvideo/3caigou.mp4'
+      }
+      if (isPurchaseReturn) {
+        playerOptions.sources[0].src = 'https://jianguan-images.oss-cn-beijing.aliyuncs.com/helpvideo/4caigoutuihuo.mp4'
+      }
+	  // console.log(playerOptions, 'playerOptions')
+	  return playerOptions
     }
     }
   },
   },
   watch: {
   watch: {
@@ -134,6 +208,10 @@ export default {
   },
   },
   methods: {
   methods: {
     ...mapActions(['setSidebar']),
     ...mapActions(['setSidebar']),
+    // 关闭视频弹窗
+    closeVido () {
+      store.commit('IS_ShOW_VIDEO', false)
+    },
     toggle () {
     toggle () {
       this.collapsed = !this.collapsed
       this.collapsed = !this.collapsed
       this.setSidebar(!this.collapsed)
       this.setSidebar(!this.collapsed)
@@ -142,7 +220,7 @@ export default {
     paddingCalc () {
     paddingCalc () {
       let left = ''
       let left = ''
       if (this.sidebarOpened) {
       if (this.sidebarOpened) {
-        left = this.isDesktop() ? '230px' : '80px'
+        left = this.isDesktop() ? '160px' : '80px'
       } else {
       } else {
         left = (this.isMobile() && '0') || ((this.fixSidebar && '80px') || '0')
         left = (this.isMobile() && '0') || ((this.fixSidebar && '80px') || '0')
       }
       }
@@ -152,6 +230,12 @@ export default {
     },
     },
     drawerClose () {
     drawerClose () {
       this.collapsed = false
       this.collapsed = false
+    },
+    reloadView () {
+      this.isRouterAlive = false
+      this.$nextTick(() => {
+        this.isRouterAlive = true
+      })
     }
     }
   }
   }
 }
 }
@@ -169,7 +253,21 @@ export default {
  * You can easily play with the page transition by editing
  * You can easily play with the page transition by editing
  * these styles.
  * these styles.
  */
  */
-
+.vidio_cont .ant-modal-body {
+	padding: 0;
+}
+.vidio_cont .ant-modal-close-x {
+	width: 36px;
+	height: 36px;
+	text-align: center;
+	line-height: 36px;
+	color: #fff;
+	background-color: rgba(0, 0, 0, 0.6);
+	border-radius: 50%;
+	position: absolute;
+	top: 10px;
+	right: 10px;
+}
 .page-transition-enter {
 .page-transition-enter {
   opacity: 0;
   opacity: 0;
 }
 }

+ 4 - 1
src/layouts/PageView.vue

@@ -94,7 +94,7 @@ export default {
       multiTab: state => state.app.multiTab
       multiTab: state => state.app.multiTab
     }),
     }),
     contHeight () {
     contHeight () {
-      return window.innerHeight - 80
+      return window.innerHeight - 85
     }
     }
   },
   },
   mounted () {
   mounted () {
@@ -131,6 +131,9 @@ export default {
     margin: 12px 12px 0;
     margin: 12px 12px 0;
     .page-header-index-wide{
     .page-header-index-wide{
       height: 100%;
       height: 100%;
+      >div{
+        height: 100%;
+      }
     }
     }
     .link {
     .link {
       margin-top: 16px;
       margin-top: 16px;

+ 4 - 4
src/layouts/RouteView.vue

@@ -11,10 +11,10 @@ export default {
     return {}
     return {}
   },
   },
   render () {
   render () {
-    const { $route: { meta }, $store: { getters } } = this
+    const { $route: { meta, name }, $store: { getters } } = this
     const inKeep = (
     const inKeep = (
       <keep-alive>
       <keep-alive>
-        <router-view key={ this.$route.fullPath }/>
+        <router-view key={ name }/>
       </keep-alive>
       </keep-alive>
     )
     )
     const notKeep = (
     const notKeep = (
@@ -26,8 +26,8 @@ export default {
     // if (!getters.multiTab && !meta.keepAlive) {
     // if (!getters.multiTab && !meta.keepAlive) {
     //   return notKeep
     //   return notKeep
     // }
     // }
-    // return this.keepAlive || getters.multiTab || meta.keepAlive ? inKeep : notKeep
-    return meta.keepAlive ? inKeep : notKeep
+    return this.keepAlive || getters.multiTab || meta.keepAlive ? inKeep : notKeep
+    // return meta.keepAlive ? inKeep : notKeep
   }
   }
 }
 }
 </script>
 </script>

+ 3 - 4
src/layouts/UserLayout.vue

@@ -4,10 +4,9 @@
     <div class="container">
     <div class="container">
       <div class="top">
       <div class="top">
         <div class="header">
         <div class="header">
-          <a href="/">
+          <!-- <a href="/">
             <img :src="logo" class="logo" alt="logo" />
             <img :src="logo" class="logo" alt="logo" />
-            <!-- <span class="title">{{logo}}</span> -->
-          </a>
+          </a> -->
         </div>
         </div>
         <div class="desc">{{ title }}</div>
         <div class="desc">{{ title }}</div>
       </div>
       </div>
@@ -43,7 +42,7 @@ export default {
       title: process.env.VUE_APP_PRO_NAME,
       title: process.env.VUE_APP_PRO_NAME,
       company: process.env.VUE_APP_COM_NAME, //  公司
       company: process.env.VUE_APP_COM_NAME, //  公司
       icp: process.env.VUE_APP_ICP, //  备案号
       icp: process.env.VUE_APP_ICP, //  备案号
-      logo: require(process.env.VUE_APP_LOGO) //  logo
+      // logo: require(process.env.VUE_APP_LOGO) //  logo
     }
     }
   },
   },
   mounted () {
   mounted () {

+ 48 - 0
src/libs/JGPrint.js

@@ -0,0 +1,48 @@
+import confirm from 'ant-design-vue/es/modal/confirm'
+import { getLodop } from '@/libs/LodopFuncs'
+export const JGPrint = function(data, type, printerType){
+  if (!data) {
+    return
+  }
+  // 针式打印
+  if (printerType == 'NEEDLE') {
+    const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
+    console.log(LODOP)
+    if (!LODOP) {
+      confirm({
+        title: '提示?',
+        content: h => <div>打印控件未安装,请先下载并安装。安装完成后,刷新页面即可打印。</div>,
+        okText: '立即下载',
+        okType: 'danger',
+        cancelText: '暂不打印',
+        onOk () {
+          window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
+        }
+      })
+      return
+    }
+    const rx = /<body[^>]*>([\s\S]+?)<\/body>/i///
+    let m = rx.exec(data)
+    if (m) m = m[1]
+    LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
+    LODOP.SET_PRINT_PAGESIZE(3, '2140', '60', '') // 这里3表示纵向打印且纸高“按内容的高度”;2140表示纸宽214.0mm;45表示页底空白4.5mm
+    LODOP.ADD_PRINT_HTM("0","0","RightMargin:0.5cm","BottomMargin:0.5cm",m)
+    // LODOP.ADD_PRINT_TABLE(0, 0, '100%', '100%', m)
+    if (type == 'preview') {
+      LODOP.PREVIEW()
+    }
+    if (type == 'print') {
+      LODOP.PRINT()
+    }
+  } else {
+    const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
+    document.getElementById('print').innerHTML = '<iframe id="printfsqd" name="printfsqd" src="' + url + '" hidden></iframe>'
+    // 喷墨打印
+    if (type == 'preview') { //  预览
+      window.open(url)
+    } else if (type == 'print') { //  打印
+      window.frames['printfsqd'].focus()
+      window.frames['printfsqd'].print()
+    }
+  }
+}

+ 187 - 0
src/libs/LodopFuncs.js

@@ -0,0 +1,187 @@
+//= =本JS是加载Lodop插件及CLodop服务的综合示例,可直接使用,建议看懂后融进自己页面程序==
+
+var CreatedOKLodopObject, CLodopIsLocal, CLodopJsState
+
+//= =判断是否需要CLodop(那些不支持插件的浏览器):==
+function needCLodop () {
+  try {
+    var ua = navigator.userAgent
+    if (ua.match(/Windows\sPhone/i)) { return true }
+    if (ua.match(/iPhone|iPod|iPad/i)) { return true }
+    if (ua.match(/Android/i)) { return true }
+    if (ua.match(/Edge\D?\d+/i)) { return true }
+
+    var verTrident = ua.match(/Trident\D?\d+/i)
+    var verIE = ua.match(/MSIE\D?\d+/i)
+    var verOPR = ua.match(/OPR\D?\d+/i)
+    var verFF = ua.match(/Firefox\D?\d+/i)
+    var x64 = ua.match(/x64/i)
+    if ((!verTrident) && (!verIE) && (x64)) { return true } else if (verFF) {
+      verFF = verFF[0].match(/\d+/)
+      if ((verFF[0] >= 41) || (x64)) { return true }
+    } else if (verOPR) {
+      verOPR = verOPR[0].match(/\d+/)
+      if (verOPR[0] >= 32) { return true }
+    } else if ((!verTrident) && (!verIE)) {
+      var verChrome = ua.match(/Chrome\D?\d+/i)
+      if (verChrome) {
+        verChrome = verChrome[0].match(/\d+/)
+        if (verChrome[0] >= 41) { return true }
+      }
+    }
+    return false
+  } catch (err) {
+    return true
+  }
+}
+
+// 加载CLodop时用双端口(http是8000/18000,而https是8443/8444)以防其中某端口被占,
+// 主JS文件“CLodopfuncs.js”是固定文件名,其内容是动态的,与当前打印环境有关:
+function loadCLodop () {
+  if (CLodopJsState == 'loading' || CLodopJsState == 'complete') return
+  CLodopJsState = 'loading'
+  var head = document.head || document.getElementsByTagName('head')[0] || document.documentElement
+  var JS1 = document.createElement('script')
+  var JS2 = document.createElement('script')
+
+  if (window.location.protocol == 'https:') {
+    JS1.src = 'https://localhost.lodop.net:8443/CLodopfuncs.js'
+    JS2.src = 'https://localhost.lodop.net:8444/CLodopfuncs.js'
+  } else {
+    JS1.src = 'http://localhost:8000/CLodopfuncs.js'
+    JS2.src = 'http://localhost:18000/CLodopfuncs.js'
+  }
+  JS1.onload = JS2.onload = function () { CLodopJsState = 'complete' }
+  JS1.onerror = JS2.onerror = function (evt) { CLodopJsState = 'complete' }
+  head.insertBefore(JS1, head.firstChild)
+  head.insertBefore(JS2, head.firstChild)
+  CLodopIsLocal = !!((JS1.src + JS2.src).match(/\/\/localho|\/\/127.0.0./i))
+}
+
+if (needCLodop()) { loadCLodop() }// 开始加载
+
+//= =获取LODOP对象主过程,判断是否安装、需否升级:==
+function getLodop (oOBJECT, oEMBED) {
+  var strHtmInstall = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='http://www.lodop.net/demolist/install_lodop32.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>"
+  var strHtmUpdate = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='http://www.lodop.net/demolist/install_lodop32.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>"
+  var strHtm64_Install = "<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='http://www.lodop.net/demolist/install_lodop64.zip' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>"
+  var strHtm64_Update = "<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='http://www.lodop.net/demolist/install_lodop64.zip' target='_self'>执行升级</a>,升级后请重新进入。</font>"
+  var strHtmFireFox = "<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>"
+  var strHtmChrome = "<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>"
+  var strCLodopInstall_1 = "<br><font color='#FF00FF'>Web打印服务CLodop未安装启动,点击这里<a href='http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip' target='_self'>下载执行安装</a>"
+  var strCLodopInstall_2 = "<br>(若此前已安装过,可<a href='CLodop.protocol:setup' target='_self'>点这里直接再次启动</a>)"
+  var strCLodopInstall_3 = ',成功后请刷新本页面。</font>'
+  var strCLodopUpdate = "<br><font color='#FF00FF'>Web打印服务CLodop需升级!点击这里<a href='http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip' target='_self'>执行升级</a>,升级后请刷新页面。</font>"
+  var msgHtml=''
+  var LODOP
+  try {
+    var ua = navigator.userAgent
+    var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i))
+    if (needCLodop()) {
+      try {
+        LODOP = getCLodop()
+      } catch (err) {}
+      if (!LODOP && CLodopJsState !== 'complete') {
+        if (CLodopJsState == 'loading') alert('网页还没下载完毕,请稍等一下再操作.'); else alert('没有加载CLodop的主js,请先调用loadCLodop过程.')
+        return
+      }
+      if (!LODOP) {
+        msgHtml = strCLodopInstall_1 + (CLodopIsLocal ? strCLodopInstall_2 : '') + strCLodopInstall_3
+        return
+      } else {
+        if (CLODOP.CVERSION < '4.0.9.9') {
+          msgHtml = strCLodopUpdate
+        }
+        if (oEMBED && oEMBED.parentNode) { oEMBED.parentNode.removeChild(oEMBED) } // 清理旧版无效元素
+        if (oOBJECT && oOBJECT.parentNode) { oOBJECT.parentNode.removeChild(oOBJECT) }
+      }
+    } else {
+      var is64IE = isIE && !!(ua.match(/x64/i))
+      //= =如果页面有Lodop就直接使用,否则新建:==
+      if (oOBJECT || oEMBED) {
+        if (isIE) { LODOP = oOBJECT } else { LODOP = oEMBED }
+      } else if (!CreatedOKLodopObject) {
+        LODOP = document.createElement('object')
+        LODOP.setAttribute('width', 0)
+        LODOP.setAttribute('height', 0)
+        LODOP.setAttribute('style', 'position:absolute;left:0px;top:-100px;width:0px;height:0px;')
+        if (isIE) { LODOP.setAttribute('classid', 'clsid:2105C259-1E0C-4534-8141-A753534CB4CA') } else { LODOP.setAttribute('type', 'application/x-print-lodop') }
+        document.documentElement.appendChild(LODOP)
+        CreatedOKLodopObject = LODOP
+      } else { LODOP = CreatedOKLodopObject }
+      //= =Lodop插件未安装时提示下载地址:==
+      if ((!LODOP) || (!LODOP.VERSION)) {
+        if (ua.indexOf('Chrome') >= 0) { msgHtml = strHtmChrome }
+        if (ua.indexOf('Firefox') >= 0) { msgHtml = strHtmFireFox }
+        msgHtml = (is64IE ? strHtm64_Install : strHtmInstall)
+        console.log(msgHtml)
+        return LODOP
+      }
+    }
+    if (LODOP.VERSION < '6.2.2.6') {
+      if (!needCLodop()) { msgHtml = (is64IE ? strHtm64_Update : strHtmUpdate) }
+    }
+    //= ==如下空白位置适合调用统一功能(如注册语句、语言选择等):==
+    LODOP.SET_LICENSES('', '13528A153BAEE3A0254B9507DCDE2839', 'EDE92F75B6A3D917F65910', 'D60BC84D7CF2DE18156A6F88987304CB6D8')
+
+    //= ==============================================.com//.com台级//.net
+    console.log(msgHtml)
+    return LODOP
+  } catch (err) {
+    alert('getLodop出错:' + err)
+  }
+}
+
+/**
+ * 根据已有的html url进行打印
+ * @param type
+ * 是打印还是打印预览:preview-打印预览;其它值为打印。
+ * @param config
+ * 打印内容配置:
+ * 1、为字符串时,表示打印的html所在的远程url地址。
+ * 2、为对象时:{
+ * url:打印的html所在的远程url地址,
+ * width:html内容的实际宽度(单位像素)
+ * height:html内容的实际高度(单位像素)
+ * }
+ *
+ * 说明:
+ * JasperReports设计模板的像素和实际纸张的尺寸之比为72pt=1英寸(in)。
+ * Lodop打印的内容是按照一个dpi占96px=72pt=1in=2.54cm(厘米)=25.4mm(毫米)打印,JasperReports的html结果内容是按照一个dpi占72pt生成。
+ *
+ */
+function doPrintByHtml (type, config) {
+  if (!window.LODOP) {
+    alert('打印插件不可用,请先到首页进行下载安装,然后刷新浏览器!')
+    return
+  }
+  if (window.top && window.top.waltz && window.top.waltz.app && window.top.waltz.app.globalOption) {
+    var globalOption = window.top.waltz.app.globalOption
+    if (globalOption.lodopLicenseAuthor) {
+      LODOP.SET_LICENSES(globalOption.lodopLicenseAuthor, globalOption.lodopLicenseKey, '', '')
+    }
+  }
+  LODOP.PRINT_INIT('printTask')
+
+  var url
+  if ((typeof config === 'string') && config.constructor == String) {
+    url = config
+  } else {
+    url = config.url
+    var width = Math.round((config.width / 72) * 25.4) * 10 // 1 inch=25.4mm,Lodop默认单位为0.1mm
+    var height = Math.round((config.height / 72) * 25.4) * 10
+    // 设置纸张大小,设置后不允许用户手动修改纸张大小
+    LODOP.SET_PRINT_PAGESIZE(0, width, height, '')
+  }
+  // 指定按实际宽度缩放比例
+  LODOP.SET_PRINT_MODE('PRINT_PAGE_PERCENT', 'Full-Width')
+  LODOP.ADD_PRINT_HTM(0, 0, '100%', '100%', 'URL:' + url)
+  LODOP.SET_PRINT_STYLE('Stretch', 2)
+  if (type == 'preview') {
+    LODOP.PREVIEW()
+  } else {
+    LODOP.PRINT()
+  }
+}
+
+export { getLodop }

+ 4 - 0
src/main.js

@@ -18,6 +18,7 @@ import './permission' // permission control
 import './utils/filter'
 import './utils/filter'
 
 
 import VueCookies from 'vue-cookies'
 import VueCookies from 'vue-cookies'
+import VideoPlayer from 'vue-video-player'
 Vue.use(Viewer)
 Vue.use(Viewer)
 Viewer.setDefaults({
 Viewer.setDefaults({
   Options: { 'inline': true, 'button': true, 'navbar': true, 'title': true, 'toolbar': true, 'tooltip': true, 'movable': true, 'zoomable': true, 'rotatable': true, 'scalable': true, 'transition': true, 'fullscreen': true, 'keyboard': true, 'url': 'data-source' }
   Options: { 'inline': true, 'button': true, 'navbar': true, 'title': true, 'toolbar': true, 'tooltip': true, 'movable': true, 'zoomable': true, 'rotatable': true, 'scalable': true, 'transition': true, 'fullscreen': true, 'keyboard': true, 'url': 'data-source' }
@@ -29,6 +30,9 @@ Vue.config.productionTip = false
 Vue.use(VueAxios)
 Vue.use(VueAxios)
 Vue.use(VueCookies)
 Vue.use(VueCookies)
 Vue.$cookies.config('7d')
 Vue.$cookies.config('7d')
+require('video.js/dist/video-js.css')
+require('vue-video-player/src/custom-theme.css')
+Vue.use(VideoPlayer)
 /**
 /**
  * 权限检查
  * 权限检查
  */
  */

+ 1 - 0
src/permission.js

@@ -14,6 +14,7 @@ const whiteList = ['login', 'register', 'registerResult'] // no redirect whiteli
 const defaultRoutePath = '/home'
 const defaultRoutePath = '/home'
 
 
 router.beforeEach((to, from, next) => {
 router.beforeEach((to, from, next) => {
+	store.commit('TOGGLE_NOW_ROUTER',to.fullPath)
   NProgress.start() // start progress bar
   NProgress.start() // start progress bar
   to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`))
   to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`))
   let token = store.state.user.token || sessionStorage.getItem(ACCESS_TOKEN)
   let token = store.state.user.token || sessionStorage.getItem(ACCESS_TOKEN)

+ 5 - 1
src/store/getters.js

@@ -13,7 +13,11 @@ const getters = {
   changeOrg: state => state.user.changeOrg,
   changeOrg: state => state.user.changeOrg,
   addRouters: state => state.permission.addRouters,
   addRouters: state => state.permission.addRouters,
   multiTab: state => state.app.multiTab,
   multiTab: state => state.app.multiTab,
-  lang: state => state.i18n.lang
+  lang: state => state.i18n.lang,
+  nowRoute: state => state.app.nowRoute,
+  isShowVideo: state => state.app.isShowVideo,
+  isNewTab: state => state.app.isNewTab,
+  isNewSubTab: state => state.app.isNewSubTab
 }
 }
 
 
 export default getters
 export default getters

+ 49 - 13
src/store/modules/app.js

@@ -24,7 +24,11 @@ const app = {
     autoHideHeader: false,
     autoHideHeader: false,
     color: null,
     color: null,
     weak: false,
     weak: false,
-    multiTab: true
+    multiTab: true,
+    nowRoute: '', // 当前路由
+    isShowVideo: false, // 是否显示视频弹窗
+    isNewTab: false,
+    isNewSubTab: false
   },
   },
   mutations: {
   mutations: {
     SET_SIDEBAR_TYPE: (state, type) => {
     SET_SIDEBAR_TYPE: (state, type) => {
@@ -74,46 +78,78 @@ const app = {
     TOGGLE_MULTI_TAB: (state, bool) => {
     TOGGLE_MULTI_TAB: (state, bool) => {
       Vue.ls.set(DEFAULT_MULTI_TAB, bool)
       Vue.ls.set(DEFAULT_MULTI_TAB, bool)
       state.multiTab = bool
       state.multiTab = bool
+    },
+    // 当前路由
+    TOGGLE_NOW_ROUTER: (state, bool) => {
+      state.nowRoute = bool
+    },
+    // 是否显示视频弹窗
+    IS_ShOW_VIDEO: (state, bool) => {
+      state.isShowVideo = bool
     }
     }
   },
   },
   actions: {
   actions: {
-    setSidebar ({ commit }, type) {
+    setSidebar ({
+      commit
+    }, type) {
       commit('SET_SIDEBAR_TYPE', type)
       commit('SET_SIDEBAR_TYPE', type)
     },
     },
-    CloseSidebar ({ commit }) {
+    CloseSidebar ({
+      commit
+    }) {
       commit('CLOSE_SIDEBAR')
       commit('CLOSE_SIDEBAR')
     },
     },
-    ToggleDevice ({ commit }, device) {
+    ToggleDevice ({
+      commit
+    }, device) {
       commit('TOGGLE_DEVICE', device)
       commit('TOGGLE_DEVICE', device)
     },
     },
-    ToggleTheme ({ commit }, theme) {
+    ToggleTheme ({
+      commit
+    }, theme) {
       commit('TOGGLE_THEME', theme)
       commit('TOGGLE_THEME', theme)
     },
     },
-    ToggleLayoutMode ({ commit }, mode) {
+    ToggleLayoutMode ({
+      commit
+    }, mode) {
       commit('TOGGLE_LAYOUT_MODE', mode)
       commit('TOGGLE_LAYOUT_MODE', mode)
     },
     },
-    ToggleFixedHeader ({ commit }, fixedHeader) {
+    ToggleFixedHeader ({
+      commit
+    }, fixedHeader) {
       if (!fixedHeader) {
       if (!fixedHeader) {
         commit('TOGGLE_FIXED_HEADER_HIDDEN', false)
         commit('TOGGLE_FIXED_HEADER_HIDDEN', false)
       }
       }
       commit('TOGGLE_FIXED_HEADER', fixedHeader)
       commit('TOGGLE_FIXED_HEADER', fixedHeader)
     },
     },
-    ToggleFixSiderbar ({ commit }, fixSiderbar) {
+    ToggleFixSiderbar ({
+      commit
+    }, fixSiderbar) {
       commit('TOGGLE_FIXED_SIDERBAR', fixSiderbar)
       commit('TOGGLE_FIXED_SIDERBAR', fixSiderbar)
     },
     },
-    ToggleFixedHeaderHidden ({ commit }, show) {
+    ToggleFixedHeaderHidden ({
+      commit
+    }, show) {
       commit('TOGGLE_FIXED_HEADER_HIDDEN', show)
       commit('TOGGLE_FIXED_HEADER_HIDDEN', show)
     },
     },
-    ToggleContentWidth ({ commit }, type) {
+    ToggleContentWidth ({
+      commit
+    }, type) {
       commit('TOGGLE_CONTENT_WIDTH', type)
       commit('TOGGLE_CONTENT_WIDTH', type)
     },
     },
-    ToggleColor ({ commit }, color) {
+    ToggleColor ({
+      commit
+    }, color) {
       commit('TOGGLE_COLOR', color)
       commit('TOGGLE_COLOR', color)
     },
     },
-    ToggleWeak ({ commit }, weakFlag) {
+    ToggleWeak ({
+      commit
+    }, weakFlag) {
       commit('TOGGLE_WEAK', weakFlag)
       commit('TOGGLE_WEAK', weakFlag)
     },
     },
-    ToggleMultiTab ({ commit }, bool) {
+    ToggleMultiTab ({
+      commit
+    }, bool) {
       commit('TOGGLE_MULTI_TAB', bool)
       commit('TOGGLE_MULTI_TAB', bool)
     }
     }
   }
   }

+ 1 - 1
src/utils/request.js

@@ -5,7 +5,7 @@ import notification from 'ant-design-vue/es/notification'
 import modal from 'ant-design-vue/es/modal'
 import modal from 'ant-design-vue/es/modal'
 import { VueAxios } from './axios'
 import { VueAxios } from './axios'
 // import { ACCESS_TOKEN } from '@/store/mutation-types'
 // import { ACCESS_TOKEN } from '@/store/mutation-types'
-// console.log(process.env.VUE_APP_PRO_NAME)
+console.log(window.location.protocol)
 // 创建 axios 实例
 // 创建 axios 实例
 const service = axios.create({
 const service = axios.create({
   baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url
   baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url

+ 51 - 2
src/views/Home.vue

@@ -15,19 +15,36 @@
       v-model="openResetPwd">
       v-model="openResetPwd">
       <ResetPwd />
       <ResetPwd />
     </a-modal>
     </a-modal>
+    <!-- 新产品上线提醒 -->
+    <a-modal
+      class="newProductTips"
+      :title="'新产品'+(onlineFalg=='1'?'上':'下')+'线提醒'"
+      :width="800"
+      centered
+      :footer="null"
+      :maskClosable="false"
+      :destroyOnClose="true"
+      @cancel="cancelProductTips"
+      v-model="openNewProduct">
+      <newProduct :onlineFalg="onlineFalg" @seeMore="seeMore"></newProduct>
+    </a-modal>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
 import { mapGetters } from 'vuex'
 import { mapGetters } from 'vuex'
 import ResetPwd from '@/views/user/ResetPwd.vue'
 import ResetPwd from '@/views/user/ResetPwd.vue'
+import newProduct from '@/views/productManagement/newProduct/modal.vue'
+import { queryNewProductPage } from '@/api/product'
 export default {
 export default {
   name: 'Home',
   name: 'Home',
-  components: { ResetPwd },
+  components: { ResetPwd, newProduct },
   data () {
   data () {
     return {
     return {
       message: '欢迎登录' + process.env.VUE_APP_PRO_NAME,
       message: '欢迎登录' + process.env.VUE_APP_PRO_NAME,
-      openResetPwd: false //  重置密码是否显示
+      openResetPwd: false, //  重置密码是否显示
+      openNewProduct: false,
+      onlineFalg: '1' // 上下线标识  1为上线,0为下线
     }
     }
   },
   },
   computed: {
   computed: {
@@ -36,12 +53,44 @@ export default {
   created () {
   created () {
   },
   },
   methods: {
   methods: {
+    hasNewProduct () {
+      queryNewProductPage({ pageNo: 1, pageSize: 20, onlineFalg: this.onlineFalg }).then(res => {
+        if (res.status == 200) {
+          if (res.data.count > 0) {
+            this.openNewProduct = true
+          } else {
+            if (this.onlineFalg == '1') {
+              this.onlineFalg = '0'
+              this.hasNewProduct()
+            }
+          }
+        }
+      })
+    },
+    // 查看更多产品
+    seeMore () {
+      this.openNewProduct = false
+      this.$router.push({ name: 'newProduct', params: { onlineFalg: this.onlineFalg } })
+    },
+    // 关闭弹框
+    cancelProductTips () {
+      const _this = this
+      this.openNewProduct = false
+      if (this.onlineFalg == '1') {
+        this.onlineFalg = '0'
+        setTimeout(() => { _this.hasNewProduct() }, 100)
+      }
+    }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
     next(vm => {
     next(vm => {
       //  判断登录用户是否重置过密码(首次登陆需强制重置密码)
       //  判断登录用户是否重置过密码(首次登陆需强制重置密码)
       if (vm.mustChangePwd == 0) {
       if (vm.mustChangePwd == 0) {
         vm.openResetPwd = false
         vm.openResetPwd = false
+        if (from.name == 'login') {
+          // 判断是否有新产品上线
+          vm.hasNewProduct()
+        }
       } else {
       } else {
         vm.openResetPwd = true
         vm.openResetPwd = true
       }
       }

+ 20 - 6
src/views/allocationManagement/chainTransferIn/detail.vue

@@ -54,6 +54,7 @@
           :columns="columns"
           :columns="columns"
           :data="loadData"
           :data="loadData"
           :scroll="{ x: 1335 }"
           :scroll="{ x: 1335 }"
+          :defaultLoadData="false"
           bordered>
           bordered>
         </s-table>
         </s-table>
       </a-card>
       </a-card>
@@ -88,6 +89,7 @@ export default {
       // 加载数据方法 必须为 Promise 对象
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
       loadData: parameter => {
         const params = Object.assign(parameter, { allocationLinkagePutSn: this.$route.params.sn })
         const params = Object.assign(parameter, { allocationLinkagePutSn: this.$route.params.sn })
+        this.spinning = true
         return allocLinkagePutDetailList(params).then(res => {
         return allocLinkagePutDetailList(params).then(res => {
           const data = res.data
           const data = res.data
           const no = (data.pageNo - 1) * data.pageSize
           const no = (data.pageNo - 1) * data.pageSize
@@ -98,6 +100,7 @@ export default {
           }
           }
           this.getDetailCount(params)
           this.getDetailCount(params)
           this.localDataSource = data.list
           this.localDataSource = data.list
+          this.spinning = false
           return data
           return data
         })
         })
       },
       },
@@ -167,19 +170,30 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfcid" name="printfcid" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfcid'].focus()
+        window.frames['printfcid'].print()
       }
       }
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.$refs.table.refresh(true)
+      this.getDetail()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.getDetail()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 22 - 7
src/views/allocationManagement/chainTransferIn/edit.vue

@@ -81,6 +81,7 @@
           :rowKey="(record) => record.id"
           :rowKey="(record) => record.id"
           :columns="columns"
           :columns="columns"
           :data="loadData"
           :data="loadData"
+          :defaultLoadData="false"
           :scroll="{ x: 1110 }"
           :scroll="{ x: 1110 }"
           bordered>
           bordered>
           <!-- 仓库仓位 -->
           <!-- 仓库仓位 -->
@@ -337,20 +338,34 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfcie" name="printfcie" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfcie'].focus()
+        window.frames['printfcie'].print()
       }
       }
+    },
+    pageInit () {
+      this.getDetail()
+      this.getWarehouseCascade()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
+      this.resetSearchForm()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-      vm.getWarehouseCascade()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 26 - 13
src/views/allocationManagement/chainTransferIn/list.vue

@@ -80,6 +80,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1310, y: tableHeight }"
         :scroll="{ x: 1310, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 连锁调入单号 -->
         <!-- 连锁调入单号 -->
         <template slot="allocationLinkagePutNo" slot-scope="text, record">
         <template slot="allocationLinkagePutNo" slot-scope="text, record">
@@ -169,17 +170,7 @@ export default {
       outTenantSnData: []
       outTenantSnData: []
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   methods: {
   methods: {
-    setTableH () {
-      const tableSearchH = this.$refs.tableSearch.offsetHeight
-      this.tableHeight = window.innerHeight - tableSearchH - 197
-    },
     //  时间  change
     //  时间  change
     dateChange (date) {
     dateChange (date) {
       this.queryParam.beginDate = date[0]
       this.queryParam.beginDate = date[0]
@@ -239,6 +230,17 @@ export default {
       return (
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getPutTenantList()
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 197
     }
     }
   },
   },
   watch: {
   watch: {
@@ -249,10 +251,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getPutTenantList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 17 - 8
src/views/allocationManagement/chainTransferOut/detail.vue

@@ -14,7 +14,7 @@
             @click.stop="handleEdit">编辑</a-button>
             @click.stop="handleEdit">编辑</a-button>
         </template>
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <!-- 操作区,位于 title 行的行尾 -->
-        <template slot="extra" v-if="$hasPermissions('B_allocLinkageOutPrint')">
+        <template slot="extra" v-if="outBizSn ? $hasPermissions('B_outboundOrderDetail') : $hasPermissions('B_allocLinkageOutPrint')">
           <a-radio-group key="3" v-model="printerType">
           <a-radio-group key="3" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="INK">喷墨</a-radio>
             <a-radio value="INK">喷墨</a-radio>
@@ -58,6 +58,7 @@
               :columns="columns"
               :columns="columns"
               :data="loadData"
               :data="loadData"
               :scroll="{ x: 1090 }"
               :scroll="{ x: 1090 }"
+              :defaultLoadData="false"
               bordered>
               bordered>
             </s-table>
             </s-table>
           </a-collapse-panel>
           </a-collapse-panel>
@@ -179,22 +180,30 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfcod" name="printfcod" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfcod'].focus()
+        window.frames['printfcod'].print()
       }
       }
     }
     }
   },
   },
   mounted () {
   mounted () {
-    this.getDetail()
+    if (!this.$store.state.app.isNewTab || this.outBizSn) { // 页签刷新 或 为弹框时调用
+      this.getDetail()
+      this.$refs.table.refresh(true)
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.getDetail()
+      this.$refs.table.refresh(true)
+    }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      // vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 21 - 11
src/views/allocationManagement/chainTransferOut/edit.vue

@@ -169,6 +169,7 @@
               :rowKey="(record) => record.id"
               :rowKey="(record) => record.id"
               :columns="chooseColumns"
               :columns="chooseColumns"
               :data="chooseLoadData"
               :data="chooseLoadData"
+              :defaultLoadData="false"
               :scroll="{ x: 1695, y: 300 }"
               :scroll="{ x: 1695, y: 300 }"
               bordered>
               bordered>
               <!-- 操作 -->
               <!-- 操作 -->
@@ -424,10 +425,6 @@ export default {
         }
         }
       })
       })
     },
     },
-    //  导入明细
-    handleImport () {
-      console.log(333)
-    },
     //  返回列表
     //  返回列表
     handleBack () {
     handleBack () {
       this.$router.push({ path: '/allocationManagement/chainTransferOut/list', query: { closeLastOldTab: true } })
       this.$router.push({ path: '/allocationManagement/chainTransferOut/list', query: { closeLastOldTab: true } })
@@ -510,20 +507,33 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfcoe" name="printfcoe" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfcoe'].focus()
+        window.frames['printfcoe'].print()
       }
       }
+    },
+    pageInit () {
+      this.chooseResetSearchForm()
+      this.getDetail()
+      this.getWarehouseList()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-      vm.getWarehouseList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 23 - 10
src/views/allocationManagement/chainTransferOut/list.vue

@@ -84,6 +84,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1380, y: tableHeight }"
         :scroll="{ x: 1380, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 连锁调出单号 -->
         <!-- 连锁调出单号 -->
         <template slot="allocationLinkageOutNo" slot-scope="text, record">
         <template slot="allocationLinkageOutNo" slot-scope="text, record">
@@ -291,17 +292,19 @@ export default {
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.openModal = false
+      this.getPutTenantList()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -310,11 +313,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.openModal = false
-      vm.getPutTenantList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 1 - 0
src/views/allocationManagement/storeTransferOut/basicInfoModal.vue

@@ -164,6 +164,7 @@ export default {
       if (!newValue) {
       if (!newValue) {
         this.$emit('close')
         this.$emit('close')
         this.$refs.ruleForm.resetFields()
         this.$refs.ruleForm.resetFields()
+        this.$refs.custList.resetForm()
       } else {
       } else {
         this.getPutPersonTypeList()
         this.getPutPersonTypeList()
         this.getStoreCallOutTypeAllList()
         this.getStoreCallOutTypeAllList()

+ 21 - 10
src/views/allocationManagement/storeTransferOut/detail.vue

@@ -14,7 +14,7 @@
             @click.stop="handleEdit">编辑</a-button>
             @click.stop="handleEdit">编辑</a-button>
         </template>
         </template>
         <!-- 操作区,位于 title 行的行尾 -->
         <!-- 操作区,位于 title 行的行尾 -->
-        <template slot="extra" v-if="$hasPermissions('B_storeCallOutPrint')">
+        <template slot="extra" v-if="outBizSn ? $hasPermissions('B_outboundOrderDetail') : $hasPermissions('B_storeCallOutPrint')">
           <a-checkbox key="4" v-model="printCostChecked">打印成本</a-checkbox>
           <a-checkbox key="4" v-model="printCostChecked">打印成本</a-checkbox>
           <a-radio-group key="3" v-model="printerType">
           <a-radio-group key="3" v-model="printerType">
             <a-radio value="NEEDLE">针式</a-radio>
             <a-radio value="NEEDLE">针式</a-radio>
@@ -56,6 +56,7 @@
           :columns="columns"
           :columns="columns"
           :data="loadData"
           :data="loadData"
           :scroll="{ x: 995 }"
           :scroll="{ x: 995 }"
+          :defaultLoadData="false"
           bordered>
           bordered>
         </s-table>
         </s-table>
       </a-card>
       </a-card>
@@ -93,6 +94,7 @@ export default {
       ],
       ],
       // 加载数据方法 必须为 Promise 对象
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
       loadData: parameter => {
+        this.spinning = true
         return storeCallOutDetailList(Object.assign(parameter, { storeCallOutSn: this.outBizSn || this.$route.params.sn })).then(res => {
         return storeCallOutDetailList(Object.assign(parameter, { storeCallOutSn: this.outBizSn || this.$route.params.sn })).then(res => {
           const data = res.data
           const data = res.data
           const no = (data.pageNo - 1) * data.pageSize
           const no = (data.pageNo - 1) * data.pageSize
@@ -102,6 +104,7 @@ export default {
             data.list[i].costSubtotal = getOperationalPrecision(data.list[i].outCost, data.list[i].outQty)
             data.list[i].costSubtotal = getOperationalPrecision(data.list[i].outCost, data.list[i].outQty)
           }
           }
           this.localDataSource = data.list
           this.localDataSource = data.list
+          this.spinning = false
           return data
           return data
         })
         })
       },
       },
@@ -148,12 +151,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfsod" name="printfsod" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfsod'].focus()
+        window.frames['printfsod'].print()
       }
       }
     },
     },
     // 基本信息
     // 基本信息
@@ -182,14 +185,22 @@ export default {
     }
     }
   },
   },
   mounted () {
   mounted () {
-    this.getDetail()
-    this.getDetailCount()
+    if (!this.$store.state.app.isNewTab || this.outBizSn) { // 页签刷新 或 为弹框时调用
+      this.$refs.table.refresh(true)
+      this.getDetail()
+      this.getDetailCount()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.getDetail()
+      this.getDetailCount()
+    }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      // vm.getDetail()
-      // vm.getDetailCount()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 25 - 13
src/views/allocationManagement/storeTransferOut/edit.vue

@@ -93,6 +93,7 @@
               :customRow="handleClickRow"
               :customRow="handleClickRow"
               :data="loadData"
               :data="loadData"
               :scroll="{ x: 1180, y: 300 }"
               :scroll="{ x: 1180, y: 300 }"
+              :defaultLoadData="false"
               bordered>
               bordered>
               <!-- 操作 -->
               <!-- 操作 -->
               <template slot="action" slot-scope="text, record">
               <template slot="action" slot-scope="text, record">
@@ -150,6 +151,7 @@
               :rowKey="(record) => record.id"
               :rowKey="(record) => record.id"
               :columns="chooseColumns"
               :columns="chooseColumns"
               :data="chooseLoadData"
               :data="chooseLoadData"
+              :defaultLoadData="false"
               :scroll="{ x: 1335, y: 300 }"
               :scroll="{ x: 1335, y: 300 }"
               bordered>
               bordered>
               <!-- 调出数量 -->
               <!-- 调出数量 -->
@@ -331,12 +333,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfsoe" name="printfsoe" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfsoe'].focus()
+        window.frames['printfsoe'].print()
       }
       }
     },
     },
     // 双击快速添加
     // 双击快速添加
@@ -449,10 +451,6 @@ export default {
         }
         }
       })
       })
     },
     },
-    //  导入明细
-    handleImport () {
-      console.log(333)
-    },
     //  返回列表
     //  返回列表
     handleBack () {
     handleBack () {
       this.$router.push({ path: '/allocationManagement/storeTransferOut/list', query: { closeLastOldTab: true } })
       this.$router.push({ path: '/allocationManagement/storeTransferOut/list', query: { closeLastOldTab: true } })
@@ -505,15 +503,29 @@ export default {
       return (
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
+    },
+    pageInit () {
+      this.getDetail()
+      this.getWarehouseList()
+      this.getProductBrand()
+      this.getProductType()
+      this.resetSearchForm()
+      this.chooseResetSearchForm()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-      vm.getWarehouseList()
-      vm.getProductBrand()
-      vm.getProductType()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 23 - 10
src/views/allocationManagement/storeTransferOut/list.vue

@@ -73,6 +73,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1500, y: tableHeight }"
         :scroll="{ x: 1500, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 店内调出单号 -->
         <!-- 店内调出单号 -->
         <template slot="storeCallOutNo" slot-scope="text, record">
         <template slot="storeCallOutNo" slot-scope="text, record">
@@ -276,17 +277,19 @@ export default {
         }
         }
       })
       })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.openModal = false
+      this.getStoreCallOutTypeAllList()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -295,11 +298,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.openModal = false
-      vm.getStoreCallOutTypeAllList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 12 - 31
src/views/allocationManagement/warehouseAllocation/detail.vue

@@ -14,12 +14,6 @@
           编辑
           编辑
         </a-button>
         </a-button>
       </template>
       </template>
-      <!-- 操作区,位于 title 行的行尾 -->
-      <!-- <template slot="extra">
-        <a-button key="2" id="warehouseAllocationDetail-preview-btn">打印预览</a-button>
-        <a-button key="1" type="primary" id="warehouseAllocationDetail-print-btn">快速打印</a-button>
-        <a-button key="3" type="danger" @click="handleExport" :loading="exportLoading" id="warehouseAllocationDetail-export-btn">导出</a-button>
-      </template> -->
     </a-page-header>
     </a-page-header>
     <!-- 基础信息 -->
     <!-- 基础信息 -->
     <a-card size="small" :bordered="false" class="warehouseAllocationDetail-cont">
     <a-card size="small" :bordered="false" class="warehouseAllocationDetail-cont">
@@ -151,36 +145,23 @@ export default {
           this.productTotal = null
           this.productTotal = null
         }
         }
       })
       })
-    },
-    //  导出
-    handleExport () {
-      const params = this.queryParam
-      this.exportLoading = true
-      // customerBundleExportDelay(params).then(res => {
-      //   this.exportLoading = false
-      //   this.download(res)
-      // })
-    },
-    download (data) {
-      if (!data) { return }
-      const url = window.URL.createObjectURL(new Blob([data]))
-      const link = document.createElement('a')
-      link.style.display = 'none'
-      link.href = url
-      const a = moment().format('YYYYMMDDHHmmss')
-      const fname = '仓库调拨' + a
-      link.setAttribute('download', fname + '.xlsx')
-      document.body.appendChild(link)
-      link.click()
     }
     }
   },
   },
   mounted () {
   mounted () {
-    this.getHouse()
+    if (!this.$store.state.app.isNewTab || this.outBizSn) { // 页签刷新 或 为弹框时调用
+      this.$refs.table.refresh(true)
+      this.getHouse()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.getHouse()
+    }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      // vm.getHouse()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 24 - 16
src/views/allocationManagement/warehouseAllocation/edit.vue

@@ -8,11 +8,6 @@
           <span style="margin: 0 15px;color: #666;">调出仓库:{{ (basicInfoData&&basicInfoData.outWarehouseName) || '--' }}</span>
           <span style="margin: 0 15px;color: #666;">调出仓库:{{ (basicInfoData&&basicInfoData.outWarehouseName) || '--' }}</span>
           <span style="margin: 0 15px;color: #666;">调入仓库:{{ (basicInfoData&&basicInfoData.putWarehouseName) || '--' }}</span>
           <span style="margin: 0 15px;color: #666;">调入仓库:{{ (basicInfoData&&basicInfoData.putWarehouseName) || '--' }}</span>
         </template>
         </template>
-        <!-- 操作区,位于 title 行的行尾 -->
-        <!-- <template slot="extra">
-          <a-button key="2" id="warehouseAllocationEdit-preview-btn">打印预览</a-button>
-          <a-button key="1" type="primary" id="warehouseAllocationEdit-print-btn">快速打印</a-button>
-        </template> -->
       </a-page-header>
       </a-page-header>
       <!-- 选择产品 -->
       <!-- 选择产品 -->
       <a-card size="small" :bordered="false" class="warehouseAllocationEdit-cont">
       <a-card size="small" :bordered="false" class="warehouseAllocationEdit-cont">
@@ -179,6 +174,7 @@
               :rowKey="(record) => record.id"
               :rowKey="(record) => record.id"
               :columns="chooseColumns"
               :columns="chooseColumns"
               :data="chooseLoadData"
               :data="chooseLoadData"
+              :defaultLoadData="false"
               :scroll="{ x: 1130, y: 300 }"
               :scroll="{ x: 1130, y: 300 }"
               bordered>
               bordered>
               <!-- 产品分类 -->
               <!-- 产品分类 -->
@@ -288,7 +284,7 @@ export default {
         this.disabled = true
         this.disabled = true
         const params = Object.assign(parameter, this.queryParam)
         const params = Object.assign(parameter, this.queryParam)
         params.enabledFlag = 1
         params.enabledFlag = 1
-        params.warehouseSn = this.basicInfoData.outWarehouseSn
+        params.warehouseSn = this.basicInfoData ? this.basicInfoData.outWarehouseSn : ''
         return productQuery(params).then(res => {
         return productQuery(params).then(res => {
           const data = res.data
           const data = res.data
           const no = (data.pageNo - 1) * data.pageSize
           const no = (data.pageNo - 1) * data.pageSize
@@ -366,15 +362,17 @@ export default {
     },
     },
     // 基本信息
     // 基本信息
     getDetail () {
     getDetail () {
+      this.disabled = true
       allocWarehouseDetail({ id: this.$route.params.id }).then(res => {
       allocWarehouseDetail({ id: this.$route.params.id }).then(res => {
         if (res.status == 200) {
         if (res.status == 200) {
           this.basicInfoData = res.data
           this.basicInfoData = res.data
-          this.$refs.table.refresh(true)
+          this.resetSearchForm()
           this.getWarehouseLoc(res.data.putWarehouseSn, 'put')
           this.getWarehouseLoc(res.data.putWarehouseSn, 'put')
           this.getWarehouseLoc(res.data.outWarehouseSn, 'out')
           this.getWarehouseLoc(res.data.outWarehouseSn, 'out')
         } else {
         } else {
           this.basicInfoData = null
           this.basicInfoData = null
         }
         }
+        this.disabled = false
       })
       })
     },
     },
     //  添加/编辑
     //  添加/编辑
@@ -476,10 +474,6 @@ export default {
         }
         }
       })
       })
     },
     },
-    //  导入明细
-    handleImport () {
-      console.log(333)
-    },
     //  返回列表
     //  返回列表
     handleBack () {
     handleBack () {
       this.$router.push({ path: '/allocationManagement/warehouseAllocation/list', query: { closeLastOldTab: true } })
       this.$router.push({ path: '/allocationManagement/warehouseAllocation/list', query: { closeLastOldTab: true } })
@@ -536,14 +530,28 @@ export default {
       return (
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
+    },
+    pageInit () {
+      this.resetSearchForm()
+      this.chooseResetSearchForm()
+      this.getProductBrand()
+      this.getProductType()
+      this.getDetail()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-      vm.getProductBrand()
-      vm.getProductType()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 22 - 14
src/views/allocationManagement/warehouseAllocation/list.vue

@@ -61,6 +61,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1260, y: tableHeight }"
         :scroll="{ x: 1260, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 单号 -->
         <!-- 单号 -->
         <template slot="allocationWarehouseNo" slot-scope="text, record">
         <template slot="allocationWarehouseNo" slot-scope="text, record">
@@ -234,17 +235,18 @@ export default {
     handleEdit (row) {
     handleEdit (row) {
       this.$router.push({ path: `/allocationManagement/warehouseAllocation/edit/${row.id}/${row.allocationWarehouseSn}` })
       this.$router.push({ path: `/allocationManagement/warehouseAllocation/edit/${row.id}/${row.allocationWarehouseSn}` })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getWarehouseList()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -253,15 +255,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.queryParam.outWarehouseSn = undefined
-      vm.queryParam.putWarehouseSn = undefined
-      vm.queryParam.state = undefined
-      vm.queryParam.beginDate = ''
-      vm.queryParam.endDate = ''
-      vm.getWarehouseList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 18 - 4
src/views/basicData/bulkPartsTypeManagement/list.vue

@@ -15,6 +15,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ y: tableHeight }"
         :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
@@ -122,16 +123,29 @@ export default {
       this.openModal = false
       this.openModal = false
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 195
       this.tableHeight = window.innerHeight - tableSearchH - 195
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
   }
   }
 }
 }
 </script>
 </script>

+ 18 - 4
src/views/basicData/customerTypeManagement/list.vue

@@ -31,6 +31,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ y: tableHeight }"
         :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
@@ -138,16 +139,29 @@ export default {
       this.openModal = false
       this.openModal = false
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
   }
   }
 }
 }
 </script>
 </script>

+ 18 - 4
src/views/basicData/expenseType/list.vue

@@ -17,6 +17,7 @@
         :scroll="{ y: tableHeight }"
         :scroll="{ y: tableHeight }"
         :showPagination="false"
         :showPagination="false"
         :defaultExpandedRowKeys="defaultExpandedRowKeys"
         :defaultExpandedRowKeys="defaultExpandedRowKeys"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
@@ -158,16 +159,29 @@ export default {
         })
         })
       }
       }
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 195
       this.tableHeight = window.innerHeight - tableSearchH - 195
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.$refs.table.refresh(true)
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.$refs.table.refresh(true)
+    }
   }
   }
 }
 }
 </script>
 </script>

+ 19 - 5
src/views/basicData/storeTransferOutTypeManagement/list.vue

@@ -20,6 +20,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ y: tableHeight }"
         :scroll="{ y: tableHeight }"
+		:defaultLoadData="false"
         bordered>
         bordered>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
@@ -123,16 +124,29 @@ export default {
       this.openModal = false
       this.openModal = false
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 195
       this.tableHeight = window.innerHeight - tableSearchH - 195
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  }
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
 }
 }
 </script>
 </script>

+ 309 - 0
src/views/bulkManagement/bulkImport/list.vue

@@ -0,0 +1,309 @@
+<template>
+  <a-card size="small" :bordered="false" class="bulkImportList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <Upload
+          id="bulkImportList-attachList"
+          ref="importUpload"
+          :maxNums="1"
+          fileType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
+          uploadType="attach"
+          :action="attachAction"
+          :uploadParams="uploadParams"
+          upText="选择导入文件"
+          @remove="resetSearchForm"
+          @change="changeImport"></Upload>
+        <a :href="filePath" style="margin: 5px 0 0 15px;display: block;float: left;">
+          <a-icon type="download" style="padding-right: 5px;" />下载导入模板
+        </a>
+      </div>
+      <div class="importGuide-con">
+        <div class="explain-con">
+          <div class="explain-item">
+            <div class="explain-tit">导入文件说明</div>
+            <ul>
+              <li>1) 导入的EXCEL文件中必须包含名为"供应商"、"产品品牌"、"产品编码"、"原厂编码"、"产品名称"、"产品一级分类"、"产品二级分类"、"产品三级分类"、"仓库"、"仓位"、"入库数量"、"成本价"、"售价";列顺序可忽略、行顺序可忽略。其中"供应商"、"产品品牌"、"产品编码"、"产品名称"、"仓库"、"仓位"、"入库数量"、"成本价"、"售价"内容不能为空。</li>
+              <li>2) 红色底白字为错误项,对应错误原因列显示错误信息,存在错误项时不能导入,请取消修改后重新上传操作。</li>
+              <li>3) 供应商/产品品牌为必填项且不能包含箭冠、箭牌、冠牌等文字,产品名称为必填项。</li>
+              <li>4) 支持上传文件格式:.xls、.xlsx。</li>
+            </ul>
+          </div>
+        </div>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px' }"
+        size="small"
+        :rowClassName="(record, index) => record.isError==1 ? 'redBg-row':''"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ x: 1680, y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+      </s-table>
+      <div class="btn-con" v-if="uploadData && uploadData.stockImportSn">
+        <a-button
+          id="productInfoList-batchAudit"
+          type="primary"
+          class="button-warning"
+          @click="handleConfirm"
+          style="margin: 0 15px;">确认导入</a-button>
+        <a-button
+          id="productInfoList-batchLaunch"
+          type="primary"
+          class="button-primary"
+          @click="handleCancel"
+          style="margin: 0 15px;">取消导入</a-button>
+        <a-button
+          id="productInfoList-batchDownline"
+          type="primary"
+          class="button-grey"
+          @click="handleExportError"
+          style="margin: 0 15px;">导出错误项</a-button>
+      </div>
+    </a-spin>
+  </a-card>
+</template>
+
+<script>
+import { STable, Upload } from '@/components'
+import { stockImportList, stockImportFinish, stockImportCancel, stockImportExportError } from '@/api/stockImport'
+import moment from 'moment'
+export default {
+  components: { STable, Upload },
+  data () {
+    return {
+      spinning: false,
+      exportLoading: false, // 导出loading
+      tableHeight: 0,
+      queryParam: {}, // 查询参数
+      // 表头
+      columns: [
+        { title: '序号', dataIndex: 'no', width: 50, align: 'center' },
+        { title: '产品编码', dataIndex: 'productCode', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '原厂编码', dataIndex: 'productOrigCode', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品品牌', dataIndex: 'productBrandName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '供应商', dataIndex: 'supplierName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品一级分类', dataIndex: 'productTypeName1', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品二级分类', dataIndex: 'productTypeName2', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品三级分类', dataIndex: 'productTypeName3', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '仓库', dataIndex: 'warehouseName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '仓位', dataIndex: 'warehouseLocationName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库数量', dataIndex: 'putQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '成本价', dataIndex: 'cost', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '售价', dataIndex: 'terminalPrice', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '错误原因', dataIndex: 'errorMsg', width: 150, align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        return stockImportList(Object.assign(parameter, { stockImportSn: this.uploadData && this.uploadData.stockImportSn })).then(res => {
+          const data = res.data
+          const no = (data.pageNo - 1) * data.pageSize
+          for (var i = 0; i < data.list.length; i++) {
+            data.list[i].no = no + i + 1
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/stockImport/importForSpareParts',
+      uploadParams: {
+        savePathType: 'local'
+      },
+      uploadData: null,
+      filePath: 'https://jianguan-images.oss-cn-beijing.aliyuncs.com/template/ShangHuProductImports.xlsx'
+    }
+  },
+  methods: {
+    // 上传文件  change
+    changeImport (file) {
+      if (file && JSON.parse(file).length > 0) {
+        this.uploadData = JSON.parse(file)[0] || null
+        if (this.uploadData && this.uploadData.stockImportSn) {
+          this.$refs.table.refresh(true)
+        }
+      } else {
+        this.uploadData = null
+      }
+    },
+    resetSearchForm () {
+      this.$refs.table.clearTable() //  清空列表数据
+      this.$refs.importUpload.setFileList() //  清空导入文件
+      this.uploadData = null //  清空上传数据
+    },
+    // 确认导入
+    handleConfirm () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '您是否确认导入产品信息?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          stockImportFinish({ stockImportSn: _this.uploadData && _this.uploadData.stockImportSn }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.resetSearchForm()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    // 取消导入
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '您确认取消导入产品的信息?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          stockImportCancel({ stockImportSn: _this.uploadData && _this.uploadData.stockImportSn }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.resetSearchForm()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    // 下载模板
+    handleExport () {},
+    // 导出错误项
+    handleExportError () {
+      const _this = this
+      _this.spinning = true
+      stockImportExportError({ stockImportSn: _this.uploadData && _this.uploadData.stockImportSn }).then(res => {
+        _this.spinning = false
+        if (res.type == 'application/json') {
+          var reader = new FileReader()
+          reader.addEventListener('loadend', function () {
+            const obj = JSON.parse(reader.result)
+            _this.$notification.error({
+              message: '提示',
+              description: obj.message
+            })
+          })
+          reader.readAsText(res)
+        } else {
+          this.download(res)
+        }
+      })
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const fname = '散件导入错误项' + moment('YYYY_MMDD')
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 400
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      setTimeout(() => {
+        _this.setTableH()
+      }, 400)
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>
+<style lang="less">
+  .bulkImportList-wrap{
+    .table-page-search-wrapper{
+      overflow: hidden;
+      .upload-file{
+        height: auto;
+        margin-bottom: 10px;
+        .ant-btn{
+          background-color: #f30;
+          border-color: #f30;
+          margin: 0 5px;
+          font-size: 12px;
+          color: #fff;
+        }
+      }
+    }
+    .importGuide-con{
+      .explain-con{
+        .explain-item{
+          margin-bottom: 10px;
+          .explain-tit{
+            font-weight: bold;
+            span{
+              display: inline-block;
+              width: 18px;
+              height: 18px;
+              line-height: 16px;
+              text-align: center;
+              margin-right: 5px;
+              border-radius: 50%;
+              border: 1px solid rgba(0, 0, 0, 0.3);
+            }
+          }
+          p{
+            margin: 8px 0;
+            padding-left: 23px;
+          }
+          ul{
+            list-style: none;
+            padding: 0;
+            padding-left: 23px;
+            margin: 0;
+            li{
+              line-height: 26px;
+              font-size: 12px;
+            }
+          }
+        }
+      }
+    }
+    .redBg-row{
+      background-color: #F39494;
+    }
+    .btn-con{
+      text-align: center;
+    }
+  }
+</style>

+ 7 - 9
src/views/bulkManagement/bulkReturnGoods/detailModal.vue

@@ -11,13 +11,9 @@
     <a-spin :spinning="spinning" tip="Loading...">
     <a-spin :spinning="spinning" tip="Loading...">
       <a-card size="small" :bordered="false" class="bulkReturnGoodsDetail-cont">
       <a-card size="small" :bordered="false" class="bulkReturnGoodsDetail-cont">
         <a-descriptions size="small">
         <a-descriptions size="small">
-          <a-descriptions-item label="散件退货单号" :span="3">
-            {{ (basicInfoData&&basicInfoData.sparePartsReturnNo) || '--' }}
-            <div style="display: inline-block;margin-left: 10px;">
-              <a-tag color="red" v-if="basicInfoData&&basicInfoData.stateDictValue">{{ basicInfoData.stateDictValue }}</a-tag>
-              <a-tag color="orange" v-if="basicInfoData&&basicInfoData.settleStateDictValue">{{ basicInfoData.settleStateDictValue }}</a-tag>
-            </div>
-          </a-descriptions-item>
+          <a-descriptions-item label="散件退货单号">{{ (basicInfoData&&basicInfoData.sparePartsReturnNo) || '--' }}</a-descriptions-item>
+          <a-descriptions-item label="业务状态">{{ (basicInfoData&&basicInfoData.stateDictValue) || '--' }}</a-descriptions-item>
+          <a-descriptions-item label="财务状态">{{ (basicInfoData&&basicInfoData.settleStateDictValue) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="供应商">{{ (basicInfoData&&basicInfoData.supplierName) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="供应商">{{ (basicInfoData&&basicInfoData.supplierName) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="是否抓单">{{ (basicInfoData&&basicInfoData.isGrabDictValue) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="是否抓单">{{ (basicInfoData&&basicInfoData.isGrabDictValue) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="备注">{{ (basicInfoData&&basicInfoData.remark) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="备注">{{ (basicInfoData&&basicInfoData.remark) || '--' }}</a-descriptions-item>
@@ -115,10 +111,10 @@ export default {
           { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
           { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
           { title: '仓库', dataIndex: 'warehouseName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
           { title: '仓库', dataIndex: 'warehouseName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
           { title: '仓位', dataIndex: 'warehouseLocationName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
           { title: '仓位', dataIndex: 'warehouseLocationName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
-          { title: '库存数量', dataIndex: 'currentStockQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
           { title: '单位', dataIndex: 'productUnit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
           { title: '单位', dataIndex: 'productUnit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
           { title: '退货单价', dataIndex: 'purchaseCost', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
           { title: '退货单价', dataIndex: 'purchaseCost', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-          { title: '退货数量', dataIndex: 'purchaseQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+          { title: '退货数量', dataIndex: 'purchaseQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+          { title: '退货金额', dataIndex: 'purchaseAmount', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
         ]
         ]
       }
       }
       return arr
       return arr
@@ -155,6 +151,8 @@ export default {
     isShow (newValue, oldValue) {
     isShow (newValue, oldValue) {
       if (!newValue) {
       if (!newValue) {
         this.$emit('close')
         this.$emit('close')
+        this.basicInfoData = null
+        this.$refs.table.clearTable()
       } else {
       } else {
         const _this = this
         const _this = this
         setTimeout(() => (
         setTimeout(() => (

+ 19 - 3
src/views/bulkManagement/bulkReturnGoods/edit.vue

@@ -53,6 +53,7 @@
           :columns="columns"
           :columns="columns"
           :customRow="handleClickRow"
           :customRow="handleClickRow"
           :data="loadData"
           :data="loadData"
+          :defaultLoadData="false"
           :scroll="{ x: 980, y:300 }"
           :scroll="{ x: 980, y:300 }"
           bordered>
           bordered>
           <!-- 退货单价 -->
           <!-- 退货单价 -->
@@ -129,6 +130,7 @@
           :rowKey="(record) => record.id"
           :rowKey="(record) => record.id"
           :columns="chooseColumns"
           :columns="chooseColumns"
           :data="chooseLoadData"
           :data="chooseLoadData"
+          :defaultLoadData="false"
           :scroll="{ x: 980, y:300 }"
           :scroll="{ x: 980, y:300 }"
           bordered>
           bordered>
           <!-- 退货单价 -->
           <!-- 退货单价 -->
@@ -414,12 +416,26 @@ export default {
       return (
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
+    },
+    initPage () {
+      this.getWarehouse()
+      this.resetSearchForm()
+      this.chooseResetSearchForm()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.initPage()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.initPage()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getWarehouse()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 19 - 3
src/views/bulkManagement/bulkReturnGoods/grabEdit.vue

@@ -43,6 +43,7 @@
           :rowKey="(record) => record.id"
           :rowKey="(record) => record.id"
           :columns="columns"
           :columns="columns"
           :customRow="handleClickRow"
           :customRow="handleClickRow"
+          :defaultLoadData="false"
           :data="loadData"
           :data="loadData"
           :scroll="{ x: 1280, y:300 }"
           :scroll="{ x: 1280, y:300 }"
           bordered>
           bordered>
@@ -120,6 +121,7 @@
           :rowKey="(record) => record.id"
           :rowKey="(record) => record.id"
           :columns="chooseColumns"
           :columns="chooseColumns"
           :data="chooseLoadData"
           :data="chooseLoadData"
+          :defaultLoadData="false"
           :scroll="{ x: 960, y:300 }"
           :scroll="{ x: 960, y:300 }"
           bordered>
           bordered>
           <!-- 退货单价 -->
           <!-- 退货单价 -->
@@ -412,12 +414,26 @@ export default {
       return (
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
+    },
+    initPage () {
+      this.getWarehouse()
+      this.resetSearchForm()
+      this.chooseResetSearchForm()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.initPage()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.initPage()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getWarehouse()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 23 - 10
src/views/bulkManagement/bulkReturnGoods/list.vue

@@ -71,6 +71,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1330, y: tableHeight }"
         :scroll="{ x: 1330, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 散件退货单号 -->
         <!-- 散件退货单号 -->
         <template slot="sparePartsReturnNo" slot-scope="text, record">
         <template slot="sparePartsReturnNo" slot-scope="text, record">
@@ -304,17 +305,19 @@ export default {
         }
         }
       })
       })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.openModal = false
+      this.getSupplierList()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -323,11 +326,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.openModal = false
-      vm.getSupplierList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 20 - 7
src/views/bulkManagement/bulkWarehousingOrder/detail.vue

@@ -74,6 +74,7 @@
               :columns="columns"
               :columns="columns"
               :data="loadData"
               :data="loadData"
               :scroll="{ x: 1180 }"
               :scroll="{ x: 1180 }"
+              :defaultLoadData="false"
               bordered>
               bordered>
             </s-table>
             </s-table>
           </a-collapse-panel>
           </a-collapse-panel>
@@ -181,12 +182,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfbwod" name="printfbwod" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfbwod'].focus()
+        window.frames['printfbwod'].print()
       }
       }
     },
     },
     // 基本信息
     // 基本信息
@@ -214,11 +215,23 @@ export default {
       this.$router.push({ path: `/bulkManagement/bulkWarehousingOrder/edit/${this.basicInfoData.id}/${this.basicInfoData.sparePartsPurchaseSn}` })
       this.$router.push({ path: `/bulkManagement/bulkWarehousingOrder/edit/${this.basicInfoData.id}/${this.basicInfoData.sparePartsPurchaseSn}` })
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.$refs.table.refresh(true)
+      this.getDetail()
+      this.getDetailCount()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.getDetail()
+      this.getDetailCount()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-      vm.getDetailCount()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 25 - 10
src/views/bulkManagement/bulkWarehousingOrder/edit.vue

@@ -172,6 +172,7 @@
                 :rowKey="(record) => record.id"
                 :rowKey="(record) => record.id"
                 :columns="chooseColumns"
                 :columns="chooseColumns"
                 :data="chooseLoadData"
                 :data="chooseLoadData"
+                :defaultLoadData="false"
                 :scroll="{ x: 1320, y: 300 }"
                 :scroll="{ x: 1320, y: 300 }"
                 bordered>
                 bordered>
                 <!-- 成本价 -->
                 <!-- 成本价 -->
@@ -406,12 +407,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfbwoe" name="printfbwoe" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfbwoe'].focus()
+        window.frames['printfbwoe'].print()
       }
       }
     },
     },
     // 双击快速添加
     // 双击快速添加
@@ -654,16 +655,30 @@ export default {
       return (
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
+    },
+    initPage () {
+      this.getWarehouseCascade()
+      this.getDetail()
+      this.getProductBrand()
+      this.getProductType()
+      this.resetSearchForm()
+      this.$refs.chooseTable.refresh(true)
+      this.openModal = false
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.initPage()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.initPage()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.openModal = false
-      vm.getWarehouseCascade()
-      vm.getDetail()
-      vm.getProductBrand()
-      vm.getProductType()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 26 - 13
src/views/bulkManagement/bulkWarehousingOrder/list.vue

@@ -58,9 +58,9 @@
             <a-col :md="6" :sm="24">
             <a-col :md="6" :sm="24">
               <span class="table-page-search-submitButtons">
               <span class="table-page-search-submitButtons">
                 <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="bulkWarehousingOrderList-refresh">查询</a-button>
                 <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="bulkWarehousingOrderList-refresh">查询</a-button>
-                <a-button style="margin-left: 8px" @click="resetSearchForm()" :disabled="disabled" id="bulkWarehousingOrderList-reset">重置</a-button>
+                <a-button style="margin-left: 5px" @click="resetSearchForm()" :disabled="disabled" id="bulkWarehousingOrderList-reset">重置</a-button>
                 <a-button
                 <a-button
-                  style="margin-left: 8px"
+                  style="margin-left: 5px"
                   type="primary"
                   type="primary"
                   class="button-warning"
                   class="button-warning"
                   @click="handleExport"
                   @click="handleExport"
@@ -68,7 +68,7 @@
                   :loading="exportLoading"
                   :loading="exportLoading"
                   v-if="$hasPermissions('B_bulkWarehousingOrder_export')"
                   v-if="$hasPermissions('B_bulkWarehousingOrder_export')"
                   id="bulkWarehousingOrderList-export">导出</a-button>
                   id="bulkWarehousingOrderList-export">导出</a-button>
-                <a @click="advanced=!advanced" style="margin-left: 8px">
+                <a @click="advanced=!advanced" style="margin-left: 5px">
                   {{ advanced ? '收起' : '展开' }}
                   {{ advanced ? '收起' : '展开' }}
                   <a-icon :type="advanced ? 'up' : 'down'"/>
                   <a-icon :type="advanced ? 'up' : 'down'"/>
                 </a>
                 </a>
@@ -99,6 +99,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1120, y: tableHeight }"
         :scroll="{ x: 1120, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 散件单号 -->
         <!-- 散件单号 -->
         <template slot="sparePartsPurchaseNo" slot-scope="text, record">
         <template slot="sparePartsPurchaseNo" slot-scope="text, record">
@@ -334,17 +335,19 @@ export default {
         }
         }
       })
       })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.openModal = false
+      this.getSupplierList()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 270
       this.tableHeight = window.innerHeight - tableSearchH - 270
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -353,11 +356,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.openModal = false
-      vm.getSupplierList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 19 - 7
src/views/customerManagement/customerInfo/edit.vue

@@ -329,16 +329,28 @@ export default {
       this.getCustTypeList() //  客户类型
       this.getCustTypeList() //  客户类型
       this.getSettleStyleList() // 收款方式
       this.getSettleStyleList() // 收款方式
       this.$refs.ruleForm.resetFields()
       this.$refs.ruleForm.resetFields()
+    },
+    initPage () {
+      this.getBaseData()
+      if (this.$route.params.id) {
+        //  编辑页
+        this.getDetail()
+      }
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.initPage()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.initPage()
     }
     }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getBaseData()
-      if (vm.$route.params.id) {
-        //  编辑页
-        vm.getDetail()
-      }
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 23 - 10
src/views/customerManagement/customerInfo/list.vue

@@ -88,6 +88,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1220, y: tableHeight }"
         :scroll="{ x: 1220, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
@@ -323,17 +324,19 @@ export default {
         }
         }
       })
       })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getArea('province')
+      this.getCustTypeList()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -342,11 +345,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getArea('province')
-      vm.getCustTypeList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 15 - 8
src/views/financialManagement/companyCollectionPayment/detail.vue

@@ -6,11 +6,6 @@
         <a id="companyCollectionPaymentDetail-back-btn" href="javascript:;" @click="handleBack"><a-icon type="left" /> 返回列表</a>
         <a id="companyCollectionPaymentDetail-back-btn" href="javascript:;" @click="handleBack"><a-icon type="left" /> 返回列表</a>
         <p style=" display: inline-block;margin: 0 0 0 60px;color: #000;font-size: 16px;font-weight: 600;">单号:{{ (basicInfoData&&basicInfoData.unitSettleNo) || '--' }}</p>
         <p style=" display: inline-block;margin: 0 0 0 60px;color: #000;font-size: 16px;font-weight: 600;">单号:{{ (basicInfoData&&basicInfoData.unitSettleNo) || '--' }}</p>
       </template>
       </template>
-      <!-- 操作区,位于 title 行的行尾 -->
-      <!-- <template slot="extra">
-        <a-button key="2" id="companyCollectionPaymentDetail-preview-btn">打印预览</a-button>
-        <a-button key="1" type="primary" id="companyCollectionPaymentDetail-print-btn">快速打印</a-button>
-      </template> -->
     </a-page-header>
     </a-page-header>
     <!-- 基础信息 -->
     <!-- 基础信息 -->
     <a-card size="small" :bordered="false" class="companyCollectionPaymentDetail-cont">
     <a-card size="small" :bordered="false" class="companyCollectionPaymentDetail-cont">
@@ -51,6 +46,7 @@
             :columns="columns"
             :columns="columns"
             :data="loadData"
             :data="loadData"
             :scroll="{ x: 640 }"
             :scroll="{ x: 640 }"
+            :defaultLoadData="false"
             bordered>
             bordered>
           </s-table>
           </s-table>
         </a-collapse-panel>
         </a-collapse-panel>
@@ -117,10 +113,21 @@ export default {
       })
       })
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.$refs.table.refresh(true)
+      this.getDetail()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.getDetail()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 22 - 9
src/views/financialManagement/companyCollectionPayment/list.vue

@@ -83,6 +83,7 @@
       :columns="columns"
       :columns="columns"
       :data="loadData"
       :data="loadData"
       :scroll="{ x: 1340, y: tableHeight }"
       :scroll="{ x: 1340, y: tableHeight }"
+      :defaultLoadData="false"
       bordered>
       bordered>
       <!-- 结算单号 -->
       <!-- 结算单号 -->
       <template slot="unitSettleNo" slot-scope="text, record">
       <template slot="unitSettleNo" slot-scope="text, record">
@@ -194,17 +195,18 @@ export default {
         }
         }
       })
       })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getSettleStyle()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 230
       this.tableHeight = window.innerHeight - tableSearchH - 230
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -213,10 +215,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getSettleStyle()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 15 - 3
src/views/financialManagement/companyReceivablePayable/collectionPayment.vue

@@ -35,6 +35,7 @@
               :dataSource="chooseLoadData"
               :dataSource="chooseLoadData"
               :scroll="{ x: 1040, y: 300 }"
               :scroll="{ x: 1040, y: 300 }"
               :loading="loading"
               :loading="loading"
+              :locale="{emptyText: '请先选择单据'}"
               :pagination="false"
               :pagination="false"
               bordered>
               bordered>
               <!-- 序号 -->
               <!-- 序号 -->
@@ -305,10 +306,21 @@ export default {
       this.openModal = false
       this.openModal = false
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.getSettleStyle()
+      this.chooseLoadData = []
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.getSettleStyle()
+      this.chooseLoadData = []
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getSettleStyle()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 17 - 5
src/views/financialManagement/companyReceivablePayable/detail.vue

@@ -6,11 +6,6 @@
         <a id="companyCollectionPaymentDetail-back-btn" href="javascript:;" @click="handleBack"><a-icon type="left" /> 返回列表</a>
         <a id="companyCollectionPaymentDetail-back-btn" href="javascript:;" @click="handleBack"><a-icon type="left" /> 返回列表</a>
         <p style=" display: inline-block;margin: 0 0 0 60px;color: #000;font-size: 16px;font-weight: 600;">客户:{{ $route.params.name || '--' }}</p>
         <p style=" display: inline-block;margin: 0 0 0 60px;color: #000;font-size: 16px;font-weight: 600;">客户:{{ $route.params.name || '--' }}</p>
       </template>
       </template>
-      <!-- 操作区,位于 title 行的行尾 -->
-      <!-- <template slot="extra">
-        <a-button key="2" id="companyCollectionPaymentDetail-preview-btn">打印预览</a-button>
-        <a-button key="1" type="primary" id="companyCollectionPaymentDetail-print-btn">快速打印</a-button>
-      </template> -->
     </a-page-header>
     </a-page-header>
     <a-card>
     <a-card>
       <!-- 搜索条件 -->
       <!-- 搜索条件 -->
@@ -60,6 +55,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 800 }"
         :scroll="{ x: 800 }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 采购数量 -->
         <!-- 采购数量 -->
         <template slot="purchaseNum" slot-scope="text, record">
         <template slot="purchaseNum" slot-scope="text, record">
@@ -170,6 +166,22 @@ export default {
       document.body.appendChild(link)
       document.body.appendChild(link)
       link.click()
       link.click()
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.$refs.table.refresh(true)
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 21 - 4
src/views/financialManagement/companyReceivablePayable/list.vue

@@ -47,6 +47,7 @@
       :columns="columns"
       :columns="columns"
       :data="loadData"
       :data="loadData"
       :scroll="{ y: tableHeight }"
       :scroll="{ y: tableHeight }"
+      :defaultLoadData="false"
       bordered>
       bordered>
       <!-- 操作 -->
       <!-- 操作 -->
       <template slot="action" slot-scope="text, record">
       <template slot="action" slot-scope="text, record">
@@ -141,16 +142,32 @@ export default {
       this.queryParam.settleClientType = undefined
       this.queryParam.settleClientType = undefined
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 230
       this.tableHeight = window.innerHeight - tableSearchH - 230
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 18 - 5
src/views/financialManagement/expenseManagement/edit.vue

@@ -188,10 +188,9 @@ export default {
     //  返回列表
     //  返回列表
     handleBack () {
     handleBack () {
       this.$router.push({ path: '/financialManagement/expenseManagement/list', query: { closeLastOldTab: true } })
       this.$router.push({ path: '/financialManagement/expenseManagement/list', query: { closeLastOldTab: true } })
-    }
-  },
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
+    },
+    pageInit () {
+      const vm = this
       vm.$refs.ruleForm.resetFields()
       vm.$refs.ruleForm.resetFields()
       if (vm.$route.params.id) {
       if (vm.$route.params.id) {
         //  编辑页
         //  编辑页
@@ -199,7 +198,21 @@ export default {
       }
       }
       vm.getCostTypeList()
       vm.getCostTypeList()
       vm.getSettleStyle()
       vm.getSettleStyle()
-    })
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 23 - 6
src/views/financialManagement/expenseManagement/list.vue

@@ -76,6 +76,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1120, y: tableHeight }"
         :scroll="{ x: 1120, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 费用类别 -->
         <!-- 费用类别 -->
         <template slot="expensesType" slot-scope="text, record">
         <template slot="expensesType" slot-scope="text, record">
@@ -303,17 +304,17 @@ export default {
       this.costType = []
       this.costType = []
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 270
       this.tableHeight = window.innerHeight - tableSearchH - 270
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -321,6 +322,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 24 - 11
src/views/financialManagement/financialCollection/list.vue

@@ -86,6 +86,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1660, y: tableHeight }"
         :scroll="{ x: 1660, y: tableHeight }"
+        :defaultLoadData="false"
         bordered
         bordered
       >
       >
         <!-- 操作 -->
         <!-- 操作 -->
@@ -212,11 +213,6 @@ export default {
       }
       }
     }
     }
   },
   },
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.queryByTypeSum()
-    })
-  },
   methods: {
   methods: {
     //  时间  change
     //  时间  change
     dateChange (date) {
     dateChange (date) {
@@ -329,17 +325,18 @@ export default {
         })
         })
       }
       }
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.queryByTypeSum()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 330
       this.tableHeight = window.innerHeight - tableSearchH - 330
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -347,6 +344,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 24 - 11
src/views/financialManagement/financialPayment/list.vue

@@ -85,6 +85,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1660, y: tableHeight }"
         :scroll="{ x: 1660, y: tableHeight }"
+        :defaultLoadData="false"
         bordered
         bordered
       >
       >
         <!-- 操作 -->
         <!-- 操作 -->
@@ -211,11 +212,6 @@ export default {
       }
       }
     }
     }
   },
   },
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.queryByTypeSum()
-    })
-  },
   methods: {
   methods: {
     //  时间  change
     //  时间  change
     dateChange (date) {
     dateChange (date) {
@@ -328,17 +324,18 @@ export default {
         })
         })
       }
       }
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.queryByTypeSum()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 330
       this.tableHeight = window.innerHeight - tableSearchH - 330
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -346,6 +343,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 28 - 7
src/views/financialManagement/inventoryCheckAudit/list.vue

@@ -34,12 +34,17 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1150, y: tableHeight }"
         :scroll="{ x: 1150, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 单号 -->
         <!-- 单号 -->
         <template slot="checkWarehouseNo" slot-scope="text, record">
         <template slot="checkWarehouseNo" slot-scope="text, record">
           <span style="color: #ed1c24;cursor: pointer;" v-if="$hasPermissions('B_inventoryCheckingDetail')" @click="handleDetail(record)">{{ record.checkWarehouseNo }}</span>
           <span style="color: #ed1c24;cursor: pointer;" v-if="$hasPermissions('B_inventoryCheckingDetail')" @click="handleDetail(record)">{{ record.checkWarehouseNo }}</span>
           <span v-else>{{ record.checkWarehouseNo }}</span>
           <span v-else>{{ record.checkWarehouseNo }}</span>
         </template>
         </template>
+        <!-- 盈亏数量 -->
+        <template slot="totalLossQty" slot-scope="text, record">
+          <span>{{ (record.totalLossQty || record.totalLossQty==0) ? Math.abs(record.totalLossQty) : '--' }}</span>
+        </template>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
           <a-button
           <a-button
@@ -91,7 +96,7 @@ export default {
         { title: '总数量', dataIndex: 'totalStockQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '总数量', dataIndex: 'totalStockQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '总成本', dataIndex: 'totalStockCost', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '总成本', dataIndex: 'totalStockCost', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '盘盈数量', dataIndex: 'totalProfitQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '盘盈数量', dataIndex: 'totalProfitQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘亏数量', dataIndex: 'totalLossQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '盘亏数量', scopedSlots: { customRender: 'totalLossQty' }, width: 80, align: 'center' },
         { title: '盘点完成时间', dataIndex: 'checkTime', width: 140, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '盘点完成时间', dataIndex: 'checkTime', width: 140, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '财务审核时间', dataIndex: 'financeAuditTime', width: 140, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '财务审核时间', dataIndex: 'financeAuditTime', width: 140, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '财务审核状态', dataIndex: 'stateDictValue', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '财务审核状态', dataIndex: 'stateDictValue', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
@@ -162,17 +167,17 @@ export default {
       this.queryParam.checkWarehouseNo = ''
       this.queryParam.checkWarehouseNo = ''
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 195
       this.tableHeight = window.innerHeight - tableSearchH - 195
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -180,6 +185,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 0 - 161
src/views/financialManagement/inventoryReview/detail.vue

@@ -1,161 +0,0 @@
-<template>
-  <div class="inventoryReviewDetail-wrap">
-    <a-page-header :ghost="false" @back="handleBack" >
-      <!-- 自定义的二级文字标题 -->
-      <template slot="subTitle">
-        <a id="inventoryReviewDetail-back-btn" href="javascript:;" @click="handleBack">返回列表</a>
-      </template>
-      <!-- 操作区,位于 title 行的行尾 -->
-      <!-- <template slot="extra">
-        <a-button key="2" id="inventoryReviewDetail-preview-btn">打印预览</a-button>
-        <a-button key="1" type="primary" id="inventoryReviewDetail-print-btn">快速打印</a-button>
-      </template> -->
-    </a-page-header>
-    <!-- 内容 -->
-    <a-page-header title="盘点单号:CG2021010100001" ></a-page-header>
-    <!-- alert -->
-    <a-alert type="info" style="margin-bottom:10px">
-      <div slot="message"><strong class="red">红色代表盘盈</strong>,<strong class="green">绿色代表盈亏</strong></div>
-    </a-alert>
-    <!-- 盈亏统计 -->
-    <a-card size="small" :bordered="false" class="inventoryReviewDetail-cont">
-      <a-collapse :activeKey="['1']">
-        <a-collapse-panel key="1" header="盈亏统计">
-          <a-descriptions :column="2" bordered>
-            <a-descriptions-item label="库存数量">2</a-descriptions-item>
-            <a-descriptions-item label="库存成本">20</a-descriptions-item>
-            <a-descriptions-item label="盘盈数量">¥120.36</a-descriptions-item>
-            <a-descriptions-item label="盘盈成本">3</a-descriptions-item>
-            <a-descriptions-item label="盘亏数量">4</a-descriptions-item>
-            <a-descriptions-item label="盘亏成本">¥11.2</a-descriptions-item>
-            <a-descriptions-item>
-              <template slot="label">
-                盈亏总数量
-                <a-popover>
-                  <template slot="content">
-                    盘盈数量与盘亏数量之和
-                  </template>
-                  <a-icon type="question-circle" theme="twoTone" />
-                </a-popover>
-              </template>
-              4
-            </a-descriptions-item>
-            <a-descriptions-item>
-              <template slot="label">
-                盈亏总成本
-                <a-popover>
-                  <template slot="content">
-                    盘盈成本与盘亏成本之和
-                  </template>
-                  <a-icon type="question-circle" theme="twoTone" />
-                </a-popover>
-              </template>
-              4
-            </a-descriptions-item>
-          </a-descriptions>
-        </a-collapse-panel>
-      </a-collapse>
-    </a-card>
-    <!-- 产品明细 -->
-    <a-card size="small" :bordered="false" class="inventoryReviewDetail-cont">
-      <a-collapse :activeKey="['1']">
-        <a-collapse-panel key="1" header="产品明细">
-          <!-- 列表 -->
-          <s-table
-            class="sTable"
-            ref="table"
-            size="small"
-            :rowKey="(record) => record.id"
-            :columns="columns"
-            :data="loadData"
-            :scroll="{ x: 1290 }"
-            bordered>
-            <!-- 采购数量 -->
-            <template slot="purchaseNum" slot-scope="text, record">
-              <span>{{ record.purchaseNum }}</span>
-            </template>
-            <!-- 缺货数量 -->
-            <template slot="outOfStockNum" slot-scope="text, record">
-              <span>{{ record.outOfStockNum }}</span>
-            </template>
-          </s-table>
-        </a-collapse-panel>
-      </a-collapse>
-    </a-card>
-  </div>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-export default {
-  components: { STable, VSelect },
-  data () {
-    return {
-      // 表头
-      columns: [
-        { title: '序号', dataIndex: 'no', width: 80, align: 'center', fixed: 'left' },
-        { title: '产品编码', dataIndex: 'productCode', width: 160, align: 'center' },
-        { title: '产品名称', dataIndex: 'productName', align: 'center', ellipsis: true },
-        { title: '单位', dataIndex: 'productOrigUnit', width: 100, align: 'center' },
-        { title: '仓库', dataIndex: 'warehouseName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '仓位', dataIndex: 'warehouseLocationName', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '库存数量', dataIndex: 'qtsy', width: 110, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '库存成本', dataIndex: 'price', width: 100, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘点数量', dataIndex: 'qtssy', width: 110, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘点盈亏数量', dataIndex: 'qtdsy', width: 120, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘点盈亏成本', dataIndex: 'prifce', width: 120, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        this.disabled = true
-        // return customerBundleDelayList( Object.assign(parameter, this.queryParam) ).then(res => {
-        //   const data = res.data
-        //   const no = (data.pageNo - 1) * data.pageSize
-        //   for (var i = 0; i < data.list.length; i++) {
-        //     data.list[i].no = no + i + 1
-        //   }
-        //   this.disabled = false
-        //   return data
-        // })
-        const _this = this
-        return new Promise(function (resolve, reject) {
-          const data = {
-            pageNo: 1,
-            pageSize: 10,
-            list: [
-              { id: '1', purchaseNo: 'jgqp11111111111', creatDate: '产品1', custName: 'jgqp111123545', totalP: '箭冠品牌', totalNums: '产品分类1', totalPrice: '5', payType: '122' }
-            ],
-            count: 10
-          }
-          const no = (data.pageNo - 1) * data.pageSize
-          for (var i = 0; i < data.list.length; i++) {
-            data.list[i].no = no + i + 1
-          }
-          _this.disabled = false
-          resolve(data)
-        })
-      }
-    }
-  },
-  methods: {
-    //  返回列表
-    handleBack () {
-      this.$router.push({ path: '/financialManagement/inventoryReview/list', query: { closeLastOldTab: true } })
-    }
-  }
-}
-</script>
-
-<style lang="less">
-  .inventoryReviewDetail-wrap{
-    .inventoryReviewDetail-cont{
-      margin-bottom: 10px;
-    }
-    .green{
-      color: #19be6b;
-    }
-    .red{
-      color: #ed1c24;
-    }
-  }
-</style>

+ 0 - 184
src/views/financialManagement/inventoryReview/list.vue

@@ -1,184 +0,0 @@
-<template>
-  <a-card size="small" :bordered="false" class="inventoryReviewList-wrap">
-    <!-- 搜索条件 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
-        <a-row :gutter="15">
-          <a-col :md="6" :sm="24">
-            <a-form-item label="盘点单号">
-              <a-input id="inventoryReviewList-purchaseNo" v-model.trim="queryParam.purchaseNo" allowClear placeholder="请输入盘点单号"/>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="盘点审核时间">
-              <rangeDate ref="rangeDate" @change="dateChange" />
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="财务审核状态">
-              <v-select
-                v-model="queryParam.billStatus"
-                ref="billStatus"
-                id="inventoryReviewList-billStatus"
-                code="PAYMENT_TYPE"
-                placeholder="请选择财务审核状态"
-                allowClear></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <span class="table-page-search-submitButtons">
-              <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="inventoryReviewList-refresh">查询</a-button>
-              <a-button style="margin-left: 8px" @click="resetSearchForm()" :disabled="disabled" id="inventoryReviewList-reset">重置</a-button>
-            </span>
-          </a-col>
-        </a-row>
-      </a-form>
-    </div>
-    <!-- alert -->
-    <a-alert type="info" style="margin-bottom:10px">
-      <div slot="message">共 <strong>6</strong> 条记录,其中待审核 <strong>14</strong> 条 </div>
-    </a-alert>
-    <!-- 列表 -->
-    <s-table
-      class="sTable"
-      ref="table"
-      size="small"
-      :rowKey="(record) => record.id"
-      :columns="columns"
-      :data="loadData"
-      :scroll="{ x: 1300 }"
-      bordered>
-      <!-- 采购单号 -->
-      <template slot="purchaseNo" slot-scope="text, record">
-        <span style="color: #ed1c24;cursor: pointer;">{{ record.purchaseNo }}</span>
-      </template>
-      <!-- 采购入库单号 -->
-      <template slot="purchaseNos" slot-scope="text, record">
-        <span style="color: #ed1c24;cursor: pointer;">{{ record.purchaseNo }}</span>
-      </template>
-      <!-- 状态 -->
-      <template slot="state" slot-scope="text, record">
-        <span>{{ record.state == 1 ? '已启用' : '已禁用' }}</span>
-      </template>
-      <!-- 操作 -->
-      <template slot="action" slot-scope="text, record">
-        <a-button size="small" type="primary" class="button-info" @click="handleExamine(record, 1)" id="inventoryReview-adopt-btn">通过</a-button>
-        <a-button size="small" type="primary" class="button-warning" @click="handleExamine(record, 2)" id="inventoryReview-unadopt-btn">不通过</a-button>
-        <a-button size="small" type="primary" class="button-success" @click="handleDetail(record)" id="inventoryReview-detail-btn">详情</a-button>
-      </template>
-    </s-table>
-  </a-card>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import rangeDate from '@/views/common/rangeDate.vue'
-// import { getRoleList, getServiceList } from '@/api/manage'
-export default {
-  components: { STable, VSelect, rangeDate },
-  data () {
-    return {
-      disabled: false, //  查询、重置按钮是否可操作
-      // 查询参数
-      queryParam: {
-        beginDate: '',
-        endDate: ''
-      },
-      // 表头
-      columns: [
-        { title: '序号', dataIndex: 'no', width: 80, align: 'center' },
-        { title: '盘点单号', scopedSlots: { customRender: 'purchaseBillNo' }, align: 'center' },
-        { title: '盘点产品款数', dataIndex: 'totalCategory', width: 120, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '库存总成本', dataIndex: 'totalAmount', width: 110, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘盈总数量', dataIndex: 'totalQty', width: 110, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘亏总数量', dataIndex: 'totalssQty', width: 110, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '盘点审核时间', dataIndex: 'sauditTime', width: 160, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '财务审核时间', dataIndex: 'auditTime', width: 160, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '财务审核状态', scopedSlots: { customRender: 'auditStatus' }, width: 120, align: 'center' },
-        { title: '操作', scopedSlots: { customRender: 'action' }, width: 250, align: 'center', fixed: 'right' }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        this.disabled = true
-        // return customerBundleDelayList( Object.assign(parameter, this.queryParam) ).then(res => {
-        //   const data = res.data
-        //   const no = (data.pageNo - 1) * data.pageSize
-        //   for (var i = 0; i < data.list.length; i++) {
-        //     data.list[i].no = no + i + 1
-        //   }
-        //   this.disabled = false
-        //   return data
-        // })
-        const _this = this
-        return new Promise(function (resolve, reject) {
-          const data = {
-            pageNo: 1,
-            pageSize: 10,
-            list: [
-              { id: '1', purchaseNo: 'jgqp11111111111', creatDate: '产品1', custName: 'jgqp111123545', totalP: '箭冠品牌', totalNums: '产品分类1', totalPrice: '5', payType: '122' }
-            ],
-            count: 10
-          }
-          const no = (data.pageNo - 1) * data.pageSize
-          for (var i = 0; i < data.list.length; i++) {
-            data.list[i].no = no + i + 1
-          }
-          _this.disabled = false
-          resolve(data)
-        })
-      }
-    }
-  },
-  methods: {
-    //  时间  change
-    dateChange (date) {
-      this.queryParam.beginDate = date[0]
-      this.queryParam.endDate = date[1]
-    },
-    //  详情
-    handleDetail (row) {
-      this.$router.push({ path: `/financialManagement/inventoryReview/detail/${row.id}` })
-    },
-    //  审核
-    handleExamine (row, type) {
-      const _this = this
-      this.$confirm({
-        title: '提示',
-        content: '操作后不可恢复,确定要进行' + (type == 1 ? ' 通过 ' : ' 不通过 ') + '操作吗?',
-        centered: true,
-        onOk () {
-          // delectRolePower({
-          //   id: row.id
-          // }).then(res => {
-          //   console.log(res, 'res1111')
-          //   if (res.status == 200) {
-          //     _this.$message.success(res.message)
-          //     _this.$refs.table.refresh()
-          //   }
-          // })
-        }
-      })
-    },
-    //  重置
-    resetSearchForm () {
-      this.$refs.rangeDate.resetDate()
-      this.queryParam.beginDate = ''
-      this.queryParam.endDate = ''
-      this.queryParam.orderBundleNo = ''
-      this.queryParam.orderBundle.custMobile = ''
-      this.queryParam.bundleName = ''
-      this.queryParam.itemName = ''
-      this.oldTime = undefined
-      this.newTime = undefined
-      this.$refs.table.refresh(true)
-    }
-  }
-}
-</script>
-<style lang="less">
-  .inventoryReviewList-wrap{
-    .sTable{
-      margin-top: 15px;
-    }
-  }
-</style>

+ 23 - 6
src/views/financialManagement/ledgerRecord/list.vue

@@ -56,6 +56,7 @@
       :columns="columns"
       :columns="columns"
       :data="loadData"
       :data="loadData"
       :scroll="{ x: 1690 }"
       :scroll="{ x: 1690 }"
+      :defaultLoadData="false"
       bordered>
       bordered>
     </s-table>
     </s-table>
   </a-card>
   </a-card>
@@ -154,17 +155,17 @@ export default {
       this.$refs.custSatelliteList.resetForm()
       this.$refs.custSatelliteList.resetForm()
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 230
       this.tableHeight = window.innerHeight - tableSearchH - 230
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -172,6 +173,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 18 - 6
src/views/financialManagement/warehousingAudit/detail.vue

@@ -50,6 +50,7 @@
               :columns="columns"
               :columns="columns"
               :data="loadData"
               :data="loadData"
               :scroll="{ x: 1520 }"
               :scroll="{ x: 1520 }"
+              :defaultLoadData="false"
               bordered>
               bordered>
             </s-table>
             </s-table>
           </a-collapse-panel>
           </a-collapse-panel>
@@ -131,12 +132,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printfwad" name="printfwad" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printfwad'].focus()
+        window.frames['printfwad'].print()
       }
       }
     },
     },
     getDetail () {
     getDetail () {
@@ -149,10 +150,21 @@ export default {
       })
       })
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.$refs.table.refresh(true)
+      this.getDetail()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.$refs.table.refresh(true)
+      this.getDetail()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 23 - 6
src/views/financialManagement/warehousingAudit/list.vue

@@ -63,6 +63,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1420, y: tableHeight }"
         :scroll="{ x: 1420, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 采购入库单号 -->
         <!-- 采购入库单号 -->
         <template slot="receivingBillNo" slot-scope="text, record">
         <template slot="receivingBillNo" slot-scope="text, record">
@@ -204,17 +205,17 @@ export default {
       this.queryParam.auditState = undefined
       this.queryParam.auditState = undefined
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 238
       this.tableHeight = window.innerHeight - tableSearchH - 238
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -222,6 +223,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 22 - 9
src/views/financialManagement/withdrawalManagement/list.vue

@@ -33,6 +33,7 @@
       :columns="columns"
       :columns="columns"
       :data="loadData"
       :data="loadData"
       :scroll="{ x: 1320 }"
       :scroll="{ x: 1320 }"
+      :defaultLoadData="false"
       bordered>
       bordered>
     </s-table>
     </s-table>
     <!-- 提现说明 -->
     <!-- 提现说明 -->
@@ -139,17 +140,18 @@ export default {
       this.queryParam.endDate = ''
       this.queryParam.endDate = ''
       this.$refs.table.refresh(true)
       this.$refs.table.refresh(true)
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getAccount()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235 - 217.5
       this.tableHeight = window.innerHeight - tableSearchH - 235 - 217.5
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -158,10 +160,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getAccount()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 18 - 8
src/views/inventoryManagement/inventoryChecking/detailModal.vue

@@ -7,7 +7,7 @@
     title="详情"
     title="详情"
     v-model="isShow"
     v-model="isShow"
     @cancle="isShow = false"
     @cancle="isShow = false"
-    :width="960">
+    width="80%">
     <a-spin :spinning="spinning" tip="Loading...">
     <a-spin :spinning="spinning" tip="Loading...">
       <a-card size="small" :bordered="false" class="inventoryCheckingDetail-cont">
       <a-card size="small" :bordered="false" class="inventoryCheckingDetail-cont">
         <div class="print-cont" v-if="$hasPermissions('B_inventoryCheckingPrint')">
         <div class="print-cont" v-if="$hasPermissions('B_inventoryCheckingPrint')">
@@ -43,7 +43,7 @@
           </a-descriptions-item>
           </a-descriptions-item>
           <a-descriptions-item label="盘点类型">{{ (basicInfoData&&basicInfoData.checkTypeDictValue) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="盘点类型">{{ (basicInfoData&&basicInfoData.checkTypeDictValue) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="是否区分仓库" v-if="basicInfoData&&basicInfoData.checkType=='SELECT'">{{ (basicInfoData&&basicInfoData.warehouseFlagDictValue) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="是否区分仓库" v-if="basicInfoData&&basicInfoData.checkType=='SELECT'">{{ (basicInfoData&&basicInfoData.warehouseFlagDictValue) || '--' }}</a-descriptions-item>
-          <a-descriptions-item label="盘点仓库" v-if="basicInfoData&&basicInfoData.warehouseFlag=='1'">{{ (basicInfoData&&basicInfoData.warehouseNameList) || '--' }}</a-descriptions-item>
+          <a-descriptions-item label="盘点仓库" v-if="basicInfoData&&basicInfoData.warehouseFlag=='1'" :span="3">{{ (basicInfoData&&basicInfoData.warehouseNameList) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="创建人">{{ (basicInfoData&&basicInfoData.creatorName) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="创建人">{{ (basicInfoData&&basicInfoData.creatorName) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="创建时间">{{ (basicInfoData&&basicInfoData.createDate) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="创建时间">{{ (basicInfoData&&basicInfoData.createDate) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="审核时间">{{ (basicInfoData&&basicInfoData.checkSuperviseTime) || '--' }}</a-descriptions-item>
           <a-descriptions-item label="审核时间">{{ (basicInfoData&&basicInfoData.checkSuperviseTime) || '--' }}</a-descriptions-item>
@@ -105,7 +105,8 @@
           :columns="columns"
           :columns="columns"
           :data="loadData"
           :data="loadData"
           :defaultLoadData="false"
           :defaultLoadData="false"
-          :scroll="{ x: 990, y: 450 }"
+          :scroll="{ x: 1200, y: 450 }"
+          :rowClassName="(record, index) => record.checkProfitLossQty < 0 ? 'redBg-row':''"
           bordered>
           bordered>
           <!-- 产品分类 -->
           <!-- 产品分类 -->
           <template slot="productType" slot-scope="text, record">
           <template slot="productType" slot-scope="text, record">
@@ -114,7 +115,7 @@
           </template>
           </template>
           <!-- 盈亏数量 -->
           <!-- 盈亏数量 -->
           <template slot="checkProfitLossQty" slot-scope="text, record">
           <template slot="checkProfitLossQty" slot-scope="text, record">
-            <span :style="{ color: record.checkProfitLossQty>0?'red':record.checkProfitLossQty<0?'green':'' }">{{ (record.checkProfitLossQty || record.checkProfitLossQty==0) ? record.checkProfitLossQty : '--' }}</span>
+            <span :style="{ color: record.checkProfitLossQty>0?'red':record.checkProfitLossQty<0?'green':'', fontWeight: record.checkProfitLossQty!=0?'bold':'' }">{{ (record.checkProfitLossQty || record.checkProfitLossQty==0) ? Math.abs(record.checkProfitLossQty) : '--' }}</span>
           </template>
           </template>
         </s-table>
         </s-table>
       </a-card>
       </a-card>
@@ -188,7 +189,7 @@ export default {
         { title: '序号', dataIndex: 'no', width: 50, align: 'center' },
         { title: '序号', dataIndex: 'no', width: 50, align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品编码', dataIndex: 'productCode', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 140 },
+        { title: '产品分类', scopedSlots: { customRender: 'productType' }, align: 'center', width: 140 },
         { title: '单位', dataIndex: 'productUnit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '单位', dataIndex: 'productUnit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '库存数量', dataIndex: 'stockQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '库存数量', dataIndex: 'stockQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '盘点数量', dataIndex: 'checkQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '盘点数量', dataIndex: 'checkQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
@@ -196,6 +197,7 @@ export default {
       ]
       ]
       if (this.basicInfoData && this.basicInfoData.warehouseFlag == '1') {
       if (this.basicInfoData && this.basicInfoData.warehouseFlag == '1') {
         arr.splice(4, 0, { title: '仓库', dataIndex: 'warehouseName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
         arr.splice(4, 0, { title: '仓库', dataIndex: 'warehouseName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
+        arr.splice(5, 0, { title: '仓位', dataIndex: 'warehouseLocationName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
       }
       }
       return arr
       return arr
     }
     }
@@ -216,6 +218,9 @@ export default {
       checkWarehouseDetailCount(Object.assign(this.queryParam, { checkWarehouseSn: this.itemSn })).then(res => {
       checkWarehouseDetailCount(Object.assign(this.queryParam, { checkWarehouseSn: this.itemSn })).then(res => {
         if (res.status == 200) {
         if (res.status == 200) {
           this.productTotal = res.data
           this.productTotal = res.data
+          if (res.data && res.data.checkLossQty) {
+            this.productTotal.checkLossQty = Math.abs(this.productTotal.checkLossQty || 0)
+          }
         } else {
         } else {
           this.productTotal = null
           this.productTotal = null
         }
         }
@@ -296,12 +301,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printficd" name="printficd" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printficd'].focus()
+        window.frames['printficd'].print()
       }
       }
     },
     },
     download (data) {
     download (data) {
@@ -327,6 +332,8 @@ export default {
       if (!newValue) {
       if (!newValue) {
         this.$emit('close')
         this.$emit('close')
         this.printerType = 'NEEDLE'
         this.printerType = 'NEEDLE'
+        this.$refs.table.clearTable()
+        this.basicInfoData = null
       } else {
       } else {
         const _this = this
         const _this = this
         setTimeout(() => (
         setTimeout(() => (
@@ -352,5 +359,8 @@ export default {
       text-align: right;
       text-align: right;
       padding: 5px 0 10px;
       padding: 5px 0 10px;
     }
     }
+    .redBg-row{
+      background-color: #f5cdc8;
+    }
   }
   }
 </style>
 </style>

+ 23 - 6
src/views/inventoryManagement/inventoryChecking/list.vue

@@ -56,6 +56,7 @@
       :columns="columns"
       :columns="columns"
       :data="loadData"
       :data="loadData"
       :scroll="{ x: 1160, y: tableHeight }"
       :scroll="{ x: 1160, y: tableHeight }"
+      :defaultLoadData="false"
       bordered>
       bordered>
       <!-- 单号 -->
       <!-- 单号 -->
       <template slot="checkWarehouseNo" slot-scope="text, record">
       <template slot="checkWarehouseNo" slot-scope="text, record">
@@ -265,17 +266,17 @@ export default {
       this.itemSn = null
       this.itemSn = null
       this.openDetailModal = false
       this.openDetailModal = false
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -283,6 +284,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 20 - 8
src/views/inventoryManagement/inventoryChecking/makeInventory.vue

@@ -35,7 +35,7 @@
       </a-page-header>
       </a-page-header>
       <!-- 基础信息 -->
       <!-- 基础信息 -->
       <a-card size="small" :bordered="false" class="inventoryCheckMakeInventoryList-cont">
       <a-card size="small" :bordered="false" class="inventoryCheckMakeInventoryList-cont">
-        <a-collapse>
+        <a-collapse defaultActiveKey="1">
           <a-collapse-panel key="1" header="基础信息">
           <a-collapse-panel key="1" header="基础信息">
             <a-descriptions :column="3">
             <a-descriptions :column="3">
               <a-descriptions-item label="盘点类型">{{ (basicInfoData&&basicInfoData.checkTypeDictValue) || '--' }}</a-descriptions-item>
               <a-descriptions-item label="盘点类型">{{ (basicInfoData&&basicInfoData.checkTypeDictValue) || '--' }}</a-descriptions-item>
@@ -113,6 +113,7 @@
           :columns="columns"
           :columns="columns"
           :data="loadData"
           :data="loadData"
           :scroll="{ x: 990 }"
           :scroll="{ x: 990 }"
+          :defaultLoadData="false"
           bordered>
           bordered>
           <!-- 产品分类 -->
           <!-- 产品分类 -->
           <template slot="productType" slot-scope="text, record">
           <template slot="productType" slot-scope="text, record">
@@ -134,7 +135,7 @@
           </template>
           </template>
           <!-- 盈亏数量 -->
           <!-- 盈亏数量 -->
           <template slot="checkProfitLossQty" slot-scope="text, record">
           <template slot="checkProfitLossQty" slot-scope="text, record">
-            <span :style="{ color: record.checkProfitLossQty>0?'red':record.checkProfitLossQty<0?'green':'' }">{{ (record.checkProfitLossQty || record.checkProfitLossQty==0) ? record.checkProfitLossQty : '--' }}</span>
+            <span :style="{ color: record.checkProfitLossQty>0?'red':record.checkProfitLossQty<0?'green':'', fontWeight: record.checkProfitLossQty!=0?'bold':'' }">{{ (record.checkProfitLossQty || record.checkProfitLossQty==0) ? Math.abs(record.checkProfitLossQty) : '--' }}</span>
           </template>
           </template>
         </s-table>
         </s-table>
       </a-card>
       </a-card>
@@ -402,12 +403,12 @@ export default {
         return
         return
       }
       }
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
       const url = window.URL.createObjectURL(new Blob([data], { type: 'application/pdf' }))
-      document.getElementById('print').innerHTML = '<iframe id="printf" name="printf" src="' + url + '" hidden></iframe>'
+      document.getElementById('print').innerHTML = '<iframe id="printficm" name="printficm" src="' + url + '" hidden></iframe>'
       if (type == 'preview') { //  预览
       if (type == 'preview') { //  预览
         window.open(url)
         window.open(url)
       } else if (type == 'print') { //  打印
       } else if (type == 'print') { //  打印
-        window.frames['printf'].focus()
-        window.frames['printf'].print()
+        window.frames['printficm'].focus()
+        window.frames['printficm'].print()
       }
       }
     },
     },
     download (data) {
     download (data) {
@@ -423,10 +424,21 @@ export default {
       link.click()
       link.click()
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.getDetail()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.getDetail()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 15 - 3
src/views/inventoryManagement/inventoryChecking/overall.vue

@@ -55,6 +55,7 @@
           :rowKey="(record) => record.id"
           :rowKey="(record) => record.id"
           :columns="columns"
           :columns="columns"
           :data="loadData"
           :data="loadData"
+          :defaultLoadData="false"
           bordered>
           bordered>
         </s-table>
         </s-table>
       </a-card>
       </a-card>
@@ -161,10 +162,21 @@ export default {
       })
       })
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.getDetail()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.getDetail()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 26 - 9
src/views/inventoryManagement/inventoryChecking/selfDisk.vue

@@ -11,7 +11,7 @@
       </a-page-header>
       </a-page-header>
       <!-- 基础信息 -->
       <!-- 基础信息 -->
       <a-card size="small" :bordered="false" class="inventoryCheckSelfDiskList-cont">
       <a-card size="small" :bordered="false" class="inventoryCheckSelfDiskList-cont">
-        <a-collapse>
+        <a-collapse defaultActiveKey="1">
           <a-collapse-panel key="1" header="基础信息">
           <a-collapse-panel key="1" header="基础信息">
             <a-descriptions :column="3">
             <a-descriptions :column="3">
               <a-descriptions-item label="盘点类型">{{ (basicInfoData&&basicInfoData.checkTypeDictValue) || '--' }}</a-descriptions-item>
               <a-descriptions-item label="盘点类型">{{ (basicInfoData&&basicInfoData.checkTypeDictValue) || '--' }}</a-descriptions-item>
@@ -93,7 +93,8 @@
           :columns="columns"
           :columns="columns"
           :customRow="handleClickRow"
           :customRow="handleClickRow"
           :data="loadData"
           :data="loadData"
-          :scroll="{ x: 1280, y: 300 }"
+          :scroll="{ x: 1340, y: 300 }"
+          :defaultLoadData="false"
           bordered>
           bordered>
           <!-- 产品分类 -->
           <!-- 产品分类 -->
           <template slot="productType" slot-scope="text, record">
           <template slot="productType" slot-scope="text, record">
@@ -182,7 +183,8 @@
           :rowKey="(record) => record.id"
           :rowKey="(record) => record.id"
           :columns="chooseColumns"
           :columns="chooseColumns"
           :data="chooseLoadData"
           :data="chooseLoadData"
-          :scroll="{ x: 1280, y: 300 }"
+          :scroll="{ x: 1420, y: 300 }"
+          :defaultLoadData="false"
           bordered>
           bordered>
           <!-- 产品分类 -->
           <!-- 产品分类 -->
           <template slot="productType" slot-scope="text, record">
           <template slot="productType" slot-scope="text, record">
@@ -213,7 +215,7 @@
 import { STable, VSelect } from '@/components'
 import { STable, VSelect } from '@/components'
 import ProductType from '@/views/common/productType.js'
 import ProductType from '@/views/common/productType.js'
 import ProductBrand from '@/views/common/productBrand.js'
 import ProductBrand from '@/views/common/productBrand.js'
-import { checkWarehouseDetail, checkWarehouseDetailStockList, checkWarehouseDetailList, checkWarehouseDetailCount, checkWarehouseWarehouse, checkWarehouseDetailSave, checkWarehouseDetailSaveBatch, checkWarehouseDetailDel, checkWarehouseSubmit } from '@/api/checkWarehouse'
+import { checkWarehouseDetail, checkWarehouseDetailStockList, checkWarehouseDetailList, checkWarehouseDetailCount, checkWarehouseDetailSave, checkWarehouseDetailSaveBatch, checkWarehouseDetailDel, checkWarehouseSubmit } from '@/api/checkWarehouse'
 export default {
 export default {
   components: { STable, VSelect, ProductType, ProductBrand },
   components: { STable, VSelect, ProductType, ProductBrand },
   props: {},
   props: {},
@@ -284,7 +286,7 @@ export default {
     columns () {
     columns () {
       const arr = [
       const arr = [
         { title: '产品编码', dataIndex: 'productCode', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品编码', dataIndex: 'productCode', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
         { title: '产品品牌', dataIndex: 'brandName', width: 140, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品品牌', dataIndex: 'brandName', width: 140, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 140 },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 140 },
         { title: '单位', dataIndex: 'unit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '单位', dataIndex: 'unit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
@@ -294,13 +296,14 @@ export default {
       ]
       ]
       if (this.basicInfoData && this.basicInfoData.warehouseFlag == '1') {
       if (this.basicInfoData && this.basicInfoData.warehouseFlag == '1') {
         arr.splice(4, 0, { title: '仓库', dataIndex: 'warehouseName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
         arr.splice(4, 0, { title: '仓库', dataIndex: 'warehouseName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
+        arr.splice(5, 0, { title: '仓位', dataIndex: 'warehouseLocationName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
       }
       }
       return arr
       return arr
     },
     },
     chooseColumns () {
     chooseColumns () {
       const arr = [
       const arr = [
         { title: '产品编码', dataIndex: 'productCode', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品编码', dataIndex: 'productCode', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
         { title: '产品品牌', dataIndex: 'brandName', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品品牌', dataIndex: 'brandName', width: 180, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 180, align: 'center' },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 180, align: 'center' },
         { title: '单位', dataIndex: 'productUnit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '单位', dataIndex: 'productUnit', width: 60, align: 'center', customRender: function (text) { return text || '--' } },
@@ -310,6 +313,7 @@ export default {
       ]
       ]
       if (this.basicInfoData && this.basicInfoData.warehouseFlag == '1') {
       if (this.basicInfoData && this.basicInfoData.warehouseFlag == '1') {
         arr.splice(4, 0, { title: '仓库', dataIndex: 'warehouseName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
         arr.splice(4, 0, { title: '仓库', dataIndex: 'warehouseName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
+        arr.splice(5, 0, { title: '仓位', dataIndex: 'warehouseLocationName', width: 140, align: 'center', customRender: function (text) { return text || '--' } })
       }
       }
       return arr
       return arr
     }
     }
@@ -604,10 +608,23 @@ export default {
       }
       }
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.getDetail()
+      this.resetSearchForm()
+      this.chooseResetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.getDetail()
+      this.resetSearchForm()
+      this.chooseResetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getDetail()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 303 - 0
src/views/inventoryManagement/inventoryImport/list.vue

@@ -0,0 +1,303 @@
+<template>
+  <a-card size="small" :bordered="false" class="bulkImportList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <Upload
+          id="bulkImportList-attachList"
+          ref="importUpload"
+          :maxNums="1"
+          fileType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
+          uploadType="attach"
+          :action="attachAction"
+          :uploadParams="uploadParams"
+          upText="选择导入文件"
+          @remove="resetSearchForm"
+          @change="changeImport"></Upload>
+        <a :href="filePath" style="margin: 5px 0 0 15px;display: block;float: left;">
+          <a-icon type="download" style="padding-right: 5px;" />下载导入模板
+        </a>
+      </div>
+      <div class="importGuide-con">
+        <div class="explain-con">
+          <div class="explain-item">
+            <div class="explain-tit">导入文件说明</div>
+            <ul>
+              <li>1) 导入的EXCEL文件中必须包含名为"产品编码"、"仓库"、"仓位"、"入库数量"、"成本价";列顺序可忽略、行顺序可忽略。以产品编码,仓库,仓位,成本价作为导入的是否有效判断依据。</li>
+              <li>2) 红色底白字为错误项,错误项忽略不能导入,正确项可直接导入。</li>
+              <li>3) 入库数量必须大于0,且为正整数,为了保证数据的正确性,请检查上传文件数据无误后再上传操作。</li>
+              <li>4) 成本价为必填项,必须填写大于等于零的数字。</li>
+              <li>5) 支持上传文件格式:.xls、.xlsx。</li>
+            </ul>
+          </div>
+        </div>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px' }"
+        size="small"
+        :rowClassName="(record, index) => record.isError==1 ? 'redBg-row':''"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+      </s-table>
+      <div class="btn-con" v-if="uploadData && uploadData.stockImportSn">
+        <a-button
+          id="productInfoList-batchAudit"
+          type="primary"
+          class="button-warning"
+          @click="handleConfirm"
+          style="margin: 0 15px;">确认导入</a-button>
+        <a-button
+          id="productInfoList-batchLaunch"
+          type="primary"
+          class="button-primary"
+          @click="handleCancel"
+          style="margin: 0 15px;">取消导入</a-button>
+        <a-button
+          id="productInfoList-batchDownline"
+          type="primary"
+          class="button-grey"
+          @click="handleExportError"
+          style="margin: 0 15px;">导出错误项</a-button>
+      </div>
+    </a-spin>
+  </a-card>
+</template>
+
+<script>
+import { STable, Upload } from '@/components'
+import { stockImportList, stockImportFinish, stockImportCancel, stockImportKCExportError } from '@/api/stockImport'
+import moment from 'moment'
+export default {
+  components: { STable, Upload },
+  data () {
+    return {
+      spinning: false,
+      exportLoading: false, // 导出loading
+      tableHeight: 0,
+      queryParam: {}, // 查询参数
+      isAllError: false, // 是否全部错误
+      // 表头
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '产品编码', dataIndex: 'productCode', width: '25%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '仓库', dataIndex: 'warehouseName', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '仓位', dataIndex: 'warehouseLocationName', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库数量', dataIndex: 'putQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '成本价', dataIndex: 'cost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '错误原因', dataIndex: 'errorMsg', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        return stockImportList(Object.assign(parameter, { stockImportSn: this.uploadData && this.uploadData.stockImportSn })).then(res => {
+          const data = res.data
+          const no = (data.pageNo - 1) * data.pageSize
+          for (var i = 0; i < data.list.length; i++) {
+            data.list[i].no = no + i + 1
+          }
+          const ret = data.list.filter(item => item.isError == 1)
+          this.isAllError = ret.length == data.count
+          this.spinning = false
+          return data
+        })
+      },
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/stockImport/importForStock',
+      uploadParams: {
+        savePathType: 'local'
+      },
+      uploadData: null,
+      filePath: 'https://jianguan-images.oss-cn-beijing.aliyuncs.com/template/StockImports.xlsx'
+    }
+  },
+  methods: {
+    // 上传文件  change
+    changeImport (file) {
+      if (file && JSON.parse(file).length > 0) {
+        this.uploadData = JSON.parse(file)[0] || null
+        if (this.uploadData && this.uploadData.stockImportSn) {
+          this.$refs.table.refresh(true)
+        }
+      } else {
+        this.uploadData = null
+      }
+    },
+    resetSearchForm () {
+      this.$refs.table.clearTable() //  清空列表数据
+      this.$refs.importUpload.setFileList() //  清空导入文件
+      this.uploadData = null //  清空上传数据
+    },
+    // 确认导入
+    handleConfirm () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '您是否确认导入库存?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          stockImportFinish({ stockImportSn: _this.uploadData && _this.uploadData.stockImportSn }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.resetSearchForm()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    // 取消导入
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '您确认取消导入库存?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          stockImportCancel({ stockImportSn: _this.uploadData && _this.uploadData.stockImportSn }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.resetSearchForm()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    // 导出错误项
+    handleExportError () {
+      const _this = this
+      _this.spinning = true
+      stockImportKCExportError({ stockImportSn: _this.uploadData && _this.uploadData.stockImportSn }).then(res => {
+        _this.spinning = false
+        if (res.type == 'application/json') {
+          var reader = new FileReader()
+          reader.addEventListener('loadend', function () {
+            const obj = JSON.parse(reader.result)
+            _this.$notification.error({
+              message: '提示',
+              description: obj.message
+            })
+          })
+          reader.readAsText(res)
+        } else {
+          this.download(res)
+        }
+      })
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const fname = '库存导入错误项' + moment('YYYY_MMDD')
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 400
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      setTimeout(() => {
+        _this.setTableH()
+      }, 400)
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>
+<style lang="less">
+  .bulkImportList-wrap{
+    .table-page-search-wrapper{
+      overflow: hidden;
+      .upload-file{
+        height: auto;
+        margin-bottom: 10px;
+        .ant-btn{
+          background-color: #f30;
+          border-color: #f30;
+          margin: 0 5px;
+          font-size: 12px;
+          color: #fff;
+        }
+      }
+    }
+    .importGuide-con{
+      .explain-con{
+        .explain-item{
+          margin-bottom: 10px;
+          .explain-tit{
+            font-weight: bold;
+            span{
+              display: inline-block;
+              width: 18px;
+              height: 18px;
+              line-height: 16px;
+              text-align: center;
+              margin-right: 5px;
+              border-radius: 50%;
+              border: 1px solid rgba(0, 0, 0, 0.3);
+            }
+          }
+          p{
+            margin: 8px 0;
+            padding-left: 23px;
+          }
+          ul{
+            list-style: none;
+            padding: 0;
+            padding-left: 23px;
+            margin: 0;
+            li{
+              line-height: 26px;
+              font-size: 12px;
+            }
+          }
+        }
+      }
+    }
+    .redBg-row{
+      background-color: #F39494;
+    }
+    .btn-con{
+      text-align: center;
+    }
+  }
+</style>

+ 13 - 9
src/views/inventoryManagement/inventoryQuery/detailModal.vue

@@ -11,8 +11,8 @@
     <!-- 合计 -->
     <!-- 合计 -->
     <a-alert type="info" style="margin-bottom:10px">
     <a-alert type="info" style="margin-bottom:10px">
       <div class="ftext" slot="message">
       <div class="ftext" slot="message">
-        可用库存总数量(个):<strong>{{ currentStock&&(currentStock.currentQty || currentStock.currentQty==0) ? currentStock.currentQty : '--' }}</strong>;
-        可用库存总成本(¥):<strong>{{ currentStock&&(currentStock.putCost || currentStock.putCost==0) ? currentStock.putCost : '--' }}</strong>。
+        可用库存总数量(个):<strong>{{ currentStock&&(currentStock.currentStockQty || currentStock.currentStockQty==0) ? currentStock.currentStockQty : '--' }}</strong>;
+        可用库存总成本(¥):<strong>{{ currentStock&&(currentStock.currentStockCost || currentStock.currentStockCost==0) ? currentStock.currentStockCost : '--' }}</strong>。
       </div>
       </div>
     </a-alert>
     </a-alert>
     <!-- 库存详情 -->
     <!-- 库存详情 -->
@@ -35,7 +35,7 @@
 
 
 <script>
 <script>
 import { STable } from '@/components'
 import { STable } from '@/components'
-import { stockDetailList, stockDetailCount } from '@/api/stock'
+import { stockDetailList, stockByProductSn } from '@/api/stock'
 export default {
 export default {
   name: 'InventoryQueryDetailModal',
   name: 'InventoryQueryDetailModal',
   components: { STable },
   components: { STable },
@@ -44,9 +44,11 @@ export default {
       type: Boolean,
       type: Boolean,
       default: false
       default: false
     },
     },
-    itemId: {
-      type: [Number, String],
-      default: ''
+    nowData: {
+      type: Object,
+      default: () => {
+        return {}
+      }
     }
     }
   },
   },
   computed: {
   computed: {
@@ -73,7 +75,7 @@ export default {
       // 加载数据方法 必须为 Promise 对象
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
       loadData: parameter => {
         this.disabled = true
         this.disabled = true
-        return stockDetailList(Object.assign(parameter, { stockSn: this.itemId })).then(res => {
+        return stockDetailList(Object.assign(parameter, { stockSn: this.nowData && this.nowData.stockSn || '', isSellOut: '0' })).then(res => {
           const data = res.data
           const data = res.data
           const no = (data.pageNo - 1) * data.pageSize
           const no = (data.pageNo - 1) * data.pageSize
           for (var i = 0; i < data.list.length; i++) {
           for (var i = 0; i < data.list.length; i++) {
@@ -81,7 +83,7 @@ export default {
           }
           }
           this.disabled = false
           this.disabled = false
           // 总计
           // 总计
-          this.getTotal(Object.assign(parameter, { stockSn: this.itemId }))
+          this.getTotal(Object.assign(parameter, { stockSn: this.nowData && this.nowData.stockSn || '', isSellOut: '0' }))
           return data
           return data
         })
         })
       },
       },
@@ -91,7 +93,7 @@ export default {
   methods: {
   methods: {
     // 合计
     // 合计
     getTotal (param) {
     getTotal (param) {
-      stockDetailCount(param).then(res => {
+      stockByProductSn({ productSn: this.nowData && this.nowData.productSn || '' }).then(res => {
         if (res.status == 200 && res.data) {
         if (res.status == 200 && res.data) {
           this.currentStock = res.data
           this.currentStock = res.data
         } else {
         } else {
@@ -109,6 +111,8 @@ export default {
     isShow (newValue, oldValue) {
     isShow (newValue, oldValue) {
       if (!newValue) {
       if (!newValue) {
         this.$emit('close')
         this.$emit('close')
+        this.currentStock = null
+        this.$refs.table.clearTable()
       }
       }
     }
     }
   }
   }

+ 35 - 18
src/views/inventoryManagement/inventoryQuery/list.vue

@@ -89,6 +89,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1340, y: tableHeight }"
         :scroll="{ x: 1340, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 产品分类 -->
         <!-- 产品分类 -->
         <template slot="productTypeName" slot-scope="text, record">
         <template slot="productTypeName" slot-scope="text, record">
@@ -116,7 +117,7 @@
       </s-table>
       </s-table>
     </a-spin>
     </a-spin>
     <!-- 库存详情 -->
     <!-- 库存详情 -->
-    <inventory-query-detail-modal :openModal="openModal" :itemId="itemId" @close="closeModal" />
+    <inventory-query-detail-modal :openModal="openModal" :nowData="nowData" @close="closeModal" />
   </a-card>
   </a-card>
 </template>
 </template>
 
 
@@ -170,7 +171,7 @@ export default {
         this.spinning = true
         this.spinning = true
         // 排序
         // 排序
         if (parameter.sortField == 'currentStockQty') {
         if (parameter.sortField == 'currentStockQty') {
-          parameter.sortField = 'qty'
+          parameter.sortField = 'currentStockQty'
           parameter.sortAlias = ''
           parameter.sortAlias = ''
         }
         }
         if (parameter.sortField == 'currentStockCost') {
         if (parameter.sortField == 'currentStockCost') {
@@ -192,7 +193,7 @@ export default {
           this.disabled = false
           this.disabled = false
           this.spinning = false
           this.spinning = false
           // 总计
           // 总计
-          this.getTotal(Object.assign(parameter, this.queryParam))
+          this.getTotal(params)
           // 产品分类
           // 产品分类
           if (this.typeData.length == 0) {
           if (this.typeData.length == 0) {
             this.getProductType()
             this.getProductType()
@@ -205,7 +206,7 @@ export default {
         })
         })
       },
       },
       openModal: false, //  查看库存详情  弹框
       openModal: false, //  查看库存详情  弹框
-      itemId: '', //  当前库存记录id
+      nowData: null,
       currentStock: null
       currentStock: null
     }
     }
   },
   },
@@ -227,11 +228,6 @@ export default {
     },
     },
     // 合计
     // 合计
     getTotal (param) {
     getTotal (param) {
-      if (param.zeroQtyFlag) {
-        param.zeroQtyFlag = '0'
-      } else {
-        param.zeroQtyFlag = ''
-      }
       stockCount(param).then(res => {
       stockCount(param).then(res => {
         if (res.status == 200 && res.data) {
         if (res.status == 200 && res.data) {
           this.currentStock = res.data
           this.currentStock = res.data
@@ -242,12 +238,12 @@ export default {
     },
     },
     //  库存详情
     //  库存详情
     goDetail (row) {
     goDetail (row) {
-      this.itemId = row.stockSn
+      this.nowData = row
       this.openModal = true
       this.openModal = true
     },
     },
     //  关闭弹框
     //  关闭弹框
     closeModal () {
     closeModal () {
-      this.itemId = ''
+      this.nowData = null
       this.openModal = false
       this.openModal = false
     },
     },
     //  出入库明细
     //  出入库明细
@@ -257,7 +253,12 @@ export default {
     //  导出
     //  导出
     handleExport () {
     handleExport () {
       const _this = this
       const _this = this
-      const params = this.queryParam
+      const params = JSON.parse(JSON.stringify(this.queryParam))
+      if (params.zeroQtyFlag) {
+        params.zeroQtyFlag = '0'
+      } else {
+        params.zeroQtyFlag = ''
+      }
       this.exportLoading = true
       this.exportLoading = true
       _this.spinning = true
       _this.spinning = true
       stockExport(params).then(res => {
       stockExport(params).then(res => {
@@ -334,17 +335,17 @@ export default {
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
       )
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 230
       this.tableHeight = window.innerHeight - tableSearchH - 230
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -352,6 +353,22 @@ export default {
         _this.setTableH()
         _this.setTableH()
       }, 400)
       }, 400)
     }
     }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 21 - 9
src/views/inventoryManagement/inventoryQuery/warehouseDetail.vue

@@ -80,6 +80,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ x: 1760, y: tableHeight }"
         :scroll="{ x: 1760, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 数量 -->
         <!-- 数量 -->
         <template slot="qty" slot-scope="text, record">
         <template slot="qty" slot-scope="text, record">
@@ -196,17 +197,19 @@ export default {
         }
         }
       })
       })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getWarehouseList()
+      this.resetSearchForm()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 285
       this.tableHeight = window.innerHeight - tableSearchH - 285
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -215,10 +218,19 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getWarehouseList()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 26 - 13
src/views/inventoryManagement/inventoryWarning/list.vue

@@ -103,7 +103,8 @@
         :rowKey="(record) => record.id"
         :rowKey="(record) => record.id"
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
-        :scroll="{ x: 1600, y: tableHeight }"
+        :scroll="{ x: 1490, y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 产品分类 -->
         <!-- 产品分类 -->
         <template slot="productType" slot-scope="text, record">
         <template slot="productType" slot-scope="text, record">
@@ -210,9 +211,9 @@ export default {
         { title: '原厂编码', dataIndex: 'productOrigCode', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '原厂编码', dataIndex: 'productOrigCode', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品品牌', dataIndex: 'brandName', width: 150, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品品牌', dataIndex: 'brandName', width: 150, align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 150, align: 'center' },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 150, align: 'center' },
-        { title: '实时库存数(个)', scopedSlots: { customRender: 'stockQty' }, width: 110, align: 'center' },
+        // { title: '实时库存数(个)', scopedSlots: { customRender: 'stockQty' }, width: 110, align: 'center' },
         { title: '在途数(个)', scopedSlots: { customRender: 'inTransit' }, width: 100, align: 'center' },
         { title: '在途数(个)', scopedSlots: { customRender: 'inTransit' }, width: 100, align: 'center' },
-        { title: '总库存数(个)', dataIndex: 'totalStockQty', width: 100, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '总库存数(个)', dataIndex: 'currentStockQty', width: 100, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '最大库存数(个)', scopedSlots: { customRender: 'upperLimit' }, width: 110, align: 'center' },
         { title: '最大库存数(个)', scopedSlots: { customRender: 'upperLimit' }, width: 110, align: 'center' },
         { title: '最小库存数(个)', scopedSlots: { customRender: 'lowerLimit' }, width: 110, align: 'center' },
         { title: '最小库存数(个)', scopedSlots: { customRender: 'lowerLimit' }, width: 110, align: 'center' },
         { title: '差异数量', dataIndex: 'differenceNum', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '差异数量', dataIndex: 'differenceNum', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
@@ -423,17 +424,19 @@ export default {
       document.body.appendChild(link)
       document.body.appendChild(link)
       link.click()
       link.click()
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.getProductType()
+      this.getProductBrand()
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
-  mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
-  },
   watch: {
   watch: {
     advanced (newValue, oldValue) {
     advanced (newValue, oldValue) {
       const _this = this
       const _this = this
@@ -442,11 +445,21 @@ export default {
       }, 400)
       }, 400)
     }
     }
   },
   },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.getProductType()
-      vm.getProductBrand()
-    })
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

+ 17 - 4
src/views/inventoryManagement/satelliteWarehouseInventory/list.vue

@@ -185,16 +185,29 @@ export default {
     closeModal () {
     closeModal () {
       this.openModal = false
       this.openModal = false
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
   },
   },
   beforeRouteEnter (to, from, next) {
   beforeRouteEnter (to, from, next) {
     next(vm => {})
     next(vm => {})

+ 21 - 4
src/views/inventoryManagement/warehouse/list.vue

@@ -31,6 +31,7 @@
         :columns="columns"
         :columns="columns"
         :data="loadData"
         :data="loadData"
         :scroll="{ y: tableHeight }"
         :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
         bordered>
         bordered>
         <!-- 操作 -->
         <!-- 操作 -->
         <template slot="action" slot-scope="text, record">
         <template slot="action" slot-scope="text, record">
@@ -153,16 +154,32 @@ export default {
     goStoringLocation (row) {
     goStoringLocation (row) {
       this.$router.push({ path: `/inventoryManagement/storingLocation/${row.warehouseSn}`, query: { name: row.name } })
       this.$router.push({ path: `/inventoryManagement/storingLocation/${row.warehouseSn}`, query: { name: row.name } })
     },
     },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
     setTableH () {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 235
       this.tableHeight = window.innerHeight - tableSearchH - 235
     }
     }
   },
   },
   mounted () {
   mounted () {
-    const _this = this
-    this.$nextTick(() => { // 页面渲染完成后的回调
-      _this.setTableH()
-    })
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
   }
   }
 }
 }
 </script>
 </script>

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