提交 505f381d 编写于 作者: hujun's avatar hujun

Merge branch 'release' into 'dev-followup-0902'

Release



See merge request !85
......@@ -57,8 +57,9 @@ module.exports = {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url',
query: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
limit: 5000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]'),
publicPath: '../../'
}
}]
},
......
......@@ -17,6 +17,7 @@ var webpackConfig = merge(baseWebpackConfig, {
})
},
//devtool: config.build.productionSourceMap ? '#source-map' : false,
devtool: process.env.BUILD_ENV == 'dev' ? 'source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].js?chunkhash=[chunkhash]'),
......
......@@ -17,6 +17,7 @@
<router-view></router-view>
</div>
<script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script>
<script src="https://cdn.bootcss.com/downloadjs/1.4.8/download.min.js"></script>
<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
</body>
</html>
......@@ -35,8 +35,7 @@
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
},
"accepts": {
"version": "1.3.5",
......@@ -85,8 +84,7 @@
"amdefine": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
"dev": true
"integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
},
"ansi-html": {
"version": "0.0.7",
......@@ -102,8 +100,7 @@
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
"dev": true
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
},
"anymatch": {
"version": "1.3.2",
......@@ -118,14 +115,12 @@
"aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
},
"are-we-there-yet": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"dev": true,
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
......@@ -134,14 +129,12 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
......@@ -156,7 +149,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
}
......@@ -196,8 +188,7 @@
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
"dev": true
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
},
"array-flatten": {
"version": "1.1.1",
......@@ -222,7 +213,6 @@
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dev": true,
"requires": {
"safer-buffer": "~2.1.0"
}
......@@ -281,13 +271,12 @@
"async-foreach": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
"integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
"dev": true
"integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
},
"async-validator": {
"version": "1.8.5",
"resolved": "http://registry.npm.taobao.org/async-validator/download/async-validator-1.8.5.tgz",
"integrity": "sha1-3D4I7B/Q3dtn5ghC8CwM0c7G1/A=",
"resolved": "http://192.168.110.93:4873/async-validator/-/async-validator-1.8.5.tgz",
"integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
"requires": {
"babel-runtime": "6.x"
}
......@@ -295,8 +284,7 @@
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"atob": {
"version": "2.1.2",
......@@ -340,8 +328,7 @@
"aws4": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
"dev": true
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
"axios": {
"version": "0.16.2",
......@@ -569,8 +556,8 @@
},
"babel-helper-vue-jsx-merge-props": {
"version": "2.0.3",
"resolved": "http://registry.npm.taobao.org/babel-helper-vue-jsx-merge-props/download/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha1-Iq69OzOQIyjlEyk6jkmSs4T58bY="
"resolved": "http://192.168.110.93:4873/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
"integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
},
"babel-helpers": {
"version": "6.24.1",
......@@ -1133,8 +1120,7 @@
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"base": {
"version": "0.11.2",
......@@ -1219,7 +1205,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"requires": {
"tweetnacl": "^0.14.3"
}
......@@ -1248,7 +1233,6 @@
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
"integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
"dev": true,
"requires": {
"inherits": "~2.0.0"
}
......@@ -1307,7 +1291,6 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
......@@ -1374,8 +1357,7 @@
"builtin-modules": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
"dev": true
"integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8="
},
"builtin-status-codes": {
"version": "3.0.0",
......@@ -1433,7 +1415,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"dev": true,
"requires": {
"camelcase": "^2.0.0",
"map-obj": "^1.0.0"
......@@ -1442,9 +1423,16 @@
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
"dev": true
"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8="
}
}
},
"can-promise": {
"version": "0.0.1",
"resolved": "http://192.168.110.93:4873/can-promise/-/can-promise-0.0.1.tgz",
"integrity": "sha1-enWXrYAfsUyLIjQd/sMUtr1q2NM=",
"requires": {
"window-or-global": "^1.0.1"
}
},
"caniuse-api": {
......@@ -1468,8 +1456,7 @@
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
"center-align": {
"version": "0.1.3",
......@@ -1485,7 +1472,6 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
"ansi-styles": "^2.2.1",
"escape-string-regexp": "^1.0.2",
......@@ -1497,14 +1483,12 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
......@@ -1512,8 +1496,7 @@
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
"dev": true
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
}
}
},
......@@ -1640,8 +1623,7 @@
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
"dev": true
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
"coa": {
"version": "1.0.4",
......@@ -1723,7 +1705,6 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
"integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
......@@ -1784,8 +1765,7 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"config-chain": {
"version": "1.1.12",
......@@ -1815,8 +1795,7 @@
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
},
"consolidate": {
"version": "0.14.5",
......@@ -1880,8 +1859,7 @@
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cross-env": {
"version": "5.2.0",
......@@ -2068,7 +2046,6 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
"integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
"dev": true,
"requires": {
"array-find-index": "^1.0.1"
}
......@@ -2077,7 +2054,6 @@
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
},
......@@ -2085,8 +2061,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}
}
},
......@@ -2123,8 +2098,8 @@
},
"deepmerge": {
"version": "1.5.2",
"resolved": "http://registry.npm.taobao.org/deepmerge/download/deepmerge-1.5.2.tgz",
"integrity": "sha1-EEmdhohEza1P7ghC34x/bwyVp1M="
"resolved": "http://192.168.110.93:4873/deepmerge/-/deepmerge-1.5.2.tgz",
"integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ=="
},
"define-property": {
"version": "2.0.2",
......@@ -2188,14 +2163,12 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
},
"depd": {
"version": "1.1.2",
......@@ -2218,6 +2191,11 @@
"repeating": "^2.0.0"
}
},
"dijkstrajs": {
"version": "1.0.1",
"resolved": "http://192.168.110.93:4873/dijkstrajs/-/dijkstrajs-1.0.1.tgz",
"integrity": "sha1-082BIh4+pAdCz83lVtTpnpjdxxs="
},
"dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
......@@ -2280,7 +2258,6 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
......@@ -2329,9 +2306,9 @@
"dev": true
},
"element-ui": {
"version": "2.6.1",
"resolved": "http://registry.npm.taobao.org/element-ui/download/element-ui-2.6.1.tgz",
"integrity": "sha1-htt5/13psbzDGHtls3crDFQHRxg=",
"version": "2.10.0",
"resolved": "http://192.168.110.93:4873/element-ui/-/element-ui-2.10.0.tgz",
"integrity": "sha1-5hKfa21v/g260SWkqNF9RHpfY5w=",
"requires": {
"async-validator": "~1.8.1",
"babel-helper-vue-jsx-merge-props": "^2.0.0",
......@@ -2353,6 +2330,14 @@
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
"dev": true
},
"end-of-stream": {
"version": "1.4.1",
"resolved": "http://192.168.110.93:4873/end-of-stream/-/end-of-stream-1.4.1.tgz",
"integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
"requires": {
"once": "^1.4.0"
}
},
"enhanced-resolve": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
......@@ -2391,7 +2376,6 @@
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
"integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
......@@ -2405,8 +2389,7 @@
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"esprima": {
"version": "2.7.3",
......@@ -2543,8 +2526,7 @@
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
"extend-shallow": {
"version": "3.0.2",
......@@ -2586,7 +2568,7 @@
},
"extract-text-webpack-plugin": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz",
"resolved": "http://192.168.110.93:4873/extract-text-webpack-plugin/-/extract-text-webpack-plugin-1.0.1.tgz",
"integrity": "sha1-yVvzy6rEnclvHcbgclSfu2VMzSw=",
"dev": true,
"requires": {
......@@ -2598,20 +2580,17 @@
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
"integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
"dev": true
"integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
},
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
},
"fastclick": {
"version": "1.0.6",
......@@ -2738,8 +2717,7 @@
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
},
"form-data": {
"version": "2.1.4",
......@@ -2777,8 +2755,7 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"fsevents": {
"version": "1.2.4",
......@@ -3313,7 +3290,6 @@
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
"integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"inherits": "~2.0.0",
......@@ -3331,7 +3307,6 @@
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"requires": {
"aproba": "^1.0.3",
"console-control-strings": "^1.0.0",
......@@ -3346,14 +3321,12 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
......@@ -3362,7 +3335,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
......@@ -3373,7 +3345,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
......@@ -3384,7 +3355,6 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
"integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
"dev": true,
"requires": {
"globule": "^1.0.0"
}
......@@ -3397,8 +3367,7 @@
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
"dev": true
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
},
"get-stream": {
"version": "3.0.0",
......@@ -3415,7 +3384,6 @@
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0"
},
......@@ -3423,8 +3391,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}
}
},
......@@ -3432,7 +3399,6 @@
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
......@@ -3505,7 +3471,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
"integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
"dev": true,
"requires": {
"glob": "~7.1.1",
"lodash": "~4.17.10",
......@@ -3515,8 +3480,7 @@
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
"dev": true
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"har-schema": {
"version": "1.0.5",
......@@ -3549,7 +3513,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
},
......@@ -3557,8 +3520,7 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
}
}
},
......@@ -3571,8 +3533,7 @@
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
},
"has-value": {
"version": "1.0.0",
......@@ -3678,8 +3639,7 @@
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
"dev": true
"integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
},
"html-comment-regex": {
"version": "1.1.2",
......@@ -3835,14 +3795,12 @@
"in-publish": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
"integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
"dev": true
"integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E="
},
"indent-string": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
"integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
"dev": true,
"requires": {
"repeating": "^2.0.0"
}
......@@ -3863,7 +3821,6 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
......@@ -3872,8 +3829,7 @@
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ini": {
"version": "1.3.5",
......@@ -3925,8 +3881,7 @@
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
},
"is-binary-path": {
"version": "1.0.1",
......@@ -3946,7 +3901,6 @@
"version": "1.0.0",
"resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
"dev": true,
"requires": {
"builtin-modules": "^1.0.0"
}
......@@ -4010,7 +3964,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
"integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
......@@ -4090,14 +4043,12 @@
"is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
},
"is-windows": {
"version": "1.0.2",
......@@ -4141,14 +4092,12 @@
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
"js-base64": {
"version": "2.4.9",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
"integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==",
"dev": true
"integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ=="
},
"js-beautify": {
"version": "1.8.8",
......@@ -4203,8 +4152,7 @@
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"dev": true
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"jsesc": {
"version": "1.3.0",
......@@ -4221,14 +4169,12 @@
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
"dev": true
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"json-schema-traverse": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
},
"json-stable-stringify": {
"version": "1.0.1",
......@@ -4243,8 +4189,7 @@
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
"dev": true
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
"json3": {
"version": "3.3.2",
......@@ -4269,7 +4214,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"dev": true,
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
......@@ -4280,8 +4224,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}
}
},
......@@ -4337,7 +4280,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"parse-json": "^2.2.0",
......@@ -4370,8 +4312,7 @@
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
},
"lodash._arraycopy": {
"version": "3.0.0",
......@@ -4489,8 +4430,7 @@
"lodash.assign": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
"dev": true
"integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc="
},
"lodash.camelcase": {
"version": "3.0.1",
......@@ -4504,8 +4444,7 @@
"lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
"dev": true
"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
},
"lodash.deburr": {
"version": "3.2.0",
......@@ -4614,8 +4553,7 @@
"lodash.mergewith": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
"dev": true
"integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ=="
},
"lodash.pairs": {
"version": "3.0.1",
......@@ -4685,7 +4623,6 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
"integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
"dev": true,
"requires": {
"currently-unhandled": "^0.4.1",
"signal-exit": "^3.0.0"
......@@ -4706,6 +4643,14 @@
"yallist": "^2.1.2"
}
},
"map-age-cleaner": {
"version": "0.1.3",
"resolved": "http://192.168.110.93:4873/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
"integrity": "sha1-fVg6cwZDTAVf5HSw9FB45uG0uSo=",
"requires": {
"p-defer": "^1.0.0"
}
},
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
......@@ -4715,8 +4660,7 @@
"map-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
"dev": true
"integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
},
"map-visit": {
"version": "1.0.0",
......@@ -4799,7 +4743,6 @@
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"dev": true,
"requires": {
"camelcase-keys": "^2.0.0",
"decamelize": "^1.1.2",
......@@ -4816,8 +4759,7 @@
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
}
}
},
......@@ -4880,14 +4822,12 @@
"mime-db": {
"version": "1.37.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
"dev": true
"integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg=="
},
"mime-types": {
"version": "2.1.21",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
"integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"dev": true,
"requires": {
"mime-db": "~1.37.0"
}
......@@ -4901,7 +4841,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
......@@ -4909,8 +4848,7 @@
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mixin-deep": {
"version": "1.3.1",
......@@ -4937,7 +4875,6 @@
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
}
......@@ -4950,8 +4887,7 @@
"nan": {
"version": "2.11.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
"integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
"dev": true
"integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA=="
},
"nanomatch": {
"version": "1.2.13",
......@@ -5001,8 +4937,7 @@
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
"dev": true
"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
},
"no-case": {
"version": "2.3.2",
......@@ -5017,7 +4952,6 @@
"version": "3.8.0",
"resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
"integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
"dev": true,
"requires": {
"fstream": "^1.0.0",
"glob": "^7.0.3",
......@@ -5037,7 +4971,6 @@
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
......@@ -5048,20 +4981,17 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"dev": true
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
......@@ -5071,14 +5001,12 @@
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
"integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
"dev": true,
"requires": {
"ajv": "^5.3.0",
"har-schema": "^2.0.0"
......@@ -5088,7 +5016,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
......@@ -5098,20 +5025,17 @@
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"dev": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
......@@ -5138,14 +5062,12 @@
"semver": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
"dev": true
"integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
},
"tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"dev": true,
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
......@@ -5222,7 +5144,6 @@
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.4.tgz",
"integrity": "sha512-MXyurANsUoE4/6KmfMkwGcBzAnJQ5xJBGW7Ei6ea8KnUKuzHr/SguVBIi3uaUAHtZCPUYkvlJ3Ef5T5VAwVpaA==",
"dev": true,
"requires": {
"async-foreach": "^0.1.3",
"chalk": "^1.1.1",
......@@ -5249,7 +5170,6 @@
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"dev": true,
"requires": {
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
......@@ -5260,20 +5180,17 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
"dev": true
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"cross-spawn": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
"integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
"dev": true,
"requires": {
"lru-cache": "^4.0.1",
"which": "^1.2.9"
......@@ -5283,7 +5200,6 @@
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
"integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
......@@ -5293,14 +5209,12 @@
"har-schema": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
"integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
},
"har-validator": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
"integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
"dev": true,
"requires": {
"ajv": "^5.3.0",
"har-schema": "^2.0.0"
......@@ -5310,7 +5224,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
......@@ -5320,20 +5233,17 @@
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
"request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
"integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"dev": true,
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
......@@ -5361,7 +5271,6 @@
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
"integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"dev": true,
"requires": {
"psl": "^1.1.24",
"punycode": "^1.4.1"
......@@ -5373,7 +5282,6 @@
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
"integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
"dev": true,
"requires": {
"abbrev": "1"
}
......@@ -5382,7 +5290,6 @@
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
"integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
"is-builtin-module": "^1.0.0",
......@@ -5419,7 +5326,7 @@
},
"normalize-wheel": {
"version": "1.0.1",
"resolved": "http://registry.npm.taobao.org/normalize-wheel/download/normalize-wheel-1.0.1.tgz",
"resolved": "http://192.168.110.93:4873/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
"integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU="
},
"npm-run-path": {
......@@ -5434,7 +5341,6 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"requires": {
"are-we-there-yet": "~1.1.2",
"console-control-strings": "~1.1.0",
......@@ -5472,8 +5378,7 @@
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"object-copy": {
"version": "0.1.0",
......@@ -5566,7 +5471,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
}
......@@ -5633,8 +5537,7 @@
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
},
"os-locale": {
"version": "2.1.0",
......@@ -5649,24 +5552,32 @@
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"requires": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
"p-defer": {
"version": "1.0.0",
"resolved": "http://192.168.110.93:4873/p-defer/-/p-defer-1.0.0.tgz",
"integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
},
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
},
"p-is-promise": {
"version": "2.1.0",
"resolved": "http://192.168.110.93:4873/p-is-promise/-/p-is-promise-2.1.0.tgz",
"integrity": "sha1-kYzrrqJIpiz3/6uOO8qMX4gvxC4="
},
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
......@@ -5736,7 +5647,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
"integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
"dev": true,
"requires": {
"error-ex": "^1.2.0"
}
......@@ -5767,8 +5677,7 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-key": {
"version": "2.0.1",
......@@ -5791,7 +5700,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
"integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"pify": "^2.0.0",
......@@ -5814,20 +5722,17 @@
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
"dev": true
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"dev": true,
"requires": {
"pinkie": "^2.0.0"
}
......@@ -5862,6 +5767,11 @@
}
}
},
"pngjs": {
"version": "3.4.0",
"resolved": "http://192.168.110.93:4873/pngjs/-/pngjs-3.4.0.tgz",
"integrity": "sha1-mcp9clll+2VYFOr2XzjxK72/VV8="
},
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
......@@ -6508,8 +6418,7 @@
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
},
"promise": {
"version": "7.3.1",
......@@ -6551,14 +6460,21 @@
"psl": {
"version": "1.1.29",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
"integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
"dev": true
"integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
},
"pump": {
"version": "3.0.0",
"resolved": "http://192.168.110.93:4873/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
"dev": true
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
},
"q": {
"version": "1.5.1",
......@@ -6566,11 +6482,172 @@
"integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
"dev": true
},
"qrcode": {
"version": "1.3.3",
"resolved": "http://192.168.110.93:4873/qrcode/-/qrcode-1.3.3.tgz",
"integrity": "sha1-XvUMDIkM/6GJf0UgcPDwlJNpk94=",
"requires": {
"can-promise": "0.0.1",
"dijkstrajs": "^1.0.1",
"isarray": "^2.0.1",
"pngjs": "^3.3.0",
"yargs": "^12.0.5"
},
"dependencies": {
"camelcase": {
"version": "5.3.1",
"resolved": "http://192.168.110.93:4873/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA="
},
"cross-spawn": {
"version": "6.0.5",
"resolved": "http://192.168.110.93:4873/cross-spawn/-/cross-spawn-6.0.5.tgz",
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"requires": {
"nice-try": "^1.0.4",
"path-key": "^2.0.1",
"semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
"execa": {
"version": "1.0.0",
"resolved": "http://192.168.110.93:4873/execa/-/execa-1.0.0.tgz",
"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
"requires": {
"cross-spawn": "^6.0.0",
"get-stream": "^4.0.0",
"is-stream": "^1.1.0",
"npm-run-path": "^2.0.0",
"p-finally": "^1.0.0",
"signal-exit": "^3.0.0",
"strip-eof": "^1.0.0"
}
},
"find-up": {
"version": "3.0.0",
"resolved": "http://192.168.110.93:4873/find-up/-/find-up-3.0.0.tgz",
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"requires": {
"locate-path": "^3.0.0"
}
},
"get-stream": {
"version": "4.1.0",
"resolved": "http://192.168.110.93:4873/get-stream/-/get-stream-4.1.0.tgz",
"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
"requires": {
"pump": "^3.0.0"
}
},
"invert-kv": {
"version": "2.0.0",
"resolved": "http://192.168.110.93:4873/invert-kv/-/invert-kv-2.0.0.tgz",
"integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
},
"isarray": {
"version": "2.0.4",
"resolved": "http://192.168.110.93:4873/isarray/-/isarray-2.0.4.tgz",
"integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA=="
},
"lcid": {
"version": "2.0.0",
"resolved": "http://192.168.110.93:4873/lcid/-/lcid-2.0.0.tgz",
"integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
"requires": {
"invert-kv": "^2.0.0"
}
},
"locate-path": {
"version": "3.0.0",
"resolved": "http://192.168.110.93:4873/locate-path/-/locate-path-3.0.0.tgz",
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"requires": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
}
},
"mem": {
"version": "4.3.0",
"resolved": "http://192.168.110.93:4873/mem/-/mem-4.3.0.tgz",
"integrity": "sha1-Rhr0l7xK4JYIzbLmDu+2m/90QXg=",
"requires": {
"map-age-cleaner": "^0.1.1",
"mimic-fn": "^2.0.0",
"p-is-promise": "^2.0.0"
}
},
"mimic-fn": {
"version": "2.1.0",
"resolved": "http://192.168.110.93:4873/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs="
},
"os-locale": {
"version": "3.1.0",
"resolved": "http://192.168.110.93:4873/os-locale/-/os-locale-3.1.0.tgz",
"integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
"requires": {
"execa": "^1.0.0",
"lcid": "^2.0.0",
"mem": "^4.0.0"
}
},
"p-limit": {
"version": "2.2.0",
"resolved": "http://192.168.110.93:4873/p-limit/-/p-limit-2.2.0.tgz",
"integrity": "sha1-QXyZQeYCepq8ulCS3SkE4lW1+8I=",
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "3.0.0",
"resolved": "http://192.168.110.93:4873/p-locate/-/p-locate-3.0.0.tgz",
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"requires": {
"p-limit": "^2.0.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "http://192.168.110.93:4873/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY="
},
"yargs": {
"version": "12.0.5",
"resolved": "http://192.168.110.93:4873/yargs/-/yargs-12.0.5.tgz",
"integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
"requires": {
"cliui": "^4.0.0",
"decamelize": "^1.2.0",
"find-up": "^3.0.0",
"get-caller-file": "^1.0.1",
"os-locale": "^3.0.0",
"require-directory": "^2.1.1",
"require-main-filename": "^1.0.1",
"set-blocking": "^2.0.0",
"string-width": "^2.0.0",
"which-module": "^2.0.0",
"y18n": "^3.2.1 || ^4.0.0",
"yargs-parser": "^11.1.1"
}
},
"yargs-parser": {
"version": "11.1.1",
"resolved": "http://192.168.110.93:4873/yargs-parser/-/yargs-parser-11.1.1.tgz",
"integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
}
}
}
},
"qs": {
"version": "6.5.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
"query-string": {
"version": "4.3.4",
......@@ -6647,7 +6724,6 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
"integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
"dev": true,
"requires": {
"load-json-file": "^1.0.0",
"normalize-package-data": "^2.3.2",
......@@ -6658,7 +6734,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
"integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
"dev": true,
"requires": {
"find-up": "^1.0.0",
"read-pkg": "^1.0.0"
......@@ -6668,7 +6743,6 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
"integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
"dev": true,
"requires": {
"path-exists": "^2.0.0",
"pinkie-promise": "^2.0.0"
......@@ -6678,7 +6752,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
"integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
"dev": true,
"requires": {
"pinkie-promise": "^2.0.0"
}
......@@ -7036,7 +7109,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
"integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
"dev": true,
"requires": {
"indent-string": "^2.1.0",
"strip-indent": "^1.0.1"
......@@ -7211,7 +7283,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
"integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
"dev": true,
"requires": {
"is-finite": "^1.0.0"
}
......@@ -7274,8 +7345,8 @@
},
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "http://registry.npm.taobao.org/resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ="
"resolved": "http://192.168.110.93:4873/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
},
"resolve": {
"version": "1.8.1",
......@@ -7321,7 +7392,6 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"requires": {
"glob": "^7.0.5"
}
......@@ -7335,8 +7405,7 @@
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safe-regex": {
"version": "1.1.0",
......@@ -7350,8 +7419,7 @@
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sass": {
"version": "0.5.0",
......@@ -7363,7 +7431,6 @@
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
"integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
"dev": true,
"requires": {
"glob": "^7.0.0",
"lodash": "^4.0.0",
......@@ -7374,20 +7441,17 @@
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"camelcase": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
"dev": true
"integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
},
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
"dev": true,
"requires": {
"string-width": "^1.0.1",
"strip-ansi": "^3.0.1",
......@@ -7398,7 +7462,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
}
......@@ -7407,7 +7470,6 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true,
"requires": {
"lcid": "^1.0.0"
}
......@@ -7416,7 +7478,6 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
......@@ -7427,7 +7488,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
}
......@@ -7435,14 +7495,12 @@
"which-module": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
"dev": true
"integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
},
"yargs": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
"integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
"dev": true,
"requires": {
"camelcase": "^3.0.0",
"cliui": "^3.2.0",
......@@ -7463,7 +7521,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
"integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
"dev": true,
"requires": {
"camelcase": "^3.0.0"
}
......@@ -7517,7 +7574,6 @@
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
"integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
"dev": true,
"requires": {
"js-base64": "^2.1.8",
"source-map": "^0.4.2"
......@@ -7527,7 +7583,6 @@
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
"integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
"dev": true,
"requires": {
"amdefine": ">=0.0.4"
}
......@@ -7537,8 +7592,7 @@
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
"dev": true
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
},
"send": {
"version": "0.16.2",
......@@ -7891,6 +7945,11 @@
"is-plain-obj": "^1.0.0"
}
},
"sortablejs": {
"version": "1.10.0-rc3",
"resolved": "http://192.168.110.93:4873/sortablejs/-/sortablejs-1.10.0-rc3.tgz",
"integrity": "sha1-L+Y0Y6OLXNEuyRT8PgNYMEhJb0I="
},
"source-list-map": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz",
......@@ -7935,7 +7994,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
"integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==",
"dev": true,
"requires": {
"spdx-expression-parse": "^3.0.0",
"spdx-license-ids": "^3.0.0"
......@@ -7944,14 +8002,12 @@
"spdx-exceptions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
"integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
"dev": true
"integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
},
"spdx-expression-parse": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
"integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
"dev": true,
"requires": {
"spdx-exceptions": "^2.1.0",
"spdx-license-ids": "^3.0.0"
......@@ -7960,8 +8016,7 @@
"spdx-license-ids": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
"integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==",
"dev": true
"integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w=="
},
"split-string": {
"version": "3.1.0",
......@@ -7982,7 +8037,6 @@
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
"integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==",
"dev": true,
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
......@@ -7998,8 +8052,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}
}
},
......@@ -8034,7 +8087,6 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
"integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
"dev": true,
"requires": {
"readable-stream": "^2.0.1"
},
......@@ -8042,14 +8094,12 @@
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
......@@ -8064,7 +8114,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
}
......@@ -8204,7 +8253,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
"integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
"dev": true,
"requires": {
"is-utf8": "^0.2.0"
}
......@@ -8218,7 +8266,6 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
"integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
"dev": true,
"requires": {
"get-stdin": "^4.0.1"
}
......@@ -8279,7 +8326,6 @@
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"dev": true,
"requires": {
"block-stream": "*",
"fstream": "^1.0.2",
......@@ -8288,8 +8334,8 @@
},
"throttle-debounce": {
"version": "1.1.0",
"resolved": "http://registry.npm.taobao.org/throttle-debounce/download/throttle-debounce-1.1.0.tgz",
"integrity": "sha1-UYU9o3vmihVctugns1FKPEIuic0="
"resolved": "http://192.168.110.93:4873/throttle-debounce/-/throttle-debounce-1.1.0.tgz",
"integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg=="
},
"time-stamp": {
"version": "2.2.0",
......@@ -8379,8 +8425,7 @@
"trim-newlines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
"integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
"dev": true
"integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM="
},
"trim-right": {
"version": "1.0.1",
......@@ -8392,7 +8437,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
"integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
"dev": true,
"requires": {
"glob": "^7.1.2"
}
......@@ -8407,7 +8451,6 @@
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"requires": {
"safe-buffer": "^5.0.1"
}
......@@ -8415,8 +8458,7 @@
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"type-is": {
"version": "1.6.16",
......@@ -8644,8 +8686,7 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"utila": {
"version": "0.4.0",
......@@ -8662,14 +8703,12 @@
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
"validate-npm-package-license": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
"integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"requires": {
"spdx-correct": "^3.0.0",
"spdx-expression-parse": "^3.0.0"
......@@ -8691,7 +8730,6 @@
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
......@@ -8701,8 +8739,7 @@
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
}
}
},
......@@ -8726,6 +8763,11 @@
"integrity": "sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ==",
"dev": true
},
"vue-infinite-scroll": {
"version": "2.0.2",
"resolved": "http://192.168.110.93:4873/vue-infinite-scroll/-/vue-infinite-scroll-2.0.2.tgz",
"integrity": "sha1-yjepH+ku4K07dKz4aCwAkXFEtxE="
},
"vue-lazyload": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.2.6.tgz",
......@@ -9079,7 +9121,7 @@
},
"webpack-sources": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.1.5.tgz",
"resolved": "http://192.168.110.93:4873/webpack-sources/-/webpack-sources-0.1.5.tgz",
"integrity": "sha1-qh86vw8NdNtxEcQOUAuE+WZkB1A=",
"dev": true,
"requires": {
......@@ -9126,11 +9168,15 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"requires": {
"string-width": "^1.0.2 || 2"
}
},
"window-or-global": {
"version": "1.0.1",
"resolved": "http://192.168.110.93:4873/window-or-global/-/window-or-global-1.0.1.tgz",
"integrity": "sha1-2+RboqKRqrxW1iz2bEW3+jIpRt4="
},
"window-size": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
......@@ -9188,8 +9234,7 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"xtend": {
"version": "4.0.1",
......
<template>
<div v-if="$route.name!='loginPage'">
<v-header :userName="userName" :portrait="portrait" :idType="idType"></v-header>
<v-slidebar :authList="authList" :tokenValue="token" :storageIdType="storageIdType"></v-slidebar>
<v-slidebar :authList="authList" :tokenValue="token" :storageIdType="storageIdType" :notCompleteCount="redNum"></v-slidebar>
<el-container>
<div class="content" id="body-content">
<transition name="router-fade" mode="out-in">
......@@ -30,6 +30,7 @@ import VFooter from './views/layout/footer.vue'
import { base64decode, isNotEmptyUtils, getUrlParamsMap } from "./utils/utils.js"
import { mapActions, mapGetters } from 'vuex'
import { getLoginUrl } from './utils/index.js'
import { getRedNum } from './utils/patients/patientsapi'
let vm = null
export default {
components:{
......@@ -44,7 +45,8 @@ export default {
token: '',
userName: '',
portrait: '',
authList: {}
authList: {},
redNum: 0,
}
},
computed:{
......@@ -59,6 +61,7 @@ export default {
}
},
mounted() {
vm.getRedData()
function checkIE(){
return '-ms-scroll-limit' in document.documentElement.style && '-ms-ime-align' in document.documentElement.style
}
......@@ -85,6 +88,12 @@ export default {
vm.token = paramMap["token"]
localStorage.setItem('storageToken', vm.token)
vm.$router.push({ path: 'home' })
// if(href.indexOf("mypatients-manage/patients-list") > -1) {
// // vm.$router.push({ path: 'patients-manage/mypatients-manage/patients-list' })
// vm.$router.push({ path: 'patients-list' })
// }else {
// vm.$router.push({ path: 'home' })
// }
} else {
if(!localStorage.getItem('storageToken')) {
console.log('域名',window.location.host)
......@@ -141,6 +150,17 @@ export default {
vm.$message.info(res.message)
}
})
},
getRedData() {
getRedNum({
openTime: (new Date()).getTime()
}).then((data) => {
if(data.code == '000000') {
vm.redNum = data.data
}
}).catch(error => {
vm.$message.error(error)
})
}
},
watch: {
......@@ -149,6 +169,14 @@ export default {
vm.getUserAuth(val)
}
},
$route:{
deep:true,
handler:function(newVal){
if(vm.$route.path == '/patients-manage/not-complete/uncompleted-list'){ //避免重复请求
vm.redNum = 0
}
}
}
}
}
</script>
......@@ -181,4 +209,13 @@ export default {
.login-div {
height: 100%;
}
.check-auth{
width: 480px!important;
height: 240px;
padding: 20px 50px;
.el-message-box__content{
padding:20px 0;
margin-bottom: 10px;
}
}
</style>
......@@ -3,7 +3,8 @@
<el-breadcrumb separator="/">
<el-breadcrumb-item>{{curmbFirst}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbSecond" :to="{ path: jumPathThird }">{{curmbSecond}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbThird">{{curmbThird}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbThird" :to="{ path: jumPathFouth }">{{curmbThird}}</el-breadcrumb-item>
<el-breadcrumb-item v-if="curmbFouth">{{curmbFouth}}</el-breadcrumb-item>
</el-breadcrumb>
</div>
</template>
......@@ -19,8 +20,14 @@ export default {
curmbThird: {
type: String
},
curmbFouth: {
type: String
},
jumPathThird: {
type: String
},
jumPathFouth: {
type: String
}
}
}
......
<template>
<div class="add-diagnose-wrap">
<div class="fixed-wrap" v-show="showDiagnoseModal">
<div class="fullscreen-bg"></div>
<div class="add-diagnose-modal" >
<span class="close-btn el-icon-close" @click="hideSelf"></span>
<p class="title-text">添加诊断</p>
<div class="search-input">
<el-input v-model="searchInput" placeholder="搜索诊断" class="search-disease" @input="handleInputSearch" @blur="handleSearchListBlur"></el-input>
</div>
<div class="main-content">
<div class="left-box left">
<!-- 搜索列表 有搜索结果时-->
<div
v-if="searchList && searchList.length > 0"
class="search-list-wrap"
v-infinite-scroll="loadMore"
:infinite-scroll-disabled="busy"
infinite-scroll-distance="5"
infinite-scroll-immediate-check="false"
>
<ul class="search-list">
<li v-for="(searchLi, index) in searchList" @mousedown="handleSearchLiClick(searchLi)">
<div class="left">
<p class="disease-name" v-html="searchLi.diseaseName"></p>
<div class="one-line">
<p class="alias" v-html="searchLi.alias"></p>
<p class="sign" v-if="searchLi.alias">|</p>
<p class="code">{{searchLi.icdCode}}</p>
</div>
</div>
<div class="right" v-if="isSearchLiSelected(searchLi)"><i class="el-icon-check"></i></div>
</li>
<p v-if="busy" class="loading">加载中...</p>
<p v-if="noMore" class="loading">没有更多了...</p>
</ul>
</div>
<!-- 常用诊断 -->
<div v-if="!(searchList && searchList.length > 0)" class="common-diagnose">
<p class="title">常用诊断<span class='no-result' v-if="hasNoResult">没有找到相关搜索结果</span></p>
<ul class="list">
<li
v-for="item in commonList"
:class="returnEachCommonLiClass(item)"
@click="handleEachCommonLiClick(item)"
>
{{item.diseaseName}}
</li>
</ul>
</div>
</div>
<!-- 已选 -->
<div class="choosed-list-wrap left">
<div class="title">已选 {{choosedList.length}}/20</div>
<div class="choosed-list">
<el-tag
v-for="(tag, index) in choosedList"
closable
:disable-transitions="false"
@close="handleClose(tag)">
<div class="text" v-html="tag.alias ? tag.alias : tag.diseaseName"></div>
</el-tag>
</div>
</div>
</div>
<div class="dialog-footer">
<el-button @click="hideSelf">取 消</el-button>
<el-button type="primary" @click="handleConfirm">确 定</el-button>
</div>
</div>
</div>
<!-- 已选数量不能超过20个 提示 -->
<div class="tips-wrap" @mousedown.prevent="preventDefault">
<el-dialog
title="提示"
:close-on-click-modal="false"
:visible.sync="limitTipsVisible"
width="400px"
center>
<span>最多只能选择20种诊断</span>
<span slot="footer" class="dialog-footer">
<!-- <el-button type="primary" >我知道了</el-button> -->
<div class="know-confirm" @mousedown.prevent="hideNumLimitTips" >我知道了</div>
</span>
</el-dialog>
</div>
</div>
</template>
<script>
import {
getCommonDiagnoseList,
goToSearch,
} from '@/utils/patients/patientsapi';
export default {
data() {
return {
showDiagnoseModal: false,
limitTipsVisible: false,
searchInput: '',
searchList: [],
commonList: [],
choosedList: [],
hasNoResult: false,
page: 1,
pageSize: 30,
busy: false,
noMore: false,
totalPageNum: 0,
isInputResponse: false,
searchFlagTimer: null,
}
},
computed: {
},
created() {
let that = this;
getCommonDiagnoseList().then(res => {
// console.log('>>>>>>*********** res: ', res)
if(res.code == '000000'){
that.commonList = res.data;
}else{
that.$message({
message: (data && data.message) || '接口出错',
type: 'warning'
});
}
})
},
mounted() {
// console.log('>>>>>>>>>>>>>>>>>>>>>>>> ', this.showDiagnoseModal)
},
watch: {
showDiagnoseModal(val) {
}
},
methods: {
showSelf(params) {
this.showDiagnoseModal = true;
let list = JSON.parse(JSON.stringify(this.$store.state.patientsDiagnose.selectedDiagList));
this.choosedList = list;
},
hideSelf() {
this.showDiagnoseModal = false;
this.choosedList = [];
this.searchList = [];
this.searchInput = ''
},
preventDefault() {
// console.log('prevent>>>>>>>>>>>>>>>>>>>')
},
hideNumLimitTips() {
this.limitTipsVisible = false;
},
isSearchLiSelected(item) {
return this.hasItem(this.choosedList, item) > -1 ? true : false;
},
handleSearchLiClick(item) {
this.searchInput = '';
let hasIndex = this.hasItem(this.choosedList, item);
if( hasIndex > -1 ){
this.choosedList.splice(hasIndex, 1);
}else{
// 已选20个后,不能再添加,出Tips
if( this.choosedList && this.choosedList.length == 20 ){
this.limitTipsVisible = true;
return;
}
this.choosedList.push(item);
}
},
handleSearchListBlur() {
this.searchList = [];
clearTimeout(this.searchFlagTimer);
// console.log('blur.....')
},
handleSearchWrapScroll() {
// console.log('ddxx88888888888')
// let that = this;
// // console.log('val: ', val)
// // 搜索时
// that.$nextTick(function(){
// let searchListWrap = document.querySelector('.search-list-wrap');
// console.log('>>> ', searchListWrap)
// if( searchListWrap ){
// // searchListWrap.onscroll = function(){
// let contentH = document.querySelector('.search-list').offsetHeight;
// let viewH = 290;
// let scrollTop = searchListWrap.scrollTop;
// if( that.canScroll && (contentH - viewH - scrollTop <= 50) ){
// console.log('到达临界点,开始加载下一页');
// that.canScroll = false;
// that.loadMoreSearchData();
// }
// // }
// }
// })
},
// 搜索框中输入文字 时 page=1 pageSize=30
handleInputSearch() {
// debugger;
clearTimeout(this.searchFlagTimer);
let that = this;
that.page = 1;
that.isInputResponse = false;
if( that.searchInput == ''){
that.searchList = [];
return;
}
that.searchList = [];
let params = {
diseaseName: that.searchInput,
page: 1,
pageSize: 30,
};
this.searchFlagTimer = setTimeout(() => {
goToSearch(params).then(res => {
// console.log('>>>>>>*********** search: ', res)
if(res.code == '000000'){
that.isInputResponse = true;
that.totalPageNum = Math.ceil(res.data.total/that.pageSize); // 总页数
let list = res.data.icdContentsList || [];
if(list.length > 0){
if(that.searchInput == ''){
that.searchList = [];
return;
}
that.searchList = list;
that.hasNoResult = false;
}else{
that.searchList = [];
that.hasNoResult = true;
}
}else{
that.isInputResponse = false;
that.searchList = [];
that.$message({
message: data.message,
type: 'warning'
});
}
})
}, 300)
},
// 上拉加载更多
loadMore() {
// debugger;
// console.log('loadmore...')
let that = this;
if( !that.isInputResponse ){
return;
}
if( !(that.searchList && that.searchList.length > 0) ){
return;
}
that.busy = true;
that.page += 1;
// console.log('请求第几页数据: ', that.page)
if(that.page > that.totalPageNum){
// console.log('没有更多了。。。。。');
that.busy = false;
that.noMore = true;
return;
}else{
that.noMore = false;
}
let params = {
diseaseName: that.searchInput,
page: that.page,
pageSize: that.pageSize,
}
setTimeout(()=>{
goToSearch(params).then(res => {
// console.log('>>>>>>*********** search: ', res)
// request ...加载完成后,可以继续滚动加载\
that.busy = false;
if(res.code == '000000'){
let list = res.data.icdContentsList || [];
if(list.length > 0){
that.searchList = that.searchList.concat(list);
}
}else{
that.$message({
message: data.message,
type: 'warning'
});
}
})
}, 500)
},
handleInputSearchBlur(){
this.searchList = [];
},
handleConfirm() {
let list = JSON.parse(JSON.stringify(this.choosedList));
this.$store.dispatch('patientsDiagnose/changeDiagnoseList', list)
this.showDiagnoseModal = false;
this.searchInput = '';
this.searchList = [];
},
handleClose(tag) {
this.choosedList.splice(this.hasItem(this.choosedList, tag), 1);
},
returnEachCommonLiClass(item) {
let hasIndex = this.hasItem(this.choosedList, item);
if( hasIndex > -1 ){
return 'active';
}else{
return '';
}
},
handleEachCommonLiClick(item) {
// console.log('ddd', item);
let hasIndex = this.hasItem(this.choosedList, item);
if( hasIndex > -1 ){
this.choosedList.splice(hasIndex, 1);
}else{
// 已选20个后,不能再添加,出Tips
if( this.choosedList && this.choosedList.length == 20 ){
this.limitTipsVisible = true;
return;
}
this.choosedList.push(item);
}
},
hasItem(list, item) {
for(let i=0; i<list.length; i++){
if( list[i].icdCode == item.icdCode ){
return i;
}
}
return -1;
},
},
}
</script>
<style lang="less">
.scroll-bar{
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
&::-webkit-scrollbar
{
width: 5px;
height: 5px;
background-color: #fff;
}
/*定义滚动条轨道 内阴影+圆角*/
&::-webkit-scrollbar-track
{
// border-radius: 10px;
// background-color: rgb(241, 239, 239);
// background: #fff;
}
/*定义滑块 内阴影+圆角*/
&::-webkit-scrollbar-thumb
{
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #bbb;
}
}
.add-diagnose-wrap{
.fixed-wrap{
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
overflow: auto;
z-index: 1000;
.fullscreen-bg{
position: absolute;
width: 100%; height: 100%;
background: black; opacity: 0.3;
}
.add-diagnose-modal{
position: relative;
border-radius: 4px;
width: 910px; padding: 0 30px 0;
position: fixed;
left: 50%; margin-left: -455px;
top: 60px;
background: #fff;
.close-btn{
position: absolute; right: 20px; top: 20px;
cursor: pointer;
&:hover{
color: #409eff;
}
}
.title-text{
text-align: center;
line-height: 60px;
}
.search-disease{
width: 370px;
}
.main-content{
overflow: hidden;
.left{
float: left;
}
.left-box{
width: 370px;
height: 300px;
.common-diagnose{
width: 100%; height: 300px;
.title{
color: #303133;
font-size: 16px;
line-height: 40px;
margin-top: 10px;
.no-result{
font-size: 14px;
color: #e6a23c;
margin-left: 28px;
}
}
.list{
width: 100%; height: 250px;
overflow: hidden;
overflow-y: scroll;
.scroll-bar;
padding: 10px;
border: 1px solid #DCDFE6;
li{
height: 35px; line-height: 35px; padding: 0 15px;
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
cursor: pointer;
font-size: 12px;
&.active{
color: #fff;
background: #409eff;
border-color: #409eff;
}
display: inline-block;
margin: 0 10px 10px 0;
border-radius: 4px;
max-width: 350px;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
}
}
.search-list-wrap{
width: 100%; height: 290px; margin-top: 10px;
border: 1px solid #DCDFE6;
overflow: hidden;
overflow-y: scroll;
.scroll-bar;
.search-list{
border-radius: 4px;
width: 100%;
padding: 10px;
li{
position: relative;
line-height: 30px;
overflow: hidden;
cursor: pointer;
font-size: 12px;
&:hover{
background: #eee;
}
.left{
width: 310px;
float: left;
span{
color: #ff8429;
}
.disease-name{
font-size: 14px;
}
.one-line{
width: 100%; overflow: hidden;
font-size: 12px; color: #aaa;
.alias{
float: left;
}
.sign{
float: left;
margin: 0 5px;
}
.code{
float: left;
}
}
}
.right{
position: absolute;
right: 0;
top: 50%;
margin-top: -13px;
// width: 0px;
// float: left;
display: inline-block;
vertical-align: middle;
i{
font-size: 24px;
color: #449284;
font-weight: 700;
}
}
.code{
line-height: 30px;
}
}
.loading{
color: #ccc;
text-align: center;
margin: 0;
font-size: 12px;
margin-top: 5px;
}
}
}
}
.choosed-list-wrap{
width: 450px;
height: 300px;
margin-left: 30px;
.title{
color: #303133;
font-size: 16px;
line-height: 40px;
margin-top: 10px;
}
.choosed-list{
overflow: hidden;
overflow-y: scroll;
width: 450px;
height: 250px;
padding: 10px;
border: 1px solid #DCDFE6;
.scroll-bar;
.el-tag {
margin: 0 10px 10px 0;;
.text{
display: inline-block;
max-width: 342px;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.el-tag__close{
top: -12px;
}
}
}
}
}
}
.dialog-footer{
text-align: center;
margin: 20px auto;
}
}
.tips-wrap {
.know-confirm{
width: 98px;
height: 40px;
background: #449284;
border-radius: 4px;
text-align: center;
line-height: 40px;
color: #FFF;
margin: 0 auto;
font-size: 14px;
cursor: pointer;
}
}
}
</style>
<template>
<div class="opinion-container">
<el-dialog title="意见反馈" :center="true" :visible.sync="dialogFormVisible" :before-close="beforeClose" :close-on-click-modal="false">
<el-form :model="form" :rules="rules" ref="opinionForm" >
<el-form-item label="意见反馈:" :label-width="formLabelWidth" prop="opinion">
<el-input type="textarea" :rows="5" :maxlength="maxlength" v-model="form.opinion" autocomplete="off" placeholder="请告诉我们您遇到的问题或者建议"></el-input>
<span class="text-count">{{currentCount}}/{{maxlength}}</span>
</el-form-item>
<el-form-item label="上传图片:" :label-width="formLabelWidth" prop="imgs">
<el-upload
class="upload-demo"
:action="action"
:headers="headers"
multiple
list-type="picture"
:limit="imgLimit"
:accept="'image/jpg,image/jpeg,image/png,image/bmp'"
:data="imgFile"
:before-upload="getImgParam"
:on-remove="handleRemove"
:on-success="handleSuccess"
:on-error="handleError"
:on-exceed="handleExceed"
:file-list="fileList">
<!--:disabled="addImageDisabled"-->
<!--<el-button size="small" type="primary" @click="addImage" :disabled="addImageDisabled">添加图片</el-button>-->
<el-button size="small" type="primary" v-if="!addImageDisabled" @click="addImage">添加图片</el-button>
<div slot="tip" class="el-upload__tip">最多5张,每张小于5M,支持jpg,png,bmp</div>
</el-upload>
</el-form-item>
<el-form-item label="联系方式:" :label-width="formLabelWidth" prop="contact">
<el-input v-model="form.contact" maxlength="50" autocomplete="off" placeholder="请输入您的联系方式,如有需要我们会尽快联系您" class="contact-info"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="beforeClose">取 消</el-button>
<el-button type="primary" @click="submitFrom('opinionForm')">提 交</el-button>
</div>
<div slot="footer" class="dialog-footer bottom-msg">
<div class="disblock">
<h1>客服电话:400-920-8877 工作日:9:00~18:00</h1>
</div>
<div class="disblock">
<img src="https://file.yunqueyi.com/File/static/qrcode_for_yunqueyi.jpg" alt="">
<div class="ewm-wrap">
<h1>您可以在「云鹊医」公众号里直接留言</h1>
<h1>扫一扫二维码关注云鹊医公众号</h1>
</div>
</div>
</div>
</el-dialog>
<el-dialog
width="60%"
title=""
:center="true"
:visible.sync="innerVisible"
:before-close="beforeCloseInner"
:custom-class="'result-opinion'"
append-to-body>
<div class="result-msg">
<i class="el-icon-success"></i>
<span>提交成功</span>
</div>
<div class="msg-wrap">
<h1>感谢您的反馈,我们会在<span>1个工作日</span>内答复您的问题</h1>
<h1>请耐心等待</h1>
</div>
<div class="btn-wrap">
<el-button type="primary" class="button" @click="beforeCloseInner">我知道了</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import fetch from '@/utils/fetch'
import { envConfig } from '@/utils/env-config'
import { uploadImg } from '@/utils/index'
import { getQiniuToken, submitFeedback } from '@/utils/patients/patientsapi'
export default {
data(){
return{
maxlength: 1000,
form: {
opinion: '',
imgs: '',
contact: '',
},
innerVisible: false,
dialogFormVisible: true,
formLabelWidth: '100px',
rules: {
opinion: [
{ required: true, message: '请输入意见反馈', trigger: 'blur' }
]
},
imgDomin: '',
addImageDisabled: false,
imgLimit: 5,// 最多允许上传的图片个数
action: 'https://upload.qiniup.com/',
token: '',
headers: {
token: ''
},
imgToken: null,//qiniu上传token
imgFile: {},
fileList: [],
urlString: ''
}
},
created(){
// this.token = 'C712F412E096492B84E2B1D636565626';
this.token = localStorage.getItem('storageToken');
this.headers.token = this.token
},
computed: {
currentCount(){
return this.form.opinion.length
}
},
methods: {
// 获取七牛token
addImage(){
if(this.fileList.length>=this.imgLimit){
this.$message.warning(`最多上传${this.imgLimit}张图片`);
return;
}
getQiniuToken().then((res) => {
if(res.code=='000000'){
this.imgToken = res.data.token;
}else{
this.$message.error(res.message);
}
})
},
beforeClose(e){
this.$emit('closeDialog',false)
},
beforeCloseInner(e){
this.$emit('closeDialog',false)
},
submitFrom(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
this.urlString = '';
this.fileList.forEach((item)=>{
// this.urlString += `${this.imgDomin}/${item.response.key};`
this.urlString += `${item.response.key};`
})
const data = {
input_text: this.form.opinion,
system_type: 'workStation',
token: this.token,
contact_information: this.form.contact,
url: this.urlString,
};
submitFeedback(data).then(res=>{
this.dialogFormVisible = false;
this.innerVisible = true;
})
} else {
return false;
}
});
},
getImgParam(file) {
let isAllowed = /^image\/(jpg|jpeg|png|bmp)$/.test(file.type);
if( !isAllowed ){
this.$message.error('仅支持jpg、png、bmp格式图片文件');
return false;
}
const isLt2M = (file.size / 1024 / 1024) < 5;
if (!isLt2M) {
this.$message.error('上传图片大小不能超过 5MB!');
return false;
}
const date = new Date();
const year = date.getFullYear();
const month = date.getMonth() + 1;
// const day = date.getDate();
// const hour = date.getHours();
// const minute = date.getMinutes();
// const second = date.getSeconds();
// this.imgFile.imageType = this.imageType;
this.imgFile.file = file;
this.imgFile.name = file.name;
this.imgFile.key = `qiniu/image/feedback/${year}/${month}/${file.name}`;
this.imgFile.token = this.imgToken;
},
handleRemove(file, fileList){
this.fileList = fileList
this.addImageDisabled = false;
},
handleSuccess(response, file, fileList){
const imgDomin = uploadImg();
this.imgDomin = imgDomin;
// this.urlString += `${imgDomin}/${response.key};`
// this.fileList.forEach((item)=>{
// this.urlString += `${imgDomin}/${response.key};`
// })
this.fileList = fileList;
this.$message.success(`上传成功!`);
if(fileList.length>=this.imgLimit){
this.addImageDisabled = true;
}
},
handleError(err, file, fileList){
this.$message.error(JSON.stringify(err) + '| 如果出现这个错误信息,说明图片上传失败,请检查代码,如果没有问题,请查看服务器是否有问题!并且删除这段代码提示,只保留前面错误信息提示即可!');
},
// 超出限制时
handleExceed(files, fileList){
if(fileList.length>=this.imgLimit){
this.$message.warning(`最多上传${this.imgLimit}张图片`);
}
},
}
}
</script>
<style lang="scss">
.opinion-container{
.text-count{
position: absolute;
right: 5px;
bottom: 3px;
line-height: 28px;
}
.el-form-item__label{
text-align: center;
}
.el-upload__tip{
display: inline;
margin-left: 10px;
}
.el-upload-list--picture .el-upload-list__item-thumbnail{
margin-left: -75px;
}
.el-upload-list__item{
width: 92px;
height: 102px !important;
padding-top: 15px !important;
display: inline-block;
margin-right: 5px;
.el-upload-list__item-name{
display: none;
}
.el-icon-close-tip{
display: none;
}
&.is-success:focus:not(:hover) .el-icon-close-tip {
display: none;
}
}
.el-upload-list--picture .el-upload-list__item-status-label{
background: #449284;
}
.el-upload-list--picture .el-progress{
top: 7px;
}
.el-dialog--center .el-dialog__body{
padding: 25px 25px 0;
}
.el-dialog__footer{
padding: 0;
}
.bottom-msg{
margin-top: 30px;
padding: 20px 0;
background: #efefef;
.disblock{
width: 48%;
display: inline-block;
vertical-align: middle;
img,div{
display: inline-block;
vertical-align: middle;
}
h1{
color: #000;
font-size: 14px;
line-height: 28px;
}
img{
width: 80px;
height: 80px;
}
.ewm-wrap{
h1{
text-align: left;
}
}
}
}
}
.contact-info{
width: 100% !important;
}
.result-opinion{
border-radius: 8px!important;
text-align: center;
.result-msg{
text-align: center;
color: #449284;
span{
color: #000;
margin-left: 5px;
font-size: 20px;
}
}
.msg-wrap{
margin: 10px 0;
text-align: center;
h1{
font-size: 18px;
}
span{
color: #449284;
}
}
.btn-wrap{
text-align: center;
padding: 10px 5px;
}
}
</style>
......@@ -8,9 +8,11 @@ import FastClick from 'fastclick'
import vueFilters from '@/utils/filter'
// 引入ElementUI
import ElementUI from 'element-ui'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
//引入滚动加载分页
import infiniteScroll from 'vue-infinite-scroll'
Vue.use(infiniteScroll)
// 可调试
// Vue.config.devtools = true;
// Vue.use(Logger, { prefix: new Date(), isDev: process.env.NODE_ENV === 'development', cLevel: 'debug' })
......@@ -45,6 +47,22 @@ const router = new VueRouter({
}
})
import utils from '@/utils/followup/followupUtils';
router.beforeEach((to, from, next) => {
if(to.meta.checkAuth){
utils.checkAuthFunc().then(res=>{
if(res==3){
next()
}else{
next(false)
return
}
})
return
}
next()
});
// 加入混合
Vue.mixin({
...mixins
......
......@@ -88,6 +88,7 @@ const followRouters = {
],
meta: {
title: '计划管理',
checkAuth: true
},
},
{
......@@ -108,6 +109,7 @@ const followRouters = {
],
meta: {
title: '预约管理',
checkAuth: true
},
},
{
......@@ -137,6 +139,7 @@ const followRouters = {
],
meta: {
title: '录入管理',
checkAuth: true
},
},
......
const patientsManage = r => require.ensure([], () => r(require('../views/patients/layout.vue')), 'patientsManage');
/*我的居民*/
const myPatientsManage = r => require.ensure([], () => r(require('../views/patients/mypatients-manage/layout.vue')), 'myPatientsManage');
const patientsList = r => require.ensure([], () => r(require('../views/patients/mypatients-manage/patients-list.vue')), 'patientsList');
const patientDetail = r => require.ensure([], () => r(require('../views/patients/mypatients-manage/patient-detail.vue')), 'patientDetail');
const basicInfo = r => require.ensure([], () => r(require('../views/patients/mypatients-manage/basic-info.vue')), 'basicInfo');
/*新增居民*/
const newManage = r => require.ensure([], () => r(require('../views/patients/new-manage/layout.vue')), 'newManage');
const newPatient = r => require.ensure([], () => r(require('../views/patients/new-manage/new-patient.vue')), 'newPatient');
/*分组管理*/
const labelsManage = r => require.ensure([], () => r(require('../views/patients/labels-manage/layout.vue')), 'labelsManage');
const labelsList = r => require.ensure([], () => r(require('../views/patients/labels-manage/labels-list.vue')), 'labelsList');
const labelsDetail = r => require.ensure([], () => r(require('../views/patients/labels-manage/labels-detail.vue')), 'labelsDetail');
/*资料不全居民*/
const notCompleteManage = r => require.ensure([], () => r(require('../views/patients/not-complete/layout.vue')), 'halfDataManage');
const notCompleteList = r => require.ensure([], () => r(require('../views/patients/not-complete/not-complete-list.vue')), 'halfDataList');
const patientsRouters = {
path: '/patients-manage',
name: 'patientsManage',
component: patientsManage,
redirect: 'patients-manage/mypatients-manage/patients-list',
children: [
{
path: 'mypatients-manage',
component: myPatientsManage,
name: 'myPatientsManage',
redirect: 'mypatients-manage/patients-list',
children: [
{
path: 'patients-list',
component: patientsList,
name: 'patientsList',
meta: {
title: '我的居民列表',
keepAlive: false, //页面不需要缓存
checkAuth: true
},
},
{
path: 'patient-detail',
component: patientDetail,
name: 'patientDetail',
meta: {
title: '居民详情',
keepAlive: false
},
},
{
path: 'basic-info',
component: basicInfo,
name: 'basicInfo',
meta: {
title: '居民详情',
keepAlive: false
},
},
],
meta: {
title: '我的居民',
},
},
{
path: 'new-manage',
component: newManage,
name: 'newManage',
redirect: 'new-manage/new-patient',
children: [
{
path: 'new-patient',
component: newPatient,
name: 'newPatient',
meta: {
title: '新增居民',
keepAlive: false,
checkAuth: true
},
},
],
meta: {
title: '新增居民',
},
},
{
path: 'labels-manage',
component: labelsManage,
name: 'labelsManage',
redirect: 'labels-manage/labels-list',
children: [
{
path: 'labels-list',
component: labelsList,
name: 'labelsList',
meta: {
title: '分组管理',
keepAlive: false,
checkAuth: true
},
},
{
path: 'labels-detail',
component: labelsDetail,
name: 'labelsDetail',
meta: {
title: '分组详情',
keepAlive: false
},
},
],
meta: {
title: '分组管理',
},
},
{
path: 'not-complete',
component: notCompleteManage,
name: 'notCompleteManage',
redirect: 'not-complete/uncompleted-list',
children: [
{
path: 'uncompleted-list',
component: notCompleteList,
name: 'notCompleteList',
meta: {
title: '资料不全居民',
keepAlive: false,
checkAuth: true
},
},
],
meta: {
title: '资料不全居民',
},
},
],
};
export default patientsRouters
......@@ -10,9 +10,17 @@ const createComponent = r => require.ensure([], () => r(require('../views/educat
const roleManager = r => require.ensure([], () => r(require('../views/system/role.vue')),'role')
const addManager = r => require.ensure([], () => r(require('../views/education/add-manager.vue')), 'add-manager')
const itemRole = r => require.ensure([], () => r(require('../views/system/item-role.vue')), 'item-role')
const msgPush = r => require.ensure([], () => r(require('../views/msgpush/msg-push.vue')), 'msg-push')
import patientsRouters from './patients'
import followRouters from './follow'
const reportLis = r => require.ensure([], () => r(require('../views/learning/report-list.vue')), 'report-list')
const itemList = r => require.ensure([], () => r(require('../views/learning/item-list.vue')), 'item-list')
const nameList = r => require.ensure([], () => r(require('../views/learning/name-list.vue')), 'name-list')
const dataAlignment = r => require.ensure([], () => r(require('../views/learning/data-alignment.vue')), 'data-alignment')
const exportDownload = r => require.ensure([], () => r(require('../views/learning/export-download.vue')), 'export-download')
export default [{
path: '/',
component: App,
......@@ -52,7 +60,35 @@ export default [{
},{
path: '/item-role',
component: itemRole
},{
path: '/report-list',
component: reportLis
},{
path: '/item-list',
component: itemList
},{
path: '/data-alignment',
component: dataAlignment
},{
path: '/name-list',
component: nameList
},
{
path: '/export-download',
component: exportDownload
},
{
path: '/msg-push',
component: msgPush,
// redirect: 'msgpush/msg-push',
},
// {
// path: '/followup',
// name: 'followUp',
// component: followUp,
// redirect: 'followup/plan-manage/planList',
// },
followRouters,
patientsRouters,
]
}]
......@@ -4,6 +4,8 @@ import common from './education/common';
//随访
import followModules from './followup/index';
import getters from './getters'
//居民诊断
import patientsDiagnose from './patientsManage/patientsDiagnose';
Vue.use(Vuex)
......@@ -11,7 +13,8 @@ Vue.use(Vuex)
export default new Vuex.Store({
modules: {
common,
...followModules
...followModules,
patientsDiagnose,
},
getters
})
......
const patientsDiagnose = {
namespaced: true,
state: {
selectedDiagList: [],
},
mutations: {
CHANGE_DIAGNOSE_LIST: (state, data) => {
state.selectedDiagList = data;
}
},
actions: {
changeDiagnoseList({ commit }, list) {
commit('CHANGE_DIAGNOSE_LIST', list);
}
}
}
export default patientsDiagnose;
\ No newline at end of file
......@@ -14,7 +14,8 @@ body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, l
border: none;
// color: #333;
font-weight: normal;
font-family: "PingFangSC", "Microsoft Yahei";
// font-family: "PingFangSC", "Microsoft Yahei";
font-family: "Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB","Microsoft YaHei", "SimSun", "sans-serif";
box-sizing: border-box;
-webkit-tap-highlight-color:transparent;
-webkit-font-smoothing: antialiased;
......@@ -60,7 +61,8 @@ html,body{
height: 100%;
width: 100%;
background-color: #fff;
font-family: Arial, Helvetica, sans-serif;
// font-family: Arial, Helvetica, sans-serif;
font-family: "Helvetica Neue", "Helvetica", "PingFang SC", "Hiragino Sans GB","Microsoft YaHei", "SimSun", "sans-serif";
font-size: 16px;
}
#app {
......@@ -229,3 +231,8 @@ html,body{
.el-breadcrumb__inner.is-link:hover {
color: #449284 !important;
}
.el-radio-button__orig-radio:checked+.el-radio-button__inner {
background-color: #449284 !important;
border-color: #449284 !important;
}
\ No newline at end of file
.label-detail-wrap{
.err-text{
height: 12px;
visibility: hidden;
}
.special-error-tips{
.el-textarea__inner{
border: 1px solid red;
outline: none;
}
.err-text{
color: red;
visibility: visible;
}
}
.remove-btn{
color: #449284;
}
}
\ No newline at end of file
.label-detail-wrap{
.screenSet{
background: #fff;
padding: 30px;
display: flex;
flex-direction: column;
display: block;
}
.label-name{
width: 100%; height: 45px;
border-bottom: 1px solid #efefef;
font-size: 14px;
line-height: 32px;
color: #606266;
p{
display: inline-block;
&.name{
color: #93969c;
padding: 0 15px;
}
&.modify{
color: #449284;
cursor: pointer;
}
}
.delete-label{
float: right;
&:hover{
color: #fff;
background-color: #f56c6c;
border-color: #f56c6c;
}
}
}
.label-member{
width: 100%; height: 65px;
font-size: 14px;
color: #606266;
p{
display: inline-block;
line-height: 65px;
&.member-number{
padding: 0 15px;
color: #449284;
}
}
.right{
float: right;
padding-top: 16px;
}
}
.delete-tips{
text-align: center !important;
line-height: 29px;
padding: 0 20px;
}
.pagination-style{
text-align: right;
margin: 20px 0;
}
.table-empty{
width: 100%;
height: auto;
text-align: center;
margin-top: 20%;
.empty-pic{
width: 100px;
height: 100px;
display: block;
border: 0;
margin: 0 auto;
}
.tips{
font-size: 14px;
color: #909399;
line-height: 14px;
padding-bottom: 200px;
}
}
}
\ No newline at end of file
.label-list-wrap{
.el-form-item{
margin-bottom: 0;
.el-textarea{
position: relative;
}
.el-textarea__inner{
outline: none !important;
resize: none !important;
height: 80px;
}
&.special-error-tips{
.el-textarea__inner{
border: 1px solid #F56C6C !important;
outline: none;
resize: none;
}
.err-text{
display: block;
position: absolute;
left: 0;
top: 80px;
}
}
.err-text{
display: none;
color: #F56C6C;
font-size: 12px;
padding-top: 4px;
line-height: 12px;
}
}
}
\ No newline at end of file
.label-list-wrap{
.screenSet{
background: #fff;
padding: 30px;
display: flex;
flex-direction: column;
}
.top-title{
font-size: 20px;
padding-bottom: 20px;
border-bottom: 1px solid #efefef;
}
.label-name-row{
margin-top: 10px;
.right{
float: right;
.create-new-label{
float: right;
}
}
}
.total-label{
font-size: 12px; padding: 30px 0 10px;
}
.label-list{
width: 100%;
height: 100%;
background: #fff;
border: 1px solid #efefef;
border-radius: 4px;
overflow: hidden;
overflow-y: scroll;
padding: 20px 10px;
.each-label{
margin: 0 10px 10px 0;
color: #449284;
background: rgba(68,146,132, .1);
border: 1px solid rgba(68,146,132, .2);
&:hover{
color: #fff;
background: #449284;
cursor: pointer;
}
}
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
&::-webkit-scrollbar
{
width: 5px;
height: 5px;
background-color: #fff;
}
/*定义滚动条轨道 内阴影+圆角*/
&::-webkit-scrollbar-track
{
// border-radius: 10px;
// background-color: rgb(241, 239, 239);
// background: #fff;
}
/*定义滑块 内阴影+圆角*/
&::-webkit-scrollbar-thumb
{
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #bbb;
}
}
.table-empty{
width: 100%;
height: auto;
text-align: center;
.empty-pic{
width: 100px;
height: 100px;
display: block;
border: 0;
margin: 0 auto;
}
.tips{
font-size: 14px;
color: #909399;
}
}
}
.newly-increased-wrap{
.screenSet{
background: #fff;
padding: 30px;
display: flex;
display: block;
flex-direction: column;
&.upload-history-wrap{
margin: 0;
padding: 0;
.septal-line{
width: 100%;
height: 1px;
background: #EBEEF5;
}
}
}
.top-title{
font-size: 20px;
padding-bottom: 20px;
border-bottom: 1px solid #efefef;
}
.single-input{
background-color: #ffffff!important;
.save-and-add{
text-align: right;
}
}
.batch-import-wrap{
.el-upload-list{
display: none;
}
.upload-success-modal{
.el-dialog__body{
padding: 5px 25px 20px;
}
.tips{
text-align: center;
line-height: 25px;
i{
color: #449284;
}
}
}
.el-table__body-wrapper{
.el-table__row{
td:nth-child(1) .cell{
width: 100%;
text-overflow: ellipsis;
display: -webkit-box;
// -webkit-box-orient: vertical;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
/* autoprefixer: on */
-webkit-line-clamp: 2;
overflow: hidden;
}
}
}
}
}
.newly-increased-wrap{
#msg{
width: 180px !important;
height: 180px !important;
padding: 10px;
}
.top-title{
border: 0 !important;
}
.screenSet{
background: #fff;
}
.upload-record{
width: 100%;
font-size: 20px;
line-height: 28px;
color: #1E2F3D;
background: #fff;
margin: 30px 0 24px;
}
.pagination-style{
text-align: right;
margin-top: 20px;
}
.tab-list{
flex: 1;
display: flex;
flex-direction: column;
display: block;
.choose-label-wrap{
.el-dialog__body{
padding: 0 25px 30px;
}
.under-title-tips{
font-size: 12px;
color: #595959;
text-align: center;
}
.row-in-line{
overflow: hidden;
margin-top: 35px;
.el-button, .tips{
display: inline-block;
}
.clear-select{
color: #449284;
border: 1px solid #449284;
&.is-disabled{
color: #c0c4cc !important;
background: #fff !important;
border: 1px solid #dcdfe6 !important;
opacity: 1;
}
}
.tips, .right{
float: right;
}
.tips{
line-height: 32px;
}
}
.list-wrap{
width: 100%;
height: 300px;
border: 1px solid #E4E7ED;
margin-top: 10px;
padding: 10px;
border-radius: 4px;
overflow: hidden;
overflow-y: scroll;
&::-webkit-scrollbar
{
width: 5px;
height: 5px;
background-color: #fff;
}
&::-webkit-scrollbar-thumb
{
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #bbb;
}
.el-checkbox{
margin-right: 10px;
margin-left: 0;
margin-bottom: 10px;
.el-checkbox__input{
&.is-focus{
.el-checkbox__inner{
border-color: #DCDFE6;
}
}
}
&.is-checked{
border-color: #449284;
.el-checkbox__inner{
background-color: #449284;
border-color: #449284;
}
.el-checkbox__label{
color: #449284;
}
}
}
}
}
.reload-label-modal{
text-align: center;
.el-dialog__body{
padding: 0 25px 8px;
.tips{
text-align: center;
}
}
}
.download-qr-modal{
.qr-pic{
width: 200px;
height: 200px;
background: pink;
margin: 0 auto;
}
.exp-date{
line-height: 36px;
text-align: center;
color: #606060;
padding-bottom: 10px;
}
.choose-group{
text-align: center;
padding-bottom: 10px;
.title{
display: inline-block;
}
.el-select{
width: 350px;
}
}
.under-tips{
color: #a3a5aa;
font-size: 12px;
line-height: 20px;
text-align: center;
}
}
.el-tabs__item{
color: #303133;
font-weight: 600;
letter-spacing: 1px;
}
.el-tabs__active-bar{
background-color: #449284;
}
.el-tabs__content{
flex: 1;
overflow: hidden;
.el-tab-pane{
width: 100%;
height: 100%;
background: #fff;
overflow: hidden;
display: flex;
flex-direction: column;
.step-guide{
width: 100%;
background: #fff;
.guide-list{
width: 100%;
height: 237px;
margin-top: 15px;
.first{
width: 250px;
// width: 30%;
height: 200px;
float: left;
.procedure{
width: 100%; height: 20px;
.icon{
width: 20px;
height: 20px;
display: inline-block;
background: #449284;
border-radius: 20px;
text-align: center; line-height: 20px;
font-size: 12px; color: #fff;
}
.text{
display: inline-block;
font-size: 14px;
color: #262626;
font-weight: 600;
}
.border{
display: inline-block;
// width: 200px;
width: 60%;
height: 0px;
border-bottom: 1px solid #449284;
vertical-align: middle;
}
&::after{
content: '';
height: 100%;
display: inline-block;
vertical-align: middle;
}
}
.under-info{
padding-left: 25px;
.step-tips{
width: 100%;
font-size: 12px;
color: #595959;
margin: 8px 0 20px;
}
}
}
.second{
width: 350px;
// width: 40%;
.procedure{
.border{
// width: 250px;
width: 63%;
}
}
.under-info{
.fill-tips{
li{
font-size: 12px;
width: 300px;
line-height: 18px;
.tips-title{
display: inline-block;
color: #262626;
font-weight: 600;
&.notice{
color: #449284;
}
}
p{
display: inline;
color: #595959;
}
}
}
}
}
.third{
width: 300px;
// width: 30%;
.el-upload{
width: 260px;
height: 150px;
}
.el-upload-dragger{
width: 260px;
// width: 100%;
height: 150px;
}
}
}
}
.upload-table{
}
.el-table__body-wrapper{
&::-webkit-scrollbar
{
width: 5px;
height: 5px;
background-color: #fff;
}
&::-webkit-scrollbar-thumb
{
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #bbb;
}
}
}
}
.qr-code-wrap{
background: #fff;
.qr-group{
width: 100%; height:auto;
overflow: hidden;
margin: 30px 0 40px;
.label-name{
display: inline-block;
font-size: 12px;
color: #8C8C8C;
}
.el-tag{
color: #449284;
background:rgba(236,244,242,1);
border:1px solid rgba(150,195,193,1);
margin: 0 0 10px 10px;
&.choose-group{
color: #666666;
background:rgba(255,255,255,1);
border:1px dashed rgba(217,217,217,1);
cursor: pointer;
}
}
}
.qr-pic-wrap{
width: 100%; height: auto;
.qr-box{
width: 200px;
margin: 0 auto;
text-align: center;
.pic{
background:rgba(240,242,245,1);
width: 200px; height: auto;
border: 0;
.qr-code-img{
width: 200px;
height: 200px;
overflow: hidden;
border: 0;
display: block;
}
border: 0;
.qr-download-btn{
color: #fff;
background: #449284;
width: 200px;
border: 0;
margin-top: -3px;
}
}
.time-limit{
width: 100%;
text-align: center;
color: #8C8C8C;
font-size: 12px;
line-height: 41px;
}
.refresh-btn{
color: #449284;
background:rgba(236,244,242,1);
border:1px solid rgba(150,195,193,1);
}
}
}
.border-space{
width: 100%;
height: 1px;
background: #EBEEF5;
margin-top: 30px;
}
.increased-steps-wrap{
overflow: hidden;
.label-title{
font-size: 20px;
color: #1E2F3D;
line-height: 28px;
margin: 30px 0 24px;
}
.flow-path{
// width: 100%;
height: 395px;
display: block;
border: 0;
margin-left: -20px;
}
}
}
}
}
/*重置tabs样式*/
.el-tabs__active-bar{
background-color: #449284!important;
}
.el-tabs__item:hover{
color: #449284;
}
.el-tabs__item.is-active{
color: #449284;
}
/*重置朴素按钮样式——plain*/
.el-button.is-plain:focus, .el-button.is-plain:hover {
color: #449284;
border-color: #449284;
}
/*恢复messageBox默认样式*/
.el-message-box {
width: 360px;
height: 220px;
}
.el-message-box__status+.el-message-box__message{
padding-left: 20px;
padding-right: 20px;
}
/*重置单选按钮样式*/
.el-radio-button__orig-radio:checked+.el-radio-button__inner {
background-color: #449284;
border-color: #449284;
box-shadow: -1px 0 0 0 #449284;
}
.el-radio-button__inner:hover {
color: #449284;
}
/*重置输入框,选择框样式*/
.el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner,.el-input__inner:focus{
border-color: #449284;
}
.el-select-dropdown__item.selected {
color: #449284;
}
.el-select .el-input__inner:focus {
border-color: #449284;
}
/*重置文字按钮样式*/
.el-button--text{
color: #606266;
}
.el-button--text:focus, .el-button--text:hover{
color: #449284;
}
/*重置表格选择框*/
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
border-color: #449284;
background-color: #449284;
}
.el-checkbox__inner {
border-color: #DCDFE6!important;
}
.el-checkbox__input.is-focus,.el-checkbox__inner:hover,.el-checkbox__inner.is-focus {
border-color: #449284!important;
}
/*重置textarea聚焦样式*/
.el-textarea__inner:focus {
border-color: #449284!important;
}
......@@ -3,13 +3,17 @@
*/
export const envConfig = {
development: {
// baseUrl: 'https://dev-sc.yunqueyi.com/',
// // baseUrl: 'http://10.177.15.180:10202/',
// // baseUrl: 'http://192.168.140.14:10201/',
// baseUrl: 'https://test1-sc.yunqueyi.com/',
//baseUrl: 'https://uat-sc.yunqueyi.com/',
// baseUrl: 'https://uat-sc.yunqueyi.com/',
// baseUrl: 'http://10.177.15.150:10401/',
// baseUrl: 'http://10.177.15.150:11905/',
baseUrl: 'https://dev-sc.yunqueyi.com/',
// baseUrl: 'https://test1-sc.yunqueyi.com/',
// baseUrl: 'https://uat-sc.yunqueyi.com/',
apiUrl: 'https://dev-api.yunqueyi.com/',
qiniuFileUrl: "https://dev-sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://test1-videos.yunqueyi.com",
qiniuImgUrl: "https://test1-file.yunqueyi.com",
......@@ -20,9 +24,16 @@ export const envConfig = {
followUpSC: 'https://dev-sc.yunqueyi.com',
saasDomainUrl: 'https://dev-saas.yunqueyi.com/',
workApiUrl: 'https://dev-work.yunqueyi.com/web',
workApiSrc: 'https://dev-work.yunqueyi.com',
// reportUrl: 'http://10.177.15.150:10401/',
// reportUrl: 'http://192.168.140.13:10401/',
reportUrl: 'https://dev-sc-report.yunqueyi.com/',
// reportUrl: 'https://test1-sc-report.yunqueyi.com/',
// reportUrl: 'https://uat-sc-report.yunqueyi.com/',
},
dev: {
baseUrl: 'https://dev-sc.yunqueyi.com/',
apiUrl: 'https://dev-api.yunqueyi.com/',
qiniuFileUrl: "https://dev-sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://test1-videos.yunqueyi.com",
qiniuImgUrl: "https://test1-file.yunqueyi.com",
......@@ -32,9 +43,12 @@ export const envConfig = {
followUpSC: 'https://dev-sc.yunqueyi.com',
saasDomainUrl: 'https://dev-saas.yunqueyi.com/',
workApiUrl: 'https://dev-work.yunqueyi.com/web',
workApiSrc: 'https://dev-work.yunqueyi.com',
reportUrl: 'https://dev-sc-report.yunqueyi.com/',
},
test: {
baseUrl: 'https://test1-sc.yunqueyi.com/',
apiUrl: 'https://test1-api.yunqueyi.com/',
qiniuFileUrl: "https://test1-sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://test1-videos.yunqueyi.com",
qiniuImgUrl: "https://test1-file.yunqueyi.com",
......@@ -44,6 +58,8 @@ export const envConfig = {
yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://test1.yunqueyi.com/',
workApiUrl: 'https://test1-work.yunqueyi.com/web',
workApiSrc: 'https://test1-work.yunqueyi.com',
reportUrl: 'https://test1-sc-report.yunqueyi.com/',
},
test2: {
baseUrl: 'https://test2-work.yunqueyi.com/sc/',
......@@ -56,29 +72,37 @@ export const envConfig = {
yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://test2-work.yunqueyi.com/web/',
workApiUrl: 'https://test2-work.yunqueyi.com/web',
workApiSrc: 'https://test2-work.yunqueyi.com',
reportUrl: 'https://test2-sc-report.yunqueyi.com/',
},
uat: {
baseUrl: 'https://uat-sc.yunqueyi.com/',
apiUrl: 'https://uat-api.yunqueyi.com/',
qiniuFileUrl: "https://uat-sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://video.yunqueyi.com", // 视频
qiniuImgUrl: "https://files.yunqueyi.com",
qiniuResourceUrl: "https://test1-videos.yunqueyi.com", // 视频
qiniuImgUrl: "https://test1-file.yunqueyi.com",
loginUrl: 'https://uat.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://uat-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
followUpSC: 'https://uat-sc.yunqueyi.com',
yuequeyiIndexUrl: 'https://uat.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://uat.yunqueyi.com/',
workApiUrl: 'https://uat-work.yunqueyi.com/web',
workApiSrc: 'https://uat-work.yunqueyi.com',
reportUrl: 'https://uat-sc-report.yunqueyi.com/',
},
pro: {
baseUrl: 'https://sc.yunqueyi.com/',
apiUrl: 'https://api.yunqueyi.com/',
qiniuFileUrl: "https://sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://video.yunqueyi.com",
qiniuImgUrl: "https://files.yunqueyi.com",
loginUrl: 'https://yunqueyi.com/pica-login/work_station.html',
loginUrl: 'https://www.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
followUpSC: 'https://sc.yunqueyi.com',
yuequeyiIndexUrl: 'https://www.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://www.yunqueyi.com/',
workApiUrl: 'https://work.yunqueyi.com/web',
workApiSrc: 'https://work.yunqueyi.com',
reportUrl: 'https://sc-report.yunqueyi.com/',
}
}
......@@ -41,12 +41,26 @@ service.interceptors.request.use(config => {
}else{
showFullScreenLoading();
}
const noSysCode = config.headers.noSysCode;
if(noSysCode){
delete config.headers.sysCode;
delete config.headers.deviceInfo;
delete config.headers.noSysCode;
delete config.headers.token;
}else{
if( config.headers['sysCode']==undefined) {
config.headers['sysCode'] = 12
}
// config.headers['token'] = 'AE013D42003D4BA3856FAD9DBDC82254'
if( process.env.BUILD_ENV == "development" ){ // 本地开发环境
// console.log('环境变量>>>> ', process.env.BUILD_ENV);
// config.headers['token'] = 'BFD804F3A3194FBBBE113962222839F6';
config.headers['token'] = '8BAA42D51C014A6090AB7717589F8967';
}else{
config.headers['token'] = localStorage.getItem('storageToken')
}
config.headers['deviceInfo'] = JSON.stringify({ "app_channel": "", "app_mac": "", "app_uuid": "", "app_version": "", "device_brand": "", "device_ip": "", "device_model": "", "device_net": "", "device_ops": "", "resolution_wh": "", "system_level": "", "device_type": '10' })
}
// if (config.data && config.data.setEntry) {
// config.headers['sysCode'] = config.data.sysCode || 10
// if(config.data.token){
......
......@@ -157,6 +157,84 @@ const vueFilter = {
return '普通用户'
}
},
joinStatus: (value) => {
if(value == "0") {
return '未参与'
}else if(value == "1") {
return '参与中'
}else {
return '已完成'
}
},
reportStatus: (value) => {
if(value == 1) {
return '进行中'
}else if(value == 2) {
return '已结束'
}
},
partJoin: (value) => {
if(value == 1) {
return '未参与'
}else {
return '参与'
}
},
partFinish: (value) => {
if(value == 1) {
return '未完成'
}else {
return '完成'
}
},
projectStatus: (value) => {
if(value == 1) {
return '未参与'
}else if(value == 2) {
return '参与中'
}else if(value == 3) {
return '完成项目'
}
},
recordValue: (value) => {
if(value == 1) {
return '无成绩'
}else if(value == 2) {
return '不通过'
}else if(value == 3) {
return '通过'
}
},
exportStatus: (value) => {
if(value == 0) {
return '数据生成中,请稍后---';
}else if(value == 1) {
return '数据生成完成';
} else {
return '文件生成失败 请重新操作导出';
}
},
getAvgTime: (value) => {
let list = [0,0];
let avgTime = '';
if(value != null && value !='') {
list[0] = Math.floor(value / 60);
list[1] = value % 60;
}
if(list[0] == 0 && list[1] == 0) {
avgTime = list[1] + '秒';
} else if(list[0] == 0 && list[1] != 0) {
avgTime = list[1] + '秒';
} else if(list[0] != 0 && list[1] == 0) {
avgTime = list[0] + '分';
} else if(list[0] != 0 && list[1] != 0) {
avgTime = list[0] + '分' + list[1] + '秒';
}
return avgTime;
},
getTotalTime: (value) => {
let time = value +'分钟';
return time;
},
}
export default vueFilter
\ No newline at end of file
......@@ -8,7 +8,8 @@ import utils from './followupUtils';
const headers = {
sysCode: 45
sysCode: 45,
hospitalAuth:true
} /**/
/*工作台*/
export const getTodayAppointsList = (params) => {
......@@ -41,15 +42,19 @@ export const getTodayPlans = (params) => {
/*计划管理*/
export const createFollowPlan = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans`),
method: 'post',
data: data,
description: '新增、修改随访计划',
},)
})
})
}
export const getPlanList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans`),
......@@ -57,32 +62,44 @@ export const getPlanList = (params) => {
params: params,
description: '获取计划列表',
})
// })
};
export const getPlanDetail = (planId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/${planId}`),
method: 'get',
description: '获取计划详情',
})
// })
};
export const getNodeTimeList = (planId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/${planId}/time`),
method: 'get',
description: '获取随访时间节点列表',
})
// })
};
export const getNodeTimeContent = (planTimeId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/time/${planTimeId}`),
method: 'get',
description: '获取节点详情',
})
// })
};
export const getResidentList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/`),
......@@ -90,8 +107,11 @@ export const getResidentList = (params) => {
params: params,
description: '获取居民列表',
})
// })
};
export const getGroupList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/group`),
......@@ -99,24 +119,33 @@ export const getGroupList = (params) => {
params: params,
description: '获取分组列表',
})
// })
};
export const getFollowStartTimeList = (planId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/${planId}/times`),
method: 'get',
description: '获取随访开始时间列表(居民相关)',
})
// })
};
export const getResidentDetail = (planId,patientId,fuPlanPatientId ) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/${planId}/detail/${patientId}?planPatientsId=${fuPlanPatientId}`),
method: 'get',
description: '获取居民详情',
})
// })
};
export const changePlan = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/change`),
......@@ -124,8 +153,11 @@ export const changePlan = (data) => {
data: data,
description: '变更计划',
})
})
};
export const finishPlan = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/status`),
......@@ -133,16 +165,22 @@ export const finishPlan = (data) => {
data: data,
description: '变更计划',
})
})
};
export const deletePlan = (planId) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/${planId}`),
method: 'delete',
description: '删除计划',
})
})
};
export const getVerifyStatus = (params) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/validate/status`),
......@@ -150,9 +188,12 @@ export const getVerifyStatus = (params) => {
params: params,
description: '认证校验',
})
})
};
/*预约管理*/
export const getReservationList = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/appointed/list`),
......@@ -160,8 +201,11 @@ export const getReservationList = (data) => {
data: data,
description: '获取预约列表',
})
})
};
export const getCheckReservation = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/healths/notice/fu/doctor/appoint/pushValid`),
......@@ -169,8 +213,11 @@ export const getCheckReservation = (data) => {
data: data,
description: '发送预约校验',
})
})
};
export const getReservationPatients = (data) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/appointed/count`),
......@@ -178,8 +225,11 @@ export const getReservationPatients = (data) => {
data: data,
description: '查看预约人数',
})
// })
};
export const changeReservationStatus = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/status/`),
......@@ -187,8 +237,11 @@ export const changeReservationStatus = (data) => {
data: data,
description: '手动变更预约状态',
})
})
};
export const sendReservation = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/`),
......@@ -196,9 +249,12 @@ export const sendReservation = (data) => {
data: data,
description: '发送预约',
})
})
};
/*录入管理*/
export const getEnteringList = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/list`),
......@@ -206,17 +262,23 @@ export const getEnteringList = (data) => {
data: data,
description: '录入列表查看',
})
})
}
export const changeEnteringStatus = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/status/change`),
method: 'post',
data: data,
description: '变更随访状态',
},)
})
})
}
export const getEnteringInfo = (patientId, fuPlanPatientTimesId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/${patientId}/fuInfo/${fuPlanPatientTimesId}`),
......@@ -224,8 +286,11 @@ export const getEnteringInfo = (patientId, fuPlanPatientTimesId) => {
// params: params,
description: '随访单条信息查看',
},)
// })
}
export const getFormList = (planTimesId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/scale/${planTimesId}/list`),
......@@ -233,23 +298,30 @@ export const getFormList = (planTimesId) => {
// params: params,
description: '获取量表列表',
},)
// })
}
//获取新建计划居民列表
export const getPlanPatientsList = (data) =>{
// return utils.checkAuth(()=>{
return fetch({
headers:{
sysCode: 9
sysCode: 9,
hospitalAuth:true
},
url: getFollowUpSC(`/healths/patients/infolist`),
method: 'post',
data: data,
description: '获取新建计划居民列表',
},)
// })
}
// 获取随访计划模板列表
export const getFollowupTemplate = (data) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/templets`),
......@@ -257,10 +329,13 @@ export const getFollowupTemplate = (data) => {
data: data,
description: '获取随访计划模板列表',
})
// })
}
// 获取随访量表固定模板
export const getFollowupTableTemplate = (id) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/templets/${id}`),
......@@ -268,10 +343,13 @@ export const getFollowupTableTemplate = (id) => {
data: {},
description: '获取随访量表固定模板',
})
// })
}
// 获取量表列表
export const getFormOptions = (data)=>{
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/scale/list`),
......@@ -279,10 +357,13 @@ export const getFormOptions = (data)=>{
data: data,
description: '获取量表列表',
})
// })
}
/*常量*/
export const getBasicData = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/basic-data/constants/`),
......@@ -290,10 +371,13 @@ export const getBasicData = (params) => {
params: params,
description: '获取常量',
})
// })
};
// 获取所有漫画列表
export const getAllEducationComtent = (data) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/healths/comtent/workstation/list`),
......@@ -301,10 +385,13 @@ export const getAllEducationComtent = (data) => {
data: data,
description: '获取所有漫画列表'
})
// })
}
// 获取所有疾病
export const getAllDiseases = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/healths/patients/diseases/-1`),
......@@ -312,10 +399,13 @@ export const getAllDiseases = (params) => {
params: params,
description: '获取所有疾病',
})
// })
}
// 获取所有分组
export const getAllLabels = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getFollowUpSC(`/healths/labels/`),
......@@ -323,19 +413,25 @@ export const getAllLabels = (params) => {
params: params,
description: '获取所有分组',
})
// })
}
// 获取微信和短信病人数接口
export const getPatientNumber = (data) => {
// return utils.checkAuth(()=>{
return fetch({
headers: {
sysCode: 9
sysCode: 9,
hospitalAuth:true
},
url: getFollowUpSC(`/healths/patientEducation/getSendPatientTypeNum`),
method: 'post',
data: data,
description: '获取微信和短信病人数接口',
})
// })
}
......
......@@ -100,34 +100,100 @@ function changeFivteenToEighteen(card){
}
return card;
}
//最新的身份证校验规则
function validateIdCard (num) {
num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
return false;
}
//验证前2位,城市符合
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
if(aCity[parseInt(num.substr(0,2))]==null){
return false;
}
export const checkCardNum = (rule, value, callback) => {
var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
};
//是否为空
if(value === ''){
callback(new Error('请输入正确的身份证'))
//下面分别分析出生日期和校验位
var len, re; len = num.length;
if (len == 15) {
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
var arrSplit = num.match(re); //检查生日日期是否正确
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) { // 身份证号的出生日期不对
return false;
} else { //将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0, i;
num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
for(i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
//校验长度,类型
if(isCardNo(value) === false){
callback(new Error('请输入正确的身份证'))
num += arrCh[nTemp % 11];
return true;
}
//检查省份
if(checkProvince(value,vcity) === false){
callback(new Error('请输入正确的身份证'))
}
//校验生日
if(checkBirthday(value) === false){
callback(new Error('请输入正确的身份证'))
if (len == 18) {
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
var arrSplit = num.match(re); //检查生日日期是否正确
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) { // 身份证号的出生日期不对
return false;
}
else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var valnum;
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0, i;
for(i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1)) { // 18位身份证号的校验码不正确
return false;
}
return true;
}
//检验位的检测
if(checkParity(value) === false){
callback(new Error('请输入正确的身份证'))
}
return false;
}
export const checkCardNum = (rule, value, callback) => {
// var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
// 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
// 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
// 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
// 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
// 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
// };
// //是否为空
// if(value === ''){
// callback(new Error('请输入正确的身份证'))
// }
// //校验长度,类型
// if(isCardNo(value) === false){
// callback(new Error('请输入正确的身份证'))
// }
// //检查省份
// if(checkProvince(value,vcity) === false){
// callback(new Error('请输入正确的身份证'))
// }
// //校验生日
// if(checkBirthday(value) === false){
// callback(new Error('请输入正确的身份证'))
// }
// //检验位的检测
// if(checkParity(value) === false){
// callback(new Error('请输入正确的身份证'))
// }
// callback()
if(value === ''){
callback(new Error('请输入正确的身份证'))
}else {
if(validateIdCard(value)) {
callback()
}else {
callback(new Error('请输入正确的身份证'))
}
}
}
......@@ -38,7 +38,7 @@ export const checkRange = (rule, value, callback) => {
// 校验手机号
export const checkMobile = (rule, value, callback) => {
const reg = /^1[3|4|5|7|8|9][0-9]{9}$/; //验证规则
const reg = /^1[3|4|5|6|7|8|9][0-9]{9}$/; //验证规则
const flag = reg.test(value);
if(flag){
callback()
......
import dataConverter from './dataConverter';
import fetch from '@/utils/fetch';
import { getBaseUrl, getSaasDomain, getSaasApiDomain } from '@/utils/index'
import Vue from 'vue';
function getSaasHost(){
var host;
if(location.host.indexOf('dev-work')>-1 || location.host.indexOf('localhost')>-1){
host = 'https://dev-saas.yunqueyi.com'
}else if(location.host.indexOf('test1-work')>-1){
host = 'https://test1.yunqueyi.com'
}else if(location.host.indexOf('uat-work')>-1){
host = 'https://uat.yunqueyi.com'
}else{
host = 'https://www.yunqueyi.com'
}
return host
}
function getWsHost(){
var host;
if(location.host.indexOf('dev-work')>-1 || location.host.indexOf('localhost')>-1){
host = 'https://dev-ws.yunqueyi.com'
}else if(location.host.indexOf('test1-work')>-1){
host = 'https://test1-ws.yunqueyi.com'
}else if(location.host.indexOf('uat-work')>-1){
host = 'https://uat-ws.yunqueyi.com'
}else{
host = 'https://ws.yunqueyi.com'
}
return host
}
const alertMessage = (msg, confirmButtonText, cancelButtonText, callback) => {
Vue.prototype.$confirm(msg, '提醒', {
confirmButtonText: confirmButtonText,
cancelButtonText: cancelButtonText,
customClass: 'check-auth',
showClose: false,
}).then(() => {
callback();
}).catch(() => {
// 关闭弹窗
});
}
export default {
DC: dataConverter,
checkAuth: (callback) => {
return new Promise((resolve, reject) => {
resolve(fetch({
headers: {
token: localStorage.getItem('storageToken')
},
url: getBaseUrl(`/healths/doctor/hospitalAuth`),
method: 'get',
description: '检查用户的机构权限',
}).then(res => {
// 1、未加入 2、审核中 3、加入成功
if (res.code == '000000') {
if (res.data == 1) {
// 点击 去加入,进入加入机构流程
alertMessage('您当前暂无机构,无法使用居民管理、随访管理和群发消息等功能,请在加入机构后重试。','去加入','暂不加入', ()=>{
location.href = getSaasHost() + '/pica-base/pica_join.html'
})
return new Promise((resolve, reject) => {
})
} else if (res.data == 2) {
alertMessage('您创建的机构正在审核中,暂无法使用居民管理、随访管理和群发消息等功能,请在审核通过后重试。','查看审核','取消', ()=>{
location.href = getWsHost() + '/outside/status?tk=' + localStorage.getItem('storageToken')
})
return new Promise((resolve, reject) => {
})
} else if (res.data == 3) {
return callback()
}
}
}))
})
},
checkAuthFunc: ()=>{
return new Promise((resolve, reject) => {
resolve(fetch({
headers: {
token: localStorage.getItem('storageToken')
},
url: getBaseUrl(`healths/doctor/hospitalAuth`),
method: 'get',
description: '检查用户的机构权限',
}).then(res => {
// res.data = 2
if (res.code == '000000') {
if (res.data == 1) {
alertMessage('您当前暂无机构,无法使用居民管理、随访管理和群发消息等功能,请在加入机构后重试。','去加入','暂不加入', ()=>{
location.href = getSaasHost() + '/pica-base/pica_join.html'
})
} else if (res.data == 2) {
alertMessage('您创建的机构正在审核中,暂无法使用居民管理、随访管理和群发消息等功能,请在审核通过后重试。','查看审核','取消', ()=>{
location.href = getWsHost() + '/outside/status?tk=' + localStorage.getItem('storageToken')
})
} else if (res.data == 3) {
}
return new Promise((resolve, reject) => {
resolve(res.data)
})
}
}))
})
}
};
......@@ -191,9 +191,23 @@ export function getWorkApi(url) {
return getConfigByEnvType('workApiUrl') + url
}
// 获取saas端api域名地址
export function getSaasApiDomain(url) {
return getConfigByEnvType('apiUrl') + url
}
// 获取工作站的域名地址
export function getWorkDomain(url) {
return getConfigByEnvType('workApiSrc') + url
}
// 根据不同环境,生成URL
function getConfigByEnvType(urlType) {
return envConfig[process.env.BUILD_ENV][urlType]
}
// 获取report服务器域名地址
export function getReportUrl(url) {
return getConfigByEnvType('reportUrl') + url
}
\ No newline at end of file
import fetch from '@/utils/fetch'
import { getBaseUrl, getWorkApi } from '@/utils/index'
import { getBaseUrl, getReportUrl, getWorkApi } from '@/utils/index'
module.exports = {
data: function () {
......@@ -153,6 +153,16 @@ module.exports = {
data: para
})
},
reportGET(api, para, callback,str) {
// para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
let url = api + this.getUrlPara(para)
url = encodeURI(url);
return fetch({
url: getReportUrl(url),
method: 'get',
data: para
})
},
// saas-GET请求
saasGET(api, para) {
// para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
......@@ -186,6 +196,14 @@ module.exports = {
data: para
})
},
reportPOST(api, para, callback) {
// para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
return fetch({
url: getReportUrl(api),
method: 'post',
data: para
})
},
// 通用saas-POST请求
saasPOST(api, para, cType) {
// para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
......
......@@ -28,7 +28,7 @@ export function getIntersect(a, b) {
//获取id的list
export function getIdList(data) {
let list = [];
if(typeof data === 'undefined') {
if (typeof data === 'undefined') {
return list;
}
if (data.constructor === Array) {
......@@ -208,7 +208,7 @@ function addEmpty(data) {
label: "全部地区",
value: "0",
}
for(let i=0;i<data.length;i++) {
for (let i = 0; i < data.length; i++) {
after.push(data[i]);
}
return after;
......@@ -236,7 +236,7 @@ export function getEcologyList() {
cityName: '上海市',
countyName: '浦东新区',
townName: '--',
},{
}, {
id: '124',
name: '上海第二人民医院',
hospitalLevelName: '二甲医院',
......@@ -244,7 +244,7 @@ export function getEcologyList() {
cityName: '上海市',
countyName: '浦东新区',
townName: '--',
},{
}, {
id: '125',
name: '上海第三人民医院',
hospitalLevelName: '二甲医院',
......@@ -255,7 +255,7 @@ export function getEcologyList() {
}]
return dataList;
}
export function getEcologySelect (data) {
export function getEcologySelect(data) {
// let ecologyist = [{
// label: '上海小生态',
// value: '1',
......@@ -264,7 +264,7 @@ export function getEcologySelect (data) {
// value: '2',
// }];
let ecologyist = [];
for(let i=0;i<data.length;i++) {
for (let i = 0; i < data.length; i++) {
let obj = {
label: data[i].name,
value: data[i].id,
......@@ -273,3 +273,309 @@ export function getEcologySelect (data) {
}
return ecologyist;
}
export function isOverlap(startA, endA, startB, endB) {
let maxStart = Math.max(startA, startB);
let minEnd = Math.min(endA, endB);
console.log('maxStart', maxStart, 'minEnd', minEnd);
if (maxStart <= minEnd) {
return true;
} else {
return false;
}
}
export function setRegionOption(data) {
let option = [];
for (let i = 0; i < data.length; i++) {
let obj = data[i];
obj.label = data[i].provinceName;
obj.value = data[i].provinceId;
option.push(obj);
}
return option;
}
export function getRegionOption() {
let option = [{
value: 1,
label: '浙江',
children: [{
value: 2,
label: '杭州',
children: [{
value: 120115000000,
label: '西湖区'
}, {
value: 5,
label: '东湖区'
}]
}]
}];
return option;
}
export function getLearnOrganization(data) {
if(data.length == 0) {
let arr = [];
return arr;
}
let organization = [
{
label: "全部",
value: 0
},
];
for (let i = 0; i < data.length; i++) {
let obj = {
label: data[i].hospital_name,
value: data[i].hospital_id,
index: i,
};
organization.push(obj);
}
return organization;
}
export function getPicOption(title, legendData, colorData, seriesData) {
let option = {
title: {
text: title,
x: "center",
top: "3%",
},
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend: {
orient: "vertical",
top: "3%",
left: "left",
data: legendData
},
grid: {
left: "30%",
right: "0%",
bottom: "10%",
containLabel: true
},
color: colorData,
backgroundColor: '#F3F3F3',
series: [
{
name: "",
type: "pie",
radius: "55%",
center: ["60%", "65%"],
data: seriesData,
}
]
};
return option;
}
export function getBarOption(xAxisData, seriesData) {
let option = {
title: {
text: "用户年龄发布",
x: "center",
top: "3%",
},
color: ['#3398DB'],
backgroundColor: '#F3F3F3',
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
type: 'category',
data: xAxisData,
axisLabel: {
interval: 0
}
// axisTick: {
// alignWithLabel: true
// }
}
],
yAxis: [
{
type: 'value'
}
],
series: [
{
name: '',
type: 'bar',
barWidth: 30,
data: seriesData,
}
]
};
return option;
}
export function getRank(xAxisData, seriesData) {
let option = {
color: ["#1E90FF", "#32CD32"],
title: {
text: "排行榜",
x: "left",
textStyle: {
//主标题文本样式{"fontSize": 18,"fontWeight": "bolder","color": "#333"}
fontSize: 20,
fontStyle: "normal",
fontWeight: "normal",
color: "#000"
}
},
tooltip: {
trigger: "axis",
formatter: '{b0}<br/>{a0}: {c0}%',
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow" // 默认为直线,可选为:'line' | 'shadow'
}
},
legend: {
data: ["完成人数"],
bottom: 0
},
grid: {
left: "3%",
right: "4%",
bottom: "10%",
containLabel: true
},
xAxis: [
{
type: "category",
data: xAxisData,
}
],
yAxis: [
{
type: "value",
axisLabel: {
show: true,
interval: 'auto',
formatter: '{value}%'
},
}
],
series: [
{
name: "完成通过率",
type: "bar",
stack: "完成通过率",
barMaxWidth: "50",
data: seriesData,
},
// {
// name: "参与人数",
// type: "bar",
// stack: "人数",
// barMaxWidth: "80",
// data: [220, 182, 191, 220, 182, 191]
// }
]
};
return option;
}
export function getSearchType(formData,checkAll) {
let type = 0;
if (formData.region.length == 1 || formData.region.length == 2) {
type = formData.region.length;
} else if (formData.region.length == 3) {
if (formData.organization.length == 0 || checkAll === true) {
type = 3;
} else {
type = 4
}
}
return type;
}
export function hasAll(data) {
let flag = false;
for (let i = 0; i < data.length; i++) {
if (data[i] == 0) {
flag = true;
return flag
}
}
return flag;
}
export function getIds(formData, organizationList, checkAll) {
let ids = '';
if (formData.organization.length == 0) {
//地区id
ids = formData.region[formData.region.length - 1];
} else {
//机构id 选了'全部'
if (checkAll === true) {
// for (let i = 0; i < organizationList.length; i++) {
// if (organizationList[i].value != 0) {
// ids += organizationList[i].value + ',';
// }
// }
ids = formData.region[formData.region.length - 1];
} else {
for (let i = 0; i < formData.organization.length; i++) {
if (formData.organization[i] != 0) {
ids += formData.organization[i] + ',';
}
}
ids = ids.substring(0, ids.length - 1);
}
}
return ids;
}
//获取id的list
export function getDoctorIdList(data) {
let list = [];
if (typeof data === 'undefined') {
return list;
}
if (data.constructor === Array) {
for (let i = 0; i < data.length; i++) {
list.push(data[i].doctorId);
}
}
return list;
}
export function getAjustmentList(data) {
let idList = "";
for (let i = 0; i < data.length; i++) {
idList += data[i] + ',';
}
idList = idList.substring(0, idList.length - 1);
return idList;
}
export function removeZero(data) {
let list = [];
for(let i = 0;i<data.length;i++) {
if(data[i].value != 0) {
list.push(data[i]);
}
}
return list;
}
export function initRank(data) {
let list = [{gradeFlag: -1, gradeName: "全部"}];
for(let i=0;i<data.length;i++) {
list.push(data[i]);
}
return list;
}
export function getAvgTime(data) {
let list = [0,0];
if(data != null && data !='') {
list[0] = Math.floor(data / 60);
list[1] = data % 60;
}
return list;
}
export function getComponent(data) {
let list = [];
for(let i=0;i<data.length;i++) {
list.push(data[i].value);
}
return list;
}
\ No newline at end of file
// 检查号码是否符合规范,包括长度,类型
export const isCardNo = (card) =>{
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
// var reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/;
let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
if(reg.test(card) === false){
return false;
}
return true;
}
// 取身份证前两位,校验省份
export const checkProvince = (card,vcity) =>{
var province = card.substr(0,2);
if(vcity[province] == undefined){
return false;
}
return true;
}
// 检查生日是否正确
export const checkBirthday = (card) =>{
var len = card.length;
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if(len == '15'){
var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
var arr_data = card.match(re_fifteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date('19'+year+'/'+month+'/'+day);
return verifyBirthday('19'+year,month,day,birthday);
}
//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
if(len == '18'){
var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/;
var arr_data = card.match(re_eighteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date(year+'/'+month+'/'+day);
return verifyBirthday(year,month,day,birthday);
}
return false;
}
// 校验日期
function verifyBirthday(year,month,day,birthday) {
var now = new Date();
var now_year = now.getFullYear();
//年月日是否合理
if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day)
{
//判断年份的范围(0岁到100岁之间)
var time = now_year - year;
if(time >= 0 && time <= 100)
{
return true;
}
return false;
}
return false;
}
// 校验位的检测
export const checkParity = (card)=>{
//15位转18位
card = changeFivteenToEighteen(card);
var len = card.length;
if(len == '18'){
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var cardTemp = 0, i, valnum;
for(i = 0; i < 17; i ++) {
cardTemp += card.substr(i, 1) * arrInt[i];
}
valnum = arrCh[cardTemp % 11];
if (valnum == card.substr(17, 1).toLocaleUpperCase())
{
return true;
}
return false;
}
return false;
}
// 15位转18位身份证号
function changeFivteenToEighteen(card){
if(card.length == '15')
{
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var cardTemp = 0, i;
card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
for(i = 0; i < 17; i ++)
{
cardTemp += card.substr(i, 1) * arrInt[i];
}
card += arrCh[cardTemp % 11];
return card;
}
return card;
}
export const validateIdCard = (num)=> {
num = num.toUpperCase(); //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
return false;
}
//验证前2位,城市符合
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江 ",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
if(aCity[parseInt(num.substr(0,2))]==null){
return false;
}
//下面分别分析出生日期和校验位
var len, re; len = num.length;
if (len == 15) {
re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
var arrSplit = num.match(re); //检查生日日期是否正确
var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) { // 身份证号的出生日期不对
return false;
} else { //将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0, i;
num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
for(i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
num += arrCh[nTemp % 11];
return true;
}
}
if (len == 18) {
re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
var arrSplit = num.match(re); //检查生日日期是否正确
var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
if (!bGoodDay) { // 身份证号的出生日期不对
return false;
}
else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
var valnum;
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var nTemp = 0, i;
for(i = 0; i < 17; i ++) {
nTemp += num.substr(i, 1) * arrInt[i];
}
valnum = arrCh[nTemp % 11];
if (valnum != num.substr(17, 1)) { // 18位身份证号的校验码不正确
return false;
}
return true;
}
}
return false;
}
// export const checkCardNum = (rule, value, callback) => {
// var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
// 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
// 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
// 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
// 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
// 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
// };
// //是否为空
// // if(value === ''){
// // callback(new Error('请输入正确的身份证'))
// // }
// if(value) {
// //校验长度,类型
// if(isCardNo(value) === false){
// callback(new Error('请输入正确的身份证'))
// }
// //检查省份
// if(checkProvince(value,vcity) === false){
// callback(new Error('请输入正确的身份证'))
// }
// //校验生日
// if(checkBirthday(value) === false){
// callback(new Error('请输入正确的身份证'))
// }
// //检验位的检测
// if(checkParity(value) === false){
// callback(new Error('请输入正确的身份证'))
// }
// }else {
// callback()
// }
// }
// 校验手机号
export const checkMobile = (rule, value, callback) => {
var reg = /^1[3|4|5|6|7|8|9][0-9]{9}$/; //验证规则
const flag = reg.test(value);
if(flag){
callback()
}else{
callback(new Error(`请输入正确的手机号码`))
}
}
import fetch from '../fetch';
import { getBaseUrl, getSaasDomain, getSaasApiDomain } from '@/utils/index'
import utils from '@/utils/followup/followupUtils';
const headers = {
sysCode: 9,
hospitalAuth:true
}
/*常量API*/
export const getConstants = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`basic-data/constants/`),
method: 'get',
params: params,
description: '获取常量',
})
// })
};
/*获取省市县乡列表*/
export const getProvinceList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`basic-data/position/provinces`),
method: 'get',
params: params,
description: '获取省列表',
})
// })
};
export const getCityList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`basic-data/position/cities`),
method: 'get',
params: params,
description: '获取市列表',
})
// })
};
export const getCountyList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`basic-data/position/counties`),
method: 'get',
params: params,
description: '获取区县列表',
})
// })
};
export const getTownList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`basic-data/position/towns`),
method: 'get',
params: params,
description: '获取乡镇列表',
})
// })
};
/*居民管理*/
export const getPatientList = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/infolist`),
method: 'post',
data: data,
description: '获取居民列表',
})
})
};
export const getDiseasesList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/diseases/-1`),
method: 'get',
params: params,
description: '获取所有疾病',
})
// })
};
// 新增居民
export const getQRCode = data => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/qrcodes/get`),
method: 'post',
data: data,
description: '获取二维码',
})
})
}
export const getUploadHistory = params => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/docImpPat/import/records`),
method: 'get',
params: params,
description: '获取上传历史记录',
})
})
}
export const refreshCode = data => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/qrcodes/refresh`),
method: 'post',
data: data,
description: '刷新二维码有效期',
})
})
}
export const getLabelsInfo = params => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/qrcodes/getLabelsInfo`),
method: 'get',
params: params,
description: '获取分组信息',
})
// })
}
export const downloadQRCode = data => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/qrcodes/shareUrl`),
method: 'post',
data: data,
description: '下载二维码',
})
})
}
export const uploadExcel = data => {
// return utils.checkAuth(()=>{
return fetch({
headers: {
noSysCode: true,
// hospitalAuth:true
},
url: getSaasDomain('web/patientManages/import'),
method: 'post',
data: data,
description: '上传excel文件',
})
// })
}
// 分组管理
export const getLabelList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/labels/`),
method: 'get',
params: params,
description: '获取分组列表',
})
// })
}
export const createNewLabel = (data) => {
return utils.checkAuth(()=>{
return fetch({
url: getBaseUrl(`healths/labels/`),
headers: {
"Content-Type": 'application/json',
hospitalAuth:true
},
method: 'post',
data: data,
description: '新增分组',
})
})
}
export const changeLabelName = (data) => {
return utils.checkAuth(()=>{
return fetch({
url: getBaseUrl(`healths/labels/`),
headers,
method: 'put',
data: data,
description: '修改分组名',
})
})
}
export const getLabelDetail = (labelId, params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/labels/v2/${labelId}/patients`),
method: 'get',
params: params,
description: '获取分组详情',
})
// })
}
export const deleteCurrentLabel = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/labels/`),
method: 'delete',
data: data,
description: '删除分组',
})
})
}
export const deleteCurrentPatients = data => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/labels/patients`),
method: 'delete',
data: data,
description: '删除分组下的居民',
})
})
}
export const saveLabelsForPatient = (labelId, data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/labels/v2/${labelId}/patients`),
method: 'post',
data: data,
description: '分组中添加居民',
})
})
}
// 获取七牛上传token
export const getQiniuToken = (params) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`file/image/token`),
method: 'get',
params: params,
})
})
};
// 意见反馈 getSaasApiDomain
export const submitFeedback = (data) => {
// return utils.checkAuth(()=>{
return fetch({
headers: {
noSysCode: true,
"Content-Type": 'application/json'
},
url: getSaasApiDomain(`web/companys/feedback`),
method: 'post',
data: data,
})
// })
};
/*资料不全居民*/
export const getNotCompleteList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/uncomplate/${params.pageNo}/${params.pageSize}`),
method: 'get',
description: '获取资料不全居民列表',
})
// })
};
export const sendCompleteMessage = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/remind`),
method: 'post',
data: data,
description: '提醒居民完善信息',
})
})
};
export const sendCompleteMessageList = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/list/remind`),
method: 'post',
data: data,
description: '批量提醒居民完善信息',
})
})
};
export const getNotCompleteCount = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/uncomplate/counts`),
method: 'get',
params: params,
description: '获取未完善居民人数',
})
// })
};
export const getRedNum = (params) => {
// 这个方法暂不做权限校验
return fetch({
headers,
url: getBaseUrl(`healths/patients/uncompleted/last/counts`),
method: 'get',
params: params,
description: '获取小红点数据',
})
};
export const getPatientDetail = (patientId) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/${patientId}`),
method: 'get',
// params: params,
description: '获取居民详情',
})
// })
};
export const deletePatient = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/batch`),
method: 'delete',
data: data,
description: '删除居民',
})
})
};
export const getRemindPatient = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/remind`),
method: 'post',
data: data,
description: '提醒居民绑定微信',
})
})
};
// 保存并新增
export const savePatientInfo = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/update`),
method: 'post',
data: data,
description: '保存居民信息',
})
})
};
export const getNationsList = (params) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`resident/constants/nations`),
method: 'get',
params: params,
description: '获取56个民族列表',
})
// })
};
export const getHealthRecordList = (data) => {
// return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`followup/entering/health/records`),
method: 'post',
data: data,
description: '健康档案记录列表',
})
// })
};
/*新的获取居民接口,搜索条件有变化*/
export const getPatientInfoList = (data) => {
return utils.checkAuth(()=>{
return fetch({
headers,
url: getBaseUrl(`healths/patients/v2/infolist`),
method: 'post',
data: data,
description: '获取居民列表',
})
})
};
// 添加诊断:获取常用诊断列表
export const getCommonDiagnoseList = params => {
return fetch({
headers,
url: getBaseUrl(`medicineDictionary/icdCommonDiagnosis`),
method: 'get',
params: params,
description: '获取常用诊断列表',
})
}
// 添加诊断:搜索
export const goToSearch = params => {
return fetch({
headers,
url: getBaseUrl(`medicineDictionary/icdContents`),
method: 'get',
params: params,
description: '常用诊断搜索',
})
}
// 选择或搜索诊断
export const getIcdList = params => {
return fetch({
headers,
url: getBaseUrl(`healths/icd/list`),
// url: 'http://sosoapi.yunqueyi.com/sosoapi-web/pass/mock/46/healths/icd/list',
method: 'get',
params: params,
description: '选择或搜索诊断',
})
}
......@@ -427,8 +427,10 @@ export const doUpload = (self,file, filePath, previewId,progressId, fileType) =>
result.path = '/' + res.key;
// result.fullPath = domain + '/' + res.key + '_' + new Date().getTime();
if(!fileType) { // 图片 文件
console.log('---domain-------',domain)
result.fullPath = domain + '/' + res.key;
}else{ // 视频
console.log('----domain1------',domain1)
result.fullPath = domain1 + '/' + res.key;
}
......
......@@ -36,9 +36,32 @@
style="width:83%;"
:disabled="peopleLevel == 'L3'"
></el-input>
<span class="word-num">{{(formData.projectName).replace(/\s+/g,"").length}}/20</span>
<span class="word-num">{{(formData.projectName).replace(/\s+/g,"").length}}/24</span>
</el-col>
</el-form-item>
<el-form-item label="发起机构名称:" prop="organizationName">
<el-col :span="13">
<el-input
size="small"
v-model="formData.organizationName"
placeholder="请输入发起机构名称"
style="width:83%;"
:disabled="peopleLevel == 'L3'"
@input="changeOrganizationName"
@blur = "blurName"
@focus = "focusName"
></el-input>
<span class="word-num">{{(formData.organizationName).replace(/\s+/g,"").length}}/12</span>
</el-col>
<el-popover
class="popover-content"
placement="bottom"
:content="organizationContent"
v-model="visibleName"
@click="checkDefault">
<p @click="checkDefault"> 我的机构: {{ organizationContent }} </p>
</el-popover>
</el-form-item>
<el-form-item label="项目时间:" required>
<el-col :span="5">
<el-form-item prop="projectBegintime">
......@@ -82,7 +105,7 @@
style="width:83%;"
:disabled="peopleLevel == 'L3'"
></el-input>
<span class="word-num">{{(formData.projectIntro).replace(/\s+/g,"").length}}/150</span>
<span class="word-num">{{(formData.projectIntro).replace(/\s+/g,"").length}}/200</span>
</el-col>
</el-form-item>
<div class="basic-item-icon">
......@@ -180,6 +203,26 @@
<el-radio :label="1">使用小生态范围</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="项目上线通知">
<el-radio-group
size="small"
v-model="formData.sendOption"
:disabled="showNoticeType()"
>
<el-radio :label="1">通知</el-radio>
<el-radio :label="2">不通知</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="formData.sendOption != 2" label="通知范围">
<el-radio-group
size="small"
v-model="formData.receiveOption"
:disabled="showNoticeType()"
>
<el-radio :label="1">次级负责人</el-radio>
<el-radio :label="2">所有人</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="添加下载文件:">
<el-col :span="10">
<el-upload
......@@ -544,12 +587,13 @@
<div class="third-step" v-else-if="active === 2">
<el-form
ref="formComponent"
class="form-component"
label-width="150px"
:model="formComponent"
:rules="rulesComponent"
>
<el-form-item label="选择组件:" prop="component">
<el-col :span="20">
<el-col :span="10">
<el-select
v-model="formComponent.component"
multiple
......@@ -568,11 +612,12 @@
</el-select>
</el-col>
</el-form-item>
<el-form-item label="已选择:">
<el-form-item label="已选择:" class="check-component">
<el-col :span="20">
<el-tag
class = "tags-component"
v-for="tag in tagsComponent"
:key="tag.name"
:key="tag.value"
closable
:type="tag.type"
style="margin-left: 10px;"
......@@ -581,12 +626,14 @@
</el-col>
</el-form-item>
<el-form-item label="配置证书:">
<el-radio-group v-model="formComponent.configure" :disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6">
<el-col :span="10">
<el-radio-group class="el-configure" v-model="formComponent.configure" :disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6">
<el-radio :label="1"></el-radio>
<el-radio :label="2"></el-radio>
</el-radio-group>
</el-col>
</el-form-item>
<el-form-item v-show="formComponent.configure == 1" label="选择证书:">
<!-- <el-form-item v-show="formComponent.configure == 1" label="选择证书:">
<el-col :span="20">
<el-select
v-model="formComponent.certificate"
......@@ -602,6 +649,82 @@
></el-option>
</el-select>
</el-col>
</el-form-item> -->
</el-form>
<el-form
ref="formExam"
label-width="150px"
:model="formExam"
class="achievement"
v-show="formComponent.configure == 1"
>
<el-form-item label="项目成绩评定条件">
<el-select
v-model="formExam.certificateType"
placeholder="请选择"
style="width: 350px"
@change="updateCertificateType"
:disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6"
>
<el-option
v-for="item in certificateTypeList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<div v-show="formExam.certificateType == 2" v-for="(item , index) in formExam.exam" :key="index">
<el-form-item label="发放证书">
<el-col :span="6">
<el-select
v-model="item.certificateId"
placeholder="请选择证书"
style=""
@change="updateCertificate(index)"
:disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6"
>
<el-option
v-for="item in optionsCertificate"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-col>
<el-col :span="3">
<el-button @click="addCertificate" icon="el-icon-plus" circle></el-button>
<el-button @click="reduceCertificate(index)" icon="el-icon-minus" circle></el-button>
</el-col>
</el-form-item>
<el-form-item label="项目中最高">
<el-col :span="3">
<el-input v-model="item.examCount" @change="updateCount(index)" :disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6"></el-input>
</el-col>
<el-col class="line" :span="3.5" > &nbsp 门考试平均分:</el-col>
<el-col :span="3">
<el-input v-model="item.rangeMin" @change="updateMin(index)" :disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6"></el-input>
</el-col>
<el-col class="line" :span="1.5"> &nbsp 分~ &nbsp</el-col>
<el-col :span="3">
<el-input v-model="item.rangeMax" @change="updateMax(index)" :disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6"></el-input>
</el-col>
</el-form-item>
</div>
<el-form-item v-show="formExam.certificateType == 1" label="发放证书">
<el-select
v-model="formComponent.certificate"
placeholder="请选择证书"
style="width: 350px"
:disabled="projectStatus == 3 || projectStatus == 4 || projectStatus == 5 || projectStatus == 6"
>
<el-option
v-for="item in optionsCertificate"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
</div>
......@@ -615,33 +738,28 @@ import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
import * as operationData from "../../utils/operation";
import Sortable from 'sortablejs'
let vm = null;
export default {
components: {
BreadCrumb
},
data() {
// const itemOrganization = {
// name: "上海市第一人民医院",
// grade: "二甲医院",
// province: "上海市",
// city: "上海市",
// district: "浦东新区",
// street: "张江街道"
// };
// const itemPerson = {
// name: "云小鹊",
// hospital: "上海市第一人民医院",
// department: "全科",
// province: "上海市",
// city: "上海市",
// district: "长宁区"
// };
let checkProjectStr = (rule, value, callback) => {
if(value.indexOf("\\") != -1) {//存在
callback(new Error('请勿输入字符“ \\ ”'));
} else if (value.indexOf(".") != -1) {
callback(new Error('请勿输入字符“ . ”'));
} else {
callback();
}
};
return {
idTypeValue: 1,
idTypeProject: '',
// itemOrganization: itemOrganization,
// itemPerson: itemPerson,
projectId: null,
peopleLevel: null,
//面包屑
......@@ -669,6 +787,9 @@ export default {
attachmentMore1: {},
attachmentMore2: {},
scopeType: 0,
organizationName: '',
sendOption: 1,
receiveOption: 1,
},
pickerOptions0: {
disabledDate: time => {
......@@ -802,6 +923,29 @@ export default {
projectStatus: "",
status4Flag: "",
showStorage: false,
//考试数据
formExam: {
certificateType: 1,
exam: [{
examCount: 1,
rangeMin: '',
rangeMax: '',
certificateId: '',
certificateName: '',
}]
},
certificateTypeList: [
{
label: '根据平均分发证书',
value: 2,
},
{
label: '所有组件通过即发放',
value: 1,
}
],
visibleName: false,
organizationContent: '',
//校验工具 数据
rulesComponent: {
component: [
......@@ -816,10 +960,15 @@ export default {
{ required: true, message: "请输入项目名称", trigger: "blur" },
{
min: 2,
max: 20,
message: "输入长度为2-20的内容,可包含中英文、数字及特殊符号",
max: 24,
message: "输入长度为2-24的内容,可包含中英文、数字及特殊符号",
trigger: "blur"
}
},
{ validator: checkProjectStr, trigger: 'blur' }
],
organizationName: [
{ required: true, message: "请填写发起机构名称", trigger: "blur" },
{ min: 1, max: 12, message: "超过12个最大字数限制,请精简字数或使用简称", trigger: "blur" }
],
duringTime: [
{
......@@ -855,7 +1004,7 @@ export default {
],
projectIntro: [
{ required: true, message: "请填写项目简介", trigger: "blur" },
{ min: 1, max: 150, message: "超出可输入的最大长度", trigger: "blur" }
{ min: 1, max: 200, message: "超出可输入的最大长度", trigger: "blur" }
],
attachmentUrl1: [
{ required: true, message: "请选择列表图片", trigger: "blur" }
......@@ -950,7 +1099,12 @@ export default {
attachmentSize: editData.attachmentData[1].attachmentSize
},
scopeType: editData.projectData.scopeType,
organizationName: editData.projectData.organizationName,
notifyId: editData.notifyData.notifyId,
sendOption: editData.notifyData.sendOption,
receiveOption: editData.notifyData.receiveOption,
};
this.organizationContent = editData.projectData.creatorOrganizationName;
if (editData.attachmentData.length > 2) {
for (let i = 2; i < editData.attachmentData.length; i++) {
let pdfItem = {
......@@ -975,6 +1129,21 @@ export default {
this.formComponent.certificate =
editData.certificateData[0].relevanceId;
}
if (editData.certificateRule.length > 0) {
this.formComponent.configure = 1;
}
//初始化考试平均分配置数据
this.formExam.certificateType = editData.projectData.certificateType;
this.formExam.exam = editData.certificateRule;
if(this.formExam.exam.length == 0) {
this.formExam.exam = [{
examCount: 1,
rangeMin: '',
rangeMax: '',
certificateId: '',
certificateName: '',
}]
}
},
//编辑管理
editManager(data) {
......@@ -1014,6 +1183,7 @@ export default {
projectEndtime: this.formData.projectEndtime,
projectIntro: this.formData.projectIntro,
scopeType: this.formData.scopeType,
organizationName: this.formData.organizationName,
};
let attachmentModel = [
{
......@@ -1061,10 +1231,20 @@ export default {
}
//idTypeProject
}
//教培项目v2.1.0新增通知优化
let notifyData = {
notifyId: 0,
receiveOption: this.formData.receiveOption,
sendOption: this.formData.sendOption,
};
if(option == "edit" || option == "storageEdit") {
notifyData.notifyId = this.formData.notifyId;
}
let postData = {
projectModel: JSON.stringify(projectModel),
attachmentModel: JSON.stringify(attachmentModel),
attachmentPDFModel: JSON.stringify(attachmentPDFModel)
attachmentPDFModel: JSON.stringify(attachmentPDFModel),
notifyData: JSON.stringify(notifyData),
};
//console.log(postData);
openLoading(vm);
......@@ -1140,6 +1320,7 @@ export default {
}
this.optionsComponent = optionsComponent;
this.optionsCertificate = optionsCertificate;
this.organizationContent = res.data.creatorOrganizationName;
}
this.editManager();
});
......@@ -1147,12 +1328,42 @@ export default {
//项目组件信息 暂存/完成
componentDraft(type) {
let param = {
componentIds: this.formComponent.component,
certificateId: this.formComponent.certificate,
// componentIds: this.formComponent.component,
componentIds: operationData.getComponent(vm.tagsComponent),
// certificateId: this.formComponent.certificate,
certificateId: [],
projectId: this.projectId,
type: type,
status: this.projectStatus
status: this.projectStatus,
certificateType: this.formExam.certificateType,
getCertificateRule: [],
};
// console.log('排序后',vm.tagsComponent,'param',param);
if(this.formComponent.configure == 1) {
// 2.多证书有规
if(this.formExam.certificateType == 2) {
let ruleData = vm.formExam.exam;
for(let o=0;o<ruleData.length;o++) {
if(ruleData[o].certificateId != '' && ruleData[o].certificateId != null) {
param.certificateId[o] = ruleData[o].certificateId;
}
param.getCertificateRule[o] = {
certificateId: ruleData[o].certificateId,
certificateName: ruleData[o].certificateName,
examCount: ruleData[o].examCount,
portalProjectId: this.projectId,
rangeMax: ruleData[o].rangeMax,
rangeMin: ruleData[o].rangeMin,
}
}
}
// 1.单证书无规则
else {
if(this.formComponent.certificate != '' && this.formComponent.certificate != null) {
param.certificateId[0] = this.formComponent.certificate;
}
}
}
vm.POST("portal/portalInfo/componentDraft", param).then(res => {
console.log(res);
vm.$message({
......@@ -1178,6 +1389,7 @@ export default {
this.getDepartment();
} else if (active == 2) {
this.stepData = [false, false, true];
this.tagDrop();
}
},
//点击暂存
......@@ -1275,24 +1487,26 @@ export default {
} else if (this.active == 2) {
//暂存步骤3
this.componentDraft(1);
// let formName = "formComponent";
// let completeState = this.submitForm(formName);
// if (completeState === true) {
// this.componentDraft(1);
// }
}
},
//点击完成
complete() {
//type 1:暂存 2:完成
if (this.status4Flag == 1) {
// if (this.status4Flag == 1) {
// vm.$message.info("完成");
// vm.$router.push({ path: "item-manager" });
// return;
// }
console.log('this.peopleLevel',this.peopleLevel);
if (this.peopleLevel == 'L3') {
vm.$message.info("完成");
vm.$router.push({ path: "item-manager" });
return;
}
let formName = "formComponent";
let completeState = this.submitForm(formName);
if (completeState === true) {
let certificateState = this.checkCertificate();
if (completeState === true && certificateState === true) {
this.componentDraft(2);
}
},
......@@ -1364,6 +1578,7 @@ export default {
if (res.code == "000000") {
this.active++;
this.stepData = [false, false, true];
this.tagDrop();
}
}
);
......@@ -1413,6 +1628,7 @@ export default {
if(statusMove === 0) {
this.active++;
this.stepData = [false, false, true];
this.tagDrop();
} else {
console.log('不能改变范围status:'+res.data.status)
}
......@@ -1462,6 +1678,7 @@ export default {
if(statusMove === 0) {
this.active++;
this.stepData = [false, false, true];
this.tagDrop();
} else {
console.log('不能改变范围status:'+res.data.status)
}
......@@ -1842,6 +2059,7 @@ export default {
return { type: 2, key: key };
}),
allSelectedKeys = savedCheckedKeys.concat(savedHalfCheckedKeys);
// console.log('allSelectedKeys值:',allSelectedKeys)
return allSelectedKeys;
},
// 递归删除列表中所有子节点
......@@ -2217,7 +2435,7 @@ export default {
}
}
} else if (type == "administrativeUpdate") {
//console.log(this.allSelectedKeys.length);
console.log('this.allSelectedKeys',this.allSelectedKeys);
if (this.allSelectedKeys.length > 0) {
for (let i = 0; i < this.allSelectedKeys.length; i++) {
scope +=
......@@ -2228,13 +2446,21 @@ export default {
}
} else {
let noChangeTree = this.getTreeCheck();
console.log(noChangeTree);
console.log('noChangeTree值',noChangeTree);
if(noChangeTree.length > 0) {
for (let i = 0; i < noChangeTree.length; i++) {
scope += noChangeTree[i].key + ":" + noChangeTree[i].type;
if (i < noChangeTree.length - 1) {
scope += "|";
}
}
} else {
//选全国项目
if(this.tagsRegion[0].key == '000') {
scope = '000:1';
console.log(this.tagsRegion,'scope',scope);
}
}
}
}
//console.log(scope);
......@@ -2728,6 +2954,15 @@ export default {
}
return true;
},
//判断通知展示问题
showNoticeType() {
if(this.projectStatus == '' || this.projectStatus == 1 || this.projectStatus == 2) {
if(this.peopleLevel != 'L3') {
return false;
}
}
return true;
},
//选择小生态
selectChangeEcology(value) {
this.formEcology.pageNum = 1;
......@@ -2919,6 +3154,7 @@ export default {
}
}
//console.log('this.tagsComponent',this.tagsComponent);
vm.tagDrop();
},
initTags(value) {
//console.log('value',value,'optionsComponent',this.optionsComponent);
......@@ -2935,6 +3171,9 @@ export default {
}
}
//console.log('this.tagsComponent',this.tagsComponent);
// if(vm.tagsComponent.length > 0) {
// vm.tagDrop();
// }
},
//选择组件数据绑定
handleCloseComponent(tag) {
......@@ -2945,8 +3184,231 @@ export default {
this.formComponent.component[j] = this.tagsComponent[j].value;
}
}
},
addCertificate() {
let obj = {
examCount: 1,
rangeMin: '',
rangeMax: '',
certificateId: '',
certificateName: '',
};
vm.formExam.exam.push(obj);
},
reduceCertificate(index) {
// console.log(index);
if(vm.formExam.exam.length > 1) {
vm.formExam.exam.splice(index,1);
} else {
vm.$message('至少配置一个证书');
}
},
//考试门数更新校验
updateCount(index) {
if(vm.formExam.exam[index].examCount) {
vm.formExam.exam[index].examCount = parseInt(vm.formExam.exam[index].examCount);
if(!Number.isInteger(vm.formExam.exam[index].examCount)){
vm.formExam.exam[index].examCount = '';
}
if(vm.formExam.exam[index].examCount <= 0) {
vm.formExam.exam[index].examCount = '';
}
if(vm.formExam.exam[index].examCount != '') {
for(let i=0;i<vm.formExam.exam.length;i++) {
vm.formExam.exam[i].examCount = vm.formExam.exam[index].examCount;
}
}
}
},
//区间控制在0~100
baseCheck(index) {
if(vm.formExam.exam[index].rangeMin != '') {
vm.formExam.exam[index].rangeMin = parseInt(vm.formExam.exam[index].rangeMin);
if(vm.formExam.exam[index].rangeMin > 100) {
vm.formExam.exam[index].rangeMin = 100;
}
if(vm.formExam.exam[index].rangeMin < 0) {
vm.formExam.exam[index].rangeMin = 0;
}
}
if(vm.formExam.exam[index].rangeMax != '') {
vm.formExam.exam[index].rangeMax = parseInt(vm.formExam.exam[index].rangeMax);
if(vm.formExam.exam[index].rangeMax > 100) {
vm.formExam.exam[index].rangeMax = 100;
}
if(vm.formExam.exam[index].rangeMax < 0) {
vm.formExam.exam[index].rangeMax = 0;
}
}
},
//区间不能有交集
withoutUnion(index,type) {
let examList = vm.formExam.exam;
let nowMin = vm.formExam.exam[index].rangeMin;
let nowMax = vm.formExam.exam[index].rangeMax;
console.log('nowMin',nowMin,'nowMax',nowMax);
if(nowMin!=='' && nowMax!=='') {
for(let i=0;i<examList.length;i++) {
if(index !== i && examList[i].rangeMin!=='' && examList[i].rangeMax!=='') {
let overlapStatus = operationData.isOverlap(examList[i].rangeMin,examList[i].rangeMax,nowMin,nowMax);
if(overlapStatus === true) {//区间有交集
vm.$message('设置分数区间不能重合');
vm.formExam.exam[index].rangeMin = '';
vm.formExam.exam[index].rangeMax = '';
// console.log('重合制空',vm.formExam.exam[index])
}
}
}
}
},
updateMin(index) {
vm.baseCheck(index);
if(!Number.isInteger(vm.formExam.exam[index].rangeMin)){
vm.formExam.exam[index].rangeMin = '';
return;
}
// console.log('更新 nowMin',vm.formExam.exam[index].rangeMin,'nowMax',vm.formExam.exam[index].rangeMax);
if(vm.formExam.exam[index].rangeMin == '' || vm.formExam.exam[index].rangeMax == '') {
return;
}
if(vm.formExam.exam[index].rangeMin > vm.formExam.exam[index].rangeMax) {
vm.formExam.exam[index].rangeMin = vm.formExam.exam[index].rangeMax;
}
vm.withoutUnion(index,'min')
},
updateMax(index) {
vm.baseCheck(index);
if(!Number.isInteger(vm.formExam.exam[index].rangeMax)){
// console.log('只能整数');
vm.formExam.exam[index].rangeMax = '';
return;
}
if(vm.formExam.exam[index].rangeMin == '' || vm.formExam.exam[index].rangeMax == '') {
return;
}
if(vm.formExam.exam[index].rangeMin > vm.formExam.exam[index].rangeMax) {
vm.formExam.exam[index].rangeMax = vm.formExam.exam[index].rangeMin;
}
vm.withoutUnion(index,'max')
},
updateCertificate(index) {
// console.log('optionsCertificate',vm.optionsCertificate,'index',index,'item',vm.formExam.exam[index])
for(let i=0;i<vm.optionsCertificate.length;i++) {
if(vm.optionsCertificate[i].value == vm.formExam.exam[index].certificateId) {
vm.formExam.exam[index].certificateName = vm.optionsCertificate[i].label;
break;
}
}
},
//更新项目成绩评定条件
updateCertificateType() {
console.log('更新certificateType',vm.formExam.certificateType)
if(vm.formExam.certificateType == 2) {
vm.formExam.exam = [{
examCount: 1,
rangeMin: '',
rangeMax: '',
certificateId: '',
certificateName: '',
}];
} else if(vm.formExam.certificateType == 1) {
vm.formComponent.certificate = '';
}
},
//校验考试通过平均分配置
checkCertificate () {
if(vm.formComponent.configure == 2) {
return true;
}
//空判断
if(vm.formExam.certificateType == 2) {
let checkIdList = [];
for(let i=0;i<vm.formExam.exam.length;i++) {
checkIdList[i] = vm.formExam.exam[i].certificateId;
if(vm.formExam.exam[i].certificateId == ''){
vm.$message('证书不能为空');
return false;
}
if(vm.formExam.exam[i].examCount == ''){
vm.$message('考试门数不能为空');
return false;
}
if(vm.formExam.exam[i].rangeMin == '' || vm.formExam.exam[i].rangeMax == ''){
vm.$message('分数不能为空');
return false;
}
}
// 判断证书不能重复
checkIdList = checkIdList.sort();
for(let j=0;j<checkIdList.length-1;j++) {
if (checkIdList[j] == checkIdList[j+1]) {
vm.$message('证书不能重复选择');
return false;
}
}
// 考试门数必须相同
for(let i=0;i<vm.formExam.exam.length-1;i++) {
if (vm.formExam.exam[i].examCount != vm.formExam.exam[i+1].examCount) {
vm.$message('考试门数必须相同');
return false;
}
}
} else if(vm.formExam.certificateType == 1) {
//组件通过即发放 证书必填
if(vm.formComponent.configure == 1 && vm.formExam.certificateType == 1) {
if(vm.formComponent.certificate == '') {
vm.$message('证书不能为空!');
return false;
}
}
}
return true;
},
blurName() {
vm.visibleName = false;
setTimeout(function(){
// console.log('失去焦点');
vm.submitForm('formData');
},200)
},
focusName() {
let textLength = vm.formData.organizationName.length;
if(textLength == 0) {
vm.visibleName = true;
} else {
vm.visibleName = false;
}
},
changeOrganizationName() {
let textLength = vm.formData.organizationName.length;
console.log('文字长度',textLength);
if(textLength == 0) {
vm.visibleName = true;
} else {
vm.visibleName = false;
}
},
checkDefault() {
// console.log('点击checkDefault')
vm.formData.organizationName = vm.organizationContent;
vm.visibleName = false;
},
tagDrop() {
this.$nextTick(function() {
if(vm.tagsComponent.length > 0) {
const ele = document.querySelector('.check-component .el-col-20');
// console.log('ele',ele);
// Sortable.create(ele,{});
Sortable.create(ele, {
onEnd({ newIndex, oldIndex }) {
const currRow = vm.tagsComponent.splice(oldIndex, 1)[0]
vm.tagsComponent.splice(newIndex, 0, currRow)
}
})
}
});
},
}
};
</script>
<style lang="scss">
......@@ -3087,6 +3549,10 @@ export default {
color: #409eff;
border: 1px solid #409eff;
}
.el-popover--plain {
padding: 18px 20px;
top: 40px;
}
}
.second-step {
margin: 10px 0 0 20px;
......@@ -3162,6 +3628,25 @@ export default {
.third-step {
margin: 30px 0 0px 30px;
padding-bottom: 30px;
.achievement {
margin-top: 60px;
}
.form-component {
position: relative;
}
.check-component {
top: 0px;
left: 550px;
position: absolute;
z-index: 999;
}
.el-tag {
margin-top: 5px;
display: table;
}
.el-configure {
width: 200px;
}
}
}
</style>
\ No newline at end of file
......@@ -17,8 +17,8 @@
<div class="btn-container">
<el-button v-if="stepNum == 1 && (componentStatus == 1 || !componentStatus)" @click="storageAndNext(1)" type="default" size="small">暂存</el-button>
<el-button v-if="stepNum == 1" @click="storageAndNext(2)" type="primary" size="small" style="margin-left:0;">下一步</el-button>
<el-button v-if="stepNum == 2 && (componentStatus == 1 || !componentStatus)" :disabled="conditionSelect" @click="finishConponent(1)" type="default" size="small">暂存</el-button>
<el-button v-if="stepNum == 2" @click="finishConponent(2)" :disabled="conditionSelect" type="primary" size="small" style="margin-left:0;">完成</el-button>
<el-button v-if="stepNum == 2 && (componentStatus == 1 || !componentStatus)" :disabled="newconditionSelect" @click="finishConponent(1)" type="default" size="small">暂存</el-button>
<el-button v-if="stepNum == 2" @click="finishConponent(2)" :disabled="newconditionSelect" type="primary" size="small" style="margin-left:0;">完成</el-button>
</div>
</div>
<div class="first-step" v-if="stepNum == 1">
......@@ -104,12 +104,20 @@
<el-row>
<el-col :span="10">
<el-form-item label="模块名称" prop="name">
<el-input v-model="item.name" @blur="moduleNameValidate(index)" :disabled="conditionSelect || idType == 2 || item.moduleType == 2 || (item.id != '' && item.openFlag == 2)" size="small" placeholder="请选择模块名称" style="width:288px;"></el-input>
<el-input v-model="item.name" @blur="moduleNameValidate(index)" :disabled="fieldDisabled(item)" size="small" placeholder="请选择模块名称" style="width:288px;"></el-input>
</el-form-item>
</el-col>
<el-col :span="10" v-if="idType == 1">
<el-col :span="8" v-if="idType == 1">
<el-form-item label="是否对外开放" prop="openFlag">
<el-radio-group v-model="item.openFlag" @change="selectIsOpen(index)" :disabled="conditionSelect || item.moduleType == 2 || (item.id != '' && item.openFlag == 2)">
<el-radio-group v-model="item.openFlag" @change="selectIsOpen(index)" :disabled="fieldDisabled(item) || item.openDisabled">
<el-radio :label="2"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="6" v-if="idType == 1">
<el-form-item label="是否启用" prop="status">
<el-radio-group v-model="item.status" @change="selectIsOpenStatus(index)" :disabled="fieldDisabled(item)">
<el-radio :label="2"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
......@@ -120,7 +128,7 @@
<div class="template-btn" v-if="idType == 1">
<span class="word-size">添加一个模板</span>
<el-button
:disabled="conditionSelect || item.moduleType == 2 || (item.id != '' && item.openFlag == 2)"
:disabled="fieldDisabled(item)"
v-for="(_item,_index) in templateDataList"
:key="_index"
type="primary"
......@@ -134,7 +142,7 @@
<div class="template-content-div">
<div class="title">
{{item1.name}}
<span v-if="conditionAnd && item.moduleType == 1 && (item.id == '' || (item.id != '' && item.openFlag == 1)) && idType == 1">
<span v-if="newfieldDisabled(item)">
变更顺序:
<i class="el-icon-caret-bottom" @click="sortUp(index,index1)" style="font-size:17px;"></i>
<i class="el-icon-caret-top" @click="sortDown(index,index1)" style="font-size:17px;"></i>
......@@ -150,15 +158,15 @@
<el-col :span="10" class="item-icon">
<span class="require">*</span>
<el-form-item label="考试名称">
<el-input v-model="item3.content1" :disabled="conditionSelect || item.moduleType == 2 || (item.id != '' && item.openFlag == 2) || idType == 2" size="small" maxlength='30' placeholder="请输入考试名称" style="width:288px;"></el-input>
<span v-if="conditionAnd && item2.numFlag == 2 && index3 == 0 && item.moduleType == 1 && idType == 1 && (item.id == '' || (item.id != '' && item.openFlag == 1))"><i class="el-icon-circle-plus" @click="addMatterCourse(index,index1,index2)" style="color:#449284;"></i></span>
<span v-if="conditionAnd && item2.numFlag == 2 && index3 > 0 && item.moduleType == 1 && idType == 1 && (item.id == '' || (item.id != '' && item.openFlag == 1))"><i class="el-icon-delete" @click="deleteMatterCourse(index,index1,index2,index3)" style="color:red;"></i></span>
<el-input v-model="item3.content1" :disabled="fieldDisabled(item)" size="small" maxlength='30' placeholder="请输入考试名称" style="width:288px;"></el-input>
<span v-if="newfieldDisabled(item) && item2.numFlag == 2 && index3 == 0 "><i class="el-icon-circle-plus" @click="addMatterCourse(index,index1,index2)" style="color:#449284;"></i></span>
<span v-if="newfieldDisabled(item) && item2.numFlag == 2 && index3 > 0 "><i class="el-icon-delete" @click="deleteMatterCourse(index,index1,index2,index3)" style="color:red;"></i></span>
</el-form-item>
</el-col>
<el-col :span="10" class="item-icon">
<span class="require">*</span>
<el-form-item label="关联考试">
<el-select v-model="item3.content2" @focus="examIDfocus(index,index1,index2,index3)" @change="changeExamID" :disabled="conditionSelect || item.moduleType == 2 || idType == 2 || (item.id != '' && item.openFlag == 2)" size="small" placeholder="请选择考试ID" style="width:288px;">
<el-select v-model="item3.content2" filterable @focus="examIDfocus(index,index1,index2,index3)" @change="changeExamID" :disabled="fieldDisabled(item)" size="small" placeholder="请选择考试ID" style="width:288px;">
<el-option
v-for="(itemTest,indexTest) in testIdSelect"
:key="indexTest"
......@@ -173,7 +181,7 @@
<el-col :span="10" class="item-icon">
<span class="require">*</span>
<el-form-item label="配置证书">
<el-radio-group v-model="item3.certificateFlag" :disabled="conditionSelect || item.moduleType == 2 || idType == 2 || (item.id != '' && item.openFlag == 2)">
<el-radio-group v-model="item3.certificateFlag" :disabled="fieldDisabled(item)">
<el-radio :label="2"></el-radio>
<el-radio :label="1"></el-radio>
</el-radio-group>
......@@ -182,7 +190,7 @@
<el-col :span="10" v-if="item3.certificateFlag == 2" class="item-icon">
<span class="require">*</span>
<el-form-item label="选择证书">
<el-select v-model="item3.content4" :disabled="conditionSelect || item.moduleType == 2 || idType == 2 || (item.id != '' && item.openFlag == 2)" size="small" placeholder="请选择证书" style="width:288px;">
<el-select v-model="item3.content4" :disabled="fieldDisabled(item)" size="small" placeholder="请选择证书" style="width:288px;">
<el-option
v-for="(itemCertificate,indexCertificate) in certificateIdSelect"
:key="indexCertificate"
......@@ -202,15 +210,15 @@
<el-col :span="10" class="item-icon">
<span class="require">*</span>
<el-form-item label="课程名称">
<el-input v-model="item3.content1" :disabled="conditionSelect || item.moduleType == 2 || idType == 2 || (item.id != '' && item.openFlag == 2)" size="small" maxlength='30' placeholder="请输入课程名称" style="width:288px;"></el-input>
<span v-if="conditionAnd && item2.numFlag == 2 && index3 == 0 && item.moduleType == 1 && idType == 1 && (item.id == '' || (item.id != '' && item.openFlag == 1))"><i class="el-icon-circle-plus" @click="addMatterCourse(index,index1,index2)" style="color:#449284;"></i></span>
<span v-if="conditionAnd && item2.numFlag == 2 && index3 > 0 && item.moduleType == 1 && idType == 1 && (item.id == '' || (item.id != '' && item.openFlag == 1))"><i class="el-icon-delete" @click="deleteMatterCourse(index,index1,index2,index3)" style="color:red;"></i></span>
<el-input v-model="item3.content1" :disabled="fieldDisabled(item)" size="small" maxlength='30' placeholder="请输入课程名称" style="width:288px;"></el-input>
<span v-if="newfieldDisabled(item) && item2.numFlag == 2 && index3 == 0"><i class="el-icon-circle-plus" @click="addMatterCourse(index,index1,index2)" style="color:#449284;"></i></span>
<span v-if="newfieldDisabled(item) && item2.numFlag == 2 && index3 > 0"><i class="el-icon-delete" @click="deleteMatterCourse(index,index1,index2,index3)" style="color:red;"></i></span>
</el-form-item>
</el-col>
<el-col :span="10" class="item-icon">
<span class="require">*</span>
<el-form-item label="关联课程">
<el-select v-model="item3.content2" @focus="courseIDfocus(index,index1,index2,index3)" @change="changeCourseID" :disabled="conditionSelect || item.moduleType == 2 || idType == 2 || (item.id != '' && item.openFlag == 2)" size="small" placeholder="请选择课程ID" style="width:288px;">
<el-select v-model="item3.content2" filterable @focus="courseIDfocus(index,index1,index2,index3)" @change="changeCourseID" :disabled="fieldDisabled(item)" size="small" placeholder="请选择课程ID" style="width:288px;">
<el-option
v-for="(itemCourse,indexCourse) in courseIdSelect"
:key="indexCourse"
......@@ -365,6 +373,7 @@ export default {
componentStatus: '',
resultFlag: '',
conditionSelect: false,
newconditionSelect: false,
conditionAnd: true,
isStorage: false,
dialogTitle: '选择模板',
......@@ -422,7 +431,7 @@ export default {
],
"introduce": [
{ required: true, message: '请输入组件简介', trigger: 'blur' },
{ min: 1, max: 150, message: '超出可输入的最大长度', trigger: 'blur' }
{ min: 1, max: 151, message: '超出可输入的最大长度', trigger: 'blur' }
],
"certificateId": [
{ required: true, message: '请选择证书', trigger: 'blur' },
......@@ -434,7 +443,7 @@ export default {
moduleRules: {
"name": [
{ required: true, message: '请输入模块名称', trigger: 'blur' },
{ min: 2, max: 20, message: '输入长度为2-20个字符', trigger: 'blur' },
{ min: 2, max: 40, message: '输入长度为2-40个字符', trigger: 'blur' },
{ validator: function(rule, value, callback) {
validateModuleName(rule, value, callback, '模块名称已存在,请修改名称后保存')
},
......@@ -442,6 +451,9 @@ export default {
],
"openFlag": [
{ required: true, message: '请选择是否对外开放', trigger: 'blur' }
],
"stauts": [
{ required: true, message: '请选择是否启用', trigger: 'blur' }
]
}
}
......@@ -453,20 +465,29 @@ export default {
])
},
created() {
console.log("#######==========#####")
vm = this
vm.componentId = vm.$route.query.id
vm.componentStatus = vm.$route.query.status // 3 启用 4 禁用
vm.resultFlag = vm.$route.query.resultFlag // 判断可编辑范围是基础信息还是全部信息 1 为全部 2 为基础
vm.getCertificateList() // 获取证书列表
vm.componentBasicInfo() // 根据ID查询组件基本信息
vm.componentId = vm.$route.query.id;
vm.componentStatus = vm.$route.query.status; // 3 启用 4 禁用
vm.resultFlag = vm.$route.query.resultFlag; // 判断可编辑范围是基础信息还是全部信息 1 为全部 2 为基础
vm.getCertificateList(); // 获取证书列表
vm.componentBasicInfo(); // 根据ID查询组件基本信息
vm.getTestListData(); // 获取考试列表
vm.getCourseData(); // 获取课程列表
vm.getTemplateData(); // 获取模板信息
vm.conditionSelect = vm.resultFlag == 2 || vm.componentStatus == 3 || vm.componentStatus == 4
// vm.conditionSelect = vm.resultFlag == 2 || vm.componentStatus == 4
vm.newconditionSelect = vm.componentStatus == 4
if(vm.componentStatus && vm.resultFlag) {
vm.conditionAnd = vm.resultFlag == 1 && vm.componentStatus != 3 && vm.componentStatus != 4
//vm.conditionAnd = vm.resultFlag == 1 && vm.componentStatus != 3 && vm.componentStatus != 4
vm.conditionAnd = vm.componentStatus != 4
}
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
console.log('idType==>',vm.idType)
},
methods: {
// 根据ID查询组件基本信息
......@@ -583,10 +604,10 @@ export default {
}
if(flag == 2) {
vm.stepNum = 2
vm.getTemplateData()
//vm.getTemplateData()
vm.getModuleData()
vm.getTestListData()
vm.getCourseData()
// vm.getTestListData()
// vm.getCourseData()
} else {
vm.$message.info("暂存成功!")
}
......@@ -607,10 +628,10 @@ export default {
}
if(flag == 2) {
vm.stepNum = 2
vm.getTemplateData()
//vm.getTemplateData()
vm.getModuleData()
vm.getTestListData()
vm.getCourseData()
// vm.getTestListData()
// vm.getCourseData()
} else {
vm.$message.info("暂存成功!")
}
......@@ -718,11 +739,43 @@ export default {
vm.GET('portal/portalComponent/ModuleList',{componentId: vm.componentId}).then((res) => {
if( res.code == '000000') {
vm.componentList.moduleModelList = res.data.moduleModelList
vm.setOpenStatusFromData(vm.componentList.moduleModelList)
}else {
vm.$message.info(res.message)
}
})
},
// 从接口数据的status判断启用状态
setOpenStatusFromData(list){
// 1模块未启用 2模块已启用
for(let i=0;i<list.length;i++){
if(list[i].status == 2){
vm.componentList.moduleModelList[i].statusFlag = true;
}else{
vm.componentList.moduleModelList[i].statusFlag = false;
vm.componentList.moduleModelList[i].openDisabled = true;
}
}
},
fieldDisabled(item){
// return vm.conditionSelect || item.moduleType == 2 || (item.id != '' && item.openFlag == 2) || vm.idType == 2 || item.statusFlag
return vm.newconditionSelect || item.moduleType == 2 || vm.idType == 2 || (vm.componentStatus != 1 && vm.componentStatus != 2 && item.statusFlag);
},
newfieldDisabled(item) {
//conditionAnd && item.moduleType == 1 && (item.id == '' || (item.id != '' && item.status == 1)) && idType == 1
return vm.conditionAnd && ((vm.componentStatus == 1 || vm.componentStatus == 2) || ((vm.componentStatus != 1 || vm.componentStatus != 2) && !item.statusFlag)) && item.moduleType == 1 && vm.idType == 1
},
// 选择是否启用状态
selectIsOpenStatus(index) {
const status = vm.componentList.moduleModelList[index].status;
if(status == 1){
vm.componentList.moduleModelList[index].openFlag = 1;
vm.componentList.moduleModelList[index].openDisabled = true;
}else{
vm.componentList.moduleModelList[index].openDisabled = false;
}
vm.$forceUpdate();
},
// 模块是否对外开放
selectIsOpen(index) {
for(let i = 0; i < vm.componentList.moduleModelList.length; i++) {
......@@ -740,6 +793,12 @@ export default {
break
}
}
// const openFlag = vm.componentList.moduleModelList[index].openFlag;
// if(openFlag == 2){
//// vm.componentList.moduleModelList[index].openFlag = 1;
// vm.componentList.moduleModelList[index].statusFlag = true;
// }
// vm.$forceUpdate();
},
// 删除tab
removeTab(targetName) {
......@@ -794,8 +853,10 @@ export default {
name: '',
openFlag: 1, // 1不开放 2开放
moduleType: 1, // 2为从预设模块中添加
status: 1, // 1 不启用 2启用
templetModelList: []
})
});
vm.componentList.moduleModelList[(vm.componentList.moduleModelList.length - 1)].openDisabled = true;
},
// 添加模板
addTemplate(item,index) {
......@@ -978,11 +1039,10 @@ export default {
vm.$message.info("请输入模块名称")
return
}
if(isEmptyList(vm.componentList.moduleModelList[i].templetModelList)) {
if(isEmptyList(vm.componentList.moduleModelList[i].templetModelList) && vm.componentList.moduleModelList[i].status == 2 ) {
vm.$message.info("模块内容不能为空")
return
}
for(let j = 0; j < vm.componentList.moduleModelList[i].templetModelList.length; j++) {
for(let k = 0; k < vm.componentList.moduleModelList[i].templetModelList[j].partModelList.length; k++) {
// 考试
......@@ -997,7 +1057,6 @@ export default {
return
}
}
}
}
}
......@@ -1026,11 +1085,9 @@ export default {
vm.componentList.moduleModelList[i].templetModelList[j].partModelList[k].partContentModelList[0].content3 = vm.certificateIdSelect[q].name
}
}
}
}
}
}
}
}
......@@ -1038,15 +1095,17 @@ export default {
vm.$nextTick(() => {
for(let i=0;i<vm.componentList.moduleModelList.length;i++) {
if(!vm.componentList.moduleModelList[i].name) {
if(flag == 2) {
return
}else {
}
}
}
console.log(vm.componentList.moduleModelList)
vm.POST('portal/portalComponent/insertOrUpdatePortalModule',{model: vm.componentList.moduleModelList,status: flag}).then((res) => {
if( res.code == '000000') {
vm.enableComponent(req, flag)
}
})
}
}
})
},
// 启用
......
......@@ -143,9 +143,9 @@ export default {
},
created() {
vm = this
vm.search()
vm.idType = localStorage.getItem('storageIdType')
vm.masterAdministratorFlag = localStorage.getItem('storageMaster')
vm.search()
},
// 挂载到Dom完成时
mounted: function() {
......
......@@ -360,28 +360,61 @@ export default {
}
});
} else {
if (type === 8) {
//取消审批值对应2
type = 2;
// if (type === 8) {
// //取消审批值对应2
// type = 2;
// let req = {
// portalProjectId: projectId,
// warnType: 5
// };
// vm.GET("portal/portalCheck/remindPortalCheck", req).then(res => {
// vm.$message.info(res.message);
// if (res.code == "000000") {
// console.log(res);
// vm.getProjectList();
// }
// });
// }
// if (type == 4 || type == 6) {
// //发送消息
// let warnType = "";
// if (type == 4) {
// warnType = 3;
// } else if (type == 6) {
// warnType = 4;
// }
// let req = {
// portalProjectId: projectId,
// warnType: warnType
// };
// vm.GET("portal/portalCheck/remindPortalCheck", req).then(res => {
// vm.$message.info(res.message);
// if (res.code == "000000") {
// console.log(res);
// vm.getProjectList();
// }
// });
// }
let req = {
portalProjectId: projectId,
warnType: 5
projectId: projectId,
changeStatus: vm.getType(type)
};
vm.GET("portal/portalCheck/remindPortalCheck", req).then(res => {
vm.POST("portal/portalInfo/changeStatus", req).then(res => {
vm.$message.info(res.message);
if (res.code == "000000") {
console.log(res);
vm.getProjectList();
}
});
}
if (type == 4 || type == 6) {
//changeStatus之后remindPortalCheck
if (type == 4 || type == 6 || type == 8) {
//发送消息
let warnType = "";
if (type == 4) {
warnType = 3;
} else if (type == 6) {
warnType = 4;
} else if (type == 8) {
warnType = 5;
}
let req = {
portalProjectId: projectId,
......@@ -390,24 +423,21 @@ export default {
vm.GET("portal/portalCheck/remindPortalCheck", req).then(res => {
vm.$message.info(res.message);
if (res.code == "000000") {
console.log(res);
vm.getProjectList();
}
});
}
let req = {
projectId: projectId,
changeStatus: type
};
vm.POST("portal/portalInfo/changeStatus", req).then(res => {
vm.$message.info(res.message);
if (res.code == "000000") {
console.log(res);
vm.getProjectList();
}
});
}
},
getType(value) {
let data = value;
if(data == 8) {
data = 2;
}
return data;
},
//删除项目
delItem(row) {
let req = {};
......
......@@ -26,12 +26,20 @@
label="年龄"
align="center"
min-width="70px">
<template slot-scope="scope">
<span v-if="scope.row.age || scope.row.age===0">{{scope.row.age}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="id"
prop="idNo"
label="身份证号"
align="center"
min-width="220">
<template slot-scope="scope">
<span v-if="scope.row.idNo">{{scope.row.idNo}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="mobilePhone"
......@@ -43,7 +51,8 @@
prop="labelId"
label="分组"
align="center"
min-width="200">
min-width="200"
:show-overflow-tooltip="true">
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="margin-top20">
......@@ -85,6 +94,23 @@
hasSelectedList: Array, // 所有已选人数
},
mounted() {
if(this.hasSelectedList.length){
this.hasSelectedList.forEach((item) => {
let groupNames = []
//转化分组
if(item.labelModels) {
item.labelModels.forEach(item => {
groupNames.push(item.label)
});
item.labelId = groupNames.join('、');
} else if(item.labelId){
item.labelId = item.labelId;
// item.labelId = '-';
}else {
item.labelId = '-';
}
});
}
this.eachHasSelectedList = this.getPageList(this.hasSelectedList)
const totalLength = this.hasSelectedList.length
this.paginationSet.total = totalLength
......
......@@ -97,6 +97,7 @@
:patientIdList="baseInfo.patientIdList"
@closeSelectPatient="closeSelectPatient"
@sureSelectPatient="sureSelectPatient(arguments)"
:selectPatientType="selectPatientType"
/>
<has-selected-patient
v-if="isShowSelectedDialog"
......@@ -109,7 +110,8 @@
<script>
import BreadCrumb from '@/components/breadcrumb'
import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
// import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
import SelectPatient from '@/views/patients/labels-manage/dialog/select-patitents';
import HasSelectedPatient from '@/views/followup/plan-manage/dialog/has-selected-patient';
import SetTimeNode from '@/views/followup/plan-manage/dialog/set-time-node';
import { createFollowPlan, getFollowupTableTemplate } from '@/utils/followup/followapis'
......@@ -151,6 +153,7 @@
},
isShowSelectPatient: false,
isShowSelectedDialog: false,
selectPatientType: 1,
hasSelectedList: [],
rules: {
name: [{ required: true, message: '请输入随访计划名称', trigger: 'blur' }],
......
......@@ -66,7 +66,8 @@
:patientIdList="planDetailData.patientIdList"
:oldPatientIdList="selectResidentIdList"
@closeSelectPatient="closeSelectPatient"
@sureSelectPatient="sureSelectPatient(arguments)">
@sureSelectPatient="sureSelectPatient(arguments)"
:selectPatientType="selectPatientType">
</select-patient>
<has-selected-patient
v-if="isShowSelectedDialog"
......@@ -83,7 +84,8 @@
</template>
<script>
import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
// import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
import SelectPatient from '@/views/patients/labels-manage/dialog/select-patitents';
import HasSelectedPatient from '@/views/followup/plan-manage/dialog/has-selected-patient';
import SetTimeNode from '@/views/followup/plan-manage/dialog/set-time-node';
......@@ -144,6 +146,7 @@
newHasSelectedList: [],
initResidentList: [], //重置需要的居民列表
initResidentIdList: [], //重置需要的id
selectPatientType: 1,
}
},
created() {
......@@ -341,7 +344,7 @@
people = {
nickname: item.patientName,
age: item.age,
id: item.idNo,
idNo: item.idNo,
mobilePhone: item.mobilePhone,
labelId: item.labelName,
patientId: item.patientId
......
......@@ -136,7 +136,8 @@
:patientIdList="initialPatientIdList"
:oldPatientIdList="initialPatientIdList"
@closeSelectPatient="closeSelectPatient"
@sureSelectPatient="sureSelectPatient(arguments)">
@sureSelectPatient="sureSelectPatient(arguments)"
:selectPatientType="selectPatientType">
</select-patient>
<add-patient-time
:showThisPage="showAddPatientTime"
......@@ -151,7 +152,8 @@
//结束随访dialog
import FinishFollowup from '@/views/followup/plan-manage/dialog/finish-followup';
//添加居民
import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
// import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
import SelectPatient from '@/views/patients/labels-manage/dialog/select-patitents';
//添加居民选择随访时间
import addPatientTime from '@/views/followup/plan-manage/dialog/add-patient-time';
......@@ -189,6 +191,7 @@
statusTotal: null, //每种状态的总数
planTitle: '', //随访计划名称
residentCrumb: [], //面包屑
selectPatientType: 1,
getRowKeys(row) {
return row.patientId;
},
......
......@@ -3,54 +3,54 @@
<bread-crumb :curmbFirst="curmbFirst"></bread-crumb>
<div class="message-content">
<el-row>
<el-col class="visitor screenSet" :span="24">
<div class="visitor-title">
<div class="title">今日随访:
<span style="color:#449284;margin-right: 10px">{{todayPlansList.length}}</span>
<span class="type-button" :style="{background:(planBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayPlansList(0)">未完成</span>
<span class="type-button" :style="{background:(!planBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayPlansList(1)">已过期</span>
</div>
<span class="visitor-more" @click="lookMore(1)">查看更多</span>
</div>
<div class="visitor-info">
<el-table
:data="todayPlansList"
style="width: 100%">
<el-table-column prop="patientName" label="姓名" align="center"></el-table-column>
<el-table-column prop="appointTime" label="预约时间" align="center"></el-table-column>
<el-table-column prop="fuTypeStr" label="随访方式" align="center"></el-table-column>
<el-table-column prop="content" label="操作" align="center">
<template slot-scope="scope">
<span class="text-btn" @click="goToScale(scope.row)">随访录入</span> | <span class="text-btn" @click="changeFollowStatus(scope.row)">变更随访状态</span>
</template>
</el-table-column>
</el-table>
</div>
</el-col>
<el-col class="visitor screenSet" :span="24" style="margin-top: 0;margin-bottom: 0;">
<div class="visitor-title">
<div class="title">今日预约
<span class="type-button" :style="{background:(appointBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayAppointsList(0)" style="margin-left: 10px;">未完成</span>
<span class="type-button" :style="{background:(!appointBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayAppointsList(1)" >已过期</span>
</div>
<span class="visitor-more" @click="lookMore(2)">查看更多</span>
</div>
<div class="visitor-info">
<el-table
:data="todayAppointsList"
style="width: 100%">
<el-table-column prop="planName" label="随访计划名称" align="center"></el-table-column>
<el-table-column prop="appointTime" label="随访计划时间" align="center"></el-table-column>
<el-table-column prop="appointedCount" label="已经预约" align="center"></el-table-column>
<el-table-column prop="notAppointedCount" label="未预约" align="center"></el-table-column>
<el-table-column prop="content" label="操作" align="center">
<template slot-scope="scope">
<span class="text-btn" @click="goToReservation(scope.row.planName, scope.row.appointTime)">去预约</span>
</template>
</el-table-column>
</el-table>
</div>
</el-col>
<!--<el-col class="visitor screenSet" :span="24">-->
<!--<div class="visitor-title">-->
<!--<div class="title">今日随访:-->
<!--<span style="color:#449284;margin-right: 10px">{{todayPlansList.length}}</span>-->
<!--<span class="type-button" :style="{background:(planBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayPlansList(0)">未完成</span>-->
<!--<span class="type-button" :style="{background:(!planBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayPlansList(1)">已过期</span>-->
<!--</div>-->
<!--<span class="visitor-more" @click="lookMore(1)">查看更多</span>-->
<!--</div>-->
<!--<div class="visitor-info">-->
<!--<el-table-->
<!--:data="todayPlansList"-->
<!--style="width: 100%">-->
<!--<el-table-column prop="patientName" label="姓名" align="center"></el-table-column>-->
<!--<el-table-column prop="appointTime" label="预约时间" align="center"></el-table-column>-->
<!--<el-table-column prop="fuTypeStr" label="随访方式" align="center"></el-table-column>-->
<!--<el-table-column prop="content" label="操作" align="center">-->
<!--<template slot-scope="scope">-->
<!--<span class="text-btn" @click="goToScale(scope.row)">随访录入</span> | <span class="text-btn" @click="changeFollowStatus(scope.row)">变更随访状态</span>-->
<!--</template>-->
<!--</el-table-column>-->
<!--</el-table>-->
<!--</div>-->
<!--</el-col>-->
<!--<el-col class="visitor screenSet" :span="24" style="margin-top: 0;margin-bottom: 0;">-->
<!--<div class="visitor-title">-->
<!--<div class="title">今日预约-->
<!--<span class="type-button" :style="{background:(appointBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayAppointsList(0)" style="margin-left: 10px;">未完成</span>-->
<!--<span class="type-button" :style="{background:(!appointBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayAppointsList(1)" >已过期</span>-->
<!--</div>-->
<!--<span class="visitor-more" @click="lookMore(2)">查看更多</span>-->
<!--</div>-->
<!--<div class="visitor-info">-->
<!--<el-table-->
<!--:data="todayAppointsList"-->
<!--style="width: 100%">-->
<!--<el-table-column prop="planName" label="随访计划名称" align="center"></el-table-column>-->
<!--<el-table-column prop="appointTime" label="随访计划时间" align="center"></el-table-column>-->
<!--<el-table-column prop="appointedCount" label="已经预约" align="center"></el-table-column>-->
<!--<el-table-column prop="notAppointedCount" label="未预约" align="center"></el-table-column>-->
<!--<el-table-column prop="content" label="操作" align="center">-->
<!--<template slot-scope="scope">-->
<!--<span class="text-btn" @click="goToReservation(scope.row.planName, scope.row.appointTime)">去预约</span>-->
<!--</template>-->
<!--</el-table-column>-->
<!--</el-table>-->
<!--</div>-->
<!--</el-col>-->
<el-col class="message screenSet" :span="24" id="screenSet">
<div class="message-title">系统消息 <span>今日消息:{{count}}条</span></div>
<div class="message-info" v-if="messageList.length > 0">
......@@ -60,7 +60,7 @@
<span>{{item.menuName}}</span>
<span>{{item.portalTime}}</span>
</div>
<div class="text-bottom">{{item.content}}</div>
<div class="text-bottom" v-html="item.content"></div>
</div>
</div>
<div class="no-message" v-else>
......@@ -143,7 +143,7 @@ export default {
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
// commonUtil.resizeHeight()
},
methods: {
...mapActions('workbench', ['getTodayPlansList', 'getTodayAppointsList', 'getTodayOverview']),
......@@ -303,15 +303,16 @@ export default {
}
.message {
padding: 0 25px 30px;
margin-top: 20px;
/*margin-top: 20px;*/
margin-top: 90px;
background: #fff;
@media screen and (min-width:1240px) and (max-width:1900px) {
width: 95%;
height: 320px !important;
// height: 320px !important;
}
@media screen and (min-width:1900px) {
width: 96.7%;
height: 400px !important;
// height: 400px !important;
}
.message-title {
font-size: 20px;
......@@ -355,7 +356,8 @@ export default {
text-align: center;
img {
width: 100px;
margin-top: 17%;
// margin-top: 17%;
margin: 6% 0 6%;
}
}
}
......
......@@ -4,6 +4,7 @@
<img src="../../assets/image/index_logoicon.png"/>
<p>云鹊医工作站</p>
</div>
<div class="user-info">
<el-dropdown trigger="click" @command="handleCommand">
<div class="el-dropdown-link">
......@@ -16,13 +17,37 @@
</el-dropdown-menu>
</el-dropdown>
</div>
<div class="exp-msg">
<el-row :gutter="20">
<el-col :span="9" class="msg-opinion">
<div class="grid-content bg-purple">
<i class="el-icon-edit"></i>
<h1 @click="opinionShow=true">意见反馈</h1>
</div>
</el-col>
<el-col :span="15" class="msg-phone">
<div class="grid-content bg-purple-light" style="cursor: default;">
<i class="el-icon-phone" style="cursor: default;"></i>
<h1 style="cursor: default;">400-920-8877</h1>
</div>
</el-col>
</el-row>
</div>
<opinionDialog v-if="opinionShow" @closeDialog="closeDialog"></opinionDialog>
</div>
</template>
<script>
import { getLoginUrl,getInnerLoginUrl, getYunQueYiUrl } from '../../utils/index.js'
import { mapGetters } from 'vuex'
import opinionDialog from '@/components/opinionDialog'
let vm = null
export default {
components: {
opinionDialog
},
props: {
portrait: {
type: String
......@@ -37,7 +62,8 @@ export default {
data() {
return {
name: '',
systemInfoList: []
systemInfoList: [],
opinionShow: false
}
},
computed: {
......@@ -66,6 +92,9 @@ export default {
if(command === 'forward') {
window.location.href = getYunQueYiUrl()
}
},
closeDialog(val){
this.opinionShow = val
}
}
}
......@@ -78,7 +107,7 @@ export default {
box-sizing: border-box;
height: 64px;
width: 100%;
z-index: 1000;
// z-index: 1000;
font-size: 22px;
line-height: 64px;
color: #fff;
......@@ -100,6 +129,31 @@ export default {
margin-left: 60px;
}
}
.exp-msg{
float: right;
line-height: 64px;
.msg-opinion{
width: 140px;
}
.msg-phone{
width: 180px;
}
.grid-content{
i,h1{
display: inline-block;
vertical-align: middle;
font-size: 16px;
line-height: 32px;
color: #838683;
cursor: pointer;
}
h1{
padding-right: 20px;
border-right: 1px solid #838683;
}
}
}
.user-info {
float: right;
padding-right: 50px;
......
......@@ -8,24 +8,40 @@
<el-menu-item v-for="(subItem,i) in item.subs" :key="i" :index="'/'+subItem.index">
<i class="sub-icon" :class="subItem.icon"></i>
{{subItem.title}}
<p class="redNum"
v-if="subItem.title == '资料不全居民'
&&notCompleteCount
&&$route.path!='/patients-manage/not-complete/uncompleted-list'"
>
<span v-if="notCompleteCount>999">+999</span>
<span v-else>{{notCompleteCount}}</span>
</p>
</el-menu-item>
</el-submenu>
</template>
<template v-else>
<template v-if="item.isMessageSend">
<el-menu-item :index="'/'+item.index" :key="item.index" @click="goToMessageSendPage(item.checkAuth)" class="set-normal-background">
<i :class="item.icon"></i>{{ item.title }}
</el-menu-item>
</template>
<template v-else>
<el-menu-item :index="'/'+item.index" :key="item.index">
<i :class="item.icon"></i>{{ item.title }}
</el-menu-item>
</template>
</template>
</template>
</el-menu>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { setTimeout } from 'timers'
import { isNotEmptyUtils } from '../../utils/utils'
let vm = null
export default {
import utils from '@/utils/followup/followupUtils';
import { mapGetters } from 'vuex'
import { setTimeout } from 'timers'
import { isNotEmptyUtils } from '../../utils/utils'
let vm = null
export default {
props: {
storageIdType: {
type: Number,
......@@ -37,6 +53,9 @@ export default {
authList: {
type: Object,
default: () => {}
},
notCompleteCount: {
type: Number,
}
},
data() {
......@@ -46,7 +65,6 @@ export default {
title: '数据总览',
icon: 'el-icon-menu',
index: 'home',
},{
title: '教培项目',
icon: 'el-icon-message',
......@@ -74,8 +92,56 @@ export default {
index: 'role'
}
]
},{
title: '居民管理',
icon: 'el-icon-patients-manage',
index: 'patients-manage',
subs: [
{
title: '我的居民',
icon: 'el-icon-setting',
index: 'patients-manage/mypatients-manage/patients-list'
},
{
title: '新增居民',
icon: 'el-icon-setting',
index: 'patients-manage/new-manage/new-patient'
},
{
title: '分组管理',
icon: 'el-icon-setting',
index: 'patients-manage/labels-manage/labels-list'
},
{
title: '资料不全居民',
icon: 'el-icon-setting',
index: 'patients-manage/not-complete/uncompleted-list'
}
]
},{
title: '消息推送',
icon: 'el-icon-message',
index: 'msg-push',
isMessageSend: true,
checkAuth: true,
},{
title: '学情报告',
icon: 'el-icon-tickets',
index: 'report-list',
subs: [
{
title: '项目列表',
icon: 'el-icon-document',
index: 'report-list'
},
{
title: '导出下载',
icon: 'el-icon-document',
index: 'export-download'
}
]
},
]
}
},
computed: {
......@@ -88,7 +154,7 @@ export default {
},
mounted(){
if(vm.storageIdType==2){
vm.setFollowSide()
// vm.setFollowSide()
}
},
watch: {
......@@ -105,7 +171,7 @@ export default {
},
storageIdType(val,ov){
if(val==2){
vm.setFollowSide()
// vm.setFollowSide()
}
}
},
......@@ -134,12 +200,37 @@ export default {
]
}
vm.items.push(followSider);
},
goToMessageSendPage(checkAuth) {
if(checkAuth){
utils.checkAuthFunc().then(res=>{
console.log(res)
if(res==3){
}else{
return
}
let env = process.env.BUILD_ENV;
let src = '';
if( (env == 'development') || (env == 'dev') ){ // 本地开发环境 || jenkins dev
src = 'https://dev-saas.yunqueyi.com/pica-frontend/patientEduManage/pica_patient_edu_manage.html#/pageTab/message'
}else if( (env == 'test') || (env == 'test2') ){ // test
src = 'https://test1.yunqueyi.com/pica-frontend/patientEduManage/pica_patient_edu_manage.html#/pageTab/message';
}else if( env == 'uat' ){ // uat
src = 'https://uat.yunqueyi.com/pica-frontend/patientEduManage/pica_patient_edu_manage.html#/pageTab/message';
}else if( env == 'pro' ){ // 线上
src = 'https://www.yunqueyi.com/pica-frontend/patientEduManage/pica_patient_edu_manage.html#/pageTab/message';
}
location.href = src;
// let newTab=window.open('about:blank');
// newTab.location = src;
})
}
},
}
}
}
</script>
<style lang="scss">
.slidebar-container {
.slidebar-container {
display: block;
position: absolute;
left: 0;
......@@ -170,8 +261,31 @@ export default {
// .el-menu-item:focus, .el-menu-item:hover {
// background: #06232C !important;
// }
.el-icon-patients-manage{
width: 17px;
height: 17px;
background: url('../../assets/image/patients-icon.png');
margin: 0 8px 0 3px ;
background-size: 17px 17px;
opacity: 0.6;
}
.set-normal-background{
background: #06232C;
}
}
.redNum {
display: inline-block;
border-radius: 10px;
margin-left: 15px;
background: #EE263E;
color: #fff;
font-size: 12px;
line-height: 12px;
/*padding: 5px 10px;*/
padding: 2px 5px;
span {
display: block;
}
}
}
}
</style>
<template>
<div class="data-alignment">
<div class="alignment-header">
<el-row>
<el-col :span="18">
<div class="title">数据调整</div>
</el-col>
<el-col :span="3">
<el-button class="add-button" size="small" type="primary" @click="saveUpdate">保存修改</el-button>
</el-col>
<el-col :span="3">
<el-button class="add-button" size="small" @click="close">取消</el-button>
</el-col>
</el-row>
</div>
<div class="text">
<p>地区:{{ dialogData.region }}</p>
<p>选择机构:{{ dialogData.organization }}</p>
</div>
<el-form
class="form-update"
ref="serchForm"
:model="formData"
label-width="100px"
style="width:40%;"
>
<el-form-item label="项目成绩:">
<el-select
v-model="formData.achievementStatus"
size="small"
style="width: 100%;"
placeholder="请选择项目成绩"
>
<el-option
v-for="(item,index) in achievementList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="统计状态:">
<el-select
v-model="formData.status"
size="small"
style="width: 100%;"
placeholder="请选择统计状态"
>
<el-option
v-for="(item,index) in statusList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-form>
<div class="form-button">
<el-button @click="searchData()" type="primary">查询</el-button>
<el-button @click="resetForm()">重置</el-button>
</div>
<!-- <div class="line"></div> -->
<p class="explain">说明:只有被勾选中的人才会归入数据统计范围,不勾的不会统计</p>
<el-table
class="data-main"
border
center
ref="multipleTable"
:data="tableData"
tooltip-effect="dark"
@selection-change="handleSelectionChange"
:row-key="getRowKeys"
>
<el-table-column type="selection" width="55" :reserve-selection="true"></el-table-column>
<el-table-column prop="name" label="姓名" min-width="80"></el-table-column>
<el-table-column prop="projectStatus" label="项目状态" width="120">
<template slot-scope="scope">{{ scope.row.projectStatus | projectStatus }}</template>
</el-table-column>
<el-table-column prop="projectResult" label="项目成绩" width="120">
<template slot-scope="scope">{{ scope.row.projectResult | recordValue }}</template>
</el-table-column>
<el-table-column prop="hospitalName" label="机构" min-width="120" show-overflow-tooltip></el-table-column>
<el-table-column prop="departmentName" label="科室" show-overflow-tooltip></el-table-column>
<el-table-column prop="provinceName" label="省/直辖市" show-overflow-tooltip></el-table-column>
<el-table-column prop="cityName" label="市" show-overflow-tooltip></el-table-column>
<el-table-column prop="countyName" label="区/县" show-overflow-tooltip></el-table-column>
<el-table-column prop="townName" label="乡镇/街道" show-overflow-tooltip></el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有相关数据,请重新选择查询范围</p>
</div>
</div>
</el-table>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNo"
:page-sizes="[20, 50 ,100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
></el-pagination>
</div>
<el-dialog title="发布学情报告" :visible.sync="dialogVisible" width="30%" append-to-body>
<p style="color:red">项目【{{ projectName }}】的数据修改</p>
<p>确认需要更新学情报告吗?</p>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="updateData()">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { openLoading, closeLoading } from "../../utils/utils";
import * as operationData from "../../utils/operation";
let vm;
export default {
props: {
formInline: {
type: Object
},
organizationList: {
type: Array
},
dialogData: {
type: Object
}
},
data() {
return {
formData: {
achievementStatus: "",
status: 1,
pageNo: 1,
pageSize: 20,
},
achievementList: [
//项目状态
{
label: "全部",
value: '',
},
{
label: "通过",
value: 1
},
{
label: "不通过",
value: 2
},
{
label: "无成绩",
value: 3
}
],
statusList: [
//项目状态
{
label: "全部",
value: 1
},
{
label: "归入统计",
value: 2
},
{
label: "移除统计",
value: 3
},
],
tableData: [],
multipleSelection: [], //被选中的行
totalRows: 0, //数据总数
getRowKeys(row) {
return row.doctorId;
},
selectedData: [],
dialogVisible: false,
projectId: "",
projectName: "",
changedDoctor: [],
changedDoctor2: [],
lookedDoctor: [],
};
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "id");
this.projectName = vm.getUrlSearch(window.location.href, "projectName");
// this.search();
console.log(vm.dialogData);
},
mounted: function() {
//父组件传值
this.$on("search", () => {
// this.lookedDoctor = [];
// this.changedDoctor = [];
// this.changedDoctor2 = [];
// this.$refs.multipleTable.clearSelection();
this.resetForm();
// this.search();
});
},
methods: {
// 将选中行放入数组
handleSelectionChange(rows) {
this.changedDoctor = [];
this.changedDoctor2 = [];
this.selectedData = [];
if (rows) {
rows.forEach(row => {
if (row) {
this.changedDoctor.push(row.doctorId);
}
});
}
this.changedDoctor2 = operationData.getDifference(
this.lookedDoctor,
this.changedDoctor
);
console.log(
"选",
this.changedDoctor,
"没",
this.changedDoctor2
);
},
// 更改数据显示数量
handleSizeChange(val) {
console.log(`每页 ${val} 条`);
vm.formData.pageSize = val;
vm.search();
},
// 换页
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
vm.formData.pageNo = val;
vm.search();
},
close() {
this.$emit("closeDialog");
},
searchData() {
vm.formData.pageNo = 1;
vm.search();
},
search() {
setTimeout(function(){
openLoading(vm);
},20);
let checkAll = operationData.hasAll(vm.formInline.organization);
let req = {
projectId: vm.projectId,
achievementStatus: vm.formData.achievementStatus,
status: vm.formData.status,
ids: operationData.getIds(vm.formInline,vm.organizationList,checkAll),
type: operationData.getSearchType(vm.formInline,checkAll),
pageNo: vm.formData.pageNo,
pageSize: vm.formData.pageSize,
};
vm.reportGET("report/portal/getProjectData", req).then(res => {
// closeLoading(vm);
if (res.code == "000000") {
vm.tableData = res.data.projectData;
vm.totalRows = res.data.count;
let idList = operationData.getDoctorIdList(vm.tableData);
// console.log('idList',idList);
vm.lookedDoctor = operationData.getUnion(
vm.lookedDoctor,
idList
);
vm.initDoctorChoose();
}
});
},
initDoctorChoose() {
let tableStatus = vm.tableData;
if(typeof tableStatus === 'undefined') {
return;
}
tableStatus.forEach(row => {
let idList = [];
idList[0] = row.doctorId;
let intersect = operationData.getIntersect(idList,this.changedDoctor);
let intersect2 = operationData.getIntersect(idList,this.changedDoctor2);
// console.log('intersect',intersect,'intersect2',intersect2);
//debugger;
if(intersect.length > 0) {
//选中
//this.$refs.multipleOrganization.toggleRowSelection(row);
} else if (intersect2.length > 0) {
//不选
} else {
if (row.status == 1) {
this.$nextTick(function() {
this.$refs.multipleTable.toggleRowSelection(row);
});
}
}
});
},
//重置
resetForm() {
this.lookedDoctor = [];
this.changedDoctor = [];
this.changedDoctor2 = [];
this.$refs.multipleTable.clearSelection();
vm.formData = Object.assign(
{},
{
achievementStatus: "",
status: 1,
pageNo: 1,
pageSize: 20,
}
);
vm.search();
},
saveUpdate() {
this.dialogVisible = true;
},
updateData() {
let req = {
projectId: vm.projectId,
removeDoctorIdList: operationData.getAjustmentList(vm.changedDoctor2),
joinDoctorIdList: operationData.getAjustmentList(vm.changedDoctor),
};
openLoading(vm);
vm.reportPOST("report/portal/peopleAdjustment", req).then(res => {
closeLoading(vm);
vm.$message(res.message);
if (res.code == "000000") {
this.$emit("closeSearch");
}
});
this.dialogVisible = false;
}
}
};
</script>
<style lang='scss' rel='stylesheet/scss'>
.data-alignment {
background: #fff;
.alignment-header {
padding: 20px;
margin: 0 30px;
border-bottom: 1px solid #606266;
}
.text {
margin-top: 30px;
margin-left: 98px;
font-size: 13px;
color: #606266;
}
.form-update {
margin: 30px 0px 0px 60px;
}
.form-button {
width: 45%;
top: -62px;
position: relative;
left: 50%;
}
.line {
margin: -20px 30px 30px 30px;
width: 100%;
border-bottom: 1px solid #606266;
}
.explain {
margin: 10px 0 10px 38px;
font-size: 13px;
color: #606266;
}
.data-main {
margin-left: 36px;
width: 90%;
// padding: 0 40px;
.select {
margin-bottom: 30px;
}
}
.pagination {
margin-right: 10px;
}
}
</style>
<template>
<div class="export-download">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<div class="component-content screenSet" id="screenSet">
<p>导出文件列表</p>
<el-table :data="tableData" style="width: 100%">
<el-table-column
prop="title"
label="名称"
align="center"
min-width="150"
show-overflow-tooltip
></el-table-column>
<el-table-column prop="createdTime" label="时间" align="center" min-width="120">
<template slot-scope="scope">{{ scope.row.createdTime }}</template>
</el-table-column>
<el-table-column prop="status" label="状态" align="center" min-width="150">
<template slot-scope="scope">{{ scope.row.status | exportStatus }}</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="70">
<template slot-scope="scope">
<el-button
type="primary"
:disabled="scope.row.buttonStatus"
size="small"
@click="update(scope.row)"
>{{ scope.row.buttonText }}</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有相关数据,请重新选择查询范围</p>
</div>
</div>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="param.pageNo"
:page-sizes="[20, 50 ,100]"
:page-size="param.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
></el-pagination>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "../../components/breadcrumb.vue";
import * as commonUtil from "../../utils/utils";
import { openLoading, closeLoading } from "../../utils/utils";
import axios from "axios";
let vm = null;
export default {
components: {
BreadCrumb
},
data() {
return {
curmbFirst: "学情报告",
curmbSecond: "导出下载",
projectId: "",
tableData: [],
param: {
pageSize: 20,
pageNo: 1
},
totalRows: 0,
totalTime: 3,
queryData: {}
// buttonText: "刷新",
// buttonStatus: false,
};
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "projectId");
this.search();
},
mounted: function() {
commonUtil.resizeHeight();
},
methods: {
setButton() {
for (let i = 0; i < vm.tableData.length; i++) {
vm.tableData[i].index = i;
if (vm.tableData[i].status == 1) {
vm.tableData[i].buttonText = "下载";
vm.tableData[i].buttonStatus = false;
} else if(vm.tableData[i].status == 0) {
vm.tableData[i].buttonText = "刷新";
vm.tableData[i].buttonStatus = false;
} else if(vm.tableData[i].status == 2) {
vm.tableData[i].buttonText = "刷新";
vm.tableData[i].buttonStatus = true;
}
}
},
search() {
// this.setButton();
let req = {
projectId: vm.projectId
};
if(req.projectId == null) {
req.projectId = '';
}
vm.reportGET("report/downLoad/getDownloadList", req).then(res => {
if (res.code == "000000") {
vm.tableData = res.data.data;
vm.totalRows = res.data.totalRows;
vm.setButton();
}
});
},
downLoad(row) {
// vm.queryData = this.$route.query;
// let req = vm.queryData;
// openLoading(vm);
// vm.reportGET("report/downLoad/downLoad", req).then(res => {
// closeLoading(vm);
// // console
// if (res.code == "000000") {
// }
// });
setTimeout(() => {
window.open(row.fileUrl);
}, 500);
},
getDownLoadStatus(row) {
let req = {
id: row.id
};
vm.reportGET("report/downLoad/getDownLoadStatus", req).then(res => {
if (res.code == "000000") {
vm.tableData[row.index].status = res.data.data;
// console.log('res.data.data',res.data.data);
if (res.data.data == 1) {
vm.tableData[row.index].title = vm.tableData[row.index].title + " ";
vm.tableData[row.index].buttonText = "下载";
vm.tableData[row.index].fileUrl = res.data.url;
} else if(res.data.data == 0) {
console.log("res", res, vm.tableData[row.index]);
vm.tableData[row.index].title = vm.tableData[row.index].title + " ";
vm.tableData[row.index].buttonText = "刷新";
} else if(res.data.data == 2) {
vm.tableData[row.index].title = vm.tableData[row.index].title + " ";
vm.tableData[row.index].buttonText = "刷新";
vm.tableData[row.index].buttonStatus = true;
}
} else {
vm.$message(res.message);
vm.tableData[row.index].title = vm.tableData[row.index].title + " ";
vm.tableData[row.index].buttonText = "刷新";
}
});
},
update(row) {
if (vm.tableData[row.index].status == 1) {
vm.downLoad(row);
} else {
this.$nextTick(function() {
console.log(vm.tableData[row.index]);
let nowTime = vm.totalTime;
vm.tableData[row.index].title = vm.tableData[row.index].title + " ";
vm.tableData[row.index].buttonText = nowTime + "s后可以刷新";
vm.tableData[row.index].buttonStatus = true;
let clock = window.setInterval(() => {
nowTime--;
vm.tableData[row.index].title = vm.tableData[row.index].title + " ";
vm.tableData[row.index].buttonText = nowTime + "s后可以刷新";
if (nowTime <= 0) {
window.clearInterval(clock);
vm.tableData[row.index].title =
vm.tableData[row.index].title + " ";
// vm.tableData[row.index].buttonText = "刷新";
vm.tableData[row.index].buttonStatus = false; //这里重新开启
vm.getDownLoadStatus(row);
}
}, 1000);
});
}
},
// 更改数据显示数量
handleSizeChange(val) {
vm.param.pageSize = val;
vm.search();
},
// 换页
handleCurrentChange(val) {
vm.param.pageNo = value;
vm.search();
}
}
};
</script>
<style lang="scss">
.export-download {
.component-content {
background: #fff;
padding: 10px;
}
}
</style>
\ No newline at end of file
<template>
<div class="course-analysis-wrap">
<div v-for="(item , index) in cardData" :key="index" class="">
<el-card class="box-card">
<div slot="header" class="title">
<span class="weight">{{ item.title }}</span>
</div>
<div class="box-content">
<span v-if="item.num !=0" class="weight">{{ item.num }} </span>
<span v-if="item.num !=0">{{ item.unit }} </span>
<span v-if="index == 2 && second !=0" class="weight" >{{ second }} </span>
<span v-if="index == 2 && second !=0"></span>
</div>
</el-card>
<div v-if="index+1 !== cardData.length" class="line"></div>
</div>
<el-table
:data="tableData"
class="course-table">
<el-table-column prop="courseName" label="课程名" align="center">
</el-table-column>
<el-table-column prop="courseTotalTime" label="课程时长" align="center">
<template slot-scope="scope">
{{ scope.row.courseTotalTime | getTotalTime }}
</template>
</el-table-column>
<el-table-column prop="courseAvgStudyTime" label="人均学习时长" align="center">
<template slot-scope="scope">
{{ scope.row.courseAvgStudyTime | getAvgTime }}
</template>
</el-table-column>
<el-table-column prop="courseLearnerCount" label="参与培训人数" align="center">
</el-table-column>
<el-table-column prop="courseFinishedCount" label="完成培训人数" align="center">
</el-table-column>
<el-table-column fixed="right" label="操作" min-width="50" align="center">
<template slot-scope="scope">
<el-button
@click="checkName(scope.row)"
type="text"
size="small"
>查看名单</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png">
<p>没有相关数据,请重新选择查询范围</p>
</div>
</div>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[20, 50 ,100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
></el-pagination>
</div>
</div>
</template>
<script>
import { create } from "domain";
import * as operationData from "../../utils/operation";
import { openLoading, closeLoading } from "../../utils/utils";
let vm = null;
export default {
props: {
formInline: {
type: Object
},
activeName: {
type: String
},
dialogData: {
type: Object
},
organizationList: {
type: Array
}
},
data() {
return {
cardData: [],
tableData: [],
totalRows: 0,
projectId: '',
pageNo: 1,
pageSize: 20,
second: 0,
}
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "id");
},
mounted: function() {
this.$on('search',()=>{
// console.log(this.formInline);
this.pageNo = 1;
this.search();
});
this.$on("init", () => {
this.$nextTick(function() {
if (vm.formInline.region.length != 0) {
this.search();
}
});
});
this.$on("reset",() =>{
this.pageNo = 1;
this.pageSize = 20;
this.tableData = [];
this.cardData = [];
});
},
methods: {
setCardData(data) {
vm.totalRows = data.projectCourseCount;
let avgTime = [];
avgTime = operationData.getAvgTime(data.projectAvgStudyTime);
vm.cardData = [
{
title: '项目所有课程数',
num: data.projectCourseCount,
unit: '门课程',
},{
title: '项目所有课程总时长',
num: data.projectCourseTotalTime,
unit: '分钟',
},{
title: '项目人均学习时长',
num: avgTime[0],
unit: '分钟',
}
];
vm.second = avgTime[1];
},
search() {
if (vm.formInline.region.length == 0) {
const h = this.$createElement;
vm.$message({
message: h('p', { style: 'color: #FF3399' }, '请先选择地区后再进行查询 ')
});
return;
}
let checkAll = operationData.hasAll(vm.formInline.organization)
let req = {
projectId: vm.projectId,
ids: operationData.getIds(vm.formInline,vm.organizationList,checkAll),
type: operationData.getSearchType(vm.formInline,checkAll),
originalFlag: vm.formInline.checked == false ? 0 : 1
};
console.log("3 req", req);
openLoading(vm);
vm.reportGET("report/portalProjectCourse/getTotal", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
if(res.data.projectCourseCount == 0 ) {
vm.$message("没有相关数据,请重新选择查询范围");
}
vm.setCardData(res.data)
} else {
vm.$message(res.message);
}
});
let reqList = req;
reqList.pageNo = vm.pageNo;
reqList.pageSize = vm.pageSize;
vm.reportGET("report/portalProjectCourse/getCourseList", reqList).then(res => {
closeLoading(vm);
if (res.code == "000000") {
vm.tableData = res.data.list;
}
});
},
checkName(data) {
console.log('dialogData',this.dialogData);
let checkAll = operationData.hasAll(vm.formInline.organization)
let routerData = {};
routerData = this.dialogData;
routerData.projectId = vm.projectId;
routerData.projectName = vm.getUrlSearch(window.location.href, "projectName");
routerData.tableType = 1;
routerData.courseId = data.courseId;
routerData.ids = operationData.getIds(vm.formInline,vm.organizationList,checkAll);
routerData.type = operationData.getSearchType(vm.formInline,checkAll);
routerData.originalFlag = vm.formInline.checked == false ? 0 : 1;
// this.$router.push({ path: '/name-list', query: routerData});
let routeData = this.$router.resolve({ path: '/name-list', query: routerData});
window.open(routeData.href, '_blank');
},
handleSizeChange(val) {
console.log(`每页 ${val} 条`);
vm.pageSize = val;
vm.search();
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
vm.pageNo = val;
vm.search();
},
},
}
</script>
<style lang="scss">
.course-analysis-wrap {
background: #fff;
overflow: hidden;
padding: 10px;
.weight {
font-weight: bold;
}
.title:after {
clear: both
}
.el-card {
border-width: 0px;
}
.el-card.is-always-shadow {
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1);
}
.line {
background: #e4e4e4;
height: 80px;
width: 1px;
float: left;
margin-top: 20px;
}
.box-card {
width: 32%;
margin-right: 1%;
float: left;
.el-card__header {
border-bottom-width: 0;
}
.title {
text-align: center;
}
.box-content {
text-align: center;
height: 40px;
}
}
.course-table {
top: 20px;
margin-bottom: 20px;
}
}
</style>
\ No newline at end of file
<template>
<div class="crowd-analysis-wrap">
<el-radio-group class="crowd-radio" v-model="radio" size="small" @change="updateRadio">
<el-radio-button label="1">全部用户</el-radio-button>
<el-radio-button label="2">参与项目</el-radio-button>
<el-radio-button label="3">通过项目</el-radio-button>
</el-radio-group>
<div v-show="!showData" class="empty">
<p>"没有相关数据,请重新选择查询范围"</p>
</div>
<div class="chart" v-show="showData">
<div class="item" id="education" ref="education"></div>
<div class="item item-right" id="job" ref="job"></div>
<div class="item">
<div class="title">用户性别分布</div>
<div class="sex">
<div class="sex-item" v-for="(item , index) in sexData" :key="index">
<img class="sex-img" v-bind:src="item.src" />
<p class="sex-type">{{ item.type }}</p>
<p></p>
<p class="sex-num">{{ item.num }}</p>
</div>
</div>
</div>
<div class="item item-right" id="age" ref="age"></div>
</div>
</div>
</template>
<script>
import BreadCrumb from "../../components/breadcrumb.vue";
import { create } from "domain";
import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
import * as operationData from "../../utils/operation";
import echarts from "echarts";
import { setTimeout } from "timers";
let vm = null;
export default {
components: {
BreadCrumb
},
props: {
formInline: {
type: Object
},
activeName: {
type: String
},
organizationList: {
type: Array
}
},
data() {
return {
radio: 1,
sexData: [],
projectId: "",
crowdData: {},
showData: false,
echartsData: {
chart1: {},
chart2: {},
chart3: {},
},
};
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "id");
},
mounted: function() {
// commonUtil.resizeHeight();
//父组件传值
this.$on("search", () => {
vm.radio = 1;
this.search();
});
this.$on("init", () => {
this.$nextTick(function() {
if (vm.formInline.region.length != 0) {
this.search();
}
});
});
this.$on("reset", () => {
this.showData = false;
this.crowdData = {};
});
if (this.activeName == "second") {
}
},
methods: {
search() {
if (vm.formInline.region.length == 0) {
const h = this.$createElement;
vm.$message({
message: h('p', { style: 'color: #FF3399' }, '请先选择地区后再进行查询 ')
});
return;
}
let checkAll = operationData.hasAll(vm.formInline.organization);
let req = {
projectId: vm.projectId,
cityOrHospitalId: operationData.getIds(vm.formInline,vm.organizationList,checkAll),
kind: operationData.getSearchType(vm.formInline,checkAll),
type: vm.radio,
originalFlag: vm.formInline.checked == false ? 0 : 1
};
console.log("2 req", req);
openLoading(vm);
vm.reportGET("report/portal/getPeoplesDetails", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
if(res.data.educationList.length == 0 && res.data.jobTitle.length == 0 ) {
vm.$message("没有相关数据,请重新选择查询范围");
this.showData = false;
} else {
this.showData = true;
}
this.crowdData = res.data;
setTimeout(function() {
vm.educationDivision();
vm.jobDivision();
vm.getSexData();
vm.ageDivision();
},20);
// this.educationDivision();
// this.jobDivision();
// this.getSexData();
// this.ageDivision();
} else {
vm.$message(res.message);
}
});
},
updateResize() {
this.$nextTick(function() {
window.onresize = function() {
vm.echartsData.chart1.resize();
vm.echartsData.chart2.resize();
vm.echartsData.chart3.resize();
};
});
},
updateRadio(value) {
console.log(value,vm.radio);
this.search();
},
//用户性别分布
getSexData() {
let sexList = this.crowdData.sexList;
// if(sexList.length <3) {
// this.sexData = [];
// return;
// }
this.sexData = [
{
src: require("../../assets/image/man.png"),
type: "男性",
num: 0
},
{
src: require("../../assets/image/weman.png"),
type: "女性",
num: 0
},
{
src: require("../../assets/image/question.png"),
type: "未完善信息",
num: 0
}
];
for(let i=0;i<sexList.length;i++) {
if(sexList[i].name == "男") {
this.sexData[0].num = sexList[i].value;
} else if(sexList[i].name == "女") {
this.sexData[1].num = sexList[i].value;
} else {
this.sexData[2].num = sexList[i].value;
}
}
},
educationDivision(data) {
let myChart = echarts.init(this.$refs.education);
let educationList = operationData.removeZero(this.crowdData.educationList);
let legendData = [];
let seriesData = [];
let colorData = ["#FF9F7F", "#008000", "#E062AE", "#37A2DA", "#0050DC", "#67E0E3", "#8A2BE2"];
// for (let i = 0; i < educationList.length; i++) {
// legendData[i] = educationList[i].name;
// }
if(educationList.length > 0) {
legendData = ['博士后','博士','硕士','本科','大专','中专及以下','其他'];
}
seriesData = educationList;
let option = operationData.getPicOption(
"用户学历分布",
legendData,
colorData,
seriesData
);
myChart.setOption(option);
vm.echartsData.chart1 = myChart;
vm.updateResize();
},
jobDivision(data) {
let myChart2 = echarts.init(this.$refs.job);
let jobTitle = operationData.removeZero(this.crowdData.jobTitle);
let legendData = [];
let seriesData = [];
let colorData = ["#FF9F7F", "#008000", "#E062AE", "#37A2DA", "#0050DC", "#67E0E3", "#8A2BE2"];
for (let i = 0; i < jobTitle.length; i++) {
legendData[i] = jobTitle[i].name;
}
seriesData = jobTitle;
let option = operationData.getPicOption(
"用户职务分布",
legendData,
colorData,
seriesData
);
myChart2.setOption(option);
vm.echartsData.chart2 = myChart2;
vm.updateResize();
},
ageDivision(data) {
let myChart3 = echarts.init(this.$refs.age);
let xAxisData = [];
let seriesData = [];
let ageList = this.crowdData.ageList;
for (let i = 0; i < ageList.length; i++) {
// xAxisData[i] = ageList[i].name;
if(ageList[i].value != 0) {
xAxisData.push(ageList[i].name);
}
}
for (let i = 0; i < ageList.length; i++) {
// seriesData[i] = ageList[i].value;
if(ageList[i].value != 0) {
seriesData.push(ageList[i].value);
}
}
let option = operationData.getBarOption(xAxisData, seriesData);
myChart3.setOption(option);
vm.echartsData.chart3 = myChart3;
vm.updateResize();
}
}
};
</script>
<style lang="scss">
.crowd-analysis-wrap {
background: #fff;
overflow: hidden;
padding: 10px;
.header-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.crowd-radio {
position: relative;
left: 50%;
margin-top: 25px;
margin-left: -119px;
.is-active {
.el-radio-button__inner {
// background: #fff;
// color: #409EFF;
}
}
}
.empty {
height: 300px;
line-height: 300px;
color: #FF3399;
text-align: center;
}
.chart {
position: relative;
margin: 20px auto 0 auto;
width: 100%;
// overflow: auto;
.item {
position: relative;
float: left;
margin-top: 20px;
padding: 0;
width: 48%;
// height: 20vw;
height: 350px;
border: 1px solid #dedede;
.title {
position: relative;
margin: 15px auto 10px auto;
font-size: 18px;
text-align: center;
font-weight: bold;
}
.sex {
position: relative;
top: 42px;
left: 0;
.sex-item {
float: left;
height: 350px;
width: 33.3%;
.sex-img {
margin: 0 auto;
position: relative;
left: 10%;
// width: 80%;
width: 60%;
margin-left: 10%;
}
.sex-type {
text-align: center;
}
.sex-num {
margin-top: 40px;
font-size: 30px;
font-weight: bold;
text-align: center;
}
}
}
}
.item-right {
float: right;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="examination-analysis">
<div v-for="(item , index) in cardData" :key="index" class="box">
<el-card class="box-card">
<div slot="header" class="title">
<span class="weight">{{ item.title }}</span>
</div>
<div class="box-content">
<span class="weight">{{ item.num }}</span>
{{ item.unit }}
</div>
</el-card>
<div v-if="index+1 !== cardData.length" class="line"></div>
</div>
<div class="table">
<el-table :data="tableData" style="width: 100%" border>
<el-table-column prop="examName" label="考试名" min-width="150" align="center"></el-table-column>
<el-table-column prop="examUserCount" label="参与考试人数" min-width="100" align="center"></el-table-column>
<el-table-column prop="userCountForPassExam" label="通过考试人数" min-width="80" align="center"></el-table-column>
<el-table-column v-if="showTd[0]" prop="userCountList[0]" :label="labelTd[0]" min-width="80" align="center"></el-table-column>
<el-table-column v-if="showTd[1]" prop="userCountList[1]" :label="labelTd[1]" min-width="80" align="center"></el-table-column>
<el-table-column v-if="showTd[2]" prop="userCountList[2]" :label="labelTd[2]" min-width="80" align="center"></el-table-column>
<el-table-column v-if="showTd[3]" prop="userCountList[3]" :label="labelTd[3]" min-width="80" align="center"></el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="100">
<template slot-scope="scope">
<el-button type="text" size="small" @click="goPage(scope.row)">查看名单</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png">
<p>没有相关数据,请重新选择查询范围</p>
</div>
</div>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pageNo"
:page-sizes="[20, 50 ,100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
></el-pagination>
</div>
</div>
</template>
<script>
import { log } from 'util';
import * as operationData from "../../utils/operation";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
let vm
export default {
props: {
formInline: {
type: Object
},
activeName: {
type: String
},
dialogData: {
type: Object
},
organizationList: {
type: Array
}
},
data() {
return {
projectId: '',
tableData: [],
cardData: [],
totalRows: 0, //数据总数
pageNo: 1, //当前是第几页
pageSize: 20, //页面总数
labelTd: [],
showTd: [false,false,false,false],
};
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "id");
},
// 挂载到Dom完成时
mounted: function() {
this.$on('search',()=>{
// console.log(this.formInline);
this.pageNo = 1;
this.search();
});
this.$on("init", () => {
this.$nextTick(function() {
if (vm.formInline.region.length != 0) {
this.search();
}
});
});
this.$on("reset",() =>{
this.pageNo = 1;
this.pageSize = 20;
this.tableData = [];
this.cardData = [];
});
},
methods: {
setCardData(data) {
vm.totalRows = data.projectExamCount;
vm.cardData = [
{
title: "项目所有考试数",
num: data.projectExamCount,
unit: "门考试"
},
{
title: "项目所有考题数",
num: data.projectExamQuestionCount,
unit: "道题"
}
];
// vm.cardData[0].num = data.projectExamCount;
// vm.cardData[1].num = data.projectExamQuestionCount;
},
// 搜索列表
search() {
if (vm.formInline.region.length == 0) {
const h = this.$createElement;
vm.$message({
message: h('p', { style: 'color: #FF3399' }, '请先选择地区后再进行查询 ')
});
return;
}
let checkAll = operationData.hasAll(vm.formInline.organization)
let req = {
projectId: vm.projectId,
ids: operationData.getIds(vm.formInline,vm.organizationList,checkAll),
type: operationData.getSearchType(vm.formInline,checkAll),
originalFlag: vm.formInline.checked == false ? 0 : 1
};
console.log("4 req", req);
openLoading(vm);
vm.reportGET("report/portalProjectExam/getTotal", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
if(res.data.projectExamCount == 0 ) {
vm.$message("没有相关数据,请重新选择查询范围");
}
vm.setCardData(res.data);
vm.labelTd = res.data.gradeNameList;
} else {
vm.$message(res.message);
}
});
let reqList = req;
reqList.pageNo = vm.pageNo;
reqList.pageSize = vm.pageSize;
vm.reportGET("report/portalProjectExam/getExamList", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
vm.tableData = res.data.list;
if(res.data.list.length == 0) {
return;
}
if(res.data.list[0].userCountList == null || res.data.list[0].userCountList.length == 0) {
vm.showTd = [false,false,false,false];
} else if (res.data.list[0].userCountList.length == 1){
vm.showTd = [true,false,false,false];
} else if (res.data.list[0].userCountList.length == 2){
vm.showTd = [true,true,false,false];
} else if (res.data.list[0].userCountList.length == 3){
vm.showTd = [true,true,true,false];
} else if (res.data.list[0].userCountList.length == 4){
vm.showTd = [true,true,true,true];
}
}
});
//
},
// 跳转查看名单页面
goPage(data) {
let checkAll = operationData.hasAll(vm.formInline.organization)
let routerData = {};
routerData = this.dialogData;
routerData.projectId = vm.projectId;
routerData.projectName = vm.getUrlSearch(window.location.href, "projectName");
routerData.tableType = 2;
routerData.examId = data.examId;
routerData.ids = operationData.getIds(vm.formInline,vm.organizationList,checkAll);
routerData.type = operationData.getSearchType(vm.formInline,checkAll),
routerData.originalFlag = vm.formInline.checked == false ? 0 : 1
// this.$router.push({ path: '/name-list', query: routerData});
let routeData = this.$router.resolve({ path: '/name-list', query: routerData});
window.open(routeData.href, '_blank');
},
// 更改数据显示数量
handleSizeChange(val) {
console.log(`每页 ${val} 条`)
vm.pageSize = val
vm.search()
},
// 换页
handleCurrentChange(val) {
console.log(`当前页: ${val}`)
vm.pageNo = val
vm.search()
}
}
};
</script>
<style lang='scss' rel='stylesheet/scss'>
.examination-analysis {
background: #fff;
overflow: hidden;
padding: 10px;
.weight {
font-weight: bold;
}
.el-card {
border-width: 0px;
}
.el-card.is-always-shadow {
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1);
}
.line {
background: #e4e4e4;
height: 80px;
width: 1px;
float: left;
margin-top: 20px;
}
.box {
}
.table {
margin-top: 30px;
}
.box-card {
width: 48%;
margin-right: 1%;
float: left;
.el-card__header {
border-bottom-width: 0;
}
.title {
text-align: center;
}
.box-content {
text-align: center;
height: 40px;
font-size: 15px;
}
}
}
</style>
<template>
<div class="learning-effect">
<div class="learning" ref="learning"></div>
<div class="education" ref="education"></div>
</div>
</template>
<script>
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
const echarts = require("echarts");
export default {
data() {
return {};
},
mounted() {
commonUtil.resizeHeight();
this.initEcharts();
},
methods: {
// 初始化图表
initEcharts() {
openLoading(this);
let trainChart = echarts.init(this.$refs["learning"]);
let educationChart = echarts.init(this.$refs["education"]);
let trainPara = {
color: ["#FF9999", "#66CCFF"],
text: '培训前后知识点掌握情况变化',
xAxisData: [
"转诊与随访",
"转诊与随访",
"周三",
"治疗原则及降压目标",
"周五",
"治疗原则及降压目标",
"周日"
],
seriesBeforeDate: [20, 32, 31, 34, 39, 33, 32],
seriesAfterDate: [86, 10, 96, 10, 16, 16, 15]
}
let educationPara = {
color: ["#33FFFF", "#FF9999"],
text: '不同学历培训前后正确率对比',
xAxisData: [
"转诊与随访",
"转诊与随访",
"周三",
"治疗原则及降压目标",
"周五",
"治疗原则及降压目标",
"周日"
],
seriesBeforeDate: [20, 32, 31, 34, 39, 33, 32],
seriesAfterDate: [86, 10, 96, 10, 16, 16, 15]
};
// 显示图表。
trainChart.setOption(this.echartOptions(trainPara));
educationChart.setOption(this.echartOptions(educationPara));
closeLoading(this)
},
// 图表的参数
echartOptions(parameter) {
let option = {
color: parameter.color,
title: {
text: parameter.text,
x: "center",
textStyle: {
//主标题文本样式
fontSize: 16,
fontWeight: "bolder",
color: "#333"
}
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow"
}
},
legend: {
data: ["培训前正确率", "培训后正确率"],
right: 0,
top: 20
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true
},
xAxis: [
{
type: "category",
data: parameter.xAxisData,
axisLabel: {
//坐标轴刻度标签的相关设置。
interval: 0,
rotate: "45"
}
}
],
yAxis: [
{
name: "比率(%)",
type: "value",
axisLabel: {
show: true,
interval: "auto",
formatter: "{value} %"
},
show: true,
axisLine: {
// 轴线
show: false
}
}
],
series: [
{
name: "培训前正确率",
type: "bar",
barGap: "20%",
barMaxWidth: "50",
itemStyle: {
normal: {
label: {
show: true,
position: "top",
formatter: "{c}%"
}
}
},
data: parameter.seriesBeforeDate
},
{
name: "培训后正确率",
type: "bar",
barGap: "20%",
barMaxWidth: "50",
itemStyle: {
normal: {
label: {
show: true,
position: "top",
formatter: "{c}%" //这是关键,在需要的地方加上就行了
}
}
},
data: parameter.seriesAfterDate
}
]
};
return option;
}
}
};
</script>
<style lang='scss' rel='stylesheet/scss'>
.learning-effect {
width: 100%;
.learning,
.education {
margin-top: 40px;
min-width: 400px;
height: 400px;
background: #fff;
}
}
</style>
<template>
<div class="item-list-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond" :curmbThird="curmbThird" :jumPathThird="jumPathThird"></bread-crumb>
<div class="component-content screenSet" id="screenSet">
<el-form class="item-form" ref="formInline" :model="formInline" label-width="80px">
<el-form-item label="选择地区:">
<!-- :props="props" -->
<el-cascader
size="small"
ref="cascaderRegion"
:options="optionsRegion"
:props="props"
v-model="formInline.region"
@change="handleChange"
filterable
change-on-select
placeholder="请先选择地区后再进行查询"
style="width:330px"
></el-cascader>
</el-form-item>
<el-form-item label="选择机构:">
<el-select
size="small"
v-model="formInline.organization"
:placeholder="organizationNotice"
@change="changeOrganization"
multiple
collapse-tags
:disabled="formInline.region.length !== 3"
style="width:330px"
>
<el-option
v-for="item in organizationList"
:key="item.index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<div class="tag-group">
<el-tag
v-for="tag in tags"
:key="tag.value"
type="info"
closable
@close="handleTagClose(tag)"
>{{ tag.label }}</el-tag>
</div>
<el-form-item label v-if="showOriginal == 1">
<el-checkbox size="small" v-model="formInline.checked">查看原始数据</el-checkbox>
</el-form-item>
</el-form>
<div class="form-button">
<el-button @click="search()" type="primary">查询</el-button>
<el-button @click="resetForm()">重置</el-button>
</div>
<div class="button-group">
<el-button v-if="roleType == 'L1' || roleType == 'L2'" type="default" size="small" @click="changeDate">数据修改</el-button>
<!-- <el-button type="default" size="small" @click="update" v-else>修改范围</el-button> -->
<el-button type="default" size="small" :disabled="exportStatus" @click="exportExcel">导出明细</el-button>
</div>
<!-- <div class="item-tab"></div> -->
<el-tabs v-model="activeName" @tab-click="handleClick" :before-leave="beforeLeave">
<el-tab-pane label="参与情况" name="first">
<part-in
ref="childPart"
:formInline="formInline"
:activeName="activeName"
:organizationNum="organizationNum"
:organizationList="organizationList"
></part-in>
</el-tab-pane>
<el-tab-pane label="人群分析" name="second">
<crowd-analysis
ref="childCrowd"
:formInline="formInline"
:activeName="activeName"
:organizationList="organizationList"
></crowd-analysis>
</el-tab-pane>
<el-tab-pane label="课程分析" name="third">
<course-analysis
ref="childCourse"
:formInline="formInline"
:activeName="activeName"
:dialogData="dialogData"
:organizationList="organizationList"
></course-analysis>
</el-tab-pane>
<el-tab-pane label="考试分析" name="fourth" v-if="displayExam == 1">
<examination-analysisfrom
ref="childExam"
:formInline="formInline"
:activeName="activeName"
:dialogData="dialogData"
:organizationList="organizationList"
></examination-analysisfrom>
</el-tab-pane>
<!-- <el-tab-pane label="学习效果分析" name="fifth" lazy>
<learning-effect></learning-effect>
</el-tab-pane>-->
</el-tabs>
<el-dialog title="提示" :visible.sync="dialogVisible" width="30%" center>
<p style="text-align:center">文件正在生成,你可以去“我的导出下载”页,下载文件</p>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false">留在当前页</el-button>
<el-button type="primary" @click="toDownload()">去下载</el-button>
</span>
</el-dialog>
<el-dialog title :visible.sync="dialogUpdate" width="80%" center>
<!-- <el-button @click="dialogUpdate = false">取 消</el-button> -->
<data-alignment
ref="childAlignment"
@closeDialog="dialogUpdate = false"
@closeSearch="closeSearch"
:formInline="formInline"
:dialogData="dialogData"
:organizationList="organizationList"
></data-alignment>
</el-dialog>
</div>
</div>
</template>
<script>
import BreadCrumb from "../../components/breadcrumb.vue";
import CourseAnalysis from "./item-course-analysis.vue";
import CrowdAnalysis from "./item-crowd-analysis.vue";
import PartIn from "./item-part-in.vue";
import ExaminationAnalysisfrom from "./item-examination-analysis.vue";
import LearningEffect from "./item-learning-effect.vue";
import DataAlignment from "./data-alignment.vue";
import { create } from "domain";
import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
import * as operationData from "../../utils/operation";
import { log } from "util";
let vm = null;
export default {
components: {
BreadCrumb,
CourseAnalysis,
CrowdAnalysis,
PartIn,
ExaminationAnalysisfrom,
LearningEffect,
DataAlignment
},
data() {
return {
curmbFirst: "学情报告",
curmbSecond: "项目列表",
curmbThird: "",
jumPathThird: "/report-list",
projectId: "",
projectName: "",
exportStatus: false,
organizationList: [],
optionsRegion: [],
props: {
lazy: true,
lazyLoad(node, resolve) {
const { level } = node;
console.log("node", node);
if (node.level == 1) {
let req = {
provinceId: node.data.value
};
vm.GET("basic-data/position/cities", req).then(res => {
let newData = vm.setMoreOption(res.data.cityList, "cities");
console.log("newData", newData);
resolve(newData);
});
} else if (node.level == 2) {
let req = {
cityId: node.data.value
};
vm.GET("basic-data/position/counties", req).then(res => {
let newData = vm.setMoreOption(res.data.countyList, "counties");
console.log("newData", newData);
resolve(newData);
});
}
}
},
showOriginal: 2,
roleType: '',
formInline: {
region: [],
date: "",
organization: [],
checked: false,
pageNo: 1,
pageSize: 20
},
organizationNotice: '选择地区筛选到区才能选择机构',
dialogData: {
region: "",
// regionData: "",
organization: ""
// organizationData: "",
},
tags: [],
activeName: "first",
organizationNum: 0,
dialogVisible: false,
dialogUpdate: false,
displayExam: 2,
flag: 1,
};
},
computed: {
...mapGetters(["_token"])
},
watch: {
tags: function(val) {
this.setDialogData();
}
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "id");
this.projectName = vm.getUrlSearch(window.location.href, "projectName");
this.curmbThird = vm.getUrlSearch(window.location.href, "projectName");
this.getDisplay();
// this.getRegionOption();
},
mounted: function() {
commonUtil.resizeHeight();
},
methods: {
getDisplay(type) {
let req = {
projectId: vm.projectId,
projectName: vm.projectName,
};
openLoading(vm);
vm.reportGET("report/portal/display", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
console.log('vm.showOriginal',res.data)
vm.showOriginal = res.data.status;
vm.roleType = res.data.roleType;
vm.displayExam = res.data.existExam;
vm.flag = res.data.flag;
}
if(type !=2) {
vm.getRegionOption();
}
});
},
beforeLeave(activeName, oldActiveName) {
console.log('action',activeName,'oldActive',oldActiveName)
},
handleClick(tab, event) {
//console.log(tab, event);
// if(tab.name == this.activeName) {
// return;
// }
console.log("activeName", this.activeName, tab.name);
if (tab.name == "first") {
this.$refs.childPart.$emit("init");
} else if (tab.name == "second") {
this.$refs.childCrowd.$emit("init");
} else if (tab.name == "third") {
this.$refs.childCourse.$emit("init");
} else if (tab.name == "fourth") {
this.$refs.childExam.$emit("init");
}
},
handleChange(value) {
this.formInline.organization = [];
this.tags = [];
setTimeout(function() {
// console.log(vm.$refs["cascaderRegion"].inputValue);
vm.dialogData.region = vm.$refs["cascaderRegion"].inputValue;
// vm.dialogData.regionData = value[value.length-1];
// console.log('vm.dialogData.region',vm.dialogData.region)
}, 20);
// console.log('region',value,vm.formInline);
if (value.length >= 3) {
this.getOrganizationList();
this.organizationNotice = "请选择机构";
} else {
this.organizationNotice = "选择地区筛选到区才能选择机构";
}
},
setMoreOption(data, type) {
let option = [];
for (let i = 0; i < data.length; i++) {
let obj = data[i];
if (type == "cities") {
obj.label = data[i].cityName;
obj.value = data[i].cityId;
} else if (type == "counties") {
obj.label = data[i].countyName;
obj.value = data[i].countyId;
obj.leaf = true;
}
option.push(obj);
}
return option;
},
changeOrganization(value) {
// console.log('formInline',this.formInline.organization);
this.tags = [];
//选了全部的情况下
for (let a = 0; a < this.formInline.organization.length; a++) {
if (this.formInline.organization[a] == 0) {
//选了全部
let tagItem = {
label: "全部",
value: 0
};
this.tags.push(tagItem);
return;
}
}
//没选全部
for (let i = 0; i < this.organizationList.length; i++) {
for (let j = 0; j < value.length; j++) {
if (value[j] == this.organizationList[i].value) {
// console.log('value[j]',j,value[j],this.organizationList[i].label )
let tagItem = {
label: this.organizationList[i].label,
value: this.organizationList[i].value
};
this.tags.push(tagItem);
}
}
}
},
handleTagClose(tag) {
// console.log(tag);
//选了全部的情况下
if (this.tags.length > 0 && this.tags[0].value == 0) {
this.tags.splice(0, 1);
this.formInline.organization = [];
return;
}
//没全部的情况下
for (let i = 0; i < this.tags.length; i++) {
if (tag.value == this.tags[i].value) {
this.tags.splice(i, 1);
this.formInline.organization.splice(
this.formInline.organization.indexOf(tag.value),
1
);
break;
}
}
},
getMoreRegion() {
let http = new Promise((resolve, reject) => {
let req = {
provinceId: 350
};
vm.GET("basic-data/position/cities", req).then(res => {
resolve(res);
});
});
console.log("http值", http);
return http;
},
//获取地区
getRegionOption() {
if(vm.flag == 2 && vm.roleType == "L2") {
this.optionsRegion = [{id: 11, provinceId: 330, provinceName: "浙江省",value: 330, label: "浙江省"}]
} else {
let req = {};
openLoading(vm);
vm.GET("basic-data/position/provinces", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
this.optionsRegion = operationData.setRegionOption(
res.data.provinceList
);
// console.log("this.optionsRegion", this.optionsRegion);
}
});
}
},
getOrganizationList() {
this.organizationList = [
// {
// label: "全部",
// value: 0
// },
// {
// label: "西湖区第二人民医院",
// value: 66
// },
// {
// label: "杭州市中医院",
// value: 233
// },
// {
// label: "仁济医院",
// value: 999
// }
];
let countyId = vm.formInline.region[vm.formInline.region.length - 1];
let req = {
projectId: vm.projectId,
countyId: countyId
};
openLoading(vm);
vm.reportGET("report/portal/getOrganizationList", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
this.organizationList = operationData.getLearnOrganization(
res.data.hospitalList
);
}
});
},
getOrganizationNum() {
//选择全部
let num = 0;
if (this.tags.length == 0) {
return;
}
if (this.tags[0].value == 0) {
num = this.organizationList.length - 1;
return num;
}
//没有选择全部
num = this.tags.length;
return num;
},
closeSearch() {
vm.dialogUpdate = false;
vm.getDisplay(2);
vm.search();
},
search() {
// console.log(this.formInline,this.activeName);
if (this.activeName == "first") {
this.organizationNum = this.getOrganizationNum();
// console.log('this.organizationNum',this.organizationNum)
this.$nextTick(function() {
this.$refs.childPart.$emit("search");
});
} else if (this.activeName == "second") {
this.$refs.childCrowd.$emit("search");
} else if (this.activeName == "third") {
this.$refs.childCourse.$emit("search");
} else if (this.activeName == "fourth") {
this.$refs.childExam.$emit("search");
}
},
//重置
resetForm() {
vm.formInline = Object.assign(
{},
{
region: [],
date: "",
organization: [],
checked: false,
pageNo: 1,
pageSize: 20,
}
);
vm.tags = [];
if (this.activeName == "first") {
this.$refs.childPart.$emit("reset");
} else if (this.activeName == "second") {
this.$refs.childCrowd.$emit("reset");
} else if (this.activeName == "third") {
this.$refs.childCourse.$emit("reset");
} else if (this.activeName == "fourth") {
this.$refs.childExam.$emit("reset");
}
},
exportExcel() {
if (vm.formInline.region.length == 0) {
const h = this.$createElement;
vm.$message({
message: h('p', { style: 'color: #FF3399' }, '请先选择地区后再进行导出 ')
});
return;
}
//按钮置灰三秒
vm.exportStatus = true;
setTimeout(function() {
vm.exportStatus = false;
},3000);
this.dialogVisible = true;
//download接口
let checkAll = operationData.hasAll(vm.formInline.organization)
let req = {
projectId : vm.projectId,
ids: operationData.getIds(vm.formInline,vm.organizationList,checkAll),
type: operationData.getSearchType(vm.formInline,checkAll),
originalFlag: vm.formInline.checked == false ? 0 : 1,
projectName: vm.$route.query.projectName,
cityName: vm.getCityName(),
};
openLoading(vm);
vm.reportGET("report/downLoad/downLoad", req).then(res => {
closeLoading(vm);
// console
if (res.code == "000000") {
}
});
},
getCityName() {
let city = '';
let region = vm.dialogData.region;
console.log('region',region,typeof region,region == '');
if(region != '') {
city = region.split(' / ').join('');
console.log('city',city);
}
return city;
},
toDownload() {
let checkAll = operationData.hasAll(vm.formInline.organization)
let routerData = {
// projectId : vm.projectId,
projectId : '',
};
vm.$router.push({ path: "export-download", query: routerData });
},
update() {},
release() {},
setDialogData() {
//传递给dialog数据
this.dialogData.organization = "";
for (let x = 0; x < this.tags.length; x++) {
this.dialogData.organization += this.tags[x].label + "、";
}
let len = this.dialogData.organization.length;
this.dialogData.organization = this.dialogData.organization.substring(
0,
len - 1
);
},
changeDate() {
if (vm.formInline.region.length == 0) {
const h = this.$createElement;
vm.$message({
message: h('p', { style: 'color: #FF3399' }, '请先选择地区后再进行修改 ')
});
return;
}
this.setDialogData();
this.dialogUpdate = true;
this.$nextTick(function() {
this.$refs.childAlignment.$emit("search");
});
}
}
};
</script>
<style lang="scss">
.item-list-wrap {
.component-content {
// background: #fff;
padding: 10px;
.header-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.item-form {
padding: 10px;
background: #fff;
width:100%;
border-radius: 4px;
}
.form-button {
width: 45%;
top: -120px;
position: relative;
left: 50%;
}
.button-group {
position: relative;
// right: 100px;
float: right;
margin-right: 20px;
}
.choose {
font-size: 12px;
margin-bottom: 20px;
}
.item-tab {
width: 95%;
height: 46px;
background: #F0F2F5;
position: absolute;
}
.el-tabs__item.is-active {
color: #409eff;
}
.el-tabs__header {
width: 65%;
}
.el-tabs__nav-wrap::after {
height: 0px;
}
.tag-group {
margin-left: 78px;
.el-tag {
margin-right: 20px;
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="part-in-wrap">
<div v-show="!showData" class="empty">
<p>"没有相关数据,请重新选择查询范围"</p>
</div>
<div v-for="(item , index) in cardData" :key="index" class>
<el-card class="box-card">
<div slot="header" class="title">
<span class="weight">{{ item.title }}</span>
</div>
<div class="box-content">
<span class="weight">{{ item.num }}</span>
</div>
</el-card>
<div class="line"></div>
</div>
<div v-if="showChart" class="charts" id="rankChart" ref="rankChart"></div>
<!-- <div class="charts" id="age" ref="age"></div> -->
<el-table
v-if="showTable"
v-show="organizationNum < 2"
:data="finishDetail"
class="project-table"
style="width: 100%;margin-bottom: 30px;"
border
>
<el-table-column prop="name" label="姓名" align="center"></el-table-column>
<el-table-column prop="departmentName" label="科室" align="center"></el-table-column>
<el-table-column prop="joinStatus" label="是否参与项目" align="center">
<template slot-scope="scope">{{ scope.row.joinStatus | partJoin }}</template>
</el-table-column>
<el-table-column prop="projectStatus" label="是否完成项目" align="center">
<template slot-scope="scope">{{ scope.row.projectStatus | partFinish }}</template>
</el-table-column>
<el-table-column prop="finishTime" label="完成项目日期" align="center">
<template slot-scope="scope">{{ scope.row.finishTime }}</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png">
<p>没有相关数据,请重新选择查询范围</p>
</div>
</div>
</el-table>
</div>
</template>
<script>
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
import * as operationData from "../../utils/operation";
import echarts from "echarts";
import { setTimeout } from "timers";
let vm = null;
export default {
props: {
formInline: {
type: Object
},
activeName: {
type: String
},
organizationNum: {
type: Number
},
organizationList: {
type: Array
}
},
data() {
return {
// 只有一个机构时显示人员完成情况
projectId: "",
finishDetail: [],
cardData: [],
showChart: false,
showTable: false,
showData: false,
};
},
created() {
vm = this;
this.projectId = vm.getUrlSearch(window.location.href, "id");
},
mounted: function() {
// commonUtil.resizeHeight();
this.$on("search", () => {
this.search();
});
this.$on("init", () => {
this.$nextTick(function() {
if (vm.formInline.region.length != 0) {
this.search();
}
});
});
this.$on("reset", () => {
this.showData = false;
this.showChart = false;
this.showTable = false;
this.finishDetail = [];
this.cardData = [];
});
// if (this.activeName == "first") {
// this.updateResize();
// }
},
methods: {
search() {
if (vm.formInline.region.length == 0) {
const h = this.$createElement;
vm.$message({
message: h('p', { style: 'color: #FF3399' }, '请先选择地区后再进行查询 ')
});
return;
}
let checkAll = operationData.hasAll(vm.formInline.organization)
console.log(vm.formInline,checkAll,vm.organizationList);
let req = {
projectId: vm.projectId,
ids: operationData.getIds(vm.formInline,vm.organizationList,checkAll),
type: operationData.getSearchType(vm.formInline,checkAll),
originalFlag: vm.formInline.checked == false ? 0 : 1
};
console.log("1 req", req);
openLoading(vm);
vm.reportGET("report/portal/getParticipateInfo", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
this.getCardData(res.data);
vm.showData = true;
if(res.data.participateHospitalCount == 0 && res.data.participatePeopleCount == 0) {
vm.$message("没有相关数据,请重新选择查询范围");
}
} else {
vm.$message(res.message);
}
});
vm.reportGET("report/portal/top", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
this.getRank(res.data);
this.getTableData(res.data);
}
});
},
updateResize() {
this.$nextTick(function() {
let chartRank = echarts.init(document.getElementById("rankChart"));
window.onresize = function() {
chartRank.resize();
};
});
},
getTableData(data) {
if (vm.formInline.region.length == 3 && vm.organizationNum == 1) {
vm.showTable = true;
vm.finishDetail = data.hospitalPeopleList;
} else {
vm.showTable = false;
}
},
getRank(data) {
let xAxisData = [];
let seriesData = [];
for (let i = 0; i < data.top.length; i++) {
xAxisData[i] = data.top[i].name;
seriesData[i] = data.top[i].percentage;
}
if(vm.organizationNum == 1 || xAxisData.length <= 1) {
vm.showChart = false;
}
if (xAxisData.length > 1 && vm.organizationNum !=1) {
vm.showChart = true;
setTimeout(function() {
let myChart = echarts.init(vm.$refs.rankChart);
let optionValue = operationData.getRank(xAxisData, seriesData);
myChart.setOption(optionValue);
vm.updateResize();
}, 200);
}
},
getCardData(data) {
vm.cardData = [
{
title: "应参与机构数",
num: data.participateHospitalCount,
},
{
title: "已参与机构数",
num: data.hasParticipateHospitalCount,
},
{
title: "应参与人数",
num: data.participatePeopleCount,
},
{
title: "已参与人数",
num: data.hasParticipatePeopleCount,
},
{
title: data.type == 1 ? "项目完成人数" : "项目获证人数",
num: data.acquireCertificatePeopleCount,
},
];
if(data.manyCertificate != null) {
for(let i=0;i<data.manyCertificate.length;i++) {
let obj = {
title: data.manyCertificate[i].name,
num: data.manyCertificate[i].value,
}
if(obj.title != null) {
vm.cardData.push(obj);
}
}
}
// vm.cardData[0].num = data.participateHospitalCount;
// vm.cardData[1].num = data.participatePeopleCount;
// vm.cardData[2].num = data.hasParticipatePeopleCount;
// vm.cardData[3].num = data.acquireCertificatePeopleCount;
},
}
};
</script>
<style lang='scss'>
.part-in-wrap {
background: #fff;
overflow: hidden;
// padding: 10px;
.empty {
height: 300px;
line-height: 300px;
color: #FF3399;
text-align: center;
}
.el-card {
border-width: 0px;
}
.el-card.is-always-shadow {
box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.1);
}
.line {
background: #e4e4e4;
height: 80px;
width: 1px;
float: left;
margin-top: 20px;
}
.box-card {
width: 13%;
margin-right: 1%;
font-size: 14px;
float: left;
.el-card__header {
border-bottom-width: 0;
}
.title {
text-align: center;
}
.box-content {
text-align: center;
height: 40px;
font-size: 15px;
}
}
.charts {
top: 20px;
margin-left: 10%;
width: 80%;
border-radius: 4px;
border: 1px solid #ebeef5;
background-color: #fff;
overflow: hidden;
color: #303133;
-webkit-transition: 0.3s;
transition: 0.3s;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
height: 600px;
background: #fff;
padding: 20px;
}
.project-table {
top: 15px;
background: #fff;
}
}
</style>
<template>
<div class="name-list-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond" :curmbThird="curmbThird" :curmbFouth="curmbFouth" :jumPathThird="jumPathThird" :jumPathFouth="jumPathFouth"></bread-crumb>
<div class="component-content screenSet" id="screenSet">
<p class="course-p">地区:{{ queryData.region }}</p>
<p class="course-p">选择机构:{{ queryData.organization }}</p>
<el-form
class="form-update"
ref="serchForm"
:model="formData"
label-width="100px"
style="width:40%;"
>
<el-form-item v-if="tableType == 1" label="课程完成状态:">
<el-select
v-model="formData.learnFlag"
size="small"
style="width: 100%;"
placeholder="请选择状态"
>
<el-option
v-for="(item,index) in statusList"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item v-if="tableType == 2" label="考试成绩等级:">
<el-select v-model="formData.gradeFlag" size="small" style="width: 100%;" placeholder="请选择状态">
<el-option
v-for="(item,index) in rankList"
:key="index"
:label="item.gradeName"
:value="item.gradeFlag"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="查询姓名: ">
<el-input size="small" placeholder="查询姓名" v-model="formData.doctorName"></el-input>
</el-form-item>
</el-form>
<div class="form-button">
<el-button @click="searchData()" type="primary">查询</el-button>
<el-button @click="resetForm()">重置</el-button>
</div>
<el-table :data="tableData" class="course-table">
<el-table-column prop="doctorName" label="姓名" align="center"></el-table-column>
<el-table-column prop="sex" label="性别" align="center"></el-table-column>
<el-table-column prop="age" label="年龄" align="center"></el-table-column>
<el-table-column prop="titleName" label="职称" align="center"></el-table-column>
<el-table-column prop="hospitalName" label="机构" align="center"></el-table-column>
<el-table-column prop="addressName" label="地区" align="center"></el-table-column>
<el-table-column v-if="tableType == 1" prop="learnStatus" label="参与课程状态" align="center">
<template slot-scope="scope">
<span>{{ scope.row.learnStatus }}</span>
</template>
</el-table-column>
<el-table-column
v-if="tableType == 1"
prop="finishedTime"
label="完成培训日期"
align="center"
min-width="150"
>
<template slot-scope="scope">
<span>{{ scope.row.finishedTime }}</span>
</template>
</el-table-column>
<el-table-column
v-if="tableType == 2"
prop="passTime"
label="通过考试日期"
min-width="150"
align="center"
>
<template slot-scope="scope">
<span>{{ scope.row.passTime }}</span>
</template>
</el-table-column>
<el-table-column
v-if="tableType == 2"
prop="gradeName"
label="考试成绩等级"
min-width="80"
align="center"
>
<template slot-scope="scope">
<span>{{ scope.row.gradeName }}</span>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png">
<p>没有相关数据,请重新选择查询范围</p>
</div>
</div>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNo"
:page-sizes="[20, 50 ,100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
></el-pagination>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "../../components/breadcrumb.vue";
import { create } from "domain";
import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
import * as operationData from "../../utils/operation";
let vm = null;
export default {
components: {
BreadCrumb
},
props: {
formInline: {
type: Object
}
},
data() {
return {
curmbFirst: "学情报告",
curmbSecond: "项目管理",
curmbThird: "",
curmbFouth: "",
jumPathThird: "/report-list",
jumPathFouth: "",
formData: {
doctorName: "",
learnFlag: -1,
gradeFlag: -1,
pageNo: 1,
pageSize: 20,
},
region: "",
organization: "",
tableData: [],
tableType: 1,
totalRows: 0,
statusList: [
{
value: -1,
label: "全部"
},
{
value: 0,
label: "未参与"
},
{
value: 1,
label: "参与中"
},
{
value: 2,
label: "已完成"
}
],
rankList: [],
queryData: {}
};
},
// computed: {
// ...mapGetters([
// "_token",
// ])
// },
created() {
vm = this;
vm.getInitData();
vm.search();
},
mounted: function() {
commonUtil.resizeHeight();
},
methods: {
getHostital() {
let req = {
projectId: vm.queryData.projectId,
hospitalIds: vm.queryData.ids,
};
vm.reportGET("report/portal/getHostitalName", req).then(res => {
if (res.code == "000000") {
}
});
},
getInitData() {
vm.queryData = this.$route.query;
vm.tableType = vm.queryData.tableType;
vm.curmbThird = vm.getUrlSearch(window.location.href, "projectName");
vm.jumPathFouth = '/item-list?id=' + vm.queryData.projectId + '&projectName=' + vm.queryData.projectName;
console.log("queryData", vm.queryData);
if(vm.queryData.type == 4) {
vm.getHostital();
}
},
searchData() {
vm.formData.pageNo = 1;
vm.search();
},
search() {
let query = this.queryData;
if (this.tableType == 1) {
vm.curmbFouth = "课程培训情况";
//课程分析
// console.log('this.tableType',this.tableType)
let req = {
projectId: query.projectId,
originalFlag: query.originalFlag,
ids: query.ids,
type: query.type,
courseId: query.courseId,
learnFlag: vm.formData.learnFlag,
doctorName: vm.formData.doctorName,
pageNo: vm.formData.pageNo,
pageSize: vm.formData.pageSize,
};
console.log("course req", req);
openLoading(vm);
vm.reportGET("report/portalProjectCourse/getUserList", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
if(res.data.totalCount == 0 ) {
vm.$message("没有相关数据,请重新选择查询范围");
}
vm.tableData = res.data.list;
vm.totalRows = res.data.totalCount;
} else {
vm.$message(res.message);
}
});
} else if (this.tableType == 2) {
vm.curmbFouth = "考试培训情况";
//考试分析
let reqRank = {
projectId: query.projectId,
}
vm.reportGET("report/portalProjectExam/getGradeList", reqRank).then(res => {
if (res.code == "000000") {
vm.rankList = operationData.initRank(res.data.list);
}
});
let req = {
projectId: query.projectId,
originalFlag: query.originalFlag,
ids: query.ids,
type: query.type,
examId: query.examId,
gradeFlag: vm.formData.gradeFlag,
doctorName: vm.formData.doctorName,
pageNo: vm.formData.pageNo,
pageSize: vm.formData.pageSize,
};
console.log("exam req", req);
openLoading(vm);
vm.reportGET("report/portalProjectExam/getUserList", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
if(res.data.totalCount == 0 ) {
vm.$message("没有相关数据,请重新选择查询范围");
}
vm.tableData = res.data.list;
vm.totalRows = res.data.totalCount;
} else {
vm.$message(res.message);
}
});
}
},
resetForm() {
vm.formData = Object.assign(
{},
{
doctorName: "",
learnFlag: -1,
gradeFlag: -1,
pageNo: 1,
pageSize: 20,
}
);
vm.search();
},
handleSizeChange(val) {
console.log(`每页 ${val} 条`);
this.formData.pageSize = val;
this.search();
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.formData.pageNo = val;
this.search();
}
}
};
</script>
<style lang="scss">
.name-list-wrap {
.component-content {
background: #fff;
padding: 10px;
.header-title {
padding: 10px 12px;
font-size: 12px;
color: #449284;
border-bottom: 1px solid #efefef;
}
.course-p {
margin: 30px 0 20px 30px;
font-size: 13px;
color: #606266;
}
.form-update {
margin: 30px 0px 0px 20px;
}
.form-button {
width: 45%;
top: -62px;
position: relative;
left: 50%;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="item-list">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<div class="itemlist-content screenSet" id="screenSet">
<el-row :gutter="30" class="row" type="flex" style="margin-top: 10px;">
<el-form ref="serchForm" :model="formData" label-width="75px" style="width:100%;">
<el-col :span="6">
<el-form-item label="项目状态:">
<el-select
v-model="formData.status"
size="small"
style="width: 100%;"
placeholder="请选择项目状态"
>
<el-option
v-for="(item,index) in statusSelect"
:key="index"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-input v-model="formData.name" size="small" placeholder="请输入项目名称">
<i slot="suffix" class="el-icon-search"></i>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12" style="padding:0;text-align:right;padding-right:15px;">
<el-button type="primary" size="small" @click="searchData()">查询</el-button>
<el-button type="default" size="small" @click="resetForm()" style="margin-left:0;">重置</el-button>
</el-col>
</el-form>
</el-row>
<el-table :data="tableData" style="width: 100%">
<el-table-column prop="projectName" label="项目名称" min-width="200" align="center"></el-table-column>
<el-table-column prop="timeStatus" label="项目状态" min-width="80" align="center">
<template slot-scope="scope">
{{ scope.row.timeStatus | reportStatus }}
</template>
</el-table-column>
<el-table-column prop="projectBegintime" label="开始时间" min-width="160" align="center">
<template slot-scope="scope">{{ scope.row.projectBegintime }}</template>
</el-table-column>
<el-table-column prop="projectEndtime" label="结束时间" min-width="160" align="center">
<template slot-scope="scope">{{ scope.row.projectEndtime }}</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="200">
<template slot-scope="scope">
<el-button style="color:#509284" type="text" size="small" @click="go(scope.row)">查看学情报告</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../assets/image/no-content1.png" />
<p>没有找到符合的结果</p>
</div>
</div>
</el-table>
<div class="pagination">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="formData.pageNo"
:page-sizes="[20, 50 ,100]"
:page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="totalRows"
></el-pagination>
</div>
</div>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import { openLoading, closeLoading } from "../../utils/utils";
import * as commonUtil from "../../utils/utils";
import BreadCrumb from "../../components/breadcrumb.vue";
let vm = null;
export default {
data() {
return {
curmbFirst: "学情报告",
curmbSecond: "项目列表",
formData: {
//搜索信息
status: "",
name: "",
pageNo: 1, //当前是第几页
pageSize: 20 //页面总数
},
statusSelect: [
//项目状态
{
label: "全部",
value: ""
},
{
label: "进行中",
value: 1
},
{
label: "已结束",
value: 2
}
],
tableData: [],
totalRows: 0, //数据总数
idType: '',
};
},
components: {
BreadCrumb
},
created() {
vm = this;
vm.idType = localStorage.getItem('storageIdType');
vm.search();
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight();
},
methods: {
searchData() {
vm.formData.pageNo = 1;
vm.search();
},
// 搜索列表
search() {
let req = {};
req = this.formData;
openLoading(vm);
vm.GET("portal/portalInfo/getPortalReportProject", req).then(res => {
closeLoading(vm);
if (res.code == "000000") {
if(res.data.totalRows == 0) {
vm.$message("没有找到符合的结果");
}
vm.tableData = res.data.projectList;
vm.totalRows = res.data.totalRows;
} else {
vm.$message(res.message);
}
});
},
// 重置搜索信息
resetForm() {
this.formData = {
status: "",
name: "",
pageNo: 1, //当前是第几页
pageSize: 20 //页面总数
};
vm.search();
},
// 更改数据显示数量
handleSizeChange(val) {
console.log(`每页 ${val} 条`);
vm.formData.pageSize = val;
vm.search();
},
// 换页
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
vm.formData.pageNo = val;
vm.search();
},
//跳转到报告详情页
go(row) {
let routerData = {
id: row.id,
projectName: row.projectName,
};
vm.$router.push({ path: "/item-list" , query: routerData });
}
}
};
</script>
<style lang="scss">
.item-list {
.itemlist-content {
padding: 10px;
background: #fff;
}
}
</style>
\ No newline at end of file
......@@ -127,7 +127,7 @@
'changeToken',
]),
checkPhone(val) {
if(!(/^1[345678]\d{9}$/.test(val))) {
if(!(/^1[3456789]\d{9}$/.test(val))) {
return false;
} else {
return true;
......
<template>
<div>
</div>
</template>
<script>
export default {}
</script>
<style scoped lang="scss">
</style>
<template>
<div class="select-patient-dialog">
<el-dialog
title="添加居民"
:visible.sync="showSelectPatient"
v-if="isShowSelectPatient"
:before-close="clickClose"
:close-on-click-modal="false"
:close-on-press-escape="false"
width="1100px"
top="2%"
center>
<div class="finish-content">
<el-form
ref="searchData"
:model="searchData"
:inline="true"
class="select-width"
size="small">
<div style="display: flex;justify-content: flex-end;margin-bottom: 15px">
<el-button plain size="small" @click="goAddPatient">+ 新增居民</el-button>
</div>
<div style="display: flex;justify-content: space-between;">
<div>
<el-form-item prop="sex">
<el-select
class="init-width"
v-model="searchData.sex"
placeholder="请选择性别"
clearable>
<el-option
v-for="(item,index) in sexOptions"
:key="index"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="ageRange">
<el-select
v-model="searchData.ageRange"
multiple
collapse-tags
filterable
placeholder="请选择年龄段"
class="init-width2"
clearable>
<el-option
v-for="(item,index) in ageOptions"
:key="index"
:label="item.value"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="diseaseId">
<!--<el-select
v-model="searchData.diseaseId"
multiple
collapse-tags
filterable
placeholder="请选择诊断"
class="set-width"
clearable>
<el-option
v-for="(item,index) in diseaseOptions"
:key="index"
:label="item.diseaseName"
:value="item.diseaseId">
</el-option>-->
<!--</el-select>-->
<el-select
v-model="searchData.icdCodeList"
multiple
collapse-tags
filterable
remote
reserve-keyword
placeholder="请选择或搜索诊断"
:remote-method="getDiseaseData"
:loading="loading"
class="set-width"
>
<el-option
v-for="item in icdOptions"
:key="item.icdCode"
:label="item.diseaseName"
:value="item.icdCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="labelId">
<el-select
v-model="searchData.labelId"
multiple
collapse-tags
filterable
class="set-width"
placeholder="请选择或搜索分组"
clearable>
<el-option
v-for="(item,index) in labelOptions"
:key="index"
:label="item.labelName"
:value="item.labelId">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="fuPlanIdList" v-if="selectPatientType == 1">
<el-select
v-model="searchData.fuPlanIdList"
multiple
collapse-tags
filterable
class="set-width"
placeholder="请选择随访计划"
clearable>
<el-option
v-for="(item,index) in fuPlanOptions"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="searchCondition">
<el-input
v-model="searchData.searchCondition"
placeholder="请输入姓名,手机号,身份证"
clearable
class="set-width">
<!--<i slot="prefix" class="el-input__icon el-icon-search" @click="searchHandler" style="cursor: pointer"></i>-->
</el-input>
</el-form-item>
</div>
<div>
<el-button type="primary" @click="searchHandler" size="small">查询</el-button>
<el-button plain @click="resetData('searchData')" size="small">重置</el-button>
</div>
</div>
</el-form>
<el-table
:data="patientsData"
ref="multipleTable"
center
style="width: 100%;margin-top: 10px;"
height="250"
:row-key="getRowKeys"
class="spe-table"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
:reserve-selection="true"
:selectable="checkboxInit">
</el-table-column>
<el-table-column
prop="nickname"
label="姓名"
align="center">
</el-table-column>
<el-table-column
prop="sexStr"
label="性别"
min-width="50"
align="center">
</el-table-column>
<el-table-column
prop="ageStr"
label="年龄"
min-width="50"
align="center">
</el-table-column>
<el-table-column
prop="mobilePhone"
label="手机"
align="center"
min-width="130">
</el-table-column>
<el-table-column
prop="idNoStr"
label="身份证"
align="center"
min-width="130">
</el-table-column>
<el-table-column
prop="showDiseaseNames"
label="诊断"
align="center"
width="180"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="showLabelName"
label="分组"
align="center"
width="180"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
v-if="selectPatientType == 1"
prop="fuPlanName"
label="随访计划"
align="center"
width="180"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.fuPlanName">{{scope.row.fuPlanName}}</span>
<span v-else>-</span>
</template>
</el-table-column>
</el-table>
<el-row type="flex" justify="space-between" align="middle" class="margin-top15">
<!--<span>已选:{{newSelects.length}}人</span>-->
<span></span>
<el-pagination
background
v-if="patientsData.length"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="paginationSet.pageNum"
:page-sizes="[15,30,50,100]"
:page-size="paginationSet.pageSize"
:total="paginationSet.total">
</el-pagination>
</el-row>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="clickClose" size="small" plain>取 消</el-button>
<el-button type="primary" size="small" @click="sureClick">确 定</el-button>
</div>
</el-dialog>
<el-dialog
class="reload-label-modal"
:visible.sync="showReloadModal"
width="320px"
:show-close="false"
:close-on-click-modal="false"
center>
<p class="tips">您刚才跳转到新增居民页面进行新增居民,请点击下方按钮刷新数据</p>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleReload">重新加载</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex'
import { getConstants, getPatientInfoList, getDiseasesList, getLabelList, getIcdList } from '@/utils/patients/patientsapi'
import { getPlanList } from '@/utils/followup/followapis'
export default {
components: {},
name: "select-patient",
data() {
return {
showSelectPatient: true,
allSelects: [],
// eachSelects: [],//仅仅是操作选择的总人员
// totalSelect: [],// 当前所选的人
srvPackageId: '',
patientsData: [],
searchData: {
sex: null,
ageRange: [],
diseaseId: [],
labelId: [],
fuPlanIdList: [],
searchCondition: '',
icdCodeList: [],
},
paginationSet: {
pageNum: 1,
pageSize: 15,
total: 0
},
sexOptions: [{
no: '',
value: '不限'
}],
ageOptions: [
// {no: '', value: '年龄范围'}
],
diseaseOptions: [
// {diseaseId: '', diseaseName: '基础疾病'}
],
labelOptions: [
// {labelId: '', labelName: '分组'}
],
fuPlanOptions: [],
newSelects: [], //新选中的人
oldPatientList: [],
showReloadModal: false,
loading: false,
icdOptions: [],
getRowKeys(row) {
return row.patientId;
},
}
},
props: {
isShowSelectPatient: Boolean, //是否显示model,
patientIdList: Array,// 确定已经选过的居民
oldPatientIdList: Array,// 确定已经选过的居民
selectPatientType: Number, //获取居民列表所需字段,随访是1,分组是2,患教是3
sourceId: {
type: String,
required: false,
default: '',
},
},
watch: {
isShowSelectPatient(val){
if(val){
this.getPatientsList()
//获取搜索诊断
this.getDiseaseData();
// 获取常量 性别、年龄
getConstants({
numList: 'P057,P006'
}).then(res=>{
this.sexOptions = [{
no: '',
value: '不限'
}];
this.sexOptions = this.sexOptions.concat(res.data.P006);//性别
this.ageOptions = [
// {no: '', value: '年龄范围'}
];
this.ageOptions = this.ageOptions.concat(res.data.P057);//年龄段
});
// 获取所有疾病
getDiseasesList().then(res=>{
this.diseaseOptions = [
// {diseaseId: '', diseaseName: '基础疾病'}
];
this.diseaseOptions = this.diseaseOptions.concat(res.data);
});
// 获取所有分组
getLabelList({type: 1}).then(res=>{
this.labelOptions = [
// {labelId: '', labelName: '分组'}
]
this.labelOptions = this.labelOptions.concat(res.data.labelNameList);
});
// 获取随访计划列表
getPlanList({
pageNo: -1,
}).then(res => {
if(res.code == '000000') {
this.fuPlanOptions = res.data.fPlanDtoList;
}
})
}
},
},
methods: {
checkboxInit(row,index){
if(row.disableNum == undefined) {
return 1
} else {
return row.disableNum
}
},
getDiseaseData(query) {
// if (query !== '') {
let params = {
diseaseName: query ? query : '',
pageSize: 200,
pageNum: 1,
};
this.loading = true;
getIcdList(params).then(data => {
this.loading = false;
if(data.code == "000000") {
this.icdOptions = data.data;
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
});
// }else {
// this.icdOptions = [];
// }
},
getPatientsList(){
const data = {
pageSize: this.paginationSet.pageSize,
pageNo: this.paginationSet.pageNum,
labelIdList:this.searchData.labelId,
diseaseIdList: this.searchData.diseaseId,
ageList: this.searchData.ageRange,
sex: this.searchData.sex,
searchCondition:this.searchData.searchCondition,
srvPackageId:this.srvPackageId,
addType: this.selectPatientType, //随访是1,分组是2,患教是3
fuPlanIdList: this.searchData.fuPlanIdList || [],
sourceId: this.sourceId, //若是随访的话,传planId;若是分组的话,传labeledId;
icdCodeList: this.searchData.icdCodeList
}
getPatientInfoList(data).then(res=>{
if(res.data.patientList){
this.patientsData = res.data.patientList //接口获取的当页居民
this.getSex()
this.paginationSet.total = res.data.totalRows
// 设置所请求的当页人员是否成为选中状态
// console.log('传入的已选居民',this.patientIdList)
this.patientsData.forEach((item)=>{
item.disableNum = 1;
let diseaseNames = [];
let groupNames = []
//转化分组
if(item.labelModels) {
item.labelModels.forEach(item => {
groupNames.push(item.label)
});
item.showLabelName = groupNames.join('、');
} else {
item.showLabelName = '-';
}
//转化诊断
if(item.patientTypeModels) {
item.patientTypeModels.forEach(item => {
diseaseNames.push(item.diseaseName)
})
item.showDiseaseNames = diseaseNames.join('、');
}else {
item.showDiseaseNames = '-';
}
//针对随访项目
if(this.patientIdList.length > 0){
if(this.patientIdList.includes(item.patientId)){// 如果已经选过居民
this.$nextTick(()=>{
this.$refs.multipleTable.toggleRowSelection(item,true);
})
}
}
if(this.oldPatientIdList!=undefined&&this.oldPatientIdList.length) {
this.oldPatientList = [];
this.patientsData.forEach((item)=>{
if(this.oldPatientIdList.includes(item.patientId)){// 如果已经选过居民
item.disableNum = 0;
this.oldPatientList.push(item);
} else {
item.disableNum = 1
}
})
}
//针对分组详情
// this.patientIdList = res.data.selectedPatientIdList;
let selectedPatientIdList = res.data.selectedPatientIdList;
if(selectedPatientIdList && selectedPatientIdList.length > 0){
if(selectedPatientIdList.includes(item.patientId)){// 如果已经选过居民
this.$nextTick(()=>{
this.$refs.multipleTable.toggleRowSelection(item,true);
})
}
}
if(selectedPatientIdList && selectedPatientIdList.length > 0) {
this.patientsData.forEach((item)=>{
if(selectedPatientIdList.includes(item.patientId)){// 如果已经选过居民
item.disableNum = 0;
this.oldPatientList.push(item);
} else {
item.disableNum = 1
}
})
}
})
// console.log(this.oldPatientIdList)
}else{
this.patientsData = []
}
})
},
getSex(){
this.patientsData.forEach((item,index)=>{
if(item.sex==1){
this.patientsData[index].sexStr = '男'
}else if(item.sex==2){
this.patientsData[index].sexStr = '女'
}else{
this.patientsData[index].sexStr = '-'
}
if(!item.idNo) {
this.patientsData[index].idNoStr = '-'
}else {
this.patientsData[index].idNoStr = item.idNo
}
if(item.age || item.age == 0) {
this.patientsData[index].ageStr = item.age
}else {
this.patientsData[index].ageStr = '-'
}
})
},
// 对选中的居民进行去重
removeDuplicates(list){
return Array.from(new Set(list))
},
// 选择居民
handleSelectionChange(val) {
const _this = this;
_this.newSelects = [];
val.forEach(item => {
if(item.disableNum == 1) {
_this.newSelects.push(item)
}
})
},
// 切换分页
handleCurrentChangePre(val) {
this.paginationSet.pageNum = val
this.getPatientsList()
//控制切换页码的时候,滚动条滚到最上面
this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
},
clickClose(){
// this.searchData.searchCondition = ''
this.searchData = {
sex: null,
ageRange: [],
diseaseId: [],
labelId: [],
fuPlanIdList: [],
searchCondition: '',
icdCodeList: [],
}
this.$emit('closeSelectPatient',false)
},
sureClick(){
if(this.newSelects.length) {
// this.searchData.searchCondition = ''
this.searchData = {
sex: null,
ageRange: [],
diseaseId: [],
labelId: [],
fuPlanIdList: [],
searchCondition: '',
icdCodeList: [],
}
this.$emit('sureSelectPatient',false,this.newSelects,this.oldPatientList)
} else {
this.$message.warning('请先选择!')
}
},
handleSizeChangePre(val) {
this.paginationSet.pageSize = val;
this.getPatientsList();
this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
},
searchHandler() {
this.paginationSet.pageNum = 1;
this.getPatientsList();
this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
},
resetData(formName) {
this.$refs[formName].resetFields();
this.getPatientsList();
this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
},
goAddPatient() {
// this.$router.push({
// path: '/patients-manage/new-manage/new-patient'
// })
let routeData = this.$router.resolve({ path: '/patients-manage/new-manage/new-patient' });
window.open(routeData.href, '_blank');
this.showReloadModal = true;
},
handleReload() {
this.paginationSet.pageNum = 1;
this.getPatientsList();
this.$refs.multipleTable.bodyWrapper.scrollTop = 0;
this.showReloadModal = false;
},
ageDate(val){
let ageObj;
if(!val){
ageObj = {
ageBegin:'',
ageEnd:''
}
}else if(val.indexOf('+') > -1){
ageObj = {
ageBegin: 84,
ageEnd: 200
}
}else {
let ageItem = val.split('-');
ageObj = {
ageBegin:ageItem[0],
ageEnd:ageItem[1]
}
}
return ageObj;
}
},
}
</script>
<style lang="scss">
.init-width{
width: 100px !important;
.el-input{
width: 100px!important;
}
}
.init-width2{
width: 110px !important;
.el-input{
width: 110px!important;
}
}
.set-width{
width: 150px !important;
.el-input{
width: 150px!important;
}
}
</style>
<style lang="scss">
@import '../../../../style/patients-style/element-reset.css';
.select-patient-dialog {
.el-dialog__wrapper {
overflow: hidden;
.el-dialog--center {
/*height: 580px;*/
.el-dialog__body{
padding: 10px 25px 15px;
}
.el-table--scrollable-y,.el-table__body-wrapper {
&::-webkit-scrollbar{
width:5px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
/*.el-dialog__body {
max-height: 80%;
overflow: hidden;
.finish-content {
height: 100%;
.el-table {
.el-table--scrollable-y .el-table__body-wrapper {
height: 80%;
}
}
}
}*/
}
}
.select-width .el-form-item{
/*width: 130px;*/
}
.margin-top15{
margin-top: 15px;
}
.el-form-item--mini.el-form-item, .el-form-item--small.el-form-item{
margin-bottom: 5px;
}
.el-select__tags-text{
display: inline-block;
max-width: 70px;
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
.el-select .el-tag__close.el-icon-close{
top: -5px;
}
}
</style>
<template>
<div class="label-list-wrap label-detail-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond"
:curmbThird="curmbThird"
:jumPathThird="jumPathThird">
</bread-crumb>
<div class="component-content screenSet" id="screenSet">
<div class="label-name">
<p class="title">分组名称:</p>
<p class="name">{{$route.query.labelName}}</p>
<p class="modify" v-if="!isUngrouped" @click="handleChangeLabelName">修改</p>
<el-button type="danger" plain size="small" class="delete-label" v-if="!isUngrouped" @click="goToDeleteLabel">删除分组</el-button>
</div>
<div class="label-member">
<p class="title">分组成员:</p>
<p class="member-number">{{searchData.totalRows}}</p>
<div class="right">
<el-button type="primary" size="small" class="create-new-label" v-if="!isUngrouped" @click="addPatientsHandler">添加居民</el-button>
<el-button type="default" size="small" class="create-new-label" v-if="!isUngrouped" :disabled="isBatchDeleteDisabled" @click="handleDeletePatients">批量移除</el-button>
</div>
</div>
<el-table
ref="multipleTable"
:data="searchData.tableData"
tooltip-effect="dark"
style="width: 100%"
:row-key="getRowKeys"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
:reserve-selection="true"
width="55">
</el-table-column>
<el-table-column
label="姓名"
prop="nickname"
width="150">
</el-table-column>
<el-table-column
label="性别"
prop="sexStr"
width="150">
</el-table-column>
<el-table-column
label="年龄"
prop="patientAge"
width="150">
</el-table-column>
<el-table-column
label="诊断"
prop="patientTypeGroup"
>
</el-table-column>
<el-table-column
label="操作"
width="120"
>
<template slot-scope="scope" v-if="!isUngrouped">
<el-button
class="remove-btn"
@click="goToDeleteRow(scope.$index, searchData.tableData)"
type="text"
size="small">
移除
</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty" v-if="searchData.tableData && searchData.tableData.length < 1">
<img class="empty-pic" src="../../../assets/image/no-content1.png">
<p class="tips">当前分组暂无成员</p>
</div>
</div>
</el-table>
<el-pagination
v-if="searchData.tableData && searchData.tableData.length > 0"
class="pagination-style"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalRows"
:current-page="searchData.pageNo"
:page-sizes="[15, 30, 50, 100]"
:page-size="searchData.pageSize"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<el-dialog
title="修改名称"
:visible.sync="showChangeLabelNameDialog"
width="400px"
center
:show-close='false'
:close-on-click-modal="false"
>
<el-form>
<el-form-item :class="changeNameClass">
<el-input
type="textarea"
v-model="ruleForm.newLabelName"
placeholder="请填写分组名称,最多15个字符"
maxlength="15"
@input="handleNewNameInputChange"
>
</el-input>
<div class="err-text">{{changeNameTips}}</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="cancelChangeName">取 消</el-button>
<el-button type="primary" @click="confirmChangeName">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="删除分组"
:visible.sync="centerDialogVisible"
width="400px"
center
:show-close='false'
:close-on-click-modal="false"
>
<div class="delete-tips">分组删除后,所有分组居民(共{{searchData.totalRows}}人)将不再属于此分组。</div>
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDeleteLabel">取 消</el-button>
<el-button type="primary" @click="confirmDeleteLabel">确认删除</el-button>
</span>
</el-dialog>
<el-dialog
title="移除居民"
:visible.sync="showDeletePatientsDialog"
width="400px"
center
:show-close='false'
:close-on-click-modal="false"
>
<div class="delete-tips">移除后改居民将从分组中移除,若居民已没有任何分组,该居民将被自动分配至「未分组」</div>
<span slot="footer" class="dialog-footer">
<el-button @click="cancelDeletePatients">取 消</el-button>
<el-button type="primary" @click="confirmDeletePatients">确 定</el-button>
</span>
</el-dialog>
</div>
<select-patient
:isShowSelectPatient="isShowSelectPatient"
:patientIdList="patientIdList"
:oldPatientIdList="patientIdList"
@closeSelectPatient="closeSelectPatient"
:selectPatientType="selectPatientType"
:sourceId="String(this.$route.query.labelId)"
@sureSelectPatient="sureSelectPatient(arguments)"
/>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import * as commonUtil from "@/utils/utils";
import {
getLabelDetail,
deleteCurrentLabel,
changeLabelName,
deleteCurrentPatients,
saveLabelsForPatient,
} from '@/utils/patients/patientsapi'
import SelectPatient from './dialog/select-patitents';
export default {
data(){
return {
curmbFirst: "居民管理",
curmbSecond: "分组管理",
curmbThird: '分组详情',
jumPathThird: '/patients-manage/labels-manage/labels-list',
isChangeNameError: false,
changeNameTips: '',
showChangeLabelNameDialog: false,
centerDialogVisible: false,
showDeletePatientsDialog: false,
isShowSelectPatient: false,
patientIdList: [],
sourceId: '',
searchData: {
pageNo: 1, // 第几页
pageSize: 15, // 每页条数
tableData: [],
totalRows: 0,
},
ruleForm: {
newLabelName: '', // 修改后的分组名
},
isSingleDelete: false,
singleDeleteInfo: [],
multipleSelection: [],
selectPatientType: 2, //选择居民时需要的type类型
getRowKeys(row) {
// console.log('>>>> ', row)
return row.id;
},
}
},
components: {
BreadCrumb,
SelectPatient,
},
computed: {
changeNameClass() {
return this.isChangeNameError == true ? 'special-error-tips' : ''
},
isUngrouped(){ // 是否未分组
return this.$route.query.labelId == 0 ? true : false;
},
isBatchDeleteDisabled() {
let selectList = this.multipleSelection;
if(selectList.length < 1){
return true;
}
return false;
}
},
created() {
this.getDetail();
},
// 挂载到Dom完成时
mounted() {
// commonUtil.resizeHeight();
},
methods: {
getDetail() {
let labelId = this.$route.query.labelId;
// 获取分组详情
let params = {
pageNo: this.searchData.pageNo,
pageSize: this.searchData.pageSize,
};
getLabelDetail(labelId, params).then(data => {
// console.log('获取分组详情>> ', data)
if(data.data){
this.searchData = data.data;
// this.patientIdList = data.data.patientIdList;
let list = data.data.patientListsByLabelModels;
if(list && list.length > 0){
list = list.map(item => {
if(!item.nickname){
item.nickname = '-';
};
if(!item.sexStr){
item.sexStr = '-';
};
if(item.patientAge || item.patientAge == 0){
// 直接显示
}else{
item.patientAge = '-';
};
if(!item.patientTypeGroup){
item.patientTypeGroup = '-';
}
return item;
})
this.searchData.tableData = list;
}else{
this.searchData.tableData = [];
}
}
}).catch(err => {
console.log('error: ', err)
});
},
handleSizeChange(val){
console.log('handleSizeChange>>>')
this.searchData.pageSize = val;
this.getDetail();
},
handleCurrentChange(val){
// 切换当前页
this.searchData.pageNo = val;
this.getDetail();
},
deleteLabel(){
let labelId = this.$route.query.labelId;
let params = {
deleteList: [],
};
params.deleteList.push({
labelId: labelId
});
deleteCurrentLabel(params).then(data => {
// console.log('删除分组>> ', data)
if(data.code == '000000'){
this.centerDialogVisible = false;
this.$router.replace({
path: '/patients-manage/labels-manage/labels-list',
})
}else{
this.$message({
message: '删除分组失败,请重新再试',
type: 'warning'
});
}
}).catch(err => {
console.log('error: ', err)
});
},
goToDeleteLabel(){
this.centerDialogVisible = true;
},
cancelDeleteLabel(){
this.centerDialogVisible = false;
},
confirmDeleteLabel(){
this.deleteLabel();
},
handleChangeLabelName(){
this.showChangeLabelNameDialog = true;
this.ruleForm.newLabelName = this.$route.query.labelName;
},
cancelChangeName(){
this.isChangeNameError = false;
this.ruleForm.newLabelName = '';
this.showChangeLabelNameDialog = false;
},
handleNewNameInputChange(){
this.isChangeNameError = false;
this.changeNameTips = '';
},
// 更改分组名
confirmChangeName() {
let params = {
labelId: this.$route.query.labelId,
labelName: this.$route.query.labelName,
newLabelName: this.ruleForm.newLabelName,
};
if(!params.newLabelName){
this.isChangeNameError = true;
this.changeNameTips = '请输入分组名称';
return;
}
if( params.labelName == params.newLabelName ){
this.isChangeNameError = true;
this.changeNameTips = '该分组名称已被您使用,请重新输入';
return;
}
changeLabelName(params).then(data => {
if(data.code == '000000'){
console.log('分组名修改成功');
this.$message({
message: '分组名修改成功',
type: 'success'
});
this.cancelChangeName();
this.$router.replace({
path: '/patients-manage/labels-manage/labels-detail',
query: {
labelId: params.labelId,
labelName: params.newLabelName,
}
})
}else if(data.code == '202520'){
this.isChangeNameError = true;
this.changeNameTips = '该分组名称已被您使用,请重新输入';
}else{
this.$message({
message: data.message,
type: 'warning'
});
}
}).catch(err => {
console.log('error: ', err)
this.$message({
message: '请求接口失败,请重新再试',
type: 'warning'
});
});
},
handleSelectionChange(val){
console.log('handleSelectionChange>>>> ', val)
this.multipleSelection = val;
},
goToDeleteRow(index, rows) {
// console.log('before: ', this.multipleSelection)
// this.$refs.multipleTable.toggleRowSelection(rows[index]);
// console.log('after: ', this.multipleSelection)
this.isSingleDelete = true;
this.showDeletePatientsDialog = true;
this.singleDeleteInfo = [{ patientId: rows[index].id }];
},
handleDeletePatients() {
this.isSingleDelete = false;
let selectList = this.multipleSelection;
// console.log('list: ', selectList);
let tempArr = [];
for(let i=0; i<selectList.length; i++){
tempArr.push({
patientId: selectList[i].id
})
}
this.multipleSelection = tempArr;
this.showDeletePatientsDialog = true;
},
cancelDeletePatients() {
this.showDeletePatientsDialog = false;
},
confirmDeletePatients() {
let params = {
labelId: this.$route.query.labelId,
patientList: this.multipleSelection,
};
if(this.isSingleDelete == true){ // 点击单个移除时
params.patientList = this.singleDeleteInfo;
}
deleteCurrentPatients(params).then(data => {
if(data.code == '000000'){
this.$message({
message: '移除居民成功',
type: 'success'
});
this.showDeletePatientsDialog = false;
// 删除后去第一页
this.handleCurrentChange(1);
}else{
this.$message({
message: '请求接口失败,请重新再试',
type: 'warning'
});
}
}).catch(err => {
console.log('error: ', err)
});
},
addPatientsHandler() {
this.isShowSelectPatient = true;
},
closeSelectPatient(val) {
this.isShowSelectPatient = val;
},
sureSelectPatient() {
let getArguments = arguments[0];
const selectPatients = getArguments[1]; // 每次选中获取的人
// const oldPatients = getArguments[2]; // 该分组已经存在的居民
let labelId = this.$route.query.labelId;
let patientLen = selectPatients.length;
// let savePatientsList = selectPatients.concat(oldPatients);
saveLabelsForPatient(labelId,{
newLablelName: this.$route.query.labelName,
oldLabelName: this.$route.query.labelName,
saveLists: selectPatients,
// token:
}).then((data) => {
if(data.code == '000000') {
setTimeout(() => {
this.$message.success(`已成功添加${patientLen}位居民`)
this.isShowSelectPatient = getArguments[0];
this.getDetail();
},500)
}else {
this.$message.error(data.message)
}
})
},
}
}
</script>
<style lang="less">
@import "../../../style/patient-manager/labels-manager/labels-detail-wrap.less";
</style>
<style lang="less" scoped>
@import "../../../style/patient-manager/labels-manager/labels-detail.less";
</style>
<template>
<div class="label-list-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond" ></bread-crumb>
<div class="component-content screenSet" id="screenSet">
<p class="top-title">分组管理</p>
<el-row :gutter="30" class="label-name-row">
<el-col :span="6">
<el-input v-model="labelName" placeholder="请输入分组名称" size="small"></el-input>
</el-col>
<el-col :span="6">
<el-button type="primary" size="small" class="create-new-label" @click="getList">查询</el-button>
<el-button type="default" size="small" class="create-new-label" @click="resetLabelName">重置</el-button>
</el-col>
<el-col :span="6" class="right">
<el-button
type="primary" size="small" class="create-new-label"
:disabled="totalListCount >= 999"
@click="createNewLabel"
>
新增分组
</el-button>
</el-col>
</el-row>
<p class="total-label">共:{{totalListCount}}个分组</p>
<div class="label-list" v-if="labelNameList && labelNameList.length > 0">
<el-tag class="each-label" @click="goToDetail(item)" v-for="(item, index) in labelNameList" :key="index">{{item.labelName}}({{item.labelPatientNums}}人)</el-tag>
</div>
<div class="table-empty" v-if="labelNameList && labelNameList.length < 1">
<img class="empty-pic" src="../../../assets/image/no-content1.png">
<p class="tips">没有找到匹配分组</p>
</div>
<el-dialog
class="dialog-boxd"
title="新增分组"
:visible.sync="centerDialogVisible"
width="400px"
center
:show-close='false'
:close-on-click-modal="false"
>
<el-form>
<el-form-item :class="addNewLabelClass">
<el-input
type="textarea"
v-model="ruleForm.newLabelName"
placeholder="请填写分组名称,最多15个字符"
maxlength="15"
@input="handleNewLabelNameChange"
>
</el-input>
<div class="err-text">{{addNewLabelTips}}</div>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="submitForm">确 定</el-button>
</span>
</el-dialog>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import * as commonUtil from "@/utils/utils";
import { getLabelList, createNewLabel } from '@/utils/patients/patientsapi'
export default {
data(){
return {
curmbFirst: "居民管理",
curmbSecond: "分组管理",
labelName: '',
labelNameList: [],
totalListCount: 0,
centerDialogVisible: false,
ruleForm: {
newLabelName: '', // 新建分组名
},
addNewLabelTips: '',
isAddLabelError: false,
}
},
components: {
BreadCrumb,
},
created(){
this.getList();
},
computed: {
addNewLabelClass() {
return this.isAddLabelError == true ? 'special-error-tips' : ''
}
},
// 挂载到Dom完成时
mounted() {
commonUtil.resizeHeight();
},
methods: {
getList() {
// 获取分组列表
let params = {
type: 1,
};
if(this.labelName){
params.labelName = this.labelName;
}
// commonUtil.openLoading(this);
getLabelList(params).then(data => {
// commonUtil.closeLoading(this);
// console.log('获取分组列表>> ', data)
let hasNoLabel = 0; // 是否存在未分组
if(data.data && data.data.labelNameList){
this.labelNameList = data.data.labelNameList;
for(let i=0; i<this.labelNameList.length; i++){
if(this.labelNameList[i].labelId == 0){
hasNoLabel = 1;
break;
}
}
if( hasNoLabel == 1 ){
this.totalListCount = this.labelNameList.length - 1;
}else{
this.totalListCount = this.labelNameList.length;
}
}
}).catch(err => {
console.log('error: ', err)
});
},
resetLabelName() {
this.labelName = '';
this.getList();
},
createNewLabel() {
console.log('新增分组...');
this.centerDialogVisible = true;
},
handleNewLabelNameChange() {
if(this.isAddLabelError == true){
this.isAddLabelError = false;
this.addNewLabelTips = '';
}
},
submitForm() {
let params = {
labelName: this.ruleForm.newLabelName,
};
if(!params.labelName){
this.isAddLabelError = true;
this.addNewLabelTips = '请输入分组名称';
return;
}
// 请求新增
createNewLabel(params).then(data => {
// console.log('新增分组>> ', data)
if(data.code == '202520'){ // 分组名重复
console.log('tips: ', data.message)
this.isAddLabelError = true;
this.addNewLabelTips = '该分组名称已被您使用,请重新输入';
return;
}
if(data.code == '000000'){
console.log('新增成功');
this.$message({
message: '新增分组成功',
type: 'success'
});
this.handleClose();
this.$router.push({
path: '/patients-manage/labels-manage/labels-detail',
query: {
labelId: data.data.labelId,
labelName: params.labelName
}
})
callback();
}else{
this.$message({
message: data.message,
type: 'warning'
});
callback();
}
}).catch(err => {
console.log('error: ', err)
});
},
handleClose() {
this.isAddLabelError = false;
this.ruleForm.newLabelName = '';
this.centerDialogVisible = false
},
goToDetail(item) {
this.$router.push({
path: '/patients-manage/labels-manage/labels-detail',
query: {
labelId: item.labelId,
labelName: item.labelName,
}
})
}
}
}
</script>
<style lang="less" scoped>
@import "../../../style/patient-manager/labels-manager/labels-list.less";
</style>
<style lang="less">
@import "../../../style/patient-manager/labels-manager/labels-list-wrap.less";
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<div class="resident-list">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond"
:curmbThird="curmbThird"
:jumPathThird="jumPathThird">
</bread-crumb>
<div class="f-main-content screenSet">
<div class="header-title">
<span>居民信息</span>
<p>
<el-button plain size="small" @click="cancelEdit">取消</el-button>
<el-button type="primary" size="small" @click="saveEdit">保存</el-button>
</p>
</div>
<edit-information
:patientInfoObj="patientInfo"
:checkForm="checkForm"
@addListenSave="addListenSave"
:patientId="patientId"></edit-information>
</div>
</div>
</template>
<script>
import BreadCrumb from '@/components/breadcrumb'
import editInformation from './components/edit-information'
import { getPatientDetail, savePatientInfo } from '@/utils/patients/patientsapi'
export default {
name: "basicInfo",
components: {
BreadCrumb,
editInformation
},
data() {
return {
/*面包屑配置*/
curmbFirst: '居民管理',
curmbSecond: '我的居民',
curmbThird: '居民详情',
jumPathThird: '/patients-manage/mypatients-manage/patients-list',
patientId: '',
patientInfo: {},
checkForm: false,
}
},
created() {
this.patientId = String(this.$route.query.patientId);
this.init();
},
computed: {},
methods: {
init() {
getPatientDetail(this.patientId).then((data) => {
if(data.code == '000000') {
this.patientInfo = data.data;
}
})
},
cancelEdit() {
this.$router.go(-1);
},
saveEdit() {
this.checkForm = true;
},
addListenSave(val) {
this.checkForm = false;
if(val.status) {
// this.patientInfo = val.patientInfoForm
// console.log('保存的数据',val.patientInfoForm);
savePatientInfo(val.patientInfoForm).then(data => {
if(data.code == '000000'){
this.$message.success('修改成功')
setTimeout(() => {
this.$router.go(-1);
},500)
} else if(data.code == '202562'){
this.$message.error(data.message);
setTimeout(() => {
this.$router.go(-1);
},1000)
} else {
this.$message.error(data.message);
}
})
// 调用保存接口
}else {
this.$message.error('请正确填写信息');
}
},
},
filters: {
emptyFilter: function(value) {
if (!value) {
return '-';
} else {
return value;
}
},
sexFileter: function(value) {
if (!value && value != 0) {
return '-';
} else {
let hash = {
1: '男',
2: '女'
};
return hash[value];
}
},
},
}
</script>
<style lang="scss" scoped>
@import '../../../style/patients-style/element-reset.css';
.f-main-content{
background: #ffffff;
padding: 30px;
.header-title{
display: flex;
display: -webkit-flex;
align-items: center;
justify-content: space-between;
border-bottom: 2px solid #E4E7ED;
padding-bottom: 10px;
}
.right-btn-group{
position: absolute;
right: 60px;
z-index: 1800;
}
.section{
.item{
display: flex;
font-size: 14px;
div{
display: flex;
flex: 1;
line-height: 36px;
.title{
width: 180px;
text-align: right;
}
.info{
color: #999;
padding-left: 15px;
width: 100%;
}
}
&.wrap-p{
div{
line-height: 28px;
}
}
.btn-right{
width: 35%;
padding-left:10px;
}
}
.has-header{
display: flex;
justify-content: space-between;
padding: 15px 0;
margin-bottom: 15px;
border-bottom: 1px dashed #888;
.right-p{
display: inline-block;
text-align: right;
color: #999;
font-size: 14px;
span:last-child{
margin-left: 15px;
}
}
}
}
.health-record-list{
.item{
width: 100%;
margin-bottom: 15px;
.record-date{
color: #999;
padding-bottom: 10px;
}
.record-content{
width: 100%;
border: 1px solid #E4E7ED;
border-radius: 5px;
padding: 10px 15px 13px;
.record-title{
display: flex;
justify-content: space-between;
padding: 5px 0;
span{
color: #999;
font-size: 14px;
}
}
.list-visit{
line-height: 28px;
padding: 6px 0 2px;
display: flex;
display: -webkit-flex;
align-items: flex-start;
font-size: 14px;
color: #999;
.left-label{
line-height: 28px;
}
.right-item{
flex: 1;
line-height: 28px;
p{
line-height: 28px;
.check-btn{
color: #449284;
cursor: pointer;
margin-left: 15px;
}
}
}
}
}
}
}
.no-record-content{
@media screen and (min-width:1240px) and (max-width:1545px){
height: 300px;
}
@media screen and (min-width:1545px) and (max-width:1600px){
height: 500px;
}
@media screen and (min-width:1600px){
height: 600px;
}
text-align: center;
padding: 50px 0 60px;
img{
width: 120px;
}
p{
color: #B9B9C6;
font-size: 20px;
}
}
.ml10{
margin-left: 10px;
}
}
</style>
<template>
<div class="form-warp">
<addDiagnose ref="addDiagnose"></addDiagnose>
<el-form
:model="patientInfoForm"
:rules="rules"
ref="patientInfoForm"
label-width="150px"
label-suffix=":"
size="small"
>
<el-row>
<el-col :span="12">
<el-form-item label="居民姓名" prop="nickname">
<el-input
v-model.trim="patientInfoForm.nickname"
placeholder="请输入居民姓名"
:disabled="!baseInfoEdit"
clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号" prop="mobilePhone">
<el-input
v-model.trim="patientInfoForm.mobilePhone"
maxlength="11"
placeholder="请输入手机号"
:disabled="!baseInfoEdit"
clearable>
</el-input>
</el-form-item>
</el-col>
</el-row>
<!-- <div class="has-header">数据记录</div> -->
<el-row>
<el-col :span="12">
<el-form-item label="诊断" prop="diseaseIdList">
<!-- <el-select
v-model="diseaseIdList"
multiple
@change="changeDiseases"
:popper-append-to-body="false"
placeholder="请选择居民疾病诊断">
<el-option
v-for="(item, index) in diseasesList"
:key="item.diseaseId"
:label="item.diseaseName"
:value="item.diseaseId">
</el-option>
</el-select> -->
<el-button icon="el-icon-plus" @click="handleAddDiagnose">{{ selectedDiagList && selectedDiagList.length > 0 ? '修改诊断' : '添加诊断' }}</el-button>
<ul class="final-diagnose-list" v-if="selectedDiagList && selectedDiagList.length > 0">
<li v-for="diagnose in selectedDiagList" v-html="diagnose.alias ? diagnose.alias+'; ' : diagnose.diseaseName+'; '"></li>
</ul>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="分组" prop="labelIdList">
<el-select
v-model="labelIdList"
multiple
@change="changeLabels"
:popper-append-to-body="false"
placeholder="请选择居民分组">
<el-option
v-for="(item, index) in labelsList"
:key="index.labelId"
:label="item.labelName"
:value="item.labelId">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24" style="text-align: center;margin-top:15px;" v-show="!patientId"> <el-button plain size="small" @click="toggleClick">{{tipsText}}</el-button></el-col>
</el-row>
<div v-show="isShowAll || patientId">
<div class="has-header">基本信息</div>
<el-row>
<el-col :span="12">
<el-form-item label="身份证" prop="idNo">
<el-input
v-model.trim="patientInfoForm.idNo"
placeholder="请输入身份证"
clearable
maxlength="18"
@blur="idNoBlurHandler"
:disabled="hasIdNo">
</el-input>
<span class="idNoTxt">身份证只能输入一次<br>输入后不可更改</span>
<!--<div style="display: inline"><p class="title">身份证只能输入一次<br>输入后不可更改</p></div>-->
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出生日期" prop="birthTime">
<el-date-picker
type="date"
v-model="patientInfoForm.birthTime"
placeholder="请选择出生日期"
value-format="yyyy-MM-dd"
value="yyyy-MM-dd"
@change="getAge"
:picker-options="setPickerOption"
:editable="false"
style="width:250px"
clearable>
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="年龄" prop="age">
<span>{{(patientInfoForm.age || patientInfoForm.age == 0 ) ? `${patientInfoForm.age}岁` : '-'}}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="patientInfoForm.sex">
<el-radio :label="1"></el-radio>
<el-radio :label="2"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="常驻类型" prop="permanentResidence">
<el-select
v-model="patientInfoForm.permanentResidence"
placeholder="请选择居民常驻类型"
:popper-append-to-body="false"
clearable>
<el-option
v-for="(item, index) in residenceList"
:key="index"
:label="item.value"
:value="item.noChar">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="民族" prop="nationality">
<el-select
v-model="patientInfoForm.nationality"
placeholder="请选择民族"
:popper-append-to-body="false"
clearable>
<el-option
v-for="(item, index) in nationsList"
:key="index"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<!--<el-col :span="12">-->
<!--<el-form-item label="医保号" prop="socialCard">-->
<!--<el-input-->
<!--v-model.trim="patientInfoForm.socialCard"-->
<!--placeholder="请输入居民医保卡号码"-->
<!--maxlength="30"-->
<!--clearable>-->
<!--</el-input>-->
<!--</el-form-item>-->
<!--</el-col>-->
<!--<el-col :span="12">-->
<!--<el-form-item label="健康档案编号" prop="fileLocator">-->
<!--<el-input-->
<!--v-model.trim="patientInfoForm.fileLocator"-->
<!--placeholder="请输入居民健康档案编号"-->
<!--maxlength="30"-->
<!--clearable>-->
<!--</el-input>-->
<!--</el-form-item>-->
<!--</el-col>-->
</el-row>
<div class="has-header">联系方式</div>
<el-row>
<el-col :span="12">
<el-form-item label="所在地区" prop="addressList">
<!--@active-item-change="handleItemChange"-->
<el-cascader
ref="cascaderRegion"
placeholder="请选择省市县乡"
:options="provinceList"
v-model="addressList"
:props="optionProps"
@change="handleChange">
</el-cascader>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="详细地址" prop="address">
<el-input
v-model="patientInfoForm.address"
placeholder="请输入居民的详细地址"
maxlength="50"
clearable>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="工作单位" prop="workplace">
<el-input
v-model="patientInfoForm.workplace"
placeholder="请输入居民的工作单位"
maxlength="30"
clearable>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12" v-if="patientId">
<el-form-item label="微信" prop="address">
<p class="info" v-if="patientInfoForm.isWechatBind == '1'">未绑定 <el-button type="text" class="ml10" @click="remindBind" v-if="patientInfoForm.isRemind == '1'" style="color: #449284;">提醒绑定</el-button><span class="ml10" v-if="patientInfoForm.isRemind == '2'">已提醒</span></p>
<!--<p class="info" v-else-if="patientInfoForm.isWechatBind == '2'">已绑定 <span class="ml10">(微信名:{{patientInfoForm.wechatNickname | emptyFilter}}</span></p>-->
<p class="info" v-else-if="patientInfoForm.isWechatBind == '2'">{{patientInfoForm.wechatNickname | emptyFilter}}</p>
</el-form-item>
</el-col>
</el-row>
<div class="has-header">其他</div>
<el-row>
<el-col :span="16">
<el-form-item label="备注" prop="remark">
<el-input
type="textarea"
v-model="patientInfoForm.remark"
placeholder="请输入内容"
clearable
maxlength="200"
:autosize="{ minRows: 3, maxRows: 7}">
</el-input>
<span class="text-count">{{currentCount}} / 200</span>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</div>
</template>
<script>
import { mapGetters, mapState } from 'vuex';
import { checkMobile } from '@/utils/patients/checkValid';
import { isCardNo, checkProvince, checkBirthday, checkParity, validateIdCard } from '@/utils/patients/checkCardNum';
import {
getDiseasesList,
getLabelList,
getConstants,
getNationsList,
getRemindPatient,
getProvinceList,
getCityList,
getCountyList,
getTownList } from '@/utils/patients/patientsapi';
let vm = null;
import addDiagnose from '@/components/icd/addDiagnose.vue';
export default {
name: "basicInfo",
components: { addDiagnose },
data() {
let validCode=(rule,value,callback)=>{
if(value) {
let reg=/^[0-9a-zA-Z]*$/g
if(!reg.test(value)){
callback(new Error('只可输入数字加英文'))
}else if(value.length >30) {
callback(new Error('只可输入30个以内的字符'))
}else{
callback()
}
}else {
callback()
}
};
let checkCardNum = (rule, value, callback) =>{
// let vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
// 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
// 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
// 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
// 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
// 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
// };
if(value) {
// if(isCardNo(value) && checkProvince(value,vcity) && checkBirthday(value) && checkParity(value)) {
if(validateIdCard(value)) {
this.isTrue = true;
callback()
}else {
this.isTrue = false;
callback(new Error('请输入正确的身份证'))
}
}else {
this.isTrue = false;
callback()
}
};
return {
diseasesList: [],
labelsList: [],
residenceList: [],
nationsList: [],
diseaseIdList: [],
labelIdList: [],
addressList: [],
baseInfoEdit: true,
isTrue: false,
patientInfoForm: {
nickname: '',
mobilePhone: '',
diseases: [],
patientDiseases: [],
customLabels: [],
idNo: '',
birthTime: '',
age: null,
sex: null,
permanentResidence: '',
nationality: '',
socialCard: '',
fileLocator: '',
isWechatBind: 1,
isRemind: 1,
wechatNickname: '',
remark: '',
patientAddress: '',
address: '',
workplace: '',
provinceId: null,
cityId: null,
countyId: null,
townId: null,
},
hasIdNo: false,
validStatus: false,
provinceList: [],
provinceLists: [], //省列表
cityLists: [], //市列表
countyLists: [], //县列表
townLists: [],//乡镇列表
optionProps: {
value: "id",
label: "name",
children: "children",
lazy: true,
lazyLoad(node, resolve) {
const { level } = node;
console.log("node", node);
if (node.level == 1) {
let req = {
provinceId: node.data.id
};
vm.GET("basic-data/position/cities", req).then(res => {
let newData = res.data.cityList;
newData.map(item => {
vm.$set(item, "id", item.cityId);
vm.$set(item, "name", item.cityName);
vm.$set(item, "children", []);
});
// console.log("newData", newData);
resolve(newData);
});
} else if (node.level == 2) {
let req = {
cityId: node.data.id
};
vm.GET("basic-data/position/counties", req).then(res => {
let newData = res.data.countyList;
newData.map(item => {
vm.$set(item, "id", item.countyId);
vm.$set(item, "name", item.countyName);
vm.$set(item, "children", []);
});
// console.log("newData", newData);
resolve(newData);
});
} else if (node.level == 3) {
let req = {
countyId: node.data.id
};
vm.GET("basic-data/position/towns", req).then(res => {
let newData = res.data.townList;
newData.map(item => {
vm.$set(item, "id", item.townId);
vm.$set(item, "name", item.townName);
vm.$set(item, "leaf", true);
});
// console.log("newData", newData);
resolve(newData);
});
}
}
},
tipsText: '展开录入完整信息',
isShowAll: false,
rules: {
nickname: [{required: true, message: '请输入居民姓名', trigger: ['change', 'blur'] },
{ min: 2, max: 15, message: '长度在2至15个字符之间', trigger: 'change' }],
mobilePhone: [{required: true, message: '请输入手机号', trigger: ['change', 'blur'] },
{ validator: checkMobile , trigger: ['blur','change'] }],
idNo: [{required: false,validator: checkCardNum, trigger: ['change'] }],
socialCard: [{required: false,validator: validCode, trigger: ['change'] }],
fileLocator: [{required: false,validator: validCode, trigger: ['change'] }],
},
setPickerOption: {
disabledDate(time) {
let old = new Date('1900/1/1');
return time > Date.now() || time < old;
}
},
region: [],
}
},
props: {
patientInfoObj: Object,
checkForm: Boolean,
patientId: {
required: false,
type: String,
default: function () {
return '';
}
},
},
watch: {
async patientInfoObj(val) {
if(this.patientId){ //编辑居民信息,对拿到的数据做处理
this.patientInfoForm = val;
this.baseInfoEdit = this.patientInfoForm.baseInfoEdit;
let customLabels = this.patientInfoForm.customLabels;
// let diseases = this.patientInfoForm.diseases;
let icdList = this.patientInfoForm.icdList;
if(customLabels && customLabels.length > 0){
customLabels.forEach((kkk)=>{
this.labelIdList.push(Number(kkk.labelId))
})
}else {
this.labelIdList = [];
}
// if(diseases && diseases.length > 0) {
// diseases.forEach((dis)=>{
// this.diseaseIdList.push(Number(dis.diseaseId))
// })
// }else {
// this.diseaseIdList = [];
// }
if(icdList && icdList.length > 0) {
this.$store.dispatch('patientsDiagnose/changeDiagnoseList', icdList)
}else {
this.$store.dispatch('patientsDiagnose/changeDiagnoseList', [])
}
if(this.patientInfoForm.idNo) {
this.hasIdNo = true;
}else {
this.hasIdNo = false;
}
//对地区数据做回显处理
if(this.patientInfoForm.patientAddress) {
let provinceId = this.patientInfoForm.provinceId;
let cityId = this.patientInfoForm.cityId;
let countyId = this.patientInfoForm.countyId;
let townId = this.patientInfoForm.townId;
if(provinceId) {
await this.getCity(provinceId);
}
if(cityId) {
await this.getCounty(provinceId, cityId);
}
if(countyId) {
await this.getTown(provinceId, cityId, countyId);
}
this.addressList = [Number(provinceId), Number(cityId), Number(countyId), Number(townId)];
// console.log(this.provinceList);
this.$forceUpdate();
}else {
this.addressList = [];
}
}else { // 新增
this.initForm();
}
},
// 'patientInfoForm.age'(val) {
// console.log('年龄',val)
// },
checkForm(val){
if(val){// 触发校验
this.saveInfoData();
}
},
},
created() {
vm = this;
this.initConstant();
},
mounted(){
if(!this.patientId){//新建计划
this.initForm();
}
},
computed: {
...mapGetters([
'_token',
]),
...mapState('patientsDiagnose', {
selectedDiagList: state => state.selectedDiagList
}),
currentCount(){
if(this.patientInfoForm.remark) {
return this.patientInfoForm.remark.length
}else {
return 0;
}
},
},
methods: {
initForm() {
this.patientInfoForm = {
nickname: '',
mobilePhone: '',
diseases: [],
patientDiseases: [],
customLabels: [],
idNo: '',
birthTime: '',
age: null,
sex: null,
permanentResidence: '',
nationality: '',
socialCard: '',
fileLocator: '',
isWechatBind: null,
isRemind: null,
wechatNickname: '',
remark: '',
patientAddress: '',
address: '',
workplace: '',
provinceId: null,
cityId: null,
countyId: null,
townId: null,
},
this.$store.dispatch('patientsDiagnose/changeDiagnoseList', [])
},
// 点击 添加诊断
handleAddDiagnose() {
this.$refs.addDiagnose.showSelf();
},
initConstant(){
getDiseasesList().then((data) => {
if(data.code == '000000') {
this.diseasesList = data.data;
}
});
getLabelList({
type: 2,
token: this._token,
}).then((data) => {
if(data.code == '000000') {
this.labelsList = data.data.labelNameList;
}
});
getConstants({
numList: 'P221',
}).then((data) => {
if(data.code == '000000') {
this.residenceList = data.data.P221;
}
});
getNationsList().then((data) => {
if(data.code == '000000') {
this.nationsList = data.data;
}
});
this.getProvinceLists();
},
// changeDiseases(val) {
// // 格式化数据 提交用
// let newDiseaseList = [];
// val.forEach((valItem) => {
// this.diseasesList.forEach((item2) => {
// if(valItem == item2.diseaseId){
// newDiseaseList.push({parentDiseaseId: item2.diseaseId});
// }
// })
// });
// this.patientInfoForm.patientDiseases = newDiseaseList;
// },
changeLabels(val){
let newLabelsList = [];
val.forEach((valItem) => {
this.labelsList.forEach((item2) => {
if(valItem == item2.labelId){
newLabelsList.push(item2);
}
})
});
this.patientInfoForm.customLabels = newLabelsList;
},
idNoBlurHandler() {
if(this.isTrue) {
this.go(this.patientInfoForm.idNo.length);
}
},
//提醒绑定
remindBind() {
let remindMobileWechatPara = {
qrcodeType: 1,
patientId: this.patientId,
// deviceInfo: window.getDeviceInfo()
}
getRemindPatient({
...remindMobileWechatPara
}).then( data => {
if(data.code == '000000') {
this.$message.success(data.data.respMsg);
this.$router.go(-1);
}else {
this.$message.error(data.message);
}
})
},
saveInfoData() {
//对地区数据做处理
if(this.addressList.length > 0) {
this.patientInfoForm.provinceId = this.addressList[0];
this.patientInfoForm.cityId = this.addressList[1];
this.patientInfoForm.countyId = this.addressList[2];
this.patientInfoForm.townId = this.addressList[3];
// this.provinceLists.forEach((item) => {
// if(this.patientInfoForm.provinceId == item.provinceId) {
// this.patientInfoForm.provinceName = item.provinceName;
// }
// });
// this.cityLists.forEach((item) => {
// if(this.patientInfoForm.cityId == item.cityId) {
// this.patientInfoForm.cityName = item.cityName;
// }
// });
// this.countyLists.forEach((item) => {
// if(this.patientInfoForm.countyId == item.countyId) {
// this.patientInfoForm.countyName = item.countyName;
// }
// })
// this.townLists.forEach((item) => {
// if(this.patientInfoForm.townId == item.townId) {
// this.patientInfoForm.townName = item.townName;
// }
// })
this.patientInfoForm.provinceName = vm.region[0];
this.patientInfoForm.cityName = vm.region[1];
this.patientInfoForm.countyName = vm.region[2];
this.patientInfoForm.townName = vm.region[3];
if(this.patientInfoForm.provinceName && this.patientInfoForm.cityName && this.patientInfoForm.countyName && this.patientInfoForm.townName) {
this.patientInfoForm.patientAddress = `${this.patientInfoForm.provinceName}${this.patientInfoForm.cityName}${this.patientInfoForm.countyName}${this.patientInfoForm.townName}`
}else {
this.patientInfoForm.patientAddress = '';
}
// console.log('-----------',this.patientInfoForm.patientAddress)
}
this.$refs['patientInfoForm'].validate((valid) => {
if(!this.patientInfoForm.idNo) {
this.patientInfoForm.idNo = null;
}
if (valid) {
// console.log('提交表单',this.patientInfoForm);
this.$emit('addListenSave',{
status: true,
patientInfoForm: {
...this.patientInfoForm,
icdList: this.selectedDiagList,
birthTime: this.patientInfoForm.birthTime ? `${this.patientInfoForm.birthTime} 00:00:00` : '',
}
})
} else {
this.$emit('addListenSave',{
status: false,
// patientInfoForm: this.patientInfoForm,
patientInfoForm: {
...this.patientInfoForm,
icdList: this.selectedDiagList,
birthTime: this.patientInfoForm.birthTime ? `${this.patientInfoForm.birthTime} 00:00:00` : '',
}
})
}
});
},
// 实现自动生成生日,性别,年龄
go(val) {
let iden = this.patientInfoForm.idNo;
let sex = null;
let birth = null;
let myDate = new Date();
let month = myDate.getMonth() + 1;
let day = myDate.getDate();
let age = 0;
if(val===18){
age = myDate.getFullYear() - iden.substring(6, 10) - 1;
sex = iden.substring(16,17);
birth = iden.substring(6,10)+"-"+iden.substring(10,12)+"-"+iden.substring(12,14);
if (iden.substring(10, 12) < month || iden.substring(10, 12) == month && iden.substring(12, 14) <= day) age++;
}
if(val===15){
age = myDate.getFullYear() - iden.substring(6, 8) - 1901;
sex = iden.substring(13,14);
birth = "19"+iden.substring(6,8)+"-"+iden.substring(8,10)+"-"+iden.substring(10,12);
if (iden.substring(8, 10) < month || iden.substring(8, 10) == month && iden.substring(10, 12) <= day) age++;
}
if(sex%2 === 0)
sex = 2;
else
sex = 1;
this.patientInfoForm.sex = sex;
this.patientInfoForm.age = age;
this.patientInfoForm.birthTime = birth;
// this.baseInfo.birthplace = this.area[iden.substring(0,2)];
},
getAge(val) {
if(val) {
// let birthdays = new Date(this.patientInfoForm.birthTime.replace(/-/g, "/"));
let birthdays = new Date(val.replace(/-/g, "/"));
let d = new Date();
let age = d.getFullYear() - birthdays.getFullYear() - (d.getMonth() < birthdays.getMonth() || (d.getMonth() == birthdays.getMonth() && d.getDate() < birthdays.getDate()) ? 1 : 0);
this.patientInfoForm.age = age;
}else {
this.patientInfoForm.age = null;
}
},
handleItemChange (val) {
if (val.length === 1) { //获取市(二级)
this.getCity(val[0]);
} else if (val.length === 2) { //获取县区 (三级)
this.getCounty(val[0], val[1]);
} else if(val.length === 3) { //获取乡镇 (四级)
this.getTown(val[0], val[1], val[2]);
}
this.$forceUpdate();
},
async getProvinceLists() {
await getProvinceList({}).then((data) => {
if(data.code == '000000') {
this.provinceLists = data.data.provinceList;
this.provinceLists.map(item => {
this.$set(item, "id", item.provinceId);
this.$set(item, "name", item.provinceName);
this.$set(item, "children", []);
});
this.provinceList = this.provinceLists;
// this.$forceUpdate();
}
})
},
async getCity(provinceId) {
await getCityList({provinceId: provinceId}).then((data) => {
if(data.code == '000000') {
this.cityLists = data.data.cityList;
this.cityLists.map(item => {
this.$set(item, "id", item.cityId);
this.$set(item, "name", item.cityName);
this.$set(item, "children", []);
});
this.provinceList.map((item, index) => {
if(item.id == provinceId) {
item.children = this.cityLists;
}
})
// this.$forceUpdate();
}
})
},
async getCounty(provinceId, cityId) {
await getCountyList({cityId: cityId}).then((data) => {
if(data.code == '000000') {
this.countyLists = data.data.countyList;
this.countyLists.map(item => {
this.$set(item, "id", item.countyId);
this.$set(item, "name", item.countyName);
this.$set(item, "children", []);
});
this.provinceList.map((item, index) => {
if(item.id == provinceId) {
item.children.map((city, idx) => {
if(city.id == cityId) {
city.children = this.countyLists;
}
})
}
})
// this.$forceUpdate();
}
})
},
async getTown(provinceId, cityId, countyId) {
await getTownList({countyId: countyId}).then((data) => {
if(data.code == '000000') {
this.townLists = data.data.townList;
this.townLists.map(item => {
this.$set(item, "id", item.townId);
this.$set(item, "name", item.townName);
this.$set(item, "leaf", true);
// this.$set(item, "children", []);
});
this.provinceList.map((item, index) => {
if(item.id == provinceId) {
item.children.map((city, index2) => {
if(city.id == cityId) {
city.children.map((county, index3) => {
if(county.id == countyId) {
county.children = this.townLists;
}
})
}
})
}
})
}
// this.$forceUpdate();
})
},
toggleClick() {
if(this.isShowAll) {
this.tipsText = '展开录入完整信息';
this.isShowAll = false;
}else {
this.tipsText = '收起录入完整信息';
this.isShowAll = true;
}
},
getDate() {
let old = new Date('1900-01-01 00:00:00');
let n = new Date();
let s = n - old;
return Math.floor(s / (24 * 3600 * 1000));
// return s;
},
handleChange() {
setTimeout(function() {
let region = vm.$refs["cascaderRegion"].inputValue;
vm.region = region.split(" / ");
// console.log("vm.region",vm.region)
},20)
},
},
filters: {
emptyFilter: function(value) {
if (!value && value != 0) {
return '-';
} else {
return value;
}
},
},
}
</script>
<style lang="scss">
.screenSet{
overflow: visible!important;
}
.el-input{
width: 250px;
}
.form-warp{
margin-top: 30px;
.has-header{
padding: 15px 0;
margin-bottom: 20px;
border-bottom: 1px dashed #888;
}
.info{
font-size: 12px;
color: #999;
}
.text-count{
position: absolute;
right: 5px;
bottom: 0px;
line-height: 28px;
color: #999;
font-size: 12px;
}
.ml10{
margin-left: 10px;
}
.idNoTxt{
display: inline-flex;color:#C0C4CC;line-height:20px;vertical-align: middle;
}
.final-diagnose-list{
color: #BBB;
line-height: 20px;
margin-top: 15px;
overflow: hidden;
li{
float:left;
margin-right: 5px;
}
}
}
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<div class="resident-list">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond"
:curmbThird="curmbThird"
:jumPathThird="jumPathThird">
</bread-crumb>
<div class="f-main-content screenSet patient-detail-wrap">
<div>
<div class="right-btn-group" v-if="activeName == 'first'">
<el-button plain size="small" @click="deleteCurrentPatient">删除</el-button>
<el-button type="primary" size="small" @click="editPatient">编辑</el-button>
</div>
<el-tabs v-model="activeName" @tab-click="tabChangeHandler">
<el-tab-pane label="居民信息" name="first">
<div class="section">
<div class="has-header">
<p>基本信息</p>
<p class="right-p"><span>添加时间:{{patientInfo.addTime}}</span><span>最后修改时间:{{ patientInfo.lastModifiedTime ? patientInfo.lastModifiedTime : patientInfo.addTime}}</span></p>
</div>
<div class="item">
<div><p class="title">居民姓名:</p><p class="info">{{(patientInfo.nickname || patientInfo.wechatNickname) | emptyFilter}}</p></div>
<div><p class="title">身份证:</p><p class="info">{{patientInfo.idNo | emptyFilter}}</p></div>
</div>
<div class="item">
<div><p class="title">出生日期:</p><p class="info">{{birthTimeDisplay | emptyFilter}}{{(patientInfo.age || patientInfo.age == 0) ? `、${patientInfo.age}岁` : ''}}</p></div>
<div><p class="title">性别:</p><p class="info">{{patientInfo.sex | sexFileter}}</p></div>
</div>
<div class="item">
<div><p class="title">民族:</p><p class="info">{{nationalityDes}}</p></div>
<div><p class="title">常驻类型:</p><p class="info">{{patientInfo.permanentResidence | permanentFilter}}</p></div>
</div>
<!--<div class="item">-->
<!--<div><p class="title">健康档案编号:</p><p class="info">{{patientInfo.fileLocator | emptyFilter}}</p></div>-->
<!--<div><p class="title">医保号:</p><p class="info">{{patientInfo.socialCard | emptyFilter}}</p></div>-->
<!--</div>-->
<div class="item wrap-p">
<div><p class="title">诊断:</p><p class="info">{{showDiseaseName | emptyFilter}}</p></div>
<div><p class="title">分组:</p><p class="info">{{showLabelName | emptyFilter}}</p></div>
</div>
<!-- <div class="has-header">数据记录</div>
<div class="item wrap-p">
<div><p class="title">诊断:</p><p class="info">{{showDiseaseName | emptyFilter}}</p></div>
<div><p class="title">分组:</p><p class="info">{{showLabelName | emptyFilter}}</p></div>
</div>-->
<div class="has-header">联系方式</div>
<div class="item">
<div><p class="title">手机号:</p><p class="info">{{patientInfo.mobilePhone | emptyFilter}}</p></div>
<div><p class="title"></p><p class="info"></p></div>
</div>
<div class="item">
<div><p class="title">所在地区:</p><p class="info">{{patientInfo.patientAddress | emptyFilter}}</p></div>
<div><p class="title">详细地址:</p><p class="info">{{patientInfo.address | emptyFilter}}</p></div>
</div>
<div class="item">
<div><p class="title">工作单位:</p><p class="info">{{patientInfo.workplace | emptyFilter}}</p></div>
<div>
<p class="title">微信:</p>
<p class="info" v-if="patientInfo.isWechatBind == '1'">未绑定 <el-button type="text" class="ml10" @click="remindBind" style="color: #449284;" v-if="patientInfo.isRemind == '1'">提醒绑定</el-button><span class="ml10" v-if="patientInfo.isRemind == '2'">已提醒</span></p>
<!--<p class="info" v-else-if="patientInfo.isWechatBind == '2'">已绑定 <span class="ml10">(微信名:{{patientInfo.wechatNickname | emptyFilter}}</span></p>-->
<p class="info" v-else-if="patientInfo.isWechatBind == '2'">{{patientInfo.wechatNickname | emptyFilter}}</p>
<p class="info" v-else>-</p>
</div>
</div>
<div class="has-header">其他</div>
<div class="item">
<div>
<p class="title">备注:</p>
<p class="info">
<el-input
type="textarea"
:autosize="{ minRows: 3, maxRows: 7}"
placeholder="请输入内容"
v-model="patientInfo.remark"
maxlength="200"
>
</el-input>
</p>
</div>
<p class="btn-right"><el-button plain size="small" @click="saveRemark">保存备注</el-button></p>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="健康记录" name="second">
<div class="health-record-wrap" v-show="recordList.length">
<div class="health-record-list"
v-show="recordList.length"
v-infinite-scroll="loadMore"
:infinite-scroll-disabled="busy"
infinite-scroll-distance="5"
infinite-scroll-immediate-check="true">
<div class="item" v-for="(item, index) in recordList" :key="index">
<div class="record-date">{{item.finishedTime}}</div>
<div class="record-content">
<div class="record-title">
<p>{{item.name}}-{{item.seqNo}}次随访</p>
<span>{{item.fuTypeValue}}</span>
</div>
<div class="list-visit">
<span class="left-label">患教内容:</span>
<div class="right-item">{{item.sendContent | emptyFilter}}</div>
</div>
<div class="list-visit">
<span class="left-label">随访量表:</span>
<div class="right-item">
<p v-for="(item2, index2) in item.scaleSimpleDtos" :key="index2" v-if="item.scaleSimpleDtos.length">{{item2.name}}
<span class="check-btn" @click="openScaleDetail(item2)">查看量表</span>
</p>
<p v-if="!item.scaleSimpleDtos.length">暂无量表</p>
</div>
</div>
</div>
</div>
<p style="text-align: center;padding:10px 0;cursor: pointer" v-if="hasMore">加载中...</p>
<p style="text-align: center;padding:10px 0;cursor: pointer" v-if="!hasMore">没有更多了</p>
</div>
</div>
<div class="no-record-content" v-if="!recordList.length">
<div class="no-record-info">
<img src="../../../assets/image/no-content1.png"/>
<p>暂无随访记录或您没有权限访问</p>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from '@/components/breadcrumb'
import { mapGetters } from 'vuex'
import { getWorkDomain } from '@/utils/index'
import { getDiseasesList, getPatientDetail, getRemindPatient, deletePatient, savePatientInfo, getHealthRecordList, getNationsList } from '@/utils/patients/patientsapi'
export default {
name: "patientDetail",
components: {
BreadCrumb,
},
data() {
return {
/*面包屑配置*/
curmbFirst: '居民管理',
curmbSecond: '我的居民',
curmbThird: '居民详情',
jumPathThird: '/patients-manage/mypatients-manage/patients-list',
activeName: 'first',
patientId: '',
doctorId: '',
patientInfo: {
isWechatBind: 1,
remark: '',
},
nationalityDes: '',
showLabelName: '',
showDiseaseName: '',
birthTimeDisplay: '',
recordList: [],
hasMore: false,
busy: false,
pageNo: 1,
pageSize: 15,
}
},
created() {
this.patientId = this.$route.query.patientId;
this.init();
this.getRecordList();
},
mounted() {
},
computed: {
...mapGetters([
'_token',
])
},
methods: {
init() {
getPatientDetail(this.patientId).then((data) => {
if(data.code == '000000') {
this.patientInfo = data.data;
if(this.patientInfo){
this.doctorId = this.patientInfo.doctorId;
let customLabels = this.patientInfo.customLabels;
// let diseases = this.patientInfo.diseases;
let icdList = this.patientInfo.icdList;
let groupLabelNames = [];
let groupDiseaseNames = [];
//对出生日期的处理
if(this.patientInfo.birthTime){
let timeArr = this.patientInfo.birthTime.split('-');
let mm = parseInt(timeArr[1]) < 10 ? `0${parseInt(timeArr[1])}` : parseInt(timeArr[1]);
let dd = parseInt(timeArr[2]) < 10 ? `0${parseInt(timeArr[2])}` : parseInt(timeArr[2]);
this.birthTimeDisplay = `${timeArr[0]}-${mm}-${dd}`;
}else {
this.birthTimeDisplay = '';
}
// 对分组的处理
if(customLabels) {
customLabels.forEach(item => {
groupLabelNames.push(item.label)
});
this.showLabelName = groupLabelNames.join(';');
} else {
this.showLabelName = '';
}
// 对诊断疾病的处理(老版诊断)
// if(diseases) {
// diseases.forEach(item => {
// groupDiseaseNames.push(item.diseaseName)
// });
// this.showDiseaseName = groupDiseaseNames.join(';');
// } else {
// this.showDiseaseName = '';
// }
// 对诊断疾病的处理(新版诊断)
if(icdList) {
icdList.forEach(item => {
groupDiseaseNames.push(item.diseaseName)
});
this.showDiseaseName = groupDiseaseNames.join(';');
} else {
this.showDiseaseName = '';
}
// 对民族的处理
if(this.patientInfo.nationality) {
let nationsList = [];
getNationsList().then((data) => {
if(data.code == '000000') {
nationsList = data.data;
nationsList.forEach(item => {
if(String(this.patientInfo.nationality) == item.code ) {
this.nationalityDes = item.name;
}
})
}
})
}else {
this.nationalityDes = '-';
}
}
}
})
},
getRecordList() {
let reqPara = {
patientId: this.patientId,
// patientId: '99997701',
pageNo: this.pageNo,
pageSize: this.pageSize,
}
getHealthRecordList(reqPara).then((data) => {
if(data.code == '000000'){
// this.recordList = data.data.healthRecordDtos;
let healthRecordDtos = data.data.healthRecordDtos;
let count = data.data.count;
// if(flag) {
this.recordList = this.recordList.concat(healthRecordDtos);
if(count <= this.pageNo * this.pageSize) {
this.busy = true;
this.hasMore = false;
}else {
this.busy = false;
this.hasMore = true;
}
// }else {
// this.recordList = healthRecordDtos;
// this.busy = false;
// this.hasMore = false;
// }
}else {
this.$message.error(data.message)
}
})
},
tabChangeHandler(tab) {},
deleteCurrentPatient() {
// 把写的提示信息需要换行的地方分成数组 confirmText
const confirmText = ['您确定要删除此居民吗?', '删除后,您将无法对该居民发送患教和进行随访,重新添加该居民依旧可查看历史发送记录及随访记录'];
const newDatas = [];
const h = this.$createElement;
for (const i in confirmText) {
newDatas.push(h('p', null, confirmText[i]))
}
this.$confirm('删除居民', {
title: '删除居民',
message: h('div', null, newDatas),
confirmButtonText: '确认删除',
cancelButtonText: '取消',
closeOnClickModal: false,
closeOnPressEscape: false,
customClass: 'delete-patient',
type: 'warning'
}).then(() => {
let reqParam = {
patientIdList: [this.patientId],
token: this._token,
};
deletePatient(reqParam).then(data => {
if(data.code == '000000') {
this.$message({
type: 'success',
message: `${this.patientInfo.nickname}居民删除成功!`
});
setTimeout(()=>{
this.$router.push({
path: '/patients-manage/mypatients-manage/patients-list'
})
},2000)
}else {
this.$message({
type: 'error',
message: data.message
});
}
})
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
},
editPatient() {
this.$router.push({
path: '/patients-manage/mypatients-manage/basic-info',
query: {
patientId: this.patientId
}
})
},
//提醒绑定
remindBind() {
let remindMobileWechatPara = {
qrcodeType: 1,
patientId: this.patientId,
// deviceInfo: window.getDeviceInfo()
}
getRemindPatient({
...remindMobileWechatPara
}).then( data => {
if(data.code == '000000') {
this.$message.success(data.data.respMsg);
this.init();
}else {
this.$message.error(data.message);
}
})
},
//保存备注
saveRemark() {
savePatientInfo(this.patientInfo).then(data => {
if(data.code == '000000'){
this.$message.success('保存备注成功')
this.init();
}else {
this.$message.error(data.message);
}
})
},
//查看量表详情
openScaleDetail(item) {
// this.$router.push({path: '/followup/record-manage/form-template',
// query: {doctorId: this.enteringInfo.doctorId, scaleNo: val.scaleNo, planPatientsTimesId: this.enteringInfo.planPatientsTimesId,planTimesId : val.planTimesId, showBtn: 1}})
let scaleUrl = getWorkDomain(`/#/followup/record-manage/form-template?doctorId=${item.doctorId}&scaleNo=${item.scaleNo}&planPatientsTimesId=${item.planPatientsTimesId}&planTimesId=${item.planTimesId}&showBtn=1`);
window.open(scaleUrl)
},
loadMore() {
// console.log('触发加载页码',this.pageNo);
this.busy = true; //把busy置位true,这次请求结束前不再执行
setTimeout(() => {
this.pageNo++;
this.getRecordList()
//调用获取数据接口,并且传入一个true,让axios方法指导是否需要拼接数组。
}, 500)
},
},
filters: {
emptyFilter: function(value) {
if (!value) {
return '-';
} else {
return value;
}
},
sexFileter: function(value) {
if (!value && value != 0) {
return '-';
} else {
let hash = {
1: '男',
2: '女'
};
return hash[value];
}
},
permanentFilter: function (value) {
if (!value) {
return '-';
} else {
let hash = {
1: '户籍',
2: '非户籍'
};
return hash[value];
}
}
},
}
</script>
<style lang="scss">
.delete-patient{
.el-message-box__content {
position: relative;
padding: 10px 15px!important;
color: #606266;
font-size: 14px;
}
/*恢复messageBox默认样式*/
.el-message-box {
width: 360px;
height: 220px!important;
}
.el-message-box__status+.el-message-box__message{
padding-left: 20px;
padding-right: 20px;
}
}
</style>
<style lang="scss" scoped>
@import '../../../style/patients-style/element-reset.css';
.f-main-content{
background: #ffffff;
padding: 30px;
.right-btn-group{
position: absolute;
right: 60px;
z-index: 1800;
}
.section{
.item{
display: flex;
font-size: 14px;
div{
display: flex;
flex: 1;
line-height: 36px;
.title{
width: 150px;
text-align: right;
}
.info{
color: #999;
padding-left: 15px;
width: 100%;
}
}
&.wrap-p{
div{
line-height: 28px;
}
}
.btn-right{
width: 35%;
padding-left:10px;
}
}
.has-header{
display: flex;
justify-content: space-between;
padding: 15px 0;
margin-bottom: 15px;
border-bottom: 1px dashed #888;
.right-p{
display: inline-block;
text-align: right;
color: #999;
font-size: 14px;
span:last-child{
margin-left: 15px;
}
}
}
}
.health-record-wrap{
/*height: 300px;*/
overflow-y: auto;
@media screen and (min-width:1240px) and (max-width:1545px){
height: 350px;
}
@media screen and (min-width:1545px) and (max-width:1600px){
height: 580px;
}
@media screen and (min-width:1600px){
height: 670px;
}
&::-webkit-scrollbar{
width:5px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
.health-record-list{
.item{
width: 100%;
margin-bottom: 15px;
.record-date{
color: #999;
padding-bottom: 10px;
}
.record-content{
width: 100%;
border: 1px solid #E4E7ED;
border-radius: 5px;
padding: 10px 15px 13px;
.record-title{
display: flex;
justify-content: space-between;
padding: 5px 0;
span{
color: #999;
font-size: 14px;
}
}
.list-visit{
line-height: 28px;
padding: 6px 0 2px;
display: flex;
display: -webkit-flex;
align-items: flex-start;
font-size: 14px;
color: #999;
.left-label{
line-height: 28px;
}
.right-item{
flex: 1;
line-height: 28px;
p{
line-height: 28px;
.check-btn{
color: #449284;
cursor: pointer;
margin-left: 15px;
}
}
}
}
}
}
}
.no-record-content{
@media screen and (min-width:1240px) and (max-width:1545px){
height: 300px;
}
@media screen and (min-width:1545px) and (max-width:1600px){
height: 500px;
}
@media screen and (min-width:1600px){
height: 600px;
}
text-align: center;
padding: 50px 0 60px;
.no-record-info{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -60%);
}
img{
width: 120px;
}
p{
color: #B9B9C6;
font-size: 20px;
}
}
.ml10{
margin-left: 10px;
}
}
</style>
<template>
<section class="not-complete-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<section class="not-complete-content screenSet">
<h1 class="page-title">我的居民:共{{pagination.totalRows ? pagination.totalRows : 0}}</h1>
<div class="search-div">
<div class="search-input">
<el-form :model="searchData" ref="searchData" :inline="true" label-width="100px">
<el-form-item label="性别:" prop="patientName">
<el-select v-model="searchData.sex" size="small" clearable :popper-append-to-body="false">
<el-option
v-for="item in sexList"
:key="item.no"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="年龄段:" prop="mobile">
<el-select v-model="searchData.age" size="small" clearable :popper-append-to-body="false">
<el-option
v-for="item in agesList"
:key="item.value"
:label="item.value"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="诊断:" prop="startDate" class="diagnose-select-style">
<!-- <el-select v-model="searchData.diseaseId" size="small" clearable :popper-append-to-body="false" placeholder="请选择或搜索诊断">
<el-option
v-for="item in diseaseList"
:key="item.diseaseId"
:label="item.diseaseName"
:value="item.diseaseId">
</el-option>
</el-select> -->
<!-- new Start -->
<el-select
v-model="searchData.icdCodeList"
multiple
filterable
remote
size="small"
collapse-tags
reserve-keyword
placeholder="请选择或搜索诊断"
:remote-method="getDiseaseData"
:loading="loading"
:popper-append-to-body="false"
>
<el-option
v-for="item in options"
:key="item.icdCode"
:label="item.diseaseName"
:value="item.icdCode">
</el-option>
</el-select>
<!-- new End -->
</el-form-item>
<el-form-item label="分组:" prop="labelId">
<el-select v-model="searchData.labelId" size="small" clearable :popper-append-to-body="false">
<el-option
v-for="item in groupList"
:key="item.labelId"
:label="item.labelName"
:value="item.labelId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="关键词:" prop="searchCondition">
<el-input v-model="searchData.searchCondition" size="small" clearable placeholder="请输入患者姓名/手机号">
</el-input>
</el-form-item>
</el-form>
</div>
<div class="search-btn">
<el-button class="button-green" type="primary" size="small" @click="searchPatientList">查询</el-button>
<el-button class="button-white" plain size="small" @click="resetSearchData('searchData')">重置</el-button>
</div>
</div>
<el-table
:data="patientList"
style="width: 100%;">
<el-table-column
prop="nickname"
width="150"
label="姓名"
lign="center">
</el-table-column>
<el-table-column
prop="sex"
width="80"
label="性别"
align="center">
<template slot-scope="scope">
<span v-if="scope.row.sex==1"></span>
<span v-else-if="scope.row.sex==2"></span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="age"
label="年龄"
width="80"
align="center">
<template slot-scope="scope">
<span v-if="scope.row.age || (scope.row.age==0)">{{scope.row.age}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="showLabelName"
:show-overflow-tooltip="true"
label="分组"
align="center">
</el-table-column>
<el-table-column
prop="showDiseaseNames"
:show-overflow-tooltip="true"
label="诊断"
align="center">
</el-table-column>
<el-table-column
width="120"
label="操作"
align="center">
<template slot-scope="scope">
<el-button type="text" @click="goToDetails(scope.row)">查看详情</el-button>
</template>
</el-table-column>
<div slot="empty">
<div class="table-empty">
<img src="../../../assets/image/no-content1.png">
<p>暂无任何居民,去添加居民</p>
</div>
</div>
</el-table>
<div class="pagination" v-if="patientList">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagination.pageNo"
:page-sizes="[15, 30, 50, 100]"
:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.totalRows">
</el-pagination>
</div>
</section>
</section>
</template>
<script>
import BreadCrumb from '../../../components/breadcrumb.vue'
import { getConstants,
// getDiseasesList,
getIcdList,
getLabelList,
getPatientList} from '../../../utils/patients/patientsapi'
export default {
name: "not-complete",
components: {
BreadCrumb
},
data() {
return {
curmbFirst: '居民管理',
curmbSecond: '我的居民',
pagination: {
pageNo: 1,
pageSize: 15,
totalRows: 0,
},
searchData: {},
selectList: [],
sexList: [], //性别
agesList: [], //年龄
diseaseList: [],
groupList: [],
patientList: [],
options: [],
loading: false,
}
},
mounted() {
this.getConstantData(); //获取性别、年龄段常量
this.getDiseaseData(); //获取 搜索诊断
this.getGroupList(); //获取分组
this.getPatients({
...this.searchData
}); //获取居民列表
},
methods: {
getConstantData() {
getConstants({
numList: 'P006,P057',
}).then((data) => {
if(data.code == "000000") {
this.sexList = data.data.P006;
this.agesList = data.data.P057;
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
});
},
getDiseaseData(query) {
// getDiseasesList().then((data) => {
// if(data.code == "000000") {
// this.diseaseList = data.data;
// }
// }).catch((error) => {
// this.$message({
// message: error,
// type: 'error'
// });
// });
let params = {
diseaseName: query ? query : '',
pageNum: 1,
pageSize: 200,
};
this.loading = true;
getIcdList(params).then(data => {
this.loading = false;
if(data.code == "000000") {
this.options = data.data;
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
});
},
getGroupList() {
getLabelList({
type: 1,
token : localStorage.getItem("token")
}).then((data) => {
if(data.code == "000000") {
this.groupList = data.data.labelNameList;
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
});
},
getPatients(payload) {
const { pageNo, pageSize} = this.pagination;
let searchParams = {}
if(this.searchData.age) {
let ageBegin = '';
let ageEnd = '';
if(this.searchData.age == '84+') {
ageBegin = '84';
ageEnd = '200';
} else {
const ageItem = this.searchData.age.split('-');
ageBegin = ageItem[0];
ageEnd = ageItem[1];
}
searchParams = {
...payload,
ageBegin,
ageEnd
}
} else {
searchParams = payload
}
getPatientList({
pageNo,
pageSize,
...searchParams
}).then((data) => {
if(data.code == "000000") {
this.patientList = data.data.patientList;
this.pagination.totalRows = data.data.totalRows
if(this.patientList) {
this.patientList.forEach((item)=> {
item.disableNum = 1;
let diseaseNames = [];
let groupNames = []
//转化分组
if (item.labelModels) {
item.labelModels.forEach(item => {
groupNames.push(item.label)
});
item.showLabelName = groupNames.join('、');
} else {
item.showLabelName = '-';
}
//转化疾病
if (item.patientTypeModels) {
item.patientTypeModels.forEach(item => {
diseaseNames.push(item.diseaseName)
})
item.showDiseaseNames = diseaseNames.join('、');
} else {
item.showDiseaseNames = '-';
}
})
}
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
});
},
handleSizeChange(val) {
this.pagination.pageNo = 1;
this.pagination.pageSize = val
this.getPatients({
...this.searchData
})
},
handleCurrentChange(val) {
this.pagination.pageNo = val
this.getPatients({
...this.searchData
})
},
searchPatientList() {
this.pagination.pageNo = 1;
this.getPatients({
...this.searchData
})
},
resetSearchData() {
this.searchData = {}
this.pagination.pageNo = 1;
this.getPatients({
...this.searchData
})
},
goToDetails(item) {
this.$router.push({path: '/patients-manage/mypatients-manage/patient-detail', query: {patientId:item.patientId}})
}
},
}
</script>
<style lang="scss">
.not-complete-wrap {
.not-complete-content {
padding: 30px;
background: #ffffff;
.tip {
font-size: 12px;
padding: 30px 0;
line-height: 32px;
}
.page-title {
font-size: 20px;
color: #F1E2F3D;
padding-bottom: 20px;
border-bottom: 1px solid #efefef;
}
.search-div {
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 30px 0 10px 0;
border-bottom: 1px solid #efefef;
.search-input{
flex: 1;
.diagnose-select-style{
.el-input__inner{
height: 32px !important;
}
.el-select__tags-text{
display: inline-block;
max-width: 75px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.el-tag__close.el-icon-close{
top: -6px;
}
}
}
.search-btn {
text-align: right;
width: 150px;
}
}
.blank-wrap {
@media screen and (min-width:1240px) and (max-width:1545px){
height: 300px;
}
@media screen and (min-width:1545px) and (max-width:1600px){
height: 500px;
}
@media screen and (min-width:1600px){
height: 600px;
}
.blank-content {
text-align: center;
img {
width: 100px;
}
p {
font-size: 20px;
color: #999;
}
}
}
.user-photo {
border-radius: 50%;
width: 40px;
}
.table-empty {
img {
width: 100px;
}
p {
margin-top: -50px;
}
}
}
/*重置输入框,选择框样式*/
.el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner,.el-input__inner:focus{
border-color: #449284;
}
.el-select-dropdown__item.selected {
color: #449284;
}
.el-select .el-input__inner:focus {
border-color: #449284;
}
/*重置表格选择框*/
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
border-color: #449284;
background-color: #449284;
}
.el-checkbox__inner {
border-color: #DCDFE6!important;
}
.el-checkbox__input.is-focus,.el-checkbox__inner:hover,.el-checkbox__inner.is-focus {
border-color: #449284!important;
}
.el-button--text {
color: #449284;
}
.fontGreen {
color: #449284;
}
.el-pagination.is-background .el-pager li:not(.disabled).active {
background: #449284 !important;
}
}
</style>
<template>
<div class="batch-import-wrap">
<div class="step-guide">
<ul class="guide-list">
<li class="first">
<div class="procedure">
<i class="icon">1</i>
<p class="text">下载模板</p>
<p class="border"></p>
</div>
<div class="under-info">
<p class="step-tips">点击下方“下载模板”</p>
<el-button type="primary" size="small" @click="handleDownloadDemo">下载模板</el-button>
</div>
</li>
<li class="first second">
<div class="procedure">
<i class="icon">2</i>
<p class="text">填写居民信息</p>
<p class="border"></p>
</div>
<div class="under-info">
<p class="step-tips">按照模板编辑居民信息</p>
<ul class="fill-tips">
<li>
<i class="tips-title notice">填写要求:</i>
</li>
<li>
<i class="tips-title">居民姓名:</i>
<p>当前支持2~15个字符</p>
</li>
<li>
<i class="tips-title">出生年月:</i>
<p>"年-月-日",我们将优先识别身份证信息中的出生年月信息,若身份证未填,将识别此处信息。</p>
</li>
<li>
<i class="tips-title">居住地址:</i>
<p>≤50字</p>
</li>
<li>
<i class="tips-title">电话:</i>
<p>请输入11位手机号码</p>
</li>
<li>
<i class="tips-title">分组与诊断:</i>
<p>多个分组之间,用中文逗号“,”分割</p>
</li>
</ul>
</div>
</li>
<li class="first third">
<div class="procedure">
<i class="icon">3</i>
<p class="text">上传文件</p>
</div>
<div class="under-info">
<p class="step-tips">将填写好的居民信息文件在下方进行上传</p>
<el-upload
class="upload-file"
drag
action="#"
:before-upload="getPostData"
:http-request="notUseDefaultUpload">
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
</el-upload>
</div>
</li>
</ul>
</div>
<div class="component-content screenSet upload-history-wrap">
<p class="septal-line"></p>
<p class="upload-record">上传历史记录:{{searchData.totalCount}}</p>
<!-- :cell-style="aaa" -->
<el-table
:data="searchData.tableData"
class="upload-table"
empty-text="该用户暂无历史记录"
style="width: 100%">
<el-table-column
align="left"
prop="fileName"
label="文件名"
width="250">
</el-table-column>
<el-table-column
align="left"
prop="uploadTime"
label="上传时间"
width="180">
</el-table-column>
<el-table-column
align="left"
prop="insertCount"
label="新导入居民数">
</el-table-column>
<el-table-column
align="left"
prop="updateCount"
label="更新居民资料数">
</el-table-column>
<el-table-column
align="left"
prop="status"
label="处理状态">
</el-table-column>
<el-table-column
align="left"
prop="reason"
label="关闭理由">
</el-table-column>
</el-table>
<el-pagination
class="pagination-style"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="searchData.totalCount"
:current-page="1"
:page-sizes="[15, 30, 50, 100]"
:page-size="searchData.pageSize"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</div>
<!-- 上传成功弹窗 -->
<el-dialog
class="upload-success-modal"
title="上传成功"
:visible.sync="showUploadSuccess"
width="400px"
:show-close="false"
:close-on-click-modal="false"
center>
<p class="tips">我们会在<i>3-5个工作日</i>内进行处理,届时您可以在上传历史记录列表查看处理结果</p>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleCloseUploadSuccess">我知道了</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import { getSaasDomain } from '@/utils/index';
import {
getUploadHistory,
uploadExcel,
} from "@/utils/patients/patientsapi";
export default {
data() {
return {
searchData: {
pageNo: 1, // 第几页
pageSize: 15, // 每页条数
tableData: [],
totalCount: 0,
},
files: [],
postData: {},
showUploadSuccess: false,
}
},
created() {
this.goToGetUploadHistory();
},
computed: {
...mapGetters([
'_token',
]),
},
methods: {
// aaa(obj){
// console.log('%c cell-style obj>>>>>>', 'color: red;', obj);
// if(obj.column.property == 'reason'){
// return 'red>>>'
// }else{
// return 'pink'
// }
// },
notUseDefaultUpload(){
// console.log('just console>>>>>>>>')
},
getPostData(file) {
let self = this;
let arr = file.type.split('/');
let ext = "." + arr[1];
let name = file.name;
let type = name.substring(name.lastIndexOf('.') + 1);
if (type !== 'xls' && type !== 'xlsx') {
self.$message({
message: '上传文件只能是 xls、xlsx格式!',
type: 'warning'
});
return;
}
let reader = new FileReader();
reader.onload = function (e) {
let fileJson = {
fileName: file.name,
file: e.target.result.substr(e.target.result.indexOf("base64,") + 7),
ext: ext
};
let fileArray = [{
type: 'patient',
base64: fileJson
}];
let req = {
fileArray: fileArray,
import_type: 2,
};
if( process.env.BUILD_ENV == "development" ){
req.token = '428006DCF6DD45FB9BAD640FEF6ACE4B'
}else{
// req.token = self._token;
req.token = localStorage.getItem('storageToken');
}
self.postData = JSON.stringify(req);
console.log('>>>>>> batch upload req', req)
uploadExcel(self.postData).then(res => {
if(typeof res.importFlag != 'undefined' && res.importFlag == true){
self.showUploadSuccess = true;
try{
self.goToGetUploadHistory();
}catch(err){
console.log('reload history list error');
}
}else{
self.$message({
message: '上传失败,请重新上传!',
type: 'success'
});
}
})
};
reader.readAsDataURL(file);
},
handleDownloadDemo(){
let src = 'https://file.yunqueyi.com/File/template/居民导入模板.xlsx';
// let newTab=window.open('about:blank');
// newTab.location = src;
window.location.href = src;
},
goToGetUploadHistory(){
// console.log('go get upload history>>>>>>')
let params = {
pageNo: this.searchData.pageNo,
pageSize: this.searchData.pageSize,
};
getUploadHistory(params).then(res => {
// console.log('获取上传历史记录:', res);
if(res.code == "000000"){
let data = res.data.importRecordsModelList;
if(data && data.length > 0){
data = data.map(item => {
if(!item.fileName){
item.fileName = '-';
}
if(!item.uploadTime) {
item.uploadTime = '-';
}
if(item.insertCount || item.insertCount == 0) {
// 直接显示
}else{
item.insertCount = '-';
}
if(item.updateCount || item.updateCount == 0) {
// 直接显示
}else{
item.updateCount = '-';
}
if(!item.status) {
item.status = '-';
}
if(!item.reason) {
item.reason = '-';
}
return item;
});
this.searchData.tableData = data;
this.searchData.totalCount = res.data.count;
}
}else{
// 获取失败
this.$message({
message: '接口返回失败,请重新再试',
type: 'warning'
});
}
})
},
handleCurrentChange(val) {
this.searchData.pageNo = val;
this.goToGetUploadHistory();
},
handleSizeChange(val) {
this.searchData.pageSize = val;
this.goToGetUploadHistory();
},
handleCloseUploadSuccess() {
this.showUploadSuccess = false;
},
},
}
</script>
<template>
<div>
<div class="qr-code-wrap">
<el-alert
class="top-tips"
title="提醒:选择分组后,会自动生成相应的分组二维码,居民扫码后直接进入该分组(若未选择分组,则自动生成未分组二维码,居民扫码后进入默认未分组)"
type="warning"
show-icon>
</el-alert>
<div class="qr-group">
<p class="label-name">二维码分组:</p>
<template v-for="(labelItem, index) in labelsInfoList">
<el-tag size="small" :key="index">{{labelItem.labelName}}</el-tag>
</template>
<el-tag size="small" class="choose-group" @click="handleChooseGroup">+ 选择分组</el-tag>
</div>
<div class="qr-pic-wrap">
<div class="qr-box">
<div class="pic">
<canvas id="msg"></canvas>
<el-button icon="el-icon-download" class="qr-download-btn" @click="handleQRDownloadModal">下载二维码</el-button>
</div>
<p class="time-limit">有效期:{{qrCodeInfo.beginTime}}-{{qrCodeInfo.endTime}} </p>
<el-button icon="el-icon-refresh" class="refresh-btn" size="small" @click="handleRefreshCode">刷新有效期</el-button>
</div>
</div>
<div class="border-space"></div>
<div class="increased-steps-wrap">
<div class="label-title">居民添加流程</div>
<img src="../../../../assets/image/patient-add-flow-path.png" alt="" class="flow-path">
</div>
</div>
<!-- 选择分组 弹窗 -->
<el-dialog
class="choose-label-wrap"
:title="showDownloadQRModal == false ? '选择分组' : '下载二维码'"
:visible.sync="showChooseLabelModal"
width="680px"
:close-on-click-modal="false"
center>
<p class="under-title-tips">选择分组后,会自动生成相应的分组二维码,居民扫码后直接进入该分组</p>
<el-row class="row-in-line">
<el-button size="small" class="clear-select" :disabled="choosedLabelList.length<1" @click="handleClearSelect">清空选择</el-button>
<template v-if="!showDownloadQRModal">
<el-button type="primary" class="right" size="small" @click="handleGoToLabelManage">分组管理</el-button>
<p class="tips">未找到分组可去分组管理新建分组</p>
</template>
</el-row>
<div class="list-wrap">
<el-checkbox-group v-model="choosedLabelList">
<template v-for="item in labelNameList" >
<el-checkbox v-if="item.labelId != 0" :label="item.labelId" border :key="item.labelId">
{{item.labelName}}
</el-checkbox>
</template>
</el-checkbox-group>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="handleCloseChooseLabelModal" size="small">取 消</el-button>
<el-button type="primary" @click="handleAfterChooseLabel" size="small">{{showDownloadQRModal == false ? '确 定' : '确定下载'}}</el-button>
<a :href="imgHref" ref="downLoadBtn" id="downLoadBtn" download="二维码.png"></a>
</span>
</el-dialog>
<!-- 重新加载当前分组列表 -->
<el-dialog
class="reload-label-modal"
:visible.sync="showReloadLabelModal"
width="320px"
:show-close="false"
:close-on-click-modal="false"
center>
<p class="tips">您刚才跳转到分组管理页面进行新建分组,请点击下方按钮刷新数据</p>
<span slot="footer" class="dialog-footer">
<el-button type="primary" @click="handleReloadLabel">重新加载</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import QRCode from 'qrcode';
import {
getQRCode,
refreshCode,
getLabelList,
getLabelsInfo,
downloadQRCode,
} from "@/utils/patients/patientsapi";
export default {
name: "qrCodeImport",
data() {
return {
imgHref: '',
showChooseLabelModal: false,
showReloadLabelModal: false,
showDownloadQRModal: false, //下载二维码弹窗时, 是否隐藏“选择分组”里的分组管理部分
qrCodeInfo: {
qrcodeUrl: '',
beginTime: '',
endTime: '',
id: '',
labelIds: '',
},
labelsInfoList: [], // 二维码分组 列表信息
labelNameList: [], // 分组列表
currentLabelList: [], // 接口返回的二维码分组id列表
choosedLabelList: [], // 勾选的分组id列表
forDownloadInfo: {}, // 下载用的信息
}
},
created() {
this.goToGetQRCode({
labelIds: '',
id: '',
first: true,
});
},
watch: {
showChooseLabelModal: function(val) {
if(val == false){
// this.labelNameList = [];
this.choosedLabelList = [];
}
},
},
methods: {
handleCloseChooseLabelModal() {
this.showChooseLabelModal = false;
},
// 二维码录入
goToGetQRCode(params, cb){
let justDownload = false;
if(params.hasOwnProperty('justDownload')){
justDownload = true;
delete params.justDownload;
}
getQRCode(params).then(res => {
if(res.code == '000000'){
let data = res.data;
if( !justDownload ){ // 非下载二维码时
this.qrCodeInfo = data;
if(data.labelIds && (data.labelIds != '')){ // 存在labelIds,则去请求label信息列表
let temp = data.labelIds.split(',');
this.currentLabelList = this.formatList(temp);
this.handleGetLabelsInfo({
labelIds: data.labelIds,
});
}else{
this.labelsInfoList = [];
this.currentLabelList = [];
}
this.calculateQRCode(data.qrcodeUrl);
}else{ // 下载二维码时,不用更新页面中的二维码信息
// debugger;
this.forDownloadInfo = data;
let { id, beginTime, endTime, forever } = this.forDownloadInfo;
let obj = {
id,
beginTime,
endTime,
forever,
// labels: [], // ["高血压","糖尿病","脑卒中"]
labelList: []
};
let idArr = params.labelIds.split(','); // [1,3,55]
let checkArr = this.labelNameList;
for(let i=0; i<idArr.length; i++) {
for(let j=0; j<checkArr.length; j++) {
if( idArr[i] == checkArr[j].labelId ) {
// obj.labels.push( checkArr[j].labelName );
obj.labelList.push({
labelId: checkArr[j].labelId,
labelName: checkArr[j].labelName
})
}
}
}
// console.log('obj.labels: ', obj.labels);
cb && cb(obj);
}
}else{
this.$message({
message: '获取二维码失败,请重新再试',
type: 'warning'
});
}
})
},
formatList(arr) {
return arr.map((item, index) => {
return parseInt(item);
})
},
handleGetLabelsInfo(params) {
getLabelsInfo(params).then(res => {
if(res.code == '000000'){
this.labelsInfoList = res.data;
}else{
this.$message({
message: '获取标签信息失败',
type: 'warning'
});
}
})
},
calculateQRCode(val){
// 获取页面的canvas
var msg= document.getElementById('msg')
// 将获取到的数据(val)画到msg(canvas)上
QRCode.toCanvas(msg, val, function (error) {
// console.log(error)
})
},
handleChooseGroup() {
// debugger;
this.showDownloadQRModal = false;
// 回显已经选择的label
this.choosedLabelList = this.currentLabelList;
this.goToGetGroupList();
},
handleRefreshCode() {
let params = {
labelIds: this.qrCodeInfo.labelIds,
id: this.qrCodeInfo.id,
first: false,
}
refreshCode(params).then(res => {
if(res.code == '000000'){
let data = res.data;
this.qrCodeInfo = data;
if(data.labelIds && data.labelIds != ''){
let temp = data.labelIds.split(',');
this.currentLabelList = this.formatList(temp);
}
}else{
this.$message({
message: '获取二维码失败,请重新再试',
type: 'warning'
});
}
})
},
handleQRDownloadModal() {
this.showDownloadQRModal = true;
// 回显已经选择的label
this.choosedLabelList = this.currentLabelList;
this.goToGetGroupList();
},
handleAfterChooseLabel() {
// console.log('this.choosedLabelList ', this.choosedLabelList)
// console.log('this.choosedLabelList ', this.choosedLabelList.join(','))
if( this.showDownloadQRModal == false ){ // 选择分组时
this.showChooseLabelModal = false;
this.goToGetQRCode({
labelIds: this.choosedLabelList.join(','),
id: '',
first: false,
});
}else{ // 下载二维码时
// 获取最新二维码参数,但不影响之前的二维码参数
this.goToGetQRCode({
labelIds: this.choosedLabelList.join(','),
id: '',
first: false,
justDownload: true,
downloadQrcode:true,
}, this.goToDownloadQRCode);
}
},
goToDownloadQRCode(params) {
// 下载二维码
downloadQRCode(params).then(res => {
if(res.code == '000000'){
this.showChooseLabelModal = false;
this.downloadFile(res.data);
}else{
this.$message({
message: '下载二维码失败',
type: 'warning'
});
}
})
},
handleClearSelect() {
this.choosedLabelList = [];
},
goToGetGroupList() {
// 获取分组列表
let params = {
type: 1,
};
if(this.labelName){
params.labelName = this.labelName;
}
getLabelList(params).then(data => {
// console.log('获取分组列表>> ', data)
if(data.data && data.data.labelNameList){
this.labelNameList = data.data.labelNameList;
this.showChooseLabelModal = true;
}
}).catch(err => {
console.log('error: ', err)
});
},
handleGoToLabelManage(){
let routeUrl = this.$router.resolve({
path: '/patients-manage/labels-manage/labels-list',
});
window.open(routeUrl.href, '_blank');
this.showReloadLabelModal = true;
},
handleReloadLabel() {
this.showReloadLabelModal = false;
this.goToGetGroupList();
},
downloadFile(src) {
// console.log('准备下载',src)
this.downLoadHandle(src);
},
downLoadHandle(src){
let blobToDataURI = (blob, callback) => {
var reader = new FileReader();
reader.onload = (e) => {
callback(e.target.result);
}
reader.readAsDataURL(blob);
};
var xhr = new XMLHttpRequest();
xhr.open('GET', src, true);
xhr.responseType = "blob";
xhr.onload = () => {
if (xhr.status == 200) {
var blob = xhr.response;
var img = document.createElement("img");
img.onload = (e) => {
window.URL.revokeObjectURL(img.src);
};
img.src = window.URL.createObjectURL(blob);
blobToDataURI(blob, (data)=> {
// console.log(img)
// console.log(data)
document.getElementById('downLoadBtn').setAttribute('href',data);
this.imgHref = data;
if (this.myBrowser()==="IE" || this.myBrowser()==="Edge"){
// window.event.preventDefault();
window.event.returnValue = false;
window.download(this.imgHref,"二维码.png","image/png")
}
this.$refs.downLoadBtn.click();
// 如果是IE浏览器
})
}
}
xhr.send();
},
// 判断浏览器类型
myBrowser(){
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
var isOpera = userAgent.indexOf("Opera") > -1;
if (isOpera) {
return "Opera"
}; //判断是否Opera浏览器
if (userAgent.indexOf("Firefox") > -1) {
return "FF";
} //判断是否Firefox浏览器
if (userAgent.indexOf("Chrome") > -1){
return "Chrome";
}
if (userAgent.indexOf("Safari") > -1) {
return "Safari";
} //判断是否Safari浏览器
if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
return "IE";
}; //判断是否IE浏览器
if (userAgent.indexOf("Trident") > -1) {
return "Edge";
} //判断是否Edge浏览器
}
},
}
</script>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<div class="newly-increased-wrap">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond" ></bread-crumb>
<div class="component-content screenSet">
<el-tabs v-model="activeName2" @tab-click="handleTabClick" class="tab-list">
<el-tab-pane label="单个录入" name="first" class="single-input">
<el-row class="save-and-add">
<el-button type="primary" @click="saveEdit">保存并新增</el-button>
</el-row>
<edit-information
ref="newForm"
:patientInfoObj="patientInfo"
:checkForm="checkForm"
@addListenSave="addListenSave"
:patientId="patientId">
</edit-information>
</el-tab-pane>
<el-tab-pane label="二维码录入" name="second">
<QRCodeImport v-if="activeName2 == 'second'"></QRCodeImport>
</el-tab-pane>
<el-tab-pane label="批量导入" name="third">
<BatchImport v-if="activeName2 == 'third'"></BatchImport>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb.vue";
import EditInformation from '../mypatients-manage/components/edit-information'
import QRCodeImport from './components/qr-code-import';
import BatchImport from './components/batch-import';
import {
savePatientInfo
} from "@/utils/patients/patientsapi";
export default {
name: 'newPatient',
data() {
return {
curmbFirst: "居民管理",
curmbSecond: "新增居民",
activeName2: 'first',
patientInfo: {},
checkForm: false,
patientId: '',
}
},
components: {
BreadCrumb,
EditInformation,
QRCodeImport,
BatchImport,
},
created() {
let tabIndex = this.$route.query.tab;
if((typeof tabIndex == 'undefined') || (tabIndex == '')){
return;
}
tabIndex = parseInt(tabIndex);
let numArr = [1, 2, 3];
let tabList = ['first', 'second', 'third'];
if( numArr.indexOf(tabIndex) > -1 ){
this.activeName2 = tabList[tabIndex-1];
}else{
this.activeName2 = 'first';
}
},
// 挂载到Dom完成时
mounted() {
// commonUtil.resizeHeight();
},
methods: {
handleTabClick(tab, event) {
// console.log(tab, event);
},
saveEdit() {
this.checkForm = true;
},
addListenSave(val) {
this.checkForm = false;
if(val.status) {
// this.patientInfo = val.patientInfoForm
// console.log('填写内容',val.patientInfoForm);
savePatientInfo({
...val.patientInfoForm,
addType: 6
}).then(data => {
if(data.code == '000000'){
this.$message.success('新增成功')
setTimeout(() => {
this.$refs.newForm.$refs.patientInfoForm.resetFields()
this.$refs.newForm.diseaseIdList = [];
this.$refs.newForm.labelIdList = [];
this.$refs.newForm.addressList = [];
// 清空已选的诊断列表
this.$store.dispatch('patientsDiagnose/changeDiagnoseList', []);
// this.$router.go(0);//体验不好
},500)
}else {
this.$message.error(data.message);
}
})
// 调用保存接口
}else {
this.$message.error('请正确填写信息');
}
},
}
}
</script>
<style lang="less">
@import "../../../style/patient-manager/new-patient/new-patient-wrap.less";
</style>
<style lang="less">
@import "../../../style/patient-manager/new-patient/new-patient.less";
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<section class="not-complete-wrap">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<section class="not-complete-content screenSet">
<h1 class="page-title">资料不全居民</h1>
<p class="tip" v-if="notCompleteList.length">
<span class="fontGreen">{{pagination.totalRows}}</span>居民仅通过微信扫码与您绑定,但未完善姓名、手机号等关键信息。提醒居民完善信息后,您将可以对居民进行消息推送和随访计划设置。
<el-button type="primary" style="float: right;" size="small" @click="sendCompleteMessageMultiple">批量提醒</el-button>
</p>
<el-table
v-if="notCompleteList.length"
:data="notCompleteList"
:row-key="getRowKeys"
@selection-change="handleSelectionChange"
style="width: 100%;">
<el-table-column
type="selection"
width="100">
</el-table-column>
<el-table-column
prop="headimgurl"
label="头像"
width="100"
lign="center">
<template slot-scope="scope">
<img v-if="scope.row.headimgurl" class="user-photo" :src="scope.row.headimgurl"/>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="wechatUsername"
width="200"
label="微信昵称"
align="center">
<template slot-scope="scope">
<span v-if="scope.row.wechatUsername">{{scope.row.wechatUsername}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="country"
label="地区"
align="center">
<template slot-scope="scope">
<span v-if="scope.row.country">{{scope.row.country}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
prop="wechatCreatedTime"
label="添加时间"
align="center">
<template slot-scope="scope">
<span v-if="scope.row.wechatCreatedTime">{{scope.row.wechatCreatedTime}}</span>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center">
<template slot-scope="scope">
<el-button v-if="scope.row.isRemind==1" type="text" @click="sendMessageSingle(scope.row)">提醒完善信息</el-button>
<el-button v-else-if="scope.row.isRemind==2" type="text" style="color: #999">提醒已发送</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination" v-if="notCompleteList.length">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="pagination.pageNo"
:page-sizes="[15, 30, 50, 100]"
:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.totalRows">
</el-pagination>
</div>
<div v-if="!notCompleteList.length" class="blank-wrap">
<div class="blank-content">
<img src="../../../assets/image/no-content1.png"/>
<p>暂无资料不全居民</p>
</div>
</div>
</section>
</section>
</template>
<script>
import BreadCrumb from '../../../components/breadcrumb.vue'
import { getNotCompleteList,
sendCompleteMessage,
getNotCompleteCount,
sendCompleteMessageList,
getRedNum} from '../../../utils/patients/patientsapi'
export default {
name: "not-complete",
components: {
BreadCrumb
},
data() {
return {
curmbFirst: '居民管理',
curmbSecond: '资料不全居民',
notCompleteList: [], //未完善列表
pagination: {
pageNo: 1,
pageSize: 15,
},
getRowKeys(row) {
return row.patientId;
},
selectList: []
}
},
mounted() {
this.getRedData();
this.getNotComplete()
this.getNotCompleteNum()
},
methods: {
getRedData() {
getRedNum({
openTime: (new Date()).getTime(),
type: 1,
}).then((data) => {
if(data.code == '000000') {
// vm.redNum = data.data
}
}).catch(error => {
vm.$message.error(error)
})
},
handleSelectionChange(val) {
this.selectList = val;
},
handleSizeChange(val) {
this.pagination.pageSize = val
this.getNotComplete()
},
handleCurrentChange(val) {
this.pagination.pageNo = val
this.getNotComplete()
},
getNotComplete() { //获取未完善居民列表
const { pageNo, pageSize} = this.pagination
getNotCompleteList({
pageNo,
pageSize,
}).then((data) => {
if(data.code == "000000") {
this.notCompleteList = data.data;
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
})
},
sendMessageSingle(item) { //发送单个提醒
sendCompleteMessage({
qrcodeType: 1,
patientId: item.patientId,
}).then((data) => {
if(data.code == "000000") {
this.$message({
message: '已向居民发送提醒',
type: 'success'
});
this.getNotComplete();
this.getNotCompleteNum();
}else {
this.$message({
message: data.message,
type: 'error'
});
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
})
},
sendCompleteMessageMultiple() {
if(!this.selectList.length) {
this.$message({
message: '请选择居民',
type: 'warning'
});
return;
}
let patientIdList = [];
this.selectList.forEach(item => {
patientIdList.push(item.patientId)
});
sendCompleteMessageList({
qrcodeType: 1,
patientIds: patientIdList,
}).then((data) => {
if(data.code == "000000") {
this.$message({
message: '已向居民发送提醒',
type: 'success'
});
this.getNotComplete();
this.getNotCompleteNum();
}else {
this.$message({
message: data.message,
type: 'error'
});
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
})
},
getNotCompleteNum() {
getNotCompleteCount().then((data) => {
if(data.code == "000000") {
this.pagination.totalRows = data.data;
}
}).catch((error) => {
this.$message({
message: error,
type: 'error'
});
})
}
}
}
</script>
<style lang="scss">
.not-complete-wrap {
.not-complete-content {
padding: 30px;
background: #ffffff;
.tip {
font-size: 12px;
padding: 30px 0;
line-height: 32px;
}
.page-title {
font-size: 20px;
color: #F1E2F3D;
padding-bottom: 20px;
border-bottom: 1px solid #efefef;
}
.blank-wrap {
position: relative;
@media screen and (min-width:1240px) and (max-width:1545px){
height: 300px;
}
@media screen and (min-width:1545px) and (max-width:1600px){
height: 500px;
}
@media screen and (min-width:1600px){
height: 600px;
}
.blank-content {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
text-align: center;
img {
width: 100px;
}
p {
font-size: 20px;
color: #999;
}
}
}
.user-photo {
border-radius: 50%;
width: 40px;
}
}
/*重置表格选择框*/
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
border-color: #449284;
background-color: #449284;
}
.el-checkbox__inner {
border-color: #DCDFE6!important;
}
.el-checkbox__input.is-focus,.el-checkbox__inner:hover,.el-checkbox__inner.is-focus {
border-color: #449284!important;
}
.el-button--text {
color: #449284;
}
.fontGreen {
color: #449284;
}
.el-pagination.is-background .el-pager li:not(.disabled).active {
background: #449284 !important;
}
}
</style>
......@@ -109,12 +109,22 @@
></el-pagination>
</div>
<el-dialog title :visible.sync="dialog.show" width="30%" center>
<p v-if="numL3 > 1" class="dialog-p">
<!-- <p v-if="numL3 > 1" class="dialog-p">
确认将{{ dialog.role }}
<span class="user-name">"{{ dialog.name }}"</span>
{{ dialog.option }}吗?"
</p>
<p v-else >该用户为此机构仅有的次级负责人,确认需要降级吗?</p>
<p v-else >该用户为此机构仅有的次级负责人,确认需要降级吗?</p> -->
<p v-if="numL3 <= 1 && scopeRow.projeceRole == 'L3'" class="dialog-p">
该用户为此机构仅有的次级负责人,确认需要降级吗?
</p>
<p v-else>
确认将{{ dialog.role }}
<span class="user-name">"{{ dialog.name }}"</span>
{{ dialog.option }}吗?"
</p>
<span slot="footer" class="dialog-footer">
<el-button type="default" size="small" @click="dialog.show = false">取消</el-button>
<el-button type="primary" size="small" @click="changeRole()">确定</el-button>
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册