coys %!s(int64=2) %!d(string=hai) anos
pai
achega
40962a85d1

+ 24 - 175
package-lock.json

@@ -2591,7 +2591,8 @@
     "big.js": {
       "version": "5.2.2",
       "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "dev": true
     },
     "binary-extensions": {
       "version": "2.2.0",
@@ -3095,14 +3096,6 @@
       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
       "dev": true
     },
-    "copy-anything": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
-      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
-      "requires": {
-        "is-what": "^3.14.1"
-      }
-    },
     "copy-webpack-plugin": {
       "version": "9.1.0",
       "resolved": "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz",
@@ -3695,7 +3688,8 @@
     "emojis-list": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "dev": true
     },
     "encodeurl": {
       "version": "1.0.2",
@@ -3728,15 +3722,6 @@
       "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
       "dev": true
     },
-    "errno": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
-      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
-      "optional": true,
-      "requires": {
-        "prr": "~1.0.1"
-      }
-    },
     "error-ex": {
       "version": "1.3.2",
       "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz",
@@ -4188,7 +4173,8 @@
     "graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "dev": true
     },
     "gzip-size": {
       "version": "6.0.0",
@@ -4451,12 +4437,6 @@
       "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
       "dev": true
     },
-    "image-size": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
-      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
-      "optional": true
-    },
     "immutable": {
       "version": "4.3.1",
       "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.1.tgz",
@@ -4594,11 +4574,6 @@
       "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
       "dev": true
     },
-    "is-what": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
-      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA=="
-    },
     "is-wsl": {
       "version": "2.2.0",
       "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -4756,81 +4731,6 @@
         "launch-editor": "^2.6.0"
       }
     },
-    "less": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
-      "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
-      "requires": {
-        "copy-anything": "^2.0.1",
-        "errno": "^0.1.1",
-        "graceful-fs": "^4.1.2",
-        "image-size": "~0.5.0",
-        "make-dir": "^2.1.0",
-        "mime": "^1.4.1",
-        "needle": "^3.1.0",
-        "parse-node-version": "^1.0.1",
-        "source-map": "~0.6.0",
-        "tslib": "^2.3.0"
-      },
-      "dependencies": {
-        "make-dir": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-          "optional": true,
-          "requires": {
-            "pify": "^4.0.1",
-            "semver": "^5.6.0"
-          }
-        },
-        "semver": {
-          "version": "5.7.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-          "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
-          "optional": true
-        }
-      }
-    },
-    "less-loader": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz",
-      "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==",
-      "requires": {
-        "clone": "^2.1.1",
-        "loader-utils": "^1.1.0",
-        "pify": "^3.0.0"
-      },
-      "dependencies": {
-        "clone": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-          "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="
-        },
-        "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"
-          }
-        },
-        "pify": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-          "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="
-        }
-      }
-    },
     "lilconfig": {
       "version": "2.1.0",
       "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz",
@@ -5153,7 +5053,8 @@
     "mime": {
       "version": "1.6.0",
       "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "dev": true
     },
     "mime-db": {
       "version": "1.52.0",
@@ -5242,7 +5143,8 @@
     "minimist": {
       "version": "1.2.8",
       "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
-      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true
     },
     "minipass": {
       "version": "3.3.6",
@@ -5285,7 +5187,8 @@
     "ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
     },
     "multicast-dns": {
       "version": "7.2.5",
@@ -5313,37 +5216,6 @@
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz",
       "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
     },
-    "needle": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
-      "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
-      "optional": true,
-      "requires": {
-        "debug": "^3.2.6",
-        "iconv-lite": "^0.6.3",
-        "sax": "^1.2.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "3.2.7",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
-          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
-          "optional": true,
-          "requires": {
-            "ms": "^2.1.1"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "optional": true,
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        }
-      }
-    },
     "negotiator": {
       "version": "0.6.3",
       "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
@@ -5674,11 +5546,6 @@
         "lines-and-columns": "^1.1.6"
       }
     },
