lilei vor 2 Jahren
Ursprung
Commit
9237c72b3e

+ 146 - 23
package-lock.json

@@ -1267,6 +1267,11 @@
         "@types/node": "*"
       }
     },
+    "@types/json-schema": {
+      "version": "7.0.11",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ=="
+    },
     "@types/loader-utils": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz",
@@ -1984,15 +1989,9 @@
       },
       "dependencies": {
         "@babel/parser": {
-<<<<<<< HEAD
-          "version": "7.21.2",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
-          "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
-=======
           "version": "7.21.3",
           "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz",
           "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ=="
->>>>>>> 1a5cd462e1f0e1c42d45d0ca1136eb824ca51caf
         },
         "postcss": {
           "version": "8.4.21",
@@ -2376,8 +2375,7 @@
     "ajv-keywords": {
       "version": "3.4.1",
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
-      "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
-      "dev": true
+      "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ=="
     },
     "align-text": {
       "version": "0.1.4",
@@ -2966,6 +2964,11 @@
         "resolve": "^1.4.0"
       }
     },
+    "babel-plugin-syntax-dynamic-import": {
+      "version": "6.18.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+      "integrity": "sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA=="
+    },
     "babel-plugin-syntax-object-rest-spread": {
       "version": "6.13.0",
       "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
@@ -5864,21 +5867,12 @@
       }
     },
     "echarts": {
-<<<<<<< HEAD
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.1.tgz",
-      "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==",
-      "requires": {
-        "tslib": "2.3.0",
-        "zrender": "5.4.1"
-=======
       "version": "5.4.2",
       "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.2.tgz",
       "integrity": "sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA==",
       "requires": {
         "tslib": "2.3.0",
         "zrender": "5.4.3"
->>>>>>> 1a5cd462e1f0e1c42d45d0ca1136eb824ca51caf
       },
       "dependencies": {
         "tslib": {
@@ -12187,15 +12181,9 @@
       "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
     },
     "nanoid": {
-<<<<<<< HEAD
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
-=======
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
       "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
->>>>>>> 1a5cd462e1f0e1c42d45d0ca1136eb824ca51caf
     },
     "nanomatch": {
       "version": "1.2.13",
@@ -13199,6 +13187,16 @@
         "sha.js": "^2.4.8"
       }
     },
+    "pdfjs-dist": {
+      "version": "2.5.207",
+      "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.5.207.tgz",
+      "integrity": "sha512-xGDUhnCYPfHy+unMXCLCJtlpZaaZ17Ew3WIL0tnSgKFUZXHAPD49GO9xScyszSsQMoutNDgRb+rfBXIaX/lJbw=="
+    },
+    "pdfjs-dist-sign": {
+      "version": "2.5.208",
+      "resolved": "https://registry.npmjs.org/pdfjs-dist-sign/-/pdfjs-dist-sign-2.5.208.tgz",
+      "integrity": "sha512-/bOZqdVkq1vQzCJY0qH/d6vO739VJ6X9mF7UWEWJ2WoZJij1+NOl+qTQxNgpXACp07/fhxC3GE/1+IgeDq40kQ=="
+    },
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@@ -14388,6 +14386,68 @@
         "unpipe": "1.0.0"
       }
     },
+    "raw-loader": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz",
+      "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==",
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.12.6",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+          "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+          "requires": {
+            "fast-deep-equal": "^3.1.1",
+            "fast-json-stable-stringify": "^2.0.0",
+            "json-schema-traverse": "^0.4.1",
+            "uri-js": "^4.2.2"
+          }
+        },
+        "ajv-keywords": {
+          "version": "3.5.2",
+          "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+          "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
+        },
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+        },
+        "fast-deep-equal": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+          "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+        },
+        "json5": {
+          "version": "2.2.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+          "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
+        "schema-utils": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+          "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+          "requires": {
+            "@types/json-schema": "^7.0.8",
+            "ajv": "^6.12.5",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
     "read-pkg": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -17301,6 +17361,44 @@
       "resolved": "https://registry.npmjs.org/vue-ls/-/vue-ls-3.2.1.tgz",
       "integrity": "sha512-JoZDpSu0qV5AM50vspEzOut2lcm8R0tr5WG99jMHh14qFXkUes3ZdmDMG/p8iSQVQpg0pd/svGwM9Nd7OI2oaw=="
     },
+    "vue-pdf-signature": {
+      "version": "4.2.7",
+      "resolved": "https://registry.npmjs.org/vue-pdf-signature/-/vue-pdf-signature-4.2.7.tgz",
+      "integrity": "sha512-JPyd46wkY3E8OQZ0VklIco4J2Zo2YsEUz1bfyheDtLd9NaJS0+YYRrfxCotQMLvR1QHNJZmcOsPBZ+5mosHiqQ==",
+      "requires": {
+        "babel-plugin-syntax-dynamic-import": "^6.18.0",
+        "loader-utils": "^1.4.0",
+        "pdfjs-dist-sign": "^2.5.208",
+        "raw-loader": "^4.0.1",
+        "vue-resize-sensor": "^2.0.0",
+        "worker-loader": "^2.0.0"
+      },
+      "dependencies": {
+        "emojis-list": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+          "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+        },
+        "json5": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+          "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.2",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+          "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
     "vue-piczoom": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/vue-piczoom/-/vue-piczoom-1.0.6.tgz",
@@ -17325,6 +17423,11 @@
       "resolved": "https://registry.npmjs.org/vue-ref/-/vue-ref-2.0.0.tgz",
       "integrity": "sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ=="
     },
+    "vue-resize-sensor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz",
+      "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ=="
+    },
     "vue-router": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.1.3.tgz",
@@ -17996,6 +18099,26 @@
         "errno": "~0.1.7"
       }
     },
+    "worker-loader": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz",
+      "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==",
+      "requires": {
+        "loader-utils": "^1.0.0",
+        "schema-utils": "^0.4.0"
+      },
+      "dependencies": {
+        "schema-utils": {
+          "version": "0.4.7",
+          "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
+          "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
     "wrap-ansi": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",

+ 8 - 6
package.json

@@ -15,9 +15,11 @@
   },
   "dependencies": {
     "@antv/data-set": "^0.10.2",
+    "@jiaminghi/data-view": "^2.10.0",
     "ant-design-vue": "^1.7.8",
     "axios": "^0.19.0",
     "core-js": "2.6.9",
+    "echarts": "^5.4.0",
     "enquire.js": "^2.1.6",
     "lodash.get": "^4.4.2",
     "lodash.pick": "^4.4.0",
@@ -33,20 +35,20 @@
     "vue-clipboard2": "^0.2.1",
     "vue-cookies": "^1.6.1",
     "vue-cropper": "0.4.9",
+    "vue-easytable": "^2.24.0",
     "vue-ls": "^3.2.1",
+    "pdfjs-dist": "2.5.207",
+    "vue-pdf-signature": "^4.2.6",
     "vue-piczoom": "^1.0.6",
     "vue-quill-editor": "^3.0.6",
     "vue-router": "^3.1.2",
+    "vue-seamless-scroll": "^1.1.23",
     "vue-svg-component-runtime": "^1.0.1",
+    "vue-tv-focusable": "^2.0.1",
     "vue2.0-zoom": "^2.1.1",
     "vuescroll": "^4.17.3",
     "vuex": "^3.1.1",
-    "wangeditor": "^4.7.15",
-    "@jiaminghi/data-view": "^2.10.0",
-    "echarts": "^5.4.0",
-    "vue-seamless-scroll": "^1.1.23",
-    "vue-easytable": "^2.24.0",
-    "vue-tv-focusable": "^2.0.1"
+    "wangeditor": "^4.7.15"
   },
   "devDependencies": {
     "@ant-design/colors": "^3.2.1",

+ 8 - 1
src/api/financeBook.js

@@ -11,7 +11,14 @@ export const financeBookQueryPage = (params) => {
     method: 'post'
   })
 }