-    "parse-node-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
-      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA=="
-    },
     "parse5": {
       "version": "5.1.1",
       "resolved": "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz",
@@ -5765,12 +5632,6 @@
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true
     },
-    "pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "optional": true
-    },
     "pkg-dir": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -6212,12 +6073,6 @@
       "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
       "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
     },
-    "prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
-      "optional": true
-    },
     "pseudomap": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz",
@@ -6504,7 +6359,8 @@
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
     },
     "sass": {
       "version": "1.64.2",
@@ -6526,12 +6382,6 @@
         "neo-async": "^2.6.2"
       }
     },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
-      "optional": true
-    },
     "schema-utils": {
       "version": "2.7.1",
       "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz",
@@ -7120,7 +6970,8 @@
     "tslib": {
       "version": "2.6.1",
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz",
-      "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig=="
+      "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==",
+      "dev": true
     },
     "type-fest": {
       "version": "0.6.0",
@@ -7269,6 +7120,14 @@
         "csstype": "^3.1.0"
       }
     },
+    "vue-esign": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/vue-esign/-/vue-esign-1.1.4.tgz",
+      "integrity": "sha512-7Ix5PdcyyhVfsvrT9a+yp5+36gbQ0/bpDO+QSLT58IgJ5t164PEptOy5Nslw8bZbk3n3Hc7SP5B8eXQ8X8W+OA==",
+      "requires": {
+        "vue": "^2.5.11"
+      }
+    },
     "vue-hot-reload-api": {
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
@@ -7342,16 +7201,6 @@
         }
       }
     },
-    "vue-quick-calendar": {
-      "version": "1.0.92",
-      "resolved": "https://registry.npmjs.org/vue-quick-calendar/-/vue-quick-calendar-1.0.92.tgz",
-      "integrity": "sha512-VyqAXSo7aidOjwSTnC6vkfAnRzGHTXzDdfuP1pnZvuF3g47P/UDLX4nVkWzzRQibLsLl5kOXq3E+EhvAsbNsrg==",
-      "requires": {
-        "less": "^4.1.1",
-        "less-loader": "^4.1.0",
-        "vue": "^2.5.11"
-      }
-    },
     "vue-router": {
       "version": "3.6.5",
       "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz",

+ 1 - 0
package.json

@@ -18,6 +18,7 @@
     "v-calendar": "^2.4.1",
     "vant": "^2.12.54",
     "vue": "^2.7.14",
+    "vue-esign": "^1.1.4",
     "vue-router": "^3.6.5",
     "vuex": "^3.6.2"
   },

+ 25 - 0
src/api/training.js

@@ -0,0 +1,25 @@
+// 调阅相关接口
+import request from '@/utils/request'
+
+
+// 获取任务列表
+export function gettrainingList(data) {
+  return request({
+    url: '/core/eduTask/list',
+    
+    method: 'post',
+    data
+  })
+}
+
+//新增调阅接口NFC||图片接口
+export function registration(data) {
+  return request({
+    url: '/core/registration',
+    headers: {
+      isToken: false
+    },
+    method: 'post',
+    data
+  })
+}

+ 163 - 0
src/components/checkPeople/index.vue