-
+// 检查是否已打印
+export const checkPrintStatus = (params) => {
+  return axios({
+    url: `/financeBook/detail/checkPrintStatus `,
+    data: params,
+    method: 'post'
+  })
+}
 // 获取最新一次钉钉审核人员信息
 export const queryLastFinishDingUser = (params) => {
   return axios({

+ 16 - 5
src/layouts/BasicLayout.vue

@@ -45,12 +45,13 @@
           <router-view ></router-view>
         </transition>
       </a-layout-content>
-
+      <!-- pdf 预览 -->
+      <pdfViewModal ref="pdfview" :openModal="showPdfView" @cancel="showPdfView=false"></pdfViewModal>
       <!-- layout footer -->
       <a-layout-footer>
         <!-- <global-footer /> -->
       </a-layout-footer>
-
+      <div id="print"></div>
       <!-- Setting Drawer (show in development mode) -->
       <!-- <setting-drawer v-if="!production"></setting-drawer> -->
     </a-layout>
@@ -68,7 +69,8 @@ import RouteView from './RouteView'
 import SideMenu from '@/components/Menu/SideMenu'
 import GlobalHeader from '@/components/GlobalHeader'
 import GlobalFooter from '@/components/GlobalFooter'
-import SettingDrawer from '@/components/SettingDrawer'
+// import SettingDrawer from '@/components/SettingDrawer'
+import pdfViewModal from '@/views/common/pdfViewModal.vue'
 import { asyncRouterMap } from '@/config/router.config'
 
 export default {
@@ -84,14 +86,16 @@ export default {
     SideMenu,
     GlobalHeader,
     GlobalFooter,
-    SettingDrawer
+    // SettingDrawer,
+    pdfViewModal
   },
   data () {
     return {
       production: config.production,
       collapsed: false,
       menus: [],
-      isRouterAlive: true
+      isRouterAlive: true,
+      showPdfView: false
     }
   },
   computed: {
@@ -114,6 +118,13 @@ export default {
   watch: {
     sidebarOpened (val) {
       this.collapsed = !val
+    },
+    // 打印预览
+    '$store.state.app.showPdfPrintView' (newValue, oldValue) {
+      console.log(newValue)
+      if (newValue) {
+        this.showPdfView = newValue
+      }
     }
   },
   created () {

+ 8 - 0
src/store/modules/app.js

@@ -39,6 +39,8 @@ const app = {
     authMenusList: [], // 权限菜单数据
     priceAuthOptions:[], // 价格权限选项
     curActionPermission: '', // 当前激活状态的权限码
+    showPdfPrintView: false, // pdf 打印预览
+    pdfUrl: ''
   },
   mutations: {
     SET_SIDEBAR_TYPE: (state, type) => {
@@ -101,6 +103,12 @@ const app = {
     SET_returnReason:(state, val) => {
       state.returnReason = val
     },
+    SET_showPdfPrint: (state, val) => {
+      state.showPdfPrintView = val
+    },
+    SET_PdfUrl: (state, val) => {
+      state.pdfUrl = val
+    },
   },
   actions: {
     setSidebar ({ commit }, type) {

+ 11 - 7
src/views/common/chooseProductsModal.vue

@@ -24,19 +24,19 @@
               :wrapper-col="formItemLayout.wrapperCol">
               <a-row :gutter="15">
                 <a-col :md="6" :sm="24">
-                  <a-form-model-item label="产品编码" prop="code">
+                  <a-form-model-item label="产品编码">
                     <a-input id="chooseProducts-code" v-model.trim="queryParam.code" allowClear placeholder="请输入产品编码"/>
                   </a-form-model-item>
                 </a-col>
                 <a-col :md="6" :sm="24">
-                  <a-form-item label="产品品牌" :prop="type=='dealership'?'productBrandSn':''">
+                  <a-form-model-item label="产品品牌">
                     <ProductBrand id="chooseProducts-productBrandSn" v-model="queryParam.productBrandSn"></ProductBrand>
-                  </a-form-item>
+                  </a-form-model-item>
                 </a-col>
                 <a-col :md="6" :sm="24">
-                  <a-form-item label="产品分类" :prop="type=='dealership'?'productType':''">
+                  <a-form-model-item  label="产品分类">
                     <productTypeAll :isAll="type!='default'" placeholder="请选择产品分类" @change="changeProductType" v-model="queryParam.productType" id="chooseProducts-productType"></productTypeAll>
-                  </a-form-item>
+                  </a-form-model-item>
                 </a-col>
                 <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
                   <a-button type="primary" @click="handleSearch" :disabled="disabled" id="chooseProducts-refresh">查询</a-button>
@@ -179,6 +179,11 @@ export default {
       _this.$refs.ruleForm.validate(valid => {
         if (valid) {
           if (_this.type == 'dealership') { //  设置经销权时选择产品
+            if(!_this.queryParam.productBrandSn && !_this.queryParam.productTypeSn1){
+              _this.$message.info("请选择产品品牌或产品分类")
+              return
+            }
+             
             // 校验产品是否被包含在品牌分类中
             const params = []
             if (_this.queryParam.productBrandSn) {
@@ -234,8 +239,7 @@ export default {
     //  重置
     resetSearchForm () {
       this.resetData()
-      // this.$refs.table.clearTable()
-      this.$refs.table.refresh(true)
+      this.$refs.table.clearTable()
     },
     // 保存
     handleSave () {

+ 303 - 0
src/views/common/pdfViewModal.vue

@@ -0,0 +1,303 @@
+<template>
+    <a-modal
+      centered
+      v-drag
+      class="common-pdfView-modal"
+      :footer="null"
+      :maskClosable="false"
+      v-model="isShow"
+      :title="modalTit"
+      :zIndex="1001"
+      :destroyOnClose="true"
+      @cancel="handleCommonCancel"
+      width="1000px">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <div class="common-main">
+          <div id="canvas"></div>
+          <div class="tools">
+            <div>
+              调整比例:{{ Math.round(scalVal*100) }}%
+              <div>
+                <a-button :disabled="scalLoading" style="margin-right: 10px;" size="small" @click="setScalVal(0)"><a-icon type="minus" /> 缩小</a-button>
+                <a-button :disabled="scalLoading" size="small" @click="setScalVal(1)"><a-icon type="plus" /> 放大</a-button>
+              </div>
+            </div>
+            <div>
+              <div v-if="hasClipboard">
+                <a-button :disabled="scalLoading" size="small" @click="handleCapture('export')"><a-icon type="export" /> 导出图片</a-button>
+              </div>
+            </div>
+          </div>
+          <vue-scroll :ops="ops" :style="{width: '100%',height: '70vh',margin:'0 auto',padding: '10px 0'}">
+            <div v-if="loadedRatio > 0 && loadedRatio < 1" style="background-color: green; color: white; text-align: center" :style="{ width: loadedRatio * 100 + '%' }">{{ Math.floor(loadedRatio * 100) }}%</div>
+            <pdf
+                v-for="i in numPages"
+                :key="i"
+                :src="src"
+                :page="i"
+                style="display: inline-block; width: 25%"
+            ></pdf>
+          </vue-scroll>
+        </div>
+        <div class="btn-box">
+          <a-button size="large" style="margin-right: 25px;" @click="handleCommonCancel" v-if="isCancel">{{ cancelText }}</a-button>
+          <a-button size="large" style="margin-right: 25px;" type="default" @click="handleCapture(hasClipboard?'copy':'export')">
+            {{ hasClipboard?'复制截图':'导出图片' }}
+          </a-button>
+          <a-button size="large" type="primary" :loading="$store.state.app.printLoading" @click="handleCommonOk">
+            {{ $store.state.app.printLoading?'打印中...':okText }}
+          </a-button>
+        </div>
+      </a-spin>
+    </a-modal>
+  </template>
+  
+  <script>
+  import moment from 'moment'
+  import pdf from 'vue-pdf-signature'
+  import CMapReaderFactory from 'vue-pdf-signature/src/CMapReaderFactory.js'
+  import { pdfPrint } from '@/libs/JGPrint'
+  export default {
+    components: {
+      pdf
+    },
+    name: 'PdfViewModal',
+    props: {
+      openModal: { //  弹框显示状态
+        type: Boolean,
+        default: false
+      },
+      modalTit: { // 弹框标题
+        type: String,
+        default: '打印预览'
+      },
+      okText: { // 确定 按钮文字
+        type: String,
+        default: '打印'
+      },
+      cancelText: { // 取消 按钮文字
+        type: String,
+        default: '取消'
+      },
+      isCancel: { // 是否显示  取消 按钮
+        type: Boolean,
+        default: true
+      },
+      spinning: { // 加载中
+        type: Boolean,
+        default: false
+      }
+    },
+    data () {
+      return {
+        scalLoading: false,
+        pdfAllLoad: 0,
+        scalVal: 0.75,
+        isShow: this.openModal, //  是否打开弹框
+        show: true,
+        src: '',
+        loadedRatio: 0,
+        page: 1,
+        numPages: undefined,
+        rotate: 0,
+        curpage: 1,
+        total: 3,
+        ops: {
+          vuescroll: {},
+          scrollPanel: {},
+          rail: {
+            keepShow: true
+          },
+          bar: {
+            hoverStyle: true,
+            onlyShowBarOnScroll: false, // 是否只有滚动的时候才显示滚动条
+            background: '#9d9d9d', // 滚动条颜色
+            opacity: 0.5, // 滚动条透明度
+            size: '10px',
+            'overflow-x': 'hidden'
+          }
+        },
+        printIndex: undefined,
+        printList: []
+      }
+    },
+    computed: {
+      hasClipboard () {
+        return typeof ClipboardItem !== 'undefined'
+      }
+    },
+    methods: {
+      // 选择打印机
+      changePrint (v) {
+        this.printIndex = v
+        this.$store.commit('SET_printDefNeedle', this.printIndex)
+        this.$store.state.app.printTaskID = undefined
+      },
+      // 缩放
+      setScalVal (t) {
+        if (!this.scalLoading) {
+          this.scalLoading = true
+          this.scalVal = this.scalVal + (t ? 0.05 : -0.05)
+          if (this.scalVal > 1) {
+            this.scalVal = 1
+          }
+          if (this.scalVal < 0.5) {
+            this.scalVal = 0.5
+          }
+          setTimeout(() => {
+            this.scalLoading = false
+          }, 1000)
+        }
+      },
+      getUrl (item) {
+        const src = pdf.createLoadingTask({ url: item, CMapReaderFactory })
+        return src
+      },
+      setData (data) {
+        // console.log(data)
+        this.curpage = 1
+        this.total = data.length
+ 
+        const defPrint = this.$store.state.app.printDefNeedle
+        this.printIndex = defPrint ? (defPrint == 'undefined' ? undefined : defPrint) : undefined
+      },
+      error: function (err) {
+        console.log(err)
+      },
+      // 确定
+      handleCommonOk () {
+        const _this = this
+        const hasPrint = this.printList.find(item => item.name == this.printIndex)
+        // 已选择打印机
+        if (hasPrint) {
+           pdfPrint(_this.$store.state.app.pdfPrintList, 0)
+        } else {
+          this.$message.info('请选择打印机')
+        }
+        _this.$emit('ok')
+      },
+      // 取消
+      handleCommonCancel () {
+        this.isShow = false
+        this.$store.commit('SET_pdfPrintList', [])
+        this.$store.commit('SET_showPdfPrint', false)
+        this.$emit('cancel')
+        this.scalVal = 0.75
+      },
+      // 截图
+      handleCapture (type) {
+        if (this.scalLoading) { return }
+        const pdf = this.$refs.pdf
+        const len = pdf.length
+        const imgsList = []
+        const canvas = document.createElement('canvas')
+        let maxHeight = 0
+        const maxWidth = pdf[0].$refs.canvas.width
+        for (let i = 0; i < len; i++) {
+          const imgs = pdf[i].$refs.canvas
+          maxHeight = maxHeight + imgs.height
+          imgsList.push(imgs)
+        }
+        // 设置画布宽度和高度
+        canvas.width = maxWidth
+        canvas.height = maxHeight
+        const ctx = canvas.getContext('2d')
+        // 开始合并
+        let y = 0
+        imgsList.map(item => {
+          ctx.drawImage(item, 0, y, item.width, item.height)
+          y = y + item.height
+        })
+        const base64Str = canvas.toDataURL('image/png')
+        // 复制图片
+        if (type == 'copy') {
+          this.copyImgBtn(base64Str)
+        }
+        // 下载图片
+        if (type == 'export') {
+          const fileName = moment().format('YYYYMMDDHHmmss')
+          this.downloadFile(fileName, base64Str)
+        }
+        // 清除画布
+        ctx.clearRect(0, 0, maxWidth, maxHeight)
+      },
+      downloadFile (fileName, base64Data) {
+        const aLink = document.createElement('a')
+        const blob = this.convertBase64ToBlob(base64Data.split(',')[1], 'image/png')
+        const evt = document.createEvent('HTMLEvents')
+        // initEvent 不加后两个参数在FF下会报错  事件类型,是否冒泡,是否阻止浏览器的默认行为
+        evt.initEvent('click', true, true)
+        aLink.download = fileName
+        aLink.href = URL.createObjectURL(blob)
+        aLink.click()
+      },
+      // 将照片复制到剪贴版
+      copyImgBtn (base64Data) {
+        const blobInput = this.convertBase64ToBlob(base64Data.split(',')[1], 'image/png')
+        if (navigator.clipboard) {
+          const clipboardItemInput = new ClipboardItem({ 'image/png': blobInput })
+          navigator.clipboard.write([clipboardItemInput])
+          this.$message.success('截图成功,可以右键去粘贴图片!')
+        } else {
+          const image = nativeImageElectron.createFromDataURL(base64Data)
+          clipboardElectron.writeImage(image)
+          this.$message.success('截图成功,可以右键去粘贴图片!')
+        }
+      },
+      convertBase64ToBlob (base64, type) {
+        var bytes = window.atob(base64)
+        var ab = new ArrayBuffer(bytes.length)
+        var ua = new Uint8Array(ab)
+        for (var i = 0; i < bytes.length; i++) {
+          ua[i] = bytes.charCodeAt(i)
+        }
+        return new Blob([ab], { type: type })
+      }
+    },
+    watch: {
+      //  父页面传过来的弹框状态
+      openModal (newValue, oldValue) {
+        this.isShow = newValue
+      },
+      //  重定义的弹框状态
+      isShow (newValue, oldValue) {
+        if (!newValue) {
+          this.$emit('cancel')
+        }else{
+            this.setData()
+        }
+      }
+    }
+  }
+  </script>
+  
+  <style lang="less">
+    .common-pdfView-modal{
+      .ant-modal-body{
+        padding: 0 0 20px 0;
+      }
+      .common-main{
+        background-color: #666;
+        .tools{
+          padding: 10px;
+          display: flex;
+          align-items: center;
+          border-bottom: 1px solid #eee;
+          background-color: #f8f8f8;
+          justify-content: space-between;
+          > div{
+            display: flex;
+            align-items: center;
+            >div{
+              padding: 0 10px;
+            }
+          }
+        }
+      }
+      .btn-box{
+        text-align: center;
+        margin-top: 20px;
+      }
+    }
+  </style>
+  

+ 1 - 1
src/views/dealerManagement/merchantInfoManagement/permissionSetting.vue

@@ -102,7 +102,7 @@ export default {
         goodsCode: ''
       },
       rules: {
-        goodsType: [ { required: true, message: '请选择类型', trigger: 'change' } ]
+        // goodsType: [ { required: true, message: '请选择类型', trigger: 'change' } ]
       },
       disabled: false, //  查询、重置按钮是否可操作
       loading: false, //  表格加载中

+ 42 - 5
src/views/salesManagement/receiptPrint/list.vue

@@ -137,7 +137,7 @@ import dealerSearchList from '@/views/common/dealerSearchList.vue'
 import commonModal from '@/views/common/commonModal.vue'
 import recordModal from './recordModal.vue'
 import printModel from './printModel.vue'
-import { financeBookDetailList, updateFinanceBookDetail, getBatchLastProcessInstance } from '@/api/financeBook'
+import { financeBookDetailList, updateFinanceBookDetail, getBatchLastProcessInstance, checkPrintStatus } from '@/api/financeBook'
 export default {
   name: 'ReceiptPrintList',
   mixins: [commonMixin],
@@ -243,11 +243,30 @@ export default {
       }
       this.spinning = true
       const bookSns = []
+      const bookDetailSn = []
       rows.map(item => {
         if (bookSns.indexOf(item.bookSn) < 0) {
           bookSns.push(item.bookSn)
         }
+        bookDetailSn.push(item.bookDetailSn)
       })
+
+      // 检查是否有已打印数据
+      if(this.currentTab == 2){
+        const hasPrintData = await checkPrintStatus(bookDetailSn).then(res => res.data)
+        if(!hasPrintData){
+          _this.$info({
+            title: '操作提示',
+            centered: true,
+            content: '您所选择的收款单,存在已打印的单子,请重新选择。',
+            onOk () {
+              _this.resetSearchForm()
+            }
+          })
+          return 
+        }
+      }
+      
       const retArr = []
       const auditInfo = await getBatchLastProcessInstance({ 'businessType': 'FINANCE_BOOK', 'businessSnList': bookSns }).then(res => res.data)
       console.log(auditInfo)
@@ -263,7 +282,7 @@ export default {
           }
         })
         // 审核信息
-        const auditStr = this.getAuditInfo(auditInfo[item])
+        const auditStr = auditInfo ? this.getAuditInfo(auditInfo[item]) : ''
         retArr.push({ audit: auditStr, detail: detailItemUseStr, subList: rs })
       })
       console.log(retArr, '------------')
@@ -282,14 +301,32 @@ export default {
     },
     // 收款打印
     async handlePrint (row, type, list, bookSns) {
-      this.spinning = true
-      this.showTipModal = true
-      let detailItemUseStr = ''
+      const _this = this
       let auditInfo = null
       if (type == 0) {
+        // 是否已打印
+        if(this.currentTab == 2){
+          let hasPrintData = await checkPrintStatus([list.bookDetailSn]).then(res => res.data)
+          if(!hasPrintData){
+            _this.$info({
+              title: '操作提示',
+              centered: true,
+              content: '您所选择的收款单已打印,请重新选择。',
+              onOk () {
+                _this.resetSearchForm()
+              }
+            })
+            return 
+          }
+        }
+        
         auditInfo = await getBatchLastProcessInstance({ 'businessType': 'FINANCE_BOOK', 'businessSnList': [list.bookSn] }).then(res => res.data)
       }
       console.log(auditInfo)
+      this.spinning = true
+      this.showTipModal = true
+      let detailItemUseStr = ''
+      
       this.$nextTick(() => {
         if (type == 0 && row.detailItemUseList) {
           row.detailItemUseList.map(k => {

+ 2 - 2
vue.config.js

@@ -107,9 +107,9 @@ const vueConfig = {
     // If you want to turn on the proxy, please remosve the mockjs /src/main.jsL11
     proxy: {
       '/api': {
-        // target: 'http://192.168.2.113:8660/ocs-admin',
+        target: 'http://192.168.2.111:8602/ocs-admin',
         // target: 'https://t.ocs.360arrow.com/ocs-admin', //  练习
-        target: 'http://p.ocs.360arrow.com/ocs-admin', //  预发布
+        // target: 'http://p.ocs.360arrow.com/ocs-admin', //  预发布
         ws: false,
         changeOrigin: true,
         pathRewrite: {