@@ -0,0 +1,163 @@
+<template>
+  <div>
+    <van-field
+      readonly
+      clickable
+      name="datetimePicker"
+      :value="peoples"
+      required
+      :label="inpitLabel"
+      placeholder="请选择人员"
+      @click="show = true"
+    />
+    <van-action-sheet v-model="show" position="bottom" title="选择人员">
+      <van-row>
+        <van-col span="24"
+          ><van-field
+            v-model="orgName"
+            is-link
+            label-width="4em"
+            clearable
+            label="组织机构"
+            placeholder=""
+            @click="showcascader = true"
+          />
+          <van-popup v-model="showcascader" round position="bottom" :close-on-click-overlay="false">
+            <van-cascader
+              v-model="cascaderValue"
+              title="组织机构"
+              :options="options"
+              @close="closeDialog"
+              @change="changeCascader"
+              :field-names="fieldNames"
+            />
+          </van-popup>
+        </van-col>
+      </van-row>
+      <van-row>
+        <van-col span="24">
+          <div class="line"></div>
+        </van-col>
+      </van-row>
+
+      <van-row>
+        <van-col span="24">
+          <van-search
+            v-model="searchVal"
+            show-action
+            placeholder="请输入搜索关键词"
+            @search="onSearch"
+            @cancel="onCancel"
+          />
+        </van-col>
+      </van-row>
+
+      
+
+      <van-row>
+        <van-col span="24">
+          <van-checkbox-group v-model="result">
+            <van-cell-group>
+              <van-cell
+                v-for="(item, index) in peopleList"
+                clickable
+                :key="item"
+                :title="`复选框 ${item}`"
+                @click="toggle(index)"
+              >
+                <template #right-icon>
+                  <van-checkbox :name="item" ref="checkboxes" />
+                </template>
+              </van-cell>
+            </van-cell-group>
+          </van-checkbox-group>
+        </van-col>
+      </van-row>
+    </van-action-sheet>
+  </div>
+</template>
+<script>
+import { deptTreeList } from '@/api/toConsult.js'
+
+export default {
+  name: 'SocAppIndex',
+  props: {
+    inpitLabel: {
+      type: String,
+      default: '参与人员'
+    },
+    fieldNames: {
+      //树行配置映射项
+      type: Object,
+      default: () => {
+        return {
+          text: 'name',
+          value: 'id',
+          children: 'children'
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      show: false,
+      value1: '',
+      showcascader: false,
+      cascaderValue: '',
+      loading: false,
+      options: [], //机构列表
+      result: [], //人员ID集合
+      searchVal:'',//搜索值
+      peopleList: ['a', 'b'], //人员列表
+      orgName: '', //机构名称
+      peoples: '' //人员列表
+    }
+  },
+  created() {
+    this.getOrgList()
+  },
+  mounted() {},
+
+  methods: {
+    onLoad() {},
+    closeDialog() {
+      this.showcascader = false
+      this.orgName = this.value1
+    },
+    //级联选择当前任意层级触发
+    changeCascader(val) {
+      console.log(val)
+      let { selectedOptions } = val
+      //级联值
+      this.cascaderValue = selectedOptions[selectedOptions.length - 1].id
+      //输入框值
+      this.value1 = selectedOptions[selectedOptions.length - 1].name
+    },
+    getOrgList() {
+      //获取组织机构数据
+      deptTreeList().then(res => {
+        let { code, data, msg } = res
+        if (code == 200) {
+          this.options = data
+        }
+      })
+    },
+    onSearch(val){
+        console.log(val);
+    },
+    onCancel(){
+
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.van-action-sheet {
+  min-height: 90%;
+}
+.line {
+  width: 100%;
+  height: 3px;
+  background-color: #1989fa;
+}
+</style>

+ 30 - 0
src/components/upload/index.vue

@@ -0,0 +1,30 @@
+<template>
+    <div>
+        <van-uploader v-model="fileList" :after-read="afterRead" multiple :max-count="5" />
+    </div>
+</template>
+<script>
+export default {
+    name: 'SocAppIndex',
+
+    data() {
+        return {
+            fileList:[]
+        };
+    },
+
+    mounted() {
+        
+    },
+
+    methods: {
+        //上传到服务器
+        afterRead(file){
+
+        }
+    },
+};
+</script>
+<style lang="scss" scoped>
+    
+</style>

+ 53 - 0
src/components/writingPad/index.vue

@@ -0,0 +1,53 @@
+<template>
+  <div>
+    <vue-esign
+      ref="esign"
+      :width="800"
+      :height="400"
+      :isCrop="isCrop"
+      :isClearBgColor="false"
+      :lineWidth="lineWidth"
+      :lineColor="lineColor"
+      :bgColor.sync="bgColor"
+    />
+  </div>
+</template>
+<script>
+import vueEsign from 'vue-esign'
+import { Dialog } from 'vant'
+
+export default {
+  name: 'SocAppIndex',
+  components: {
+    vueEsign,
+    Dialog
+  },
+  data() {
+    return {
+      lineWidth: 6,
+      lineColor: '#000000',
+      bgColor: '#ccc',
+      resultImg: '',
+      isCrop: false
+    }
+  },
+  methods: {
+    handleReset() {
+      this.$refs.esign.reset()
+    },
+    handleGenerate() {
+      this.$refs.esign
+        .generate()
+        .then(res => {
+          this.resultImg = res
+          this.$emit('resultImg',res)
+        })
+        .catch(err => {
+            Dialog({message:'不能签名为空白'}) // 画布没有签字时会执行这里 'Not Signned'
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped></style>

+ 1 - 1
src/config/env.development.js

@@ -2,7 +2,7 @@
 module.exports = {
   title: 'soc-app-dev',
   baseUrl: 'http://localhost:9018', // 项目地址
-  baseApi: '/luojun', // 本地api请求地址,注意:如果你使用了代理,请设置成'/'
+  baseApi: '/yuanjingchao', // 本地api请求地址,注意:如果你使用了代理,请设置成'/'
   APPID: 'xxx',
   APPSECRET: 'xxx',
   $cdn: 'https://www.sunniejs.cn/static'  //静态资源

+ 2 - 2
src/main.js

@@ -9,7 +9,7 @@ import Vant from 'vant';
 import 'vant/lib/index.css';
 import router from './router'
 import store from './store'
-import VueQuickCalendar from 'vue-quick-calendar'
+
 import dayjs from "dayjs";
 // 设置 js中可以访问 $cdn
 import { $cdn } from '@/config'
@@ -24,7 +24,7 @@ import VCalendar from 'v-calendar';
 import globals from "@/utils/global.js"//全局混入
 Vue.use(Vant);
 Vue.use(globals);
-Vue.use(VueQuickCalendar);
+
 Vue.use(VCalendar,{
   componentPrefix: 'vc',  // Use <vc-calendar /> instead of <v-calendar />
 });

+ 6 - 6
src/router/router.config.js

@@ -39,12 +39,12 @@ export let routers = [
     component: () => import('@/views/menu/training/components/addTraining.vue'),
     meta: { title: '培训登记', keepAlive: false }
   },
-  // {
-  //   path: '/Addtraining',
-  //   name: 'Addtraining',
-  //   component: () => import('@/views/menu/training/index'),
-  //   meta: { title: '培训参与人员签名', keepAlive: false }
-  // },
+  {
+    path: '/personnelSignature/:id',
+    name: 'personnelSignature',
+    component: () => import('@/views/menu/training/components/personnelSignature.vue'),
+    meta: { title: '培训参与人员签名', keepAlive: false }
+  },
   {
     path: '/home',
     component: () => import('@/components/layouts/index'),

+ 6 - 3
src/views/menu/monitoringCall/components/addInfo.vue

@@ -23,6 +23,7 @@
             readonly
             label="监控主机"
             placeholder=""
+            :disabled="disabled"
             @click="showHost = true"
           />
           <van-popup v-model="showHost" round position="bottom">
@@ -49,7 +50,7 @@
           <van-field
             required
             v-model="fieldValue"
-            :disabled="ishost"
+            :disabled="disabled||ishost"
             is-link
             readonly
             label="视频通道"
@@ -89,7 +90,7 @@
             <van-collapse-item :name="item.dictValue" v-for="item in dataList" :key="item.dictValue">
               <template #title>
                 <div>
-                  <van-checkbox v-model="item.isChecked" shape="square">{{ item.dictLabel }}</van-checkbox>
+                  <van-checkbox :disabled="disabled" v-model="item.isChecked" shape="square">{{ item.dictLabel }}</van-checkbox>
                 </div>
               </template>
 
@@ -130,7 +131,7 @@
       <div class="bottomClass">
         <van-row>
           <van-col span="24">
-            <van-button type="info" @click="addForm">{{
+            <van-button type="info" :disabled="disabled" @click="addForm">{{
               $route.params.id.split('_')[2] == 'edit' ? '修改' : '添加'
             }}</van-button>
           </van-col>
@@ -157,6 +158,7 @@ import { mapGetters } from 'vuex'
 export default {
   data() {
     return {
+      disabled:'',//是否禁用
       taskId: '', //任务ID
       falg: false, //校验是否通过
       dictList: [], //异常正常字典
@@ -200,6 +202,7 @@ export default {
   },
   created() {
     this.init()
+    this.disabled=this.$route.params.id.split('_')[3]
   },
 
   mounted() {},

+ 18 - 21
src/views/menu/monitoringCall/components/consultInfo.vue

@@ -14,8 +14,8 @@
         <!-- 调阅列表 -->
         <div class="topBox" v-for="item in taskData.coreMonitoringTaskRegistrationMonitorVOList" :key="item.id">
           <!-- //主机列表组件 -->
-          
-          <MonitoingList :list="item"></MonitoingList>
+
+          <MonitoingList :list="item" :taskStatus="taskData.taskStatus"></MonitoingList>
         </div>
       </div>
 
@@ -40,7 +40,7 @@ import NavBar from '@/components/NavBar'
 // 主机列表组件
 import MonitoingList from './monitoringList.vue'
 import { Col, Row, Dialog, Icon, Picker } from 'vant'
-import { registrationList,getEndInfo, login } from '@/api/toConsult.js'
+import { registrationList, getEndInfo, login } from '@/api/toConsult.js'
 
 export default {
   data() {
@@ -60,14 +60,11 @@ export default {
 
   created() {
     this.init()
-    console.log(this);
-    
-   
+    console.log(this)
   },
   methods: {
     //项目初始化获取数据
     init() {
-      
       registrationList({ taskId: this.$route.params.id }).then(res => {
         let { code, data, msg } = res
         if (code == 200) {
@@ -76,24 +73,24 @@ export default {
       })
     },
     addInfoHandler() {
-      console.log(this.taskData);
-      this.$router.push('/addInfo/'+this.$route.params.id+'_'+this.taskData.id+'_add')
+      console.log(this.taskData)
+      this.$router.push('/addInfo/' + this.$route.params.id + '_' + this.taskData.id + '_add')
     },
     //结束调阅
-    endMontor(){
-     let startDate=JSON.parse(JSON.stringify(this.taskData.taskStartTime)) 
-      console.log(startDate);
-      startDate=Date.parse(new Date(startDate))
-     let endDate=Date.parse(new Date())
-      if((endDate-startDate)<=3600000){
-        Dialog({message:'该调阅未满一个小时请确认'})
+    endMontor() {
+      let startDate = JSON.parse(JSON.stringify(this.taskData.taskStartTime))
+      console.log(startDate)
+      startDate = Date.parse(new Date(startDate))
+      let endDate = Date.parse(new Date())
+      if (endDate - startDate <= 3600000) {
+        Dialog({ message: '该调阅未满一个小时请确认' })
       }
-      startDate=new Date(startDate)
+      startDate = new Date(startDate)
       getEndInfo({
-        id:this.taskData.id,
-        taskId:this.$route.params.id
-      }).then(res=>{
-this.$router.push('/monitoringCall')
+        id: this.taskData.id,
+        taskId: this.$route.params.id
+      }).then(res => {
+        this.$router.push('/monitoringCall')
       })
     }
   }

+ 28 - 20
src/views/menu/monitoringCall/components/monitoringList.vue

@@ -1,9 +1,9 @@
 <template>
   <div>
-    
     <div class="topBox">
       <div>
-        <img class="img" @click="editHandler" src="../../../../assets/img/icon/edit-square.png" alt="" />
+        <van-button class="buttoncls" size="mini" type="info" v-if="taskStatus == '2'" @click="editHandler(1)">详情</van-button>
+        <img class="img" v-else @click="editHandler(0)" src="../../../../assets/img/icon/edit-square.png" alt="" />
       </div>
       <div class="title">监控主机:{{ list?.hostName }}</div>
       <div class="title">视频通道:{{ list?.videoChannelName }}</div>
@@ -13,7 +13,7 @@
         <van-col class="vancol" span="12">异常说明</van-col>
       </van-row>
       <van-row class="List" v-for="item in list.coreMonitoringTaskMonitorInfoList" :key="item.id">
-        <van-col class="vancol" span="6">{{ item.project|proJectListFilter(this_) }}</van-col>
+        <van-col class="vancol" span="6">{{ item.project | proJectListFilter(this_) }}</van-col>
 
         <van-col class="vancol" span="6"
           ><span :style="{ color: item.situation == 1 ? '#d97b7e' : '#12b533' }">{{
@@ -32,33 +32,37 @@ export default {
     list: {
       type: Object,
       default: {}
+    },
+    //调阅状态
+    taskStatus: {
+      type: String
     }
   },
   data() {
     return {
-      this_:this,
-      proJectList:[],
+      this_: this,
+      proJectList: [],
       dictList: [] //字典情况数组
     }
   },
   filters: {
-    dictFilter: function (value,that) {
-      let label=''
+    dictFilter: function (value, that) {
+      let label = ''
       if (that.dictList && that.dictList.length > 0) {
         that.dictList.filter(item => {
           if (value == item.dictValue) {
-            label= item.dictLabel
+            label = item.dictLabel
           }
         })
       }
       return label
     },
-    proJectListFilter: function (value,that) {
-      let label=''
+    proJectListFilter: function (value, that) {
+      let label = ''
       if (that.proJectList && that.proJectList.length > 0) {
         that.proJectList.filter(item => {
           if (value == item.dictValue) {
-            label= item.dictLabel
+            label = item.dictLabel
           }
         })
       }
@@ -72,20 +76,18 @@ export default {
     })
     //获取项目字典
     this.getDictHandler('core_registration_project', res => {
-        this.proJectList = JSON.parse(JSON.stringify(res))
-        this.proJectList.forEach(item => {
-          
-        })
-      })
+      this.proJectList = JSON.parse(JSON.stringify(res))
+      this.proJectList.forEach(item => {})
+    })
   },
   mounted() {},
 
   methods: {
     //编辑项目
-    editHandler() {
-      this.$router.push('/addInfo/'+this.$route.params.id+'_'+this.list.id+'_edit')
-    },
-    
+    editHandler(isEdit) {
+      // isEdit 1查看 0编辑
+      this.$router.push('/addInfo/' + this.$route.params.id + '_' + this.list.id + '_edit'+'_'+isEdit)
+    }
   }
 }
 </script>
@@ -131,4 +133,10 @@ export default {
   position: absolute;
   right: 20px;
 }
+.buttoncls{
+  width: 100px;
+  height: 50px;
+  position: absolute;
+  right: 20px;
+}
 </style>

+ 45 - 8
src/views/menu/training/components/addTraining.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <NavBar />
-    <van-form @submit="onSubmit">
+    <van-form @submit="onSubmit" class="bigbox">
       <div class="mainItem">
         <div>标题</div>
         <div>抚琴路支行</div>
@@ -17,6 +17,7 @@
         name="picker"
         :value="form.value"
         label="培训类型"
+        :rules="[{ required: true, message: '培训类型不能为空' }]"
         placeholder="请选择培训类型"
         @click="showPicker = true"
       />
@@ -30,6 +31,7 @@
         name="datetimePicker"
         :value="form.startDate"
         required
+        :rules="[{ required: true, message: '培训开始时间不能为空' }]"
         label="培训开始时间"
         placeholder="请选择培训开始时间"
         @click="showStartDate = true"
@@ -44,6 +46,7 @@
         name="datetimePicker"
         :value="form.endDate"
         required
+        :rules="[{ required: true, message: '培训结束时间不能为空' }]"
         label="培训结束时间"
         placeholder="请选择培训结束时间"
         @click="showEndDate = true"
@@ -54,25 +57,37 @@
       <!-- 培训内容 -->
       <van-field
         required
+        :rules="[{ required: true, message: '培训内容不能为空' }]"
         v-model="username"
-        name="用户名"
+        name="username"
         label="培训内容"
         type="textarea"
-        row="3"
+        row="2"
         placeholder="请填写培训内容"
-        
       />
       <!-- 总结 -->
       <van-field
         required
+        :rules="[{ required: true, message: '总结不能为空' }]"
         v-model="username"
-        name="用户名"
+        name="username"
         label="总结"
         type="textarea"
         row="3"
         placeholder="请结合网点进行总结"
-        
       />
+
+      <!-- 参与人员 -->
+      <!-- 必填 -->
+      <CheckPeople></CheckPeople>
+      <!-- 缺席人员 -->
+      <CheckPeople :inpitLabel="'缺席人员'"></CheckPeople>
+      <!-- 上传 -->
+      <van-field readonly clickable name="uploader" label="上传图片">
+        <template #input>
+          <Upload></Upload>
+        </template>
+      </van-field>
       <div class="btns">
         <van-button type="info" native-type="submit">保存</van-button>
         <van-button type="info" native-type="submit">提交</van-button>
@@ -82,10 +97,15 @@
 </template>
 <script>
 import NavBar from '@/components/NavBar'
+import CheckPeople from '@/components/checkPeople/index.vue'
+import Upload from '@/components/upload/index.vue'
+import { Dialog } from 'vant'
 export default {
   name: 'SocAppAddTraining',
   components: {
-    NavBar
+    NavBar,
+    Upload,
+    CheckPeople
   },
   data() {
     return {
@@ -108,6 +128,16 @@ export default {
   methods: {
     onSubmit(values) {
       console.log('submit', values)
+      Dialog.confirm({
+        title: '',
+        message: '是否提交培训数据?'
+      })
+        .then(() => {
+          // on confirm
+        })
+        .catch(() => {
+          // on cancel
+        })
     },
     //培训类型确认
     onConfirm(val) {
@@ -135,9 +165,16 @@ export default {
   justify-content: space-between;
   background-color: #fff;
 }
+.bigbox {
+  height: calc(100vh - 200px);
+  overflow: scroll;
+}
 .btns {
   position: fixed;
-  bottom: 2%;
+  bottom: -7%;
+  height: 200px;
+  width: 100%;
+  background-color: #fff;
   // margin: 16px;
   display: flex;
   justify-content: space-around;

+ 131 - 0
src/views/menu/training/components/personnelSignature.vue

@@ -0,0 +1,131 @@
+<template>
+  <div>
+    <NavBar />
+
+    <div class="mainItem">
+      <div>标题</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>单位名称</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>培训类型</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>培训开始时间</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>培训结束时间</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>主持人</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>培训内容</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>总结</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>参与人员</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>缺席人员</div>
+      <div>抚琴路支行</div>
+    </div>
+    <div class="mainItem">
+      <div>上传图片</div>
+    </div>
+    <van-row>
+      <van-col span="24" class="btns">
+        <van-button type="info" class="btn" @click="signatureHandler">签名</van-button>
+      </van-col>
+    </van-row>
+    <van-action-sheet v-model="show" title="签属名字" class="sheet">
+      <writingPad ref="esign" @resultImg="resultImg"></writingPad>
+      <van-row>
+        <van-col span="24" class="btnGroup">
+          <van-button type="info" @click="clearHandler">清除</van-button>
+          <van-button type="info" @click="submitHandler">确定</van-button>
+        </van-col>
+      </van-row>
+    </van-action-sheet>
+  </div>
+</template>
+<script>
+import NavBar from '@/components/NavBar'
+import writingPad from '@/components/writingPad/index.vue'
+export default {
+  name: 'SocAppAddTraining',
+  components: {
+    NavBar,
+    writingPad
+  },
+  data() {
+    return {
+      show: false
+    }
+  },
+
+  mounted() {},
+
+  methods: {
+    signatureHandler() {
+      this.show = true
+    },
+    clearHandler() {
+      this.$refs.esign.handleReset()
+    },
+    submitHandler() {
+      this.$refs.esign.handleGenerate()
+    },
+    resultImg(img) {
+      console.log(this.base64ToBlob(img));
+    },
+    //base64转Blob
+    base64ToBlob(base64, type) {
+      const bstr = atob(base64.replace(/^[^,]+,/, ''))
+      let n = bstr.length
+      const u8arr = new Uint8Array(n)
+      while (n--) {
+        u8arr[n] = bstr.charCodeAt(n)
+      }
+      // return new Blob([u8arr], { type: type || '' })
+      return new Blob([u8arr], { type: type || '' })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.mainItem {
+  display: flex;
+  font-size: 28px;
+  padding: 34px;
+  justify-content: space-between;
+  background-color: #fff;
+}
+.btns {
+  background-color: #fff;
+  width: 100%;
+}
+.btn {
+  width: 100%;
+}
+.sheet {
+  height: 60%;
+}
+.btnGroup {
+  display: flex;
+  margin-top: 20px;
+  justify-content: space-around;
+}
+</style>

+ 16 - 9
src/views/menu/training/index.vue

@@ -103,7 +103,7 @@
           <div class="title">每月例行培训学习</div>
           <div>
             <van-button plain type="info" size="mini" @click="trainSign">培训登记</van-button>
-            <!-- <van-button plain type="info">签名</van-button> -->
+            <van-button plain type="info"  size="mini" @click="signature">签名</van-button>
           </div>
         </div>
       </template>
@@ -150,7 +150,8 @@
 <script>
 import NavBar from '@/components/NavBar'
 import { Col, Row, Cascader, Dialog, DatetimePicker, Icon, Picker } from 'vant'
-import { deptTreeList, selectListApp, registration } from '@/api/toConsult.js'
+import {  gettrainingList,  } from '@/api/training.js'
+import {  deptTreeList,  } from '@/api/toConsult.js'
 import { Toast } from 'vant'
 export default {
   data() {
@@ -219,11 +220,11 @@ export default {
   methods: {
     //清空查询条件
     clearSearch() {
-      this.str = ''
+      this.statusValue = ''
       this.cascaderValue = ''
-      this.value1 = ''
       this.currentDate = ''
-      this.fieldValue = ''
+      this.typeValue = ''
+     
       this.selectListAppHandler()
     },
 
@@ -240,10 +241,11 @@ export default {
     },
     selectListAppHandler() {
       //获取任务列表
-      selectListApp({
-        status: this.str || '',
-        orgId: this.cascaderValue || '',
-        moth: this.currentDate || ''
+      gettrainingList({
+        status: this.statusValue || null,
+        orgId: this.cascaderValue || null,
+        date: this.currentDate || null,
+        type: this.typeValue || null,
       }).then(res => {
         let { code, data, msg } = res
         if (code == 200) {
@@ -256,6 +258,7 @@ export default {
     closeDialog() {
       this.show = false
       this.selectListAppHandler()
+      this.orgName=this.value1
     },
     // 开始调阅事件
     startMonitorHandler(taskId) {
@@ -328,6 +331,10 @@ export default {
     trainSign(){
         this.$router.push('/Addtraining/'+'1111')
     },
+    //签名
+    signature(){
+        this.$router.push('/personnelSignature/'+'1111')
+    },
     onChange(picker, value, index) {},
     onCancel() {
       this.show = false

+ 8 - 0
vue.config.js

@@ -60,6 +60,14 @@ module.exports = defineConfig({
             '^/luojun':'/'
           }
       },
+      '/yuanjingchao': {
+          target: "http://10.87.11.173:8080",
+          // ws:true,
+          changOrigin:true,
+          pathRewrite:{
+            '^/yuanjingchao':'/'
+          }
+      },
       '/luowei': {
         target: "http://10.87.10.47:8080",
         // ws:true,