浏览代码

Merge remote-tracking branch 'origin/master' into referMaster

# Conflicts:
#	src/components/Preview.vue
#	src/utils/tools.js
zhouna 5 年之前
父节点
当前提交
b0d77287d3
共有 47 个文件被更改,包括 2331 次插入951 次删除
  1. 2 2
      config/index.js
  2. 59 74
      package-lock.json
  3. 4 1
      package.json
  4. 11 1
      src/App.vue
  5. 86 20
      src/common/CheckBox.vue
  6. 30 6
      src/common/ComTextArea.vue
  7. 35 8
      src/common/Input.vue
  8. 9 7
      src/common/Label.vue
  9. 18 12
      src/common/MultiLineInput.vue
  10. 29 22
      src/common/OptionInp.vue
  11. 148 0
      src/common/PickSlide.vue
  12. 45 17
      src/common/PickTime.vue
  13. 10 7
      src/common/Picker.vue
  14. 63 14
      src/common/Radio.vue
  15. 159 19
      src/common/RadioSelect.vue
  16. 25 23
      src/common/Submit.vue
  17. 162 0
      src/common/SymptomLis.vue
  18. 2 2
      src/common/Tiptoast.vue
  19. 26 19
      src/common/Toast.vue
  20. 42 28
      src/common/UploadImg.vue
  21. 10 4
      src/components/AddContent.vue
  22. 113 16
      src/components/Department.vue
  23. 304 71
      src/components/Detail.vue
  24. 87 110
      src/components/DetailBox.vue
  25. 21 8
      src/components/DiagTreat.vue
  26. 216 81
      src/components/Login.vue
  27. 19 10
      src/components/Others.vue
  28. 143 151
      src/components/PathInfo.vue
  29. 87 48
      src/components/Preview.vue
  30. 7 6
      src/components/Search.vue
  31. 213 114
      src/components/Symptom.vue
  32. 16 9
      src/components/TabPage.vue
  33. 二进制
      src/images/addimg.png
  34. 二进制
      src/images/closeimg.png
  35. 二进制
      src/images/icon_close@2x.png
  36. 1 0
      src/images/important.svg
  37. 二进制
      src/images/iptdis.png
  38. 二进制
      src/images/iptselect.png
  39. 二进制
      src/images/person.png
  40. 二进制
      src/images/slideT.png
  41. 二进制
      src/images/topContent.png
  42. 76 22
      src/less/base.less
  43. 1 1
      src/less/index.less
  44. 13 0
      src/main.js
  45. 15 6
      src/store.js
  46. 5 0
      src/utils/api.js
  47. 19 12
      src/utils/tools.js

+ 2 - 2
config/index.js

@@ -4,8 +4,8 @@
 
 const path = require('path')
 // const proxy_path = 'http://192.168.2.236:80';
-const proxy_path = 'http://192.168.2.121:5050';
-// const proxy_path = 'http://192.168.2.241:5050';
+// const proxy_path = 'http://192.168.2.236:5050';
+const proxy_path = 'http://192.168.2.241:5050';
 
 module.exports = {
   dev: {

+ 59 - 74
package-lock.json

@@ -6,16 +6,16 @@
   "dependencies": {
     "@babel/runtime": {
       "version": "7.6.3",
-      "resolved": "https://registry.npm.taobao.org/@babel/runtime/download/@babel/runtime-7.6.3.tgz",
-      "integrity": "sha1-k1Eix0xz0iQMr9Mt21/Cps01zx8=",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz",
+      "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==",
       "requires": {
         "regenerator-runtime": "^0.13.2"
       },
       "dependencies": {
         "regenerator-runtime": {
           "version": "0.13.3",
-          "resolved": "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.13.3.tgz",
-          "integrity": "sha1-fPanfY9cb2Drc8X8GVWyzrAea/U="
+          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
+          "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
         }
       }
     },
@@ -27,13 +27,13 @@
     },
     "@vant/icons": {
       "version": "1.1.15",
-      "resolved": "https://registry.npm.taobao.org/@vant/icons/download/@vant/icons-1.1.15.tgz?cache=0&sync_timestamp=1571923117293&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.1.15.tgz",
-      "integrity": "sha1-U8UaziHpmSv+6y4a2QlPv2UG0RY="
+      "resolved": "https://registry.npmjs.org/@vant/icons/-/icons-1.1.15.tgz",
+      "integrity": "sha512-96tbJotfofrKpOrUGWKkiGLJsCFc0OX5pikWLW5yarD+EMhi0zCrQSDb95xGrp/HETAFm+nSTQu2e1zGsWN/7A=="
     },
     "@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.0.0",
-      "resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.0.0.tgz",
-      "integrity": "sha1-BI/leZWNpAj7eosqPsBQtQpmEEA="
+      "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz",
+      "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw=="
     },
     "accepts": {
       "version": "1.3.7",
@@ -3421,7 +3421,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
       "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
-      "dev": true,
       "requires": {
         "globby": "^6.1.0",
         "is-path-cwd": "^1.0.0",
@@ -3540,6 +3539,14 @@
         "entities": "^1.1.1"
       }
     },
+    "dom7": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/dom7/-/dom7-2.1.3.tgz",
+      "integrity": "sha512-QTxHHDox+M6ZFz1zHPAHZKI3JOHY5iY4i9BK2uctlggxKQwRhO3q3HHFq1BKsT25Bm/ySSj70K6Wk/G4bs9rMQ==",
+      "requires": {
+        "ssr-window": "^1.0.1"
+      }
+    },
     "domain-browser": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -3885,7 +3892,6 @@
       "version": "0.1.6",
       "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
       "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
-      "dev": true,
       "requires": {
         "original": ">=0.0.5"
       }
@@ -4278,7 +4284,6 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
       "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-      "dev": true,
       "requires": {
         "locate-path": "^2.0.0"
       }
@@ -4528,8 +4533,8 @@
     },
     "fsevents": {
       "version": "1.2.9",
-      "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.9.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-1.2.9.tgz",
-      "integrity": "sha1-P17WZYPM1vQAtaANtvfoYTY+OI8=",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
+      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
       "optional": true,
       "requires": {
         "nan": "^2.12.1",
@@ -5149,8 +5154,7 @@
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
       "version": "1.0.0",
@@ -5513,7 +5517,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
       "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==",
-      "dev": true,
       "requires": {
         "pkg-dir": "^2.0.0",
         "resolve-cwd": "^2.0.0"
@@ -5556,7 +5559,6 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz",
       "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=",
-      "dev": true,
       "requires": {
         "meow": "^3.3.0"
       }
@@ -5577,8 +5579,7 @@
     "invert-kv": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
-      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
-      "dev": true
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
     },
     "ip": {
       "version": "1.1.5",
@@ -5754,14 +5755,12 @@
     "is-path-cwd": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
-      "dev": true
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
     },
     "is-path-in-cwd": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
       "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
-      "dev": true,
       "requires": {
         "is-path-inside": "^1.0.0"
       }
@@ -5770,7 +5769,6 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
       "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
-      "dev": true,
       "requires": {
         "path-is-inside": "^1.0.1"
       }
@@ -5970,7 +5968,6 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
       "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
-      "dev": true,
       "requires": {
         "invert-kv": "^1.0.0"
       }
@@ -6069,7 +6066,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
       "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-      "dev": true,
       "requires": {
         "p-locate": "^2.0.0",
         "path-exists": "^3.0.0"
@@ -6587,8 +6583,8 @@
     },
     "nan": {
       "version": "2.14.0",
-      "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnan%2Fdownload%2Fnan-2.14.0.tgz",
-      "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
       "optional": true
     },
     "nanomatch": {
@@ -7026,7 +7022,6 @@
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
       "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-      "dev": true,
       "requires": {
         "p-try": "^1.0.0"
       }
@@ -7035,7 +7030,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
       "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-      "dev": true,
       "requires": {
         "p-limit": "^1.1.0"
       }
@@ -7043,14 +7037,12 @@
     "p-map": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
-      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
-      "dev": true
+      "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA=="
     },
     "p-try": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-      "dev": true
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
     },
     "pako": {
       "version": "1.0.10",
@@ -7236,7 +7228,6 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
       "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-      "dev": true,
       "requires": {
         "find-up": "^2.1.0"
       }
@@ -10442,7 +10433,6 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz",
       "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=",
-      "dev": true,
       "requires": {
         "debug": "^2.6.6",
         "eventsource": "0.1.6",
@@ -10456,7 +10446,6 @@
           "version": "2.6.9",
           "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
           "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-          "dev": true,
           "requires": {
             "ms": "2.0.0"
           }
@@ -10465,7 +10454,6 @@
           "version": "0.11.3",
           "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
           "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
-          "dev": true,
           "requires": {
             "websocket-driver": ">=0.5.1"
           }
@@ -10473,8 +10461,7 @@
         "ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-          "dev": true
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
         }
       }
     },
@@ -10596,6 +10583,11 @@
         "tweetnacl": "~0.14.0"
       }
     },
+    "ssr-window": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-1.0.1.tgz",
+      "integrity": "sha512-dgFqB+f00LJTEgb6UXhx0h+SrG50LJvti2yMKMqAgzfUmUXZrLSv2fjULF7AWGwK25EXu8+smLR3jYsJQChPsg=="
+    },
     "ssri": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz",
@@ -10842,7 +10834,6 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
       "requires": {
         "has-flag": "^3.0.0"
       }
@@ -10880,6 +10871,15 @@
         }
       }
     },
+    "swiper": {
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-4.5.1.tgz",
+      "integrity": "sha512-se6I7PWWu950NAMXXT+ENtF/6SVb8mPyO+bTfNxbQBILSeLqsYp3Ndap+YOA0EczOIUlea274PKejT6gKZDseA==",
+      "requires": {
+        "dom7": "^2.1.3",
+        "ssr-window": "^1.0.1"
+      }
+    },
     "tapable": {
       "version": "0.2.9",
       "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz",
@@ -11359,8 +11359,8 @@
     },
     "vant": {
       "version": "2.2.10",
-      "resolved": "https://registry.npm.taobao.org/vant/download/vant-2.2.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvant%2Fdownload%2Fvant-2.2.10.tgz",
-      "integrity": "sha1-rAqkPn8n5WpyCXdPh7h62TYIO1E=",
+      "resolved": "https://registry.npmjs.org/vant/-/vant-2.2.10.tgz",
+      "integrity": "sha512-O8HhrwMkqwA3fYFDwHLxFNh7ckAafao+4gF0hIdwSjypvEdbd6jgtPep0k3Z+CzPXkvPNUV5XCwR3fSH0AIgKw==",
       "requires": {
         "@babel/runtime": "7.x",
         "@vant/icons": "1.1.15",
@@ -11399,6 +11399,15 @@
       "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz",
       "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ=="
     },
+    "vue-awesome-swiper": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/vue-awesome-swiper/-/vue-awesome-swiper-3.1.3.tgz",
+      "integrity": "sha512-E7suzkyApO8vNZbgdEnjSmnpsmQZyRvSVXJ7sey3XYwKPOkLhH3+GnHroBw+5PZIQXvWBwdCeQsPG1xQ1r1Rhg==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "swiper": "^4.0.7"
+      }
+    },
     "vue-hot-reload-api": {
       "version": "2.3.3",
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz",
@@ -11406,8 +11415,8 @@
     },
     "vue-lazyload": {
       "version": "1.2.3",
-      "resolved": "https://registry.npm.taobao.org/vue-lazyload/download/vue-lazyload-1.2.3.tgz?cache=0&sync_timestamp=1568801961628&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-lazyload%2Fdownload%2Fvue-lazyload-1.2.3.tgz",
-      "integrity": "sha1-kB+ewVx+bKeHgaK65KNDaGve2yw="
+      "resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.2.3.tgz",
+      "integrity": "sha512-DC0ZwxanbRhx79tlA3zY5OYJkH8FYp3WBAnAJbrcuoS8eye1P73rcgAZhyxFSPUluJUTelMB+i/+VkNU/qVm7g=="
     },
     "vue-loader": {
       "version": "13.7.3",
@@ -13446,7 +13455,6 @@
       "version": "1.12.2",
       "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz",
       "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==",
-      "dev": true,
       "requires": {
         "memory-fs": "~0.4.1",
         "mime": "^1.5.0",
@@ -13459,7 +13467,6 @@
       "version": "2.11.5",
       "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.11.5.tgz",
       "integrity": "sha512-7TdOKKt7G3sWEhPKV0zP+nD0c4V9YKUJ3wDdBwQsZNo58oZIRoVIu66pg7PYkBW8A74msP9C2kLwmxGHndz/pw==",
-      "dev": true,
       "requires": {
         "ansi-html": "0.0.7",
         "array-includes": "^3.0.3",
@@ -13493,14 +13500,12 @@
         "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",
@@ -13511,7 +13516,6 @@
           "version": "3.2.6",
           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
           "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
-          "dev": true,
           "requires": {
             "ms": "^2.1.1"
           }
@@ -13520,7 +13524,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"
@@ -13529,14 +13532,12 @@
         "get-caller-file": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
-          "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
-          "dev": true
+          "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
         },
         "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"
           }
@@ -13545,7 +13546,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",
@@ -13558,7 +13558,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"
           }
@@ -13567,7 +13566,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"
           }
@@ -13576,7 +13574,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"
           }
@@ -13585,7 +13582,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",
@@ -13595,14 +13591,12 @@
         "pify": {
           "version": "2.3.0",
           "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-          "dev": true
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
         },
         "read-pkg": {
           "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",
@@ -13613,7 +13607,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"
@@ -13622,14 +13615,12 @@
         "require-main-filename": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
-          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
-          "dev": true
+          "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
         },
         "string-width": {
           "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",
@@ -13640,7 +13631,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"
           }
@@ -13648,14 +13638,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="
         },
         "wrap-ansi": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
           "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
-          "dev": true,
           "requires": {
             "string-width": "^1.0.1",
             "strip-ansi": "^3.0.1"
@@ -13664,14 +13652,12 @@
         "y18n": {
           "version": "3.2.1",
           "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
-          "dev": true
+          "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
         },
         "yargs": {
           "version": "6.6.0",
           "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz",
           "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=",
-          "dev": true,
           "requires": {
             "camelcase": "^3.0.0",
             "cliui": "^3.2.0",
@@ -13692,7 +13678,6 @@
           "version": "4.2.1",
           "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
           "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
-          "dev": true,
           "requires": {
             "camelcase": "^3.0.0"
           }

+ 4 - 1
package.json

@@ -21,11 +21,14 @@
     "portal-vue": "^2.1.6",
     "vant": "^2.2.10",
     "vue": "^2.5.2",
+    "vue-awesome-swiper": "^3.1.3",
     "vue-photo-preview": "^1.1.3",
     "vue-router": "^3.0.1",
-    "vuex": "^3.1.1"
+    "vuex": "^3.1.1",
+    "webpack-dev-server": "^2.11.5"
   },
   "devDependencies": {
+    "array-includes": "^3.0.3",
     "autoprefixer": "^7.1.2",
     "babel-core": "^6.22.1",
     "babel-helper-vue-jsx-merge-props": "^2.0.3",

+ 11 - 1
src/App.vue

@@ -8,7 +8,17 @@
 </template>
 <script>
   export default {
-    name:'App'
+    name:'App',
+    mounted(){
+      (/iphone|ipod|ipad/i.test(navigator.appVersion)) && document.addEventListener('blur', (e) => {
+        // 这里加了个类型判断,因为a等元素也会触发blur事件
+        if(['input', 'textarea'].includes(e.target.localName)) {
+          setTimeout(()=> {
+            document.scrollingElement.scrollTo(0, document.scrollingElement.scrollTop);
+          }, 200);
+        }
+      }, true)
+    },
   }
 </script>
 <style lang="less">

+ 86 - 20
src/common/CheckBox.vue

@@ -1,14 +1,17 @@
 <template>
-  <div class="check-wrap" v-if="item">
-    <!-- <p v-for="(it,index) in datas.questionDetailList" :key="it.id" class="list" @click="handleClick(it,index,'',true)"> -->
-      <p v-for="(it,index) in datas.questionDetailList" :key="it.id" :class="['list',{'block':((it.description||it.name).indexOf('${'))!=-1}]" @click="handleClick(it,index,'',true)">
-      <img :src="it.select==1?check:defaultPic">
-      <span v-if="((it.description||it.name).indexOf('${'))==-1" :class="[{'check':it.select==1},{'exclu':exclusion !==999 && it.exclusion !== exclusion}]">{{it.description||it.name}}</span>
+  <div class="check-wrap bgques" v-if="item" :style="getStyle(detail,slide)">
+      <p v-for="(it,index) in datas.questionDetailList" 
+          :key="it.id" 
+          :class="['list',{'block':((it.description||it.name).indexOf('${'))!=-1}]" >
+      <span v-if="((it.description||it.name).indexOf('${'))==-1" 
+          :class="['radioCheck',{'check':it.select==1},{'exclu':exclusion !==999 && it.exclusion !== exclusion}]"
+          @click="handleClick(it,index,'',true,false)"
+          >{{it.description||it.name}}</span>
       <OptionInp v-else 
           :item="it" 
           ref="inp"
           @handleInp="inpVal($event,index)" 
-          @handleSelec="handleClick(it,index,true)"
+          @handleSelec="handleClick(it,index,true,false,true)"
           :exclu="exclusion !==999 && it.exclusion !== exclusion" 
           />
     </p>
@@ -22,6 +25,19 @@ import MultiLineInput from '../common/MultiLineInput.vue';
 import OptionInp from '../common/OptionInp.vue';
   export default{
     name:'CheckBox',
+    props:{
+      item:{
+        default:''
+      },
+      slide:{
+        default:false,
+        type:Boolean
+      },
+      detail:{
+        default:2,
+        type:Number||String
+      }
+    },
     data(){
       return{
         imgUrl:imageUrlPrefix,
@@ -31,14 +47,24 @@ import OptionInp from '../common/OptionInp.vue';
         exclusion:999 //互斥
       }
     },
-    props:['item'],
     created(){
       // this.datas = JSON.parse(JSON.stringify(this.item));
       this.datas = this.item;
       this.resetExc();
     },
     methods:{
-      handleClick(it,index,flag,flg){
+      getStyle(detail,slide){
+        if(detail == 1){
+          if(slide){
+            return {'display':'block','background-color': '#F9F9F9'}
+          }else{
+            return {'display':'none'}
+          }
+        }else{
+          return {'display':'block'}
+        }
+      },
+      handleClick(it,index,flag,flg,sign){
         if(flg){
           document.activeElement.blur();      
           document.activeElement.scrollIntoViewIfNeeded(true);
@@ -62,17 +88,40 @@ import OptionInp from '../common/OptionInp.vue';
           this.exclusion = it.exclusion;  
         }
         // 处理选中状态
-        if(flag){//输入框反选
-          data[index].select = 1;
-          this.exclusion = it.exclusion;
+        if(sign){
+          for(let i=0;i<data.length; i++){
+            if(i==index){
+              if(data[i].value){
+                data[index].select = 1;
+                this.exclusion = it.exclusion;
+              }else{
+                data[i].select = 0
+              }
+            }
+          }
         }else{
-          if(data[index].select){
-            data[index].select = 0;
-          }else{
-            data[index].select = 1;
-            this.exclusion = it.exclusion;
+          for(let i=0;i<data.length; i++){
+            if(i==index){
+              if(data[i].select == 1){
+                data[i].select = 0
+              }else{
+                data[index].select = 1;
+                this.exclusion = it.exclusion;
+              }
+            }
           }
         }
+        // if(flag){//输入框反选
+        //   data[index].select = 1;
+        //   this.exclusion = it.exclusion;
+        // }else{
+        //   if(data[index].select){
+        //     data[index].select = 0;
+        //   }else{
+        //     data[index].select = 1;
+        //     this.exclusion = it.exclusion;
+        //   }
+        // }
         
         // 处理取消-互斥
         const filArr1 = data.filter(it=>it.select==1);
@@ -83,7 +132,7 @@ import OptionInp from '../common/OptionInp.vue';
             this.exclusion = filArr1[0].exclusion;
           }
         }
-        let temp = concatVal(data);
+        let temp = concatVal(data,false,this.datas.flag);
         const newData = Object.assign({},this.datas,{questionDetailList:data},{value:temp.value?temp.value:''},{valueP:temp.valueP?temp.valueP:''});
         this.$emit("updata",newData);
       },
@@ -93,7 +142,7 @@ import OptionInp from '../common/OptionInp.vue';
         let currItem = detailList[index];
         currItem.value = val;
         // 输入框失焦重新拼接父级的value
-        let temp = concatVal(detailList);
+        let temp = concatVal(detailList,false,this.datas.flag);
         this.datas.value = temp.value;
         this.datas.valueP = temp.valueP;
         this.$emit("updata",this.datas);
@@ -127,6 +176,7 @@ import OptionInp from '../common/OptionInp.vue';
 <style lang="less" scoped>
 @import '../less/base.less';
   .check-wrap{
+    .bgques;
     img{
       width:100%;
     }
@@ -135,8 +185,8 @@ import OptionInp from '../common/OptionInp.vue';
     }
     .list{
       color: #colors[text];
-      margin:0 .1rem .1rem 0;
-      padding: .12rem .1rem;
+      margin:0 .1rem .07rem 0;
+      padding: .1rem .1rem .1rem 0;
       display: inline-block;
       white-space: nowrap;
       overflow-x: hidden;
@@ -149,11 +199,27 @@ import OptionInp from '../common/OptionInp.vue';
         vertical-align: middle;
       }
     }
+    .radioCheck {
+      display: inline-block;
+      line-height: .66rem;
+      // min-width: 2rem;
+      // text-align: center;
+      padding:0 .2rem;
+      box-sizing: border-box;
+      border-radius: .38rem;
+      border: 1px solid #DFE0E4;
+    }
+    
     .check{
       color: #colors[theme];
+      border: 1px solid #colors[theme];
     }
     .exclu{
       color:#colors[exclu];
     }
+    
+    .iptCheck {
+      color: #colors[theme];
+    }
   }
 </style>

+ 30 - 6
src/common/ComTextArea.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="comArea">
+  <div class="comArea" :style="getStyle(detail,slide)">
     <textarea @input="changeVal" 
             :style="{width:width,height:height}" 
             v-model="txt" 
@@ -26,6 +26,14 @@ export default {
     item:{
       type:Object,
       require: true
+    },
+    slide:{
+      default:false,
+      type:Boolean
+    },
+    detail:{
+      default:2,
+      type:Number||String
     }
   },
   data() {
@@ -35,6 +43,17 @@ export default {
     }
   },
   methods:{
+    getStyle(detail,slide){
+      if(detail == 1){
+        if(slide){
+          return {'display':'block','background-color': '#F9F9F9'}
+        }else{
+          return {'display':'none'}
+        }
+      }else{
+        return {'display':'block'}
+      }
+    },
     changeVal(){
           // $(".btscroll").css({'position':'fixed'})
       this.$emit('changeAreaVal',this.txt)
@@ -42,11 +61,15 @@ export default {
       this.$emit("updata",newData);
     },
     blur(){
-      document.activeElement.scrollIntoViewIfNeeded(true);
+      if(MobileDevice.getModels().join(' or ').indexOf('6') == -1){
+        document.activeElement.scrollIntoView({behavior: "smooth",block:'end'})
+      }
       $(".foot").css({'display':'block'})
-      setTimeout(()=>{
-        document.activeElement.scrollIntoViewIfNeeded(true);
-      },300)
+      // document.activeElement.scrollIntoViewIfNeeded(true);
+      // $(".foot").css({'display':'block'})
+      // setTimeout(()=>{
+      //   document.activeElement.scrollIntoViewIfNeeded(true);
+      // },300)
     },
     focus(){
       if(isIos()){
@@ -66,7 +89,9 @@ export default {
 }
 </script>
 <style lang="less" scoped>
+@import '../less/base.less';
   .comArea {
+    .bgques;
     textarea {
       color: #4F50FF;
       resize: none;
@@ -77,7 +102,6 @@ export default {
       border-radius: .08rem /* 8/100 */;
       -webkit-appearance: none;
       padding: .16rem /* 16/100 */ .3rem /* 30/100 */;
-      margin-bottom: .3rem;
       background-color: transparent;
     }
   }

+ 35 - 8
src/common/Input.vue

@@ -1,7 +1,6 @@
 <template>
-  <div class="inp-wrap">
+  <div class="inp-wrap" :style="getStyle(detail,slide)">
     <input :type="item.controlType==6?'text':'number'" 
-          :maxlength="item.controlType==6?'':10"
           :class="{'change':borColor}" 
           v-model="val" 
           @input="changeVal" 
@@ -14,6 +13,19 @@
   import $ from 'jquery';
   export default {
     name:'Input',
+    props:{
+      item:{
+        default:''
+      },
+      slide:{
+        default:false,
+        type:Boolean
+      },
+      detail:{
+        default:2,
+        type:Number||String
+      }
+    },
     data(){
       return{
         msg:"输入框",
@@ -21,12 +33,22 @@
         borColor:false
       }
     },
-    props:['item'],
     methods:{
+      getStyle(detail,slide){
+        if(detail == 1){
+          if(slide){
+            return {'display':'block','background-color': '#F9F9F9'}
+          }else{
+            return {'display':'none'}
+          }
+        }else{
+          return {'display':'block'}
+        }
+      },
       changeVal(e){
         this.borColor = true;
         if(this.item.controlType==7){//数字键盘
-          this.val = e.target.value=e.target.value.replace(/^\.$/,'')
+            this.val = e.target.value=e.target.value.replace(/^\.$/,'').slice(0,10)
         }
         // document.activeElement.scrollIntoViewIfNeeded(true);
         this.borColor = false;
@@ -36,10 +58,13 @@
       blur(){
         // $(".btscroll").css({'position':'fixed'})
         $(".foot").css({'display':'block'})
-        document.activeElement.scrollIntoViewIfNeeded(true);
-        setTimeout(()=>{
-          document.activeElement.scrollIntoViewIfNeeded(true);
-        },300)
+        if(MobileDevice.getModels().join(' or ').indexOf('6') == -1){
+          document.activeElement.scrollIntoView({behavior: "smooth",block:'end'})
+        }
+        // document.activeElement.scrollIntoViewIfNeeded(true);
+        // setTimeout(()=>{
+        //   document.activeElement.scrollIntoViewIfNeeded(true);
+        // },300)
         // this.borColor = false;
         // const newData = Object.assign({},this.item,{value:this.val,valueP:this.val});
         // this.$emit("updata",newData);
@@ -64,6 +89,8 @@
 <style lang="less" scoped>
 @import '../less/base.less';
   .inp-wrap{
+    .bgques;    
+    padding-bottom: 0;
     input{
       width: 100%;
       color: #colors[theme];

+ 9 - 7
src/common/Label.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="label-wrap" v-if="item">
+  <div class="label-wrap bgques" v-if="item">
     <p v-for="(it,index) in datas.questionMapping" :key="it.id" :class="['symp',{'check':it.select==1},{'exclu':exclusion !==999 && it.exclusionType !== exclusion}]" @click="handleClick(it,index,true)">
       <span>{{it.description||it.name}}</span>
       <span v-if="it.select==1" @click="deletSymp($event,it,index)"><img src="../images/del.png" alt=""></span>
@@ -86,7 +86,7 @@
         }
         this.showToast = true;
         $(".btscroll").css({'position':'fixed'})
-        $(".foot").css({'position':'fixed'})
+        $(".foot").css({'position':'fixed','bottom':'0'})
         // 底部body不可滑动
         // const prehandler = function(e){e.preventDefault();}
         // document.body.addEventListener("touchmove",prehandler,false)
@@ -131,7 +131,8 @@
       },
       cancelDel(){
         this.showToast = false;
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
         this.tempItem = {};
         this.delIndx = null;
       }
@@ -139,12 +140,14 @@
   }
 </script>
 <style lang="less" scoped>
+  @import '../less/base.less';
   .label-wrap{
     font-size: .3rem;
      .symp{
       display: inline-block;
-      min-width:1.9rem;
+      min-width:2.05rem;
       height: .72rem;
+      border-radius: .08rem;
       span{
         display: inline-block;
         vertical-align: top;
@@ -167,11 +170,10 @@
     }
     .check{
       color: #fff;
-      background: linear-gradient(-270deg, #3638EE, #4E72FF);
-      box-shadow: 0 .08rem .16rem 0 rgba(79,129,255,0.40);
+      background: #colors[btn];
     }
     .exclu{
-      background:#E3E4E8;
+      // background:#E3E4E8;
     }
   }
   

+ 18 - 12
src/common/MultiLineInput.vue

@@ -1,5 +1,5 @@
 <template>
-  <div :class="['multipIpt',{'border':border,'inline':inline,'check':select}]">
+  <div :style="{'margin-bottom':isLast?'0':'.3rem'}" :class="['multipIpt',{'border':border,'inline':inline,'check':select}]">
     <span class="prefix" v-if="content.prefix">{{content.prefix}}</span>
     <div class="sticP" :style="{paddingRight:content.suffix?'1rem':'0'}">
         <div class="iptWrap">
@@ -14,7 +14,6 @@
               @input="changeVal($event,idx,content.type)" 
               @blur="blur"
               @focus="focus"
-              :maxlength="content.type=='number'?10:''"
               @click="handleClick">
             <input v-show="content.iptLis.length==1" class="contentVal" 
               :type="content.type=='number'?'number':'text'" 
@@ -23,7 +22,6 @@
               @input="changeVal($event,idx,content.type)" 
               @blur="blur"
               @focus="focus"
-              :maxlength="content.type=='number'?10:''"
               @click="handleClick">
             <span v-if="idx == 0&&content.iptLis.length>1">/</span>
           </template>
@@ -57,7 +55,11 @@ export default {
     select:{ //是否选中
       default:false,
       type:Boolean
-    }
+    },
+    isLast:{ //是否为最后一个
+      default:false,
+      type:Boolean
+    },
   },
   data(){
     return {
@@ -72,9 +74,9 @@ export default {
   methods:{
     changeVal(e,num,type){
       let tmpTxt = '',arr=this.tmpArr
-      document.activeElement.scrollIntoViewIfNeeded(true);
+      // document.activeElement.scrollIntoViewIfNeeded(true);
       if(type == 'number'){
-        e.currentTarget.value = e.currentTarget.value.replace(/^\.$/,'')
+          e.currentTarget.value = e.currentTarget.value.replace(/^\.$/,'').slice(0,10)
       }
       arr[num]=e.currentTarget.value
       tmpTxt=arr.join('/')
@@ -91,10 +93,14 @@ export default {
       // 如果该项未选中,则不存值
       // $(".btscroll").css({'position':'fixed'})
       $(".foot").css({'display':'block'})
-      document.activeElement.scrollIntoViewIfNeeded(true);
-      setTimeout(()=>{
-        document.activeElement.scrollIntoViewIfNeeded(true);
-      },300)
+      
+      if(MobileDevice.getModels().join(' or ').indexOf('6') == -1){
+        document.activeElement.scrollIntoView({behavior: "smooth",block:'end'})
+      }
+      // document.activeElement.scrollIntoViewIfNeeded(true);
+      // setTimeout(()=>{
+      //   document.activeElement.scrollIntoViewIfNeeded(true);
+      // },300)
     },
     focus(){
       if(isIos()){
@@ -130,7 +136,7 @@ export default {
     padding: 0 .12rem 0 .26rem;
     box-sizing: border-box;
     position: relative;
-    margin: .3rem 0;
+    margin-bottom: .3rem;
     .contentVal {
       font-size: .3rem /* 30/100 */;
       color: #colors[theme];
@@ -150,7 +156,7 @@ export default {
   }
   .border{
     border: 1px solid #DFE0E4;
-    border-radius: .08rem
+    border-radius: 2rem
   }
   .inline{
     display: inline-block;

+ 29 - 22
src/common/OptionInp.vue

@@ -1,14 +1,13 @@
 <!-- 带输入框选项 -->
 <template>
-  <div :class="['inpbox',{'check':item.select},{'exclu':exclu}]">
-    <span class="prefix" v-if="msg.prefix" @click="focusInp">{{msg.prefix}}</span>
+  <div :class="['inpbox',{'iptCheck':item.select},{'exclu':exclu}]">
+    <img class="iptimg" :src="item.select?url[0]:url[1]" alt="">
+    <span class="prefix" v-if="msg.prefix">{{msg.prefix}}</span>
     <!-- <div class="inp" @click="preClick"> -->
-      <input :type="msg.type=='number'?'number':'text'"
+      <input :type="msg.type=='number'?'number':'text'" 
               :placeholder="msg.placeholder"
-              ref="inp"
               :style="{'width':!msg.prefix&&!msg.suffix?'90%':'33%'}"
               :disabled="exclu"
-              :maxlength="msg.type=='number'?10:''"
               :class="[{'exclu':exclu},{'cancel':item.select==0}]"
               v-model="txt"
               @click="handleCli"
@@ -16,7 +15,7 @@
               @focus="focus"
               @input="changeVal">
     <!-- </div> -->
-    <span class="suffix" v-if="msg.suffix" @click="focusInp">{{msg.suffix}}</span>
+    <span class="suffix" v-if="msg.suffix">{{msg.suffix}}</span>
   </div>
 </template>
 <script type="text/javascript">
@@ -28,7 +27,8 @@ import $ from 'jquery';
       return{
         msg:{},
         txt:this.item.value || '',
-        select:0
+        select:0,
+        url:[require('../images/iptselect.png'),require('../images/iptdis.png')]
       }
     },
     props:['item','exclu'],
@@ -38,28 +38,26 @@ import $ from 'jquery';
       this.select = this.item.select;
     },
     methods:{
-      focusInp(){
-        setTimeout(()=>{
-          this.$refs.inp.focus();
-        })
-
-      },
       changeVal(e){
         if(this.msg.type=='number'){//数字键盘
-          this.txt = e.target.value=e.target.value.replace(/^\.$/,'')
+            this.txt = e.target.value=e.target.value.replace(/^\.$/,'').slice(0,10)
         }
-
         const newData = Object.assign({},this.part,{value:this.txt});
         this.$emit("updata",newData);
         this.$emit('handleInp',this.txt);
+        this.$emit('handleSelec');
       },
       handleBlur(){
           // $(".btscroll").css({'position':'fixed'})
         $(".foot").css({'display':'block'})
-        document.activeElement.scrollIntoViewIfNeeded(true);
-        setTimeout(()=>{
-          document.activeElement.scrollIntoViewIfNeeded(true);
-        },300)
+        
+        if(MobileDevice.getModels().join(' or ').indexOf('6') == -1){
+          document.activeElement.scrollIntoView({behavior: "smooth",block:'end'})
+        }
+        // document.activeElement.scrollIntoViewIfNeeded(true);
+        // setTimeout(()=>{
+        //   document.activeElement.scrollIntoViewIfNeeded(true);
+        // },300)
           // 如果该项未选中,则不存值
         // const select = this.item.select;
         // if(!select){return}
@@ -79,9 +77,9 @@ import $ from 'jquery';
       handleCli(e){
         e.stopPropagation();
         // const select = this.item.select;
-        if(!this.select){//聚焦时自动选中该项
+        if(!this.select&&this.txt){//聚焦时自动选中该项
           this.$emit('handleSelec');
-        }
+        } 
       }
     },
     watch:{
@@ -108,17 +106,26 @@ import $ from 'jquery';
     .prefix,.suffix{
       display: inline-block;
       vertical-align: middle;
+    }
+    .iptimg {
+      width: .34rem;
+      height: .34rem;
+      margin-right: .1rem;
+      position: relative;
+      top: .06rem;
     }
      input{
       height: .42rem;
       color: #4F50FF;
-      font-size: .28rem;
+      font-size: .3rem;
       border-bottom: 1px solid #DFE0E4 !important;
       border-radius: 0;
       padding-left: .05rem;
       background-color: transparent;
       height: 0.38rem;
       line-height: 0.38rem;
+      position: relative;
+      top: 2px;
     }
     .check{//选中
       color: #colors[theme];

+ 148 - 0
src/common/PickSlide.vue

@@ -0,0 +1,148 @@
+<template>
+  <portal to="notification-outlet">
+    <div v-if="show" class="swipper-content">
+      <div class="swipper-wrapper">
+        <swiper ref="mySwiper1">
+          <swiper-slide v-for="(item,i) in num" :key="i+'fst'">{{item}}</swiper-slide>
+        </swiper>
+        <swiper ref="mySwiper2">
+          <swiper-slide v-for="(item,i) in num" :key="i+'sec'">{{item}}</swiper-slide>
+        </swiper>
+        <swiper ref="mySwiper3">
+          <swiper-slide v-for="(item,i) in data" :key="i+'trd'">{{item}}</swiper-slide>
+        </swiper>
+        <div class="lineT"></div>
+        <div class="lineB"></div>
+        <div class="confBtn">
+          <p class="tip" style="display: none;">请选择正确的时间</p>
+          <p class="btnS">确认</p>
+        </div>
+      </div>
+      <div class="mask" :styke="{'z-index':'999'}" v-if="show"></div>
+    </div>
+  </portal>
+</template>
+
+<script>
+  export default {
+    name: 'carrousel',
+    props:['show'],
+    data() {
+      return {
+        num : [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9],
+        data:['分钟', '小时', '天', '周', '月','年','分钟', '小时', '天', '周', '月','年','分钟', '小时', '天', '周', '月','年','分钟', '小时', '天', '周', '月','年']
+      }
+    },
+    computed: {
+      swiper1() {
+        setTimeout(()=>{
+          return this.$refs.mySwiper1.swiper
+        },0)
+      },
+      swiper2() {
+        setTimeout(()=>{
+          return this.$refs.mySwiper2.swiper
+        },0)
+      },
+      swiper3() {
+        setTimeout(()=>{
+          return this.$refs.mySwiper3.swiper
+        },0)
+      }
+    },
+    mounted() {
+      // this.swiper1 = new Swiper( this.$refs.mySwiper1, {
+      //   sliderMove: function(swiper){
+      //     console.log(this.swiper1.activeIndex)
+      //   }
+      // })
+      setTimeout(()=>{
+        console.log(this.swiper1)
+        this.swiper1.on('sliderMove',()=>{
+          console.log(this.swiper1.activeIndex)
+        })
+        this.swiper2.on('sliderMove',()=>{
+          console.log(this.swiper2.activeIndex)
+        })
+        this.swiper3.on('sliderMove',()=>{
+          console.log(this.swiper3.activeIndex)
+        })
+        // this.swiper.slideTo(3, 1000, false)
+
+      },400)
+    },
+    methods:{
+      onChange(){
+        
+      }
+    }
+  }
+</script>
+<style lang="less" scoped>
+@import '../less/base.less';
+.swiper-slide {
+  background-color: #fff;
+  height: 44px;
+  line-height: 44px;
+}
+.swiper-container {
+  height: 132px;
+  float: left;
+  width: 2.1rem;
+  text-align: center;
+}
+.swipper-wrapper {
+  font-size: .32rem;
+  height: 227px;
+  width: 6.3rem;
+  // overflow: hidden;
+  background-color: #ffffff;
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  transform: translateX(-50%) translateY(-50%);
+  padding-top: 25px;
+  box-sizing: border-box;
+  border-radius: 0.2rem;
+  z-index: 1000;
+  .lineT {
+    height: 1px;
+    background-color: #f5f5f5;
+    position: absolute;
+    top: 2.1rem;
+  }
+  .lineB {
+    height: 1px;
+    background-color: #f5f5f5;
+    position: absolute;
+    top: 4.2rem;
+  }
+  .confBtn {
+    height: 44px;
+    line-height: 44px;
+    text-align: center;
+    border-top: 1px solid #ebedf0;
+    margin-top: 25px;
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    .btnS {
+      color: #6678FF;
+    }
+    .tip {
+      position: absolute;
+      top: -22px;
+      font-size: 0.24rem;
+      color: red;
+      line-height: 20px;
+      width: 100%;
+      text-align: center;
+    }
+  }
+}
+.swipper-content {
+  .mask{
+    z-index: 999;
+  }
+}
+</style>

+ 45 - 17
src/common/PickTime.vue

@@ -1,16 +1,33 @@
 <!-- 时间类型控件 -->
 <template>
-  <div class="toast-wrap">
-    <p v-show="val" :class="['ptab',{'check':val != '请选择'}]" @click="showPicker">{{val}}</p>
-    <p v-show="val != '请选择'" class="tip">点击可修改</p>
-    <Picker ref="picker" :show="showTime" @comfirn="getTimeVal" @cancel="close" :picIndex="picIndex"/>
-  </div>
+  <!-- <transition name="fade"> -->
+    <div :style="getStyle(detail,slide)" class="toast-wrap">
+      <p v-show="val" :class="['ptab',{'check':val != '请选择'}]" @click="showPicker">{{val}}</p>
+      <p v-show="val != '请选择'" class="tip">点击可修改</p>
+      <Picker ref="picker" :show="showTime" @comfirn="getTimeVal" @cancel="close" :picIndex="picIndex"/>
+      <!-- <carrousel ref="picker"  v-if="showTime" :show="showTime" @comfirn="getTimeVal" @cancel="close" :picIndex="picIndex"></carrousel> -->
+    </div> 
+  <!-- </transition> -->
 </template>
 <script type="text/javascript">
   import $ from 'jquery';
   import Picker from './Picker.vue';
+  // import carrousel from './PickSlide.vue';
   export default {
     name:'PickTime',
+    props:{
+      item:{
+        default:''
+      },
+      slide:{
+        default:false,
+        type:Boolean
+      },
+      detail:{
+        default:2,
+        type:Number||String
+      }
+    },
     data() {
       return {
         val:this.item.value || '请选择',
@@ -18,12 +35,22 @@
         picIndex:this.item.pickIndex||[]
       }
     },
-    props:['item'],
     methods: {
+      getStyle(detail,slide){
+        if(detail == 1){
+          if(slide){
+            return {'display':'block','background-color': '#F9F9F9'}
+          }else{
+            return {'display':'none'}
+          }
+        }else{
+          return {'display':'block'}
+        }
+      },
       showPicker(){
         this.showTime = true;
-        $(".btscroll").css({'position':'fixed'})
-        $(".foot").css({'position':'fixed'})
+        $(".btscroll").css({'position':'fixed','top':'1rem'})
+        $(".foot").css({'position':'fixed','bottom':'0'})
       },
       getTimeVal(value,index){//确定
         // 首位为0则去掉
@@ -35,23 +62,24 @@
         this.showTime = false;
         const newData = Object.assign({},this.item,{value:this.val,valueP:this.val,pickIndex:index});
         this.$emit("updata",newData);
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
       },
       close(){//点击蒙层关闭
         this.showTime = false;
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
       }
     },
     components:{
-      Picker
+      Picker,
+      // carrousel
     },
     watch:{
       item:{
         handler(newVal,oldVal){
           this.val = newVal.value|| '请选择';
-          //有初始值或者未选择时,重置index
-          const hasOrg =newVal.value==='1分钟'; //newVal.value.indexOf("分钟")>-1||newVal.value.indexOf("1")>-1||newVal.value.indexOf("0")>-1;
-          if(!newVal.value||hasOrg){//没有值时复原时间组件中的index
+          if(!newVal.value){//没有值时复原时间组件中的index
             this.$refs.picker.resetIndex();
           }
         },
@@ -63,16 +91,16 @@
 <style lang="less" scoped>
   @import '../less/base.less';
   .toast-wrap{
-    margin-bottom: .2rem;
     position: relative;
     z-index: 116;
+    .bgques;
     .ptab{
       width:100%;
       height: .8rem;
       line-height: .8rem;
       text-align: center;
       border:1px solid #E6E6E6;
-      border-radius: .1rem;
+      border-radius: .4rem;
       color:#7C828E;
     }
     .check{
@@ -83,4 +111,4 @@
       font-size: .24rem;
     }
   }
-</style>
+</style>

文件差异内容过多而无法显示
+ 10 - 7
src/common/Picker.vue


+ 63 - 14
src/common/Radio.vue

@@ -1,10 +1,10 @@
 <template>
-  <div class="radio-wrap" v-if="item">
+  <div v-if="item" class="radio-wrap bgques" :style="getStyle(detail,slide)">
     <!-- <p v-for="(it,index) in datas.questionDetailList" :key="it.id" class="list" @click="handleClick(it,index,true)"> -->
-    <p v-for="(it,index) in datas.questionDetailList" :key="it.id" :class="['list',{'block':((it.description||it.name).indexOf('${'))!=-1}]" @click="handleClick(it,index,true)">
-      <img :src="it.select==1?check:defaultPic">
-      <span v-if="((it.description||it.name).indexOf('${'))==-1" :class="{'check':it.select==1}">{{it.description||it.name}}</span>
-      <OptionInp v-else :item="it" @handleInp="inpVal($event,index)" @handleSelec="handleClick(it,index)"/>
+    <p v-for="(it,index) in datas.questionDetailList" :key="it.id" :class="['list',{'block':((it.description||it.name).indexOf('${'))!=-1}]">
+      <!-- <img :src="it.select==1?check:defaultPic"> -->
+      <span v-if="((it.description||it.name).indexOf('${'))==-1" :class="['radioCheck',{'check':it.select==1}]" @click="handleClick(it,index,true)">{{it.description||it.name}}</span>
+      <OptionInp v-else :item="it" @handleInp="inpVal($event,index)" @handleSelec="handleClick(it,index,false,true)"/>
     </p>
   </div>
 </template>
@@ -16,6 +16,19 @@ import MultiLineInput from '../common/MultiLineInput.vue';
 import OptionInp from '../common/OptionInp.vue';
   export default{
     name:'Radio',
+    props:{
+      item:{
+        default:''
+      },
+      slide:{
+        default:false,
+        type:Boolean
+      },
+      detail:{
+        default:2,
+        type:Number||String
+      }
+    },
     data(){
       return{
         defaultPic:icon,
@@ -24,13 +37,23 @@ import OptionInp from '../common/OptionInp.vue';
         imgUrl:imageUrlPrefix,
       }
     },
-    props:['item'],
     created(){
       // this.datas = JSON.parse(JSON.stringify(this.item));
       this.datas = this.item;
     },
     methods:{
-      handleClick(it,index,flg){
+      getStyle(detail,slide){
+        if(detail == 1){
+          if(slide){
+            return {'display':'block','background-color': '#F9F9F9'}
+          }else{
+            return {'display':'none'}
+          }
+        }else{
+          return {'display':'block'}
+        }
+      },
+      handleClick(it,index,flg,ipt){
         if(flg){
           document.activeElement.blur();      
           document.activeElement.scrollIntoViewIfNeeded(true);
@@ -39,11 +62,22 @@ import OptionInp from '../common/OptionInp.vue';
           },300)
         }
         const list = this.datas;
-        let data = list.questionDetailList&&list.questionDetailList.slice(0); //数组深拷贝?
-        for(let i=0;i<data.length; i++){
-          data[i].select = 0
-          if(i==index){
-            data[i].select = 1;
+        let data = list.questionDetailList&&list.questionDetailList.slice(0); //数组深拷贝
+        if(ipt){//输入框单选,输入了内容才算选中,删除内容算取消
+          for(let i=0;i<data.length; i++){
+            if(i==index){
+              data[i].select=data[i].value?1:0;
+            }else{
+              data[i].select = 0
+            }
+          }
+        }else{
+          for(let i=0;i<data.length; i++){
+            if(i==index){
+              data[i].select = data[i].select==1?0:1;
+            }else{
+              data[i].select = 0
+            }
           }
         }
         let temp = concatVal(data);
@@ -79,6 +113,7 @@ import OptionInp from '../common/OptionInp.vue';
 <style lang="less" scoped>
 @import '../less/base.less';
   .radio-wrap{
+    .bgques;
     img{
       width:100%;
     }
@@ -87,8 +122,8 @@ import OptionInp from '../common/OptionInp.vue';
     }
     .list{
       color: #colors[text];
-      margin:0 .1rem .1rem 0;
-      padding: .12rem .1rem;
+      margin:0 .1rem .07rem 0;
+      padding: .1rem .1rem .1rem 0;
       display: inline-block;
       white-space: nowrap;
       overflow-x: hidden;
@@ -102,8 +137,22 @@ import OptionInp from '../common/OptionInp.vue';
         white-space: normal;
         vertical-align: middle;
       }
+      .radioCheck {
+        display: inline-block;
+        line-height: .66rem;
+        // min-width: 2rem;
+        // text-align: center;
+        padding:0 .2rem;
+        box-sizing: border-box;
+        border-radius: .38rem;
+        border: 1px solid #DFE0E4;
+      }
       .check{
         color: #colors[theme];
+        border: 1px solid #colors[theme];
+      }
+      .iptCheck {
+        color: #colors[theme];
       }
     }
   }

+ 159 - 19
src/common/RadioSelect.vue

@@ -1,44 +1,166 @@
 <template>
-  <div class="radio-wrap radioSelect" v-if="item">
-    <p v-for="(it,index) in datas.questionDetailList" :key="it.id" class="list">
-      <img @click="handleClick(it,index,true,1)" :src="it.select==1?check:defaultPic"> <i @click="handleClick(it,index,true,1)">有</i>&nbsp;&nbsp;&nbsp;&nbsp;
-      <img @click="handleClick(it,index,true,2)" :src="it.select==2?check:defaultPic"> <i @click="handleClick(it,index,true,2)">无</i>
-      <span v-if="((it.description||it.name).indexOf('${'))==-1" :class="{'check':it.select==1||it.select==2}">{{it.description||it.name}}</span>
-    </p>
+  <div class="radio-wrap radioSelect" v-if="item" :style="getStyle(detail,slide)">
+    <p class="please">为确保诊断准确性,请充分选择您存在的不适症状</p>
+    <div class="list" @click="handleClickShow(1)" :class="[{'setColor':!!hasStr}]">
+      <p><span>有:</span><i :style="{'color':hasStr?'#6678FF':'#7C828E'}">{{hasStr?hasStr:'点击选择症状'}}</i></p>
+    </div>
+    <p class="please pleaseS">为确保诊断准确性,请充分选择您未表现的不适症状</p>
+    <div class="list" @click="handleClickShow(2)" :class="[{'setColor':!!noStr}]">
+      <p><span>无:</span><i :style="{'color':noStr?'#6678FF':'#7C828E'}">{{noStr?noStr:'点击选择症状'}}</i></p>
+    </div>
+    <SymptomLis 
+      v-if="show"
+      :data="SymptomLis" 
+      :show="show" 
+      :flg="flg" 
+      @close="close"
+      @makeSure="makeSure"
+    ></SymptomLis>
+    <Submit v-if="submit" :showType="showType" :fail="failMsg" @showSubmit="showSubmit"></Submit>
   </div>
 </template>
 <script type="text/javascript">
 import icon from '../images/radio-default.png'
 import checkIcon from '../images/radio-check.png'
 import {patt,imageUrlPrefix,concatVal} from '@utils/tools.js'
-import MultiLineInput from '../common/MultiLineInput.vue';
-import OptionInp from '../common/OptionInp.vue';
+import SymptomLis from '../common/SymptomLis.vue';
+import Submit from "../common/Submit";
+import $ from 'jquery';
   export default{
     name:'RadioSelect',
+    props:{
+      item:{
+        default:''
+      },
+      checkDatas:{
+        default:''
+      },
+      slide:{
+        default:false,
+        type:Boolean
+      },
+      detail:{
+        default:2,
+        type:Number||String
+      }
+    },
     data(){
       return{
         defaultPic:icon,
         check:checkIcon,
         datas:{},
         imgUrl:imageUrlPrefix,
+        show:false,
+        SymptomLis:[],
+        flg:'', //是有还是无
+        noStr:'',
+        hasStr:'',
+        showType:'fail',
+        failMsg:'',
+        submit: false,
       }
     },
-    props:['item'],
     created(){
       // this.datas = JSON.parse(JSON.stringify(this.item));
       this.datas = this.item;
+      // console.log(this.item)
+    },
+    mounted(){
+      this.setStr(this.datas&&this.datas.questionDetailList)
     },
     methods:{
+      resetData(){
+        this.hasStr = ''
+        this.hasStr = ''
+      },
+      getStyle(detail,slide){
+        if(detail == 1){
+          if(slide){
+            return {'display':'block','background-color': '#F9F9F9'}
+          }else{
+            return {'display':'none'}
+          }
+        }else{
+          return {'display':'block'}
+        }
+      },
+      setStr(lis){
+        let noTmp = '',hasTmp = '';
+        for(let i = 0;i < lis.length;i++){
+          if(lis[i].flg == 1&&lis[i].select){
+            hasTmp += (lis[i].description||lis[i].name)+','
+          }else if(lis[i].flg == 2&&lis[i].select){
+            noTmp += (lis[i].description||lis[i].name)+','
+          }
+        }
+        noTmp = noTmp.slice(0,noTmp.length-1)
+        hasTmp = hasTmp.slice(0,hasTmp.length-1)
+        this.noStr = noTmp
+        this.hasStr = hasTmp
+      },
+      makeSure(lis){
+        this.show = false;
+        this.SymptomLis=lis
+        this.datas.questionDetailList = lis
+        // let noTmp = '',hasTmp = '';
+        // for(let i = 0;i < lis.length;i++){
+        //   if(lis[i].flg == 1&&lis[i].select){
+        //     hasTmp += (lis[i].description||lis[i].name)+','
+        //   }else if(lis[i].flg == 2&&lis[i].select){
+        //     noTmp += (lis[i].description||lis[i].name)+','
+        //   }
+        // }
+        // noTmp = noTmp.slice(0,noTmp.length-1)
+        // hasTmp = hasTmp.slice(0,hasTmp.length-1)
+        // this.noStr = noTmp
+        // this.hasStr = hasTmp
+
+        this.setStr(lis)
+        
+        let temp = concatVal(lis,true);
+        const newData = Object.assign({},this.datas,{questionDetailList:lis,value:temp.value,valueP:temp.valueP});
+        this.$emit("updata",newData);
+      },
+      handleClickShow(idx){
+        document.activeElement.blur();
+        this.flg = idx
+        this.SymptomLis = this.datas&&this.datas.questionDetailList
+        let lis = this.SymptomLis;
+        let tmpArr = lis.filter((item)=>item.flg!=idx&&item.flg!=undefined)
+        if(tmpArr.length == lis.length){
+          this.defaultWaring("已无症状选择");
+          return
+        }else {
+          this.show = true
+          $(".btscroll").css({'position':'fixed','top':'1rem'})
+          $(".foot").css({'position':'fixed','bottom':'0'})
+        }
+      },
+      showSubmit(flg) {
+        this.submit = flg;
+      },
+      defaultWaring(msg) {
+        this.showType = "fail";
+        this.failMsg = msg;
+        this.submit = true;
+        let timer = setTimeout(() => {
+          this.submit = false;
+          clearTimeout(timer);
+        }, 2000);
+      },
+      close(){
+        this.show = false
+      },
       handleClick(it,index,flg,isHas){
         if(flg){
-          document.activeElement.blur();      
+          document.activeElement.blur();
           document.activeElement.scrollIntoViewIfNeeded(true);
           setTimeout(()=>{
             document.activeElement.scrollIntoViewIfNeeded(true);
           },300)
         }
         const list = this.datas;
-        let data = list.questionDetailList&&list.questionDetailList.slice(0); //数组深拷贝?
+        let data = list.questionDetailList&&list.questionDetailList.slice(0); //数组深拷贝
         for(let i=0;i<data.length; i++){
         //   data[i].select = 0
           if(i==index){
@@ -48,7 +170,7 @@ import OptionInp from '../common/OptionInp.vue';
         }
         let temp = concatVal(data,true);
 
-        const newData = Object.assign({},this.datas,{questionDetailList:data,value:temp.value,valueP:temp.valueP})
+        const newData = Object.assign({},this.datas,{questionDetailList:data,value:temp.value,valueP:temp.valueP});
         this.$emit("updata",newData);
       },
       inpVal(val,index){//输入框失焦处理  
@@ -71,30 +193,40 @@ import OptionInp from '../common/OptionInp.vue';
       item:{
         handler(newVal,oldVal){
           this.datas = JSON.parse(JSON.stringify(newVal));
+          this.setStr(newVal&&newVal.questionDetailList)
         },
         deep:true
       }
     },
     components:{
-      MultiLineInput,
-      OptionInp
+      SymptomLis,
+      Submit
     }
   }
 </script>
 <style lang="less" scoped>
 @import '../less/base.less';
   .radio-wrap{
+    .bgques;    
+    .setColor {
+      color: #4F50FF!important;
+    }
     img{
       width:100%;
     }
     .list{
       color: #colors[text];
-      margin:0 .1rem .1rem 0;
-      padding: .12rem .1rem;
-      white-space: nowrap;
-      -webkit-white-space: nowrap;
+      margin-bottom: .1rem;
+      padding: .2rem .1rem;
+      background-color: #f5f5f5;
+      border-radius: .5rem;
+      border: 1px solid #E6E6E6;
+      p {
+        padding-left:.2rem;
+      }
       span {
-          margin-left:1.2rem;
+          font-weight: 800;
+          color: #333;
       }
       img{
         width: .38rem;
@@ -104,5 +236,13 @@ import OptionInp from '../common/OptionInp.vue';
         color: #colors[theme];
       }
     }
+    .please {
+      padding-bottom: .15rem;
+      font-size: 12px;
+      color: #777777;
+    }
+    .pleaseS {
+      padding-top: .2rem;
+    }
   }
 </style>

+ 25 - 23
src/common/Submit.vue

@@ -1,25 +1,27 @@
 <template>
-  <div>
-    <div class="modalWrap"></div>
-    <div
-      v-if="showType=='success'"
-      class="submitSuccess"
-    >
-      <img
-        src="../images/complete.png"
-        alt=""
+  <portal to="notification-outlet">
+    <div>
+      <div class="modalWrap"></div>
+      <div
+        v-if="showType=='success'"
+        class="submitSuccess"
       >
-      <p class="success">{{msg}}</p>
-      <p class="tip">{{tip}}</p>
-      <span @click="goStart">完 成</span>
-    </div>
-    <div
-      v-if="showType=='fail'"
-      class="submitFail"
-    >
-      <p>{{fail}}</p>
+        <img
+          src="../images/complete.png"
+          alt=""
+        >
+        <p class="success">{{msg}}</p>
+        <p class="tip">{{tip}}</p>
+        <span @click="goStart">完 成</span>
+      </div>
+      <div
+        v-if="showType=='fail'"
+        class="submitFail"
+      >
+        <p>{{fail}}</p>
+      </div>
     </div>
-  </div>
+  </portal>
 </template>
 <script>
 export default {
@@ -104,7 +106,7 @@ export default {
     font-size: 0.24rem;
     color: #666666;
     line-height: 0.44rem;
-    margin-bottom: 1.2rem;
+    margin-bottom: 0.5rem;
   }
   span {
     width: 4.9rem;
@@ -121,9 +123,8 @@ export default {
       from(#4f8bff),
       to(#4f4fff)
     );
-    background: -webkit-linear-gradient(right, #4f8bff, #4f4fff);
-    box-shadow: 0 0.12rem 0.24rem 0 rgba(79, 129, 255, 0.4);
-    border-radius: 0.44rem;
+    background: #colors[btn];
+    border-radius: 0.2rem;
   }
 }
 .submitFail {
@@ -139,6 +140,7 @@ export default {
   box-sizing: border-box;
   border-radius: 0.2rem;
   text-align: center;
+  padding: 0 .1rem;
   background-color: #fff;
 }
 </style>

+ 162 - 0
src/common/SymptomLis.vue

@@ -0,0 +1,162 @@
+<template>
+    <portal to="notification-outlet">
+      <div class="toast-wrap" v-if="show">
+            <div class="content">
+            <p class="tips">{{flg==1?'存在的不适症状:':'未表现的不适症状:'}}</p>
+              <div class="contents">
+                <div v-for="(it,index) in selectLis" :key="it.id" :class="['text', {'select':it.select==1}]" v-if="it.flg==undefined||it.flg==flg" @click="select(index)">
+                  {{it.description||it.name}}
+                </div>
+                <p class="noData" v-if="false">暂无数据</p>
+              </div>
+              <div class="makeSure" @click="makeSure">确定</div>
+              <img src="../images/icon_close@2x.png"  class="close" @click="handleClose">
+            </div>
+            <div class="mask" @click="handleClose"></div>
+      </div>
+    </portal>
+</template>
+<script type="text/javascript">
+import BScroll from 'better-scroll';
+import {setScroll} from '@utils/tools.js';
+import $ from 'jquery';
+
+/**
+  提示性弹窗组件
+  接收参数:
+    show-布尔值,是否显示弹窗;
+    data-对象,包含title和text;
+    @close-关闭弹窗的方法(点击关闭按钮或者遮罩都关闭弹窗)
+**/
+  export default {
+    name:'SymptomLis',
+    props:{
+      show:{
+        default:false,
+        type:Boolean
+      },
+      flg:{
+        default:'',
+        type:String|Number
+      },
+      data:{
+        default:[],
+        type:Array
+      },
+    },
+    data(){
+      return {
+        selectLis:this.data
+      }
+    },
+    methods:{
+      handleClose(){
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
+        this.$emit("close")
+      },
+      makeSure(){
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
+        this.$emit("makeSure",this.selectLis)
+      },
+      select(idx){
+        let tmpArr = JSON.parse(JSON.stringify(this.selectLis));
+        for(let i = 0;i < tmpArr.length;i++){
+          if(i == idx){
+            if(tmpArr[i].select==1){
+              tmpArr[i].select = 0
+              tmpArr[i].flg = undefined
+            }else{
+              tmpArr[i].select = 1
+              tmpArr[i].flg = this.flg
+            }
+          }
+        }
+        this.selectLis = tmpArr
+      }
+    },
+  }
+</script>
+<style lang="less" scoped>
+  @import '../less/base.less';
+  .toast-wrap{
+    .tips {
+      font-size: .28rem;
+      color: #777777;
+      padding-bottom: .5rem;
+      padding-left: .27rem;
+      position: relative;
+      top: -.1rem;
+    }
+    .content{
+      width: 90%;
+      background: #fff;
+      z-index: 999;
+      position: fixed;
+      top:50%;
+      left: 50%;
+      transform: translate(-50%,-50%);
+      box-sizing: border-box;
+      border-radius: .20rem;
+      z-index: 1000;
+      padding-top: .6rem;
+      .contents {
+        height: 5rem;
+        padding: 0 0.2rem 0 0.27rem;
+        overflow: auto;
+      }
+      .tit{
+        font-family:PingFangSC;
+        color:#333333;
+        font-size: .32rem;
+        text-align: center;
+        font-weight: 700;
+      }
+      .text{
+        // color:#colors[quest];
+        font-size: .3rem;
+        display: inline-block;
+        min-width: 1.9rem;
+        height: 0.74rem;
+        line-height: 0.74rem;
+        border: 1px solid #DFE0E4;
+        border-radius: 0.4rem;
+        text-align: center;
+        color: #7C828E;
+        margin: 0 0.18rem 0.3rem 0;
+        padding: 0 0.05rem;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+        float: left;
+      }
+      .select{
+        color: #4F50FF;
+        border-color: #4F50FF;
+      }
+      .close{
+        width:.72rem;
+        position: absolute;
+        bottom: -1.2rem;
+        left: 50%;
+        margin-left: -.5rem;
+      }
+    }
+    .makeSure {
+      height: .9rem;
+      line-height: .9rem;
+      text-align: center;
+      color: #4F50FF;
+      font-size: .32rem;
+      margin-top: .2rem;
+      border-top: 1px solid #E6E6E6;
+    }
+    .mask{
+      .mask;
+      z-index: 999;
+    }
+    .noData {
+      font-size: .28rem;
+    }
+  }
+</style>

+ 2 - 2
src/common/Tiptoast.vue

@@ -76,9 +76,9 @@
         font-size: .3rem;
       }
       .close{
-        width:1rem;
+        width:.72rem;
         position: absolute;
-        bottom: -1.5rem;
+        bottom: -1.2rem;
         left: 50%;
         margin-left: -.5rem;
       }

+ 26 - 19
src/common/Toast.vue

@@ -2,6 +2,7 @@
     <portal to="notification-outlet">
       <div class="toast-wrap" v-if="show">
             <div class="content">
+              <div class="title">温馨提示</div>
               <div class="text" v-html="message||msg">
                 <!-- {{message||msg}} -->
               </div>
@@ -26,11 +27,13 @@ import $ from 'jquery';
     props:['message','show','labShow'],
     methods:{
       comfirn(){
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
         this.$emit("comfirn")
       },
       cancel(){
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
         this.$emit("cancel")
       },
     },
@@ -41,47 +44,51 @@ import $ from 'jquery';
   .toast-wrap{
     .content{
       width: 6.3rem;
-      height: 3.52rem;
       background: #fff;
       z-index: 999;
-      // position: absolute;
       position: fixed;
       top:50%;
       left: 50%;
       transform: translate(-50%,-50%);
-      padding: .5rem;
+      padding: 0.6rem 0.5rem 1.5rem .5rem;
       box-sizing: border-box;
       border-radius: .2rem;
       z-index: 1000;
+      overflow: hidden;
+      .title {
+        font-size: .32rem;
+        text-align: center;
+        font-weight: 800;
+      }
       .text{
         color:#colors[quest];
         text-align: center;
-        height: 1.25rem;
-        // overflow-y: auto;
-        padding-top: .2rem;
+        padding-top: .4rem;
         font-size: .3rem;
       }
       .btn{
-        margin-top: .30rem;
-        padding: 0 .7rem;
         display: flex;
         justify-content: space-between;
+        position: absolute;
+        bottom: 0;
+        left: 0;
+        width: 6.3rem;
+        height: .9rem;
+        line-height: .9rem;
+        border-top: 1px solid #colors[line];
         span{
           display: inline-block;
-          width: 1.6rem;
-          height: .70rem;
-          line-height: .70rem;
+          width: 50%;
           text-align: center;
-          font-size: .30rem;
-          border-radius: .35rem;
+          font-size: .32rem;
         }
         .comf{
-          color:#F64B44;
-          border:2px solid rgba(246,75,68,1);
+          border-right: 1px solid #colors[line];
+          box-sizing: border-box;
+          color: #FF6167;
         }
         .canc{
-          color: #colors[theme];
-          border:2px solid rgba(79,80,255,1);
+          color: #colors[btn];
         }
       }
     }

+ 42 - 28
src/common/UploadImg.vue

@@ -1,23 +1,9 @@
 <template>
-  <div class="img-wrap">
+  <div class="img-wrap bgques">
     <div class="box">
-
+      
       <ul class="upload-imgs">
-        <li
-          v-show="imgLen<6"
-          class="uploadBox"
-        >
-          <input
-            type="file"
-            class="upload"
-            @change="addImg"
-            accept="image/*"
-            ref="inp"
-          />
-          <img src="../images/upload.png">
-          <p>点击上传</p>
-        </li>
-        <li v-for='(value, key) in imgs'>
+        <li v-for='(value, key) in imgs' class="imgLis">
           <p class="imgbox">
             <img
               :src="value"
@@ -31,6 +17,20 @@
             @click="delImg(key)"
           ></a>
         </li>
+        <li
+          v-show="imgLen<6"
+          class="uploadBox"
+        >
+          <input
+            type="file"
+            class="upload"
+            @change="addImg"
+            accept="image/*"
+            ref="inp"
+          />
+          <!-- <img src="../images/addimg.png"> -->
+          <p>点击上传</p>
+        </li>
       </ul>
     </div>
   </div>
@@ -55,7 +55,7 @@ export default {
     this.$previewRefresh();//预览刷新
     /*if(isIos()){
       $('.upload').removeAttr("capture")
-    }else if(!isWX()){
+    }else if(!isWX()){ 
     // 微信端添加这个属性直接调拍照
     //安卓手机且非微信端添加相机属性,否则QQ浏览器打不开相机
       $('.upload').attr("capture","camera")
@@ -71,7 +71,7 @@ export default {
       const inp = this.$refs.inp;
       if(this.flag){
         inp.click();
-      }
+      } 
     },
     delImg(key) {
       let obj = this.imgs;
@@ -89,11 +89,12 @@ export default {
       let file = fileTag.files[0];
       const that = this;
       this.imgBase64(file, function (image, canvas) {
-        var maxSize = 0.5 * 1024; // 0.5M
+        var maxSize = 0.5 * 1024; // 4M
         var fileSize = file.size / 1024; //kb 图片大小
         var uploadSrc;
-        var uploadFile;
-        if (fileSize > maxSize) { // 如果图片大小大于0.5M,进行压缩
+        var uploadFile,imgWidth=image.width,imgHeight=image.height;
+        // console.log(fileSize,'大小')
+        if (fileSize > maxSize) { // 如果图片大小大于4m,进行压缩
           uploadSrc = canvas.toDataURL(file.type, 0.1);
           uploadFile = that.dataURLtoFile(uploadSrc, file.name); // 转成file文件
           // uploadFile = that.convertBase64UrlToBlob(uploadSrc); // 转成blob
@@ -103,6 +104,7 @@ export default {
         }
 
         var compressedSize = uploadFile.size / 1024 / 1024;
+        // console.log('压缩',compressedSize)
         if (compressedSize.toFixed(2) > 4.00) {
           alert('上传图片不可超过4M');
         } else {
@@ -110,7 +112,7 @@ export default {
           that.$set(that.imgs, key, uploadSrc);
           that.imgLen++;
           // 将图片信息存到store
-          that.$store.commit('setImgFile', { type: that.moduleType, pId: that.item.id, key: key, file: uploadFile })
+          that.$store.commit('setImgFile', { type: that.moduleType, pId: that.item.id, key: key, file: uploadFile,imgWidth:imgWidth, imgHeight:imgHeight})
           that.$store.commit('setImgSrc', { key: key, src: uploadSrc, type: that.moduleType })
           that.$previewRefresh(); //异步获取的图片需要刷新下
         }
@@ -193,7 +195,7 @@ export default {
   .upload-imgs {
     margin-bottom: 0.2rem;
     .upload{
-      width: 1.86rem;
+      width: 1.9rem;
       height: 100%;
       position: absolute;
       left: 0;
@@ -201,18 +203,27 @@ export default {
       opacity: 0;
     }
     .uploadBox {
-      border: 1px solid #dfe0e4;
+      // border: 1px solid #dfe0e4;
       box-sizing: border-box;
       text-align: center;
+      background: url('../images/addimg.png') no-repeat;
+      background-size: cover;
+      position: relative;
       img {
         width: 0.6rem;
         margin: 0.45rem 0 0.23rem 0;
       }
+      p {
+        position: absolute;
+        bottom: .16rem;
+        left: 0;
+        width: 100%;
+        color: #AAAAAA;
+      }
     }
     li {
-      width: 1.86rem;
+      width: 1.9rem;
       height: 1.9rem;
-      border: 1px solid #dfe0e4;
       display: inline-block;
       position: relative;
       vertical-align: top;
@@ -221,7 +232,7 @@ export default {
       .close {
         width: 0.54rem;
         height: 0.54rem;
-        background: url(../images/del-pic.png) no-repeat;
+        background: url(../images/closeimg.png) no-repeat;
         background-size: cover;
         position: absolute;
         top: -0.27rem;
@@ -229,6 +240,9 @@ export default {
         z-index: 3;
       }
     }
+    .imgLis {
+      border: 1px solid #dfe0e4;
+    }
     li:nth-child(3n + 1) {
       margin-left: 0;
     }

+ 10 - 4
src/components/AddContent.vue

@@ -43,8 +43,8 @@
           </li>
         </ul>
         <div class="result" v-if="allStr">
-          <p class="title">{{allMoudles.name}}</p>
-          <p>{{allStr}}</p>
+          <p class="title"><span class="line"></span>{{allMoudles.name}}</p>
+          <p class="bgResult">{{allStr}}</p>
         </div>
         <div class="thanks">
           <p>感谢您的回答,您的病历已经自动生成。</p>
@@ -54,7 +54,8 @@
       </div>
     </div>
     <div class="foot">
-      <span class="back" @click="back">{{'返回'+ preName}}</span>
+      <!-- <span class="back" @click="back">{{'返回'+ preName}}</span> -->
+      <span class="back" @click="back">上一步</span>
       <span class="next" @click="next">预览并提交病历</span>
     </div>
   </div>
@@ -150,6 +151,10 @@ export default {
 </script>
 <style lang="less" scoped>
 @import "../less/base.less";
+.comArea,.inp-wrap,.toast-wrap {
+  padding-left:0 !important;
+  padding-right: 0 !important;
+} 
 .questionImg {
   width: 100%;
 }
@@ -159,7 +164,7 @@ export default {
   .content {
     // padding-right: .3rem;
   }
-  // .btscroll;  
+  // .btscroll;
   h3 {
     color: #colors[quest];
     margin-bottom: 0.36rem;
@@ -184,6 +189,7 @@ export default {
   
 .result{
   margin-bottom: .3rem;
+  word-break: break-all;
 }
 .thanks {
   font-size: .28rem /* 28/100 */;

+ 113 - 16
src/components/Department.vue

@@ -2,11 +2,12 @@
     <div class="department">
         <div class="departmentView">
             <div class="content">
-                <div class="list" v-for="(item,index) in departmentLis" @click="goStart(index,item.recordTime)" :key="item.hospitalDeptName">
+                <div class="list" v-for="(item,index) in departmentLis" @click="goStart(index,item.recordTime)" :key="index">
                     <div class="top">
                         <p>挂号科室:{{item.hospitalDeptName}} <img src="../images/right.png" alt=""></p>
                     </div>
                     <div class="main">
+                        <p>预约医院:{{item.sonHospitalName?item.sonHospitalName:item.hospitalName}}</p>
                         <p>预约时间:{{item.recordTime}}</p>
                         <p>姓名:{{item.patientName}}</p>
                         <p>病历号:{{item.recordId}}</p>
@@ -16,33 +17,88 @@
                 </div>
             </div>
         </div>
+        <Submit v-if="submit" :showType="showType" :fail="failMsg" @showSubmit="showSubmit"></Submit>
+        <Tiptoast
+            :show="showTip"
+            @close="close"
+            :data="message"/>
     </div>
 </template>
 <script>
-  import {setScroll,compare} from '@utils/tools.js';
-  import BScroll from 'better-scroll';
+    import {setScroll,compare} from '@utils/tools.js';
+    import BScroll from 'better-scroll';
+    import Submit from "../common/Submit";
+    import Tiptoast from "../common/Tiptoast";
+    import api from "@utils/api.js";
     export default {
         name: "Department",
         data(){
             return {
                 scroll:null,
-                departmentLis:[]
+                departmentLis:[],
+                showTip: false,
+                showType: "fail",
+                failMsg: "",
+                message:{
+                    title: "",
+                    text: ""
+                },
+                submit: false,
+                show: false,
+                son:false,//有无子医院
+                hospitalNum:'',
+                hospitalName:''
             }
         },
         created(){
-            let tmpList = JSON.parse(localStorage.getItem('loginData'))
-            let tmpTime = JSON.parse(localStorage.getItem('recordTime'))
-            let sortArr = tmpList.sort(compare("recordTime"));
-            if(tmpTime){
-                for(let j = 0;j < tmpTime.length;j++){
-                    for(let i = 0;i < sortArr.length;i++){
-                        if(tmpTime[j] == (new Date((sortArr[i].recordTime).replace(/\-/g, "/"))).getTime()){
-                            sortArr[i].dided = 1
+            let query = this.$route.query;
+            let type = query.patientInfoType,name = query.patientName,value = query.patientInfo,code=query.hospitalCode,sonHospitalCode=query.sonHospitalCode,sonHospitalName=query.sonHospitalName;
+            if(value&&name&&type&&code){
+                const param = {
+                    patientInfo: value,
+                    patientInfoType: type,
+                    hospitalCode: code,
+                    patientName:name,
+                    sonHospitalCode: sonHospitalCode||'',
+                    sonHospitalName: sonHospitalName||''
+                };
+                api.signIn(param).then(res => {
+                    let result = res.data;
+                    if (result.code == 0) {
+                        // result.data.splice(0,1);//测试只有一条数据
+                        localStorage.setItem('loginData',JSON.stringify(result.data))//保存登陆信息,扫码进入徐删除该参数
+                        if (result.data.length > 1) {
+                            this.departmentLis = this.sortPart();
+                        } else if (result.data.length == 1) {
+                            let msg = result.data[0];
+                            let params = {
+                                hospitalCode: msg.hospitalCode,
+                                hospitalDeptCode: msg.hospitalDeptCode,
+                                doctorCode: msg.doctorCode,
+                                patientCode: msg.patientCode,
+                                recordId: msg.recordId,
+                                sonHospitalCode:msg.sonHospitalCode||'',
+                                time:msg.recordTime&&(new Date((msg.recordTime).replace(/\-/g, "/"))).getTime()
+                            };
+                            localStorage.setItem('loginParam',JSON.stringify(params))//保存登陆信息,扫码进入删除该参数
+                            this.$router.push({
+                                path: "/home",
+                                query: params
+                            });
+                        } else {
+                            this.message.title = '温馨提示'
+                            this.message.text = '暂无今日挂号信息,可更换登录方式再次尝试。'
+                            this.showTip = true
                         }
+                    } else {
+                        this.defaultWaring(res.data.msg);
                     }
-                }
+                }).catch(() => {
+                    this.defaultWaring("网络异常请稍后重试");
+                });
+            }else{
+                this.departmentLis = this.sortPart();
             }
-            this.departmentLis = sortArr
         },
         mounted(){
             this.$nextTick(()=>{
@@ -51,7 +107,39 @@
             })
         },
         methods:{
+            sortPart(){
+                let tmpList = JSON.parse(localStorage.getItem('loginData'));
+                let tmpTime = JSON.parse(localStorage.getItem('recordTime'));
+                let sortArr = tmpList.sort(compare("recordTime"));
+                if(tmpTime){
+                    for(let j = 0;j < tmpTime.length;j++){
+                        for(let i = 0;i < sortArr.length;i++){
+                            if(tmpTime[j] == (new Date((sortArr[i].recordTime).replace(/\-/g, "/"))).getTime()){
+                                sortArr[i].dided = 1
+                            }
+                        }
+                    }
+                }
+                return sortArr;
+            },
+            showSubmit(flg){
+                this.submit = flg;
+            },
+            close() {
+                this.showTip = false;
+            },
+            defaultWaring(msg) {
+                this.$store.commit("handleToggleShow", false);
+                this.showType = "fail";
+                this.failMsg = msg;
+                this.submit = true;
+                let timer = setTimeout(() => {
+                    this.submit = false;
+                    clearTimeout(timer);
+                }, 2000);
+            },
             goStart(num,time){
+                this.show = !this.show
                 let msg = this.departmentLis[num]
                 let params = {
                     hospitalCode:msg.hospitalCode,
@@ -59,6 +147,7 @@
                     doctorCode:msg.doctorCode,
                     patientCode:msg.patientCode,
                     recordId:msg.recordId,
+                    sonHospitalCode:msg.sonHospitalCode||'',
                     time:(new Date(time.replace(/\-/g, "/"))).getTime()
                 }
                 localStorage.setItem('loginParam',JSON.stringify(params))//保存登陆信息,扫码进入徐删除该参数
@@ -67,13 +156,19 @@
                     query:params
                 })
             }
+        },
+        components:{
+            Submit,
+            Tiptoast
         }
     }
 </script>
 <style lang="less" scoped>
+@import '../less/base.less';
     .department {
         font-size: .3rem;
         padding: .3rem 0 1rem 0;
+        background-color: #fff;
         .departmentView {
             position: absolute;
             width: 100%;
@@ -86,7 +181,7 @@
             }
             .list {
                 background:rgba(255,255,255,1);
-                box-shadow:0px 3px 15px 0px rgba(217,217,217,0.5);
+                box-shadow:0px 3px 20px 0px rgba(192,187,224,0.23);
                 border-radius:.1rem;
                 overflow: hidden;
                 margin-bottom: .3rem;
@@ -119,4 +214,6 @@
             }
         }
     }
-</style>
+</style>
+
+

+ 304 - 71
src/components/Detail.vue

@@ -1,44 +1,78 @@
 <template>
-  <div class="detail-wrap">
+  <div class="detail-wrap btscroll">
     <!-- <div v-for="(item,index) in datas"> -->
-    <div v-for="(item,index) in checkDatas.questionMapping">
-      <p class="quest"><img v-show="item.required==1" src="../images/ip.svg"/>{{index + 1 +'.' + (item.description || item.name)}}</p>
-      <img class="questionImg" :src="item.url.replace('{imageUrlPrefix}',imgUrl)" v-if="item.url">
-      <Radio v-if="item.controlType==1"
-            :item="item"
-            :key="item.id"
-            @updata="updataData"/>
-      <RadioSelect v-if="item.controlType==8"
-            :item="item"
-            :key="item.id"
-            @updata="updataData"/>
-      <CheckBox v-if="item.controlType==2"
-            :item="item"
-            :key="item.id"
-            @updata="updataData"/>
-      <!-- 文本域 -->
-      <ComTextArea v-if="item.controlType == 5"
-            :item="item"
-            @updata="updataData"/>
-      <!-- 输入框 -->
-      <Input v-if="item.controlType==6 || item.controlType==7"
-            :item="item"
-            :key="item.id"
-            @updata="updataData"/>
-      <template
-        v-if="item.controlType == 3"
-        v-for="(part,index) in item.questionDetailList"
-      >
-        <MultiLineInput
-          v-if="item.controlType == 3"
-          :msg="part.description||part.name"
-          :part="part"
-          @updata="updataData($event,item)"
-        ></MultiLineInput>
-      </template>
-      <PickTime v-if="item.controlType == 9"
-              @updata="updataData"
-              :item="item"/>
+    <div class="head">
+      <span class="icon" @click="close">
+        <img src="../images/small-close.png">
+      </span>
+      <span class="name">{{(checkDatas.description||checkDatas.name)+'详情'}}</span>
+      <span @click="handleClear" :class="{'check':checkF}">清空</span>
+      <i>{{tips}}</i>
+    </div>
+    <div class="viewPrew">
+      <div class="content">
+        <div class="preQuestion" v-for="(item,index) in checkDatas.questionMapping">
+          <div class="quest" @click="slideToggle($event,index)">
+            <!-- <img class="sign" v-if="item.required==1" src="../images/important.svg" alt=""> -->
+            <span class="sign"></span>
+            <p class="title clearfix">{{index + 1 +'.'+(item.description || item.name)}}{{item.controlType==1?'(单选)':item.controlType==2?'(多选)':''}}</p>
+            <p class="result" v-if="item.valueP&&item.slide!=1">{{item.valueP}}</p>
+            <i :class="[{'slideT':item.slide}]"></i>
+          </div>
+          <img class="questionImg" :src="item.url.replace('{imageUrlPrefix}',imgUrl)" v-if="item.url&&!!item.slide">
+          <Radio v-if="item.controlType==1" 
+                :item="item"
+                :key="item.id"
+                :slide="!!item.slide"
+                :detail="1"
+                @updata="updataData"/>
+          <radioSelect                
+                v-if="item.controlType==8" 
+                :item="item"
+                :slide="!!item.slide"
+                :detail="1"
+                :key="item.id"
+                @updata="updataData"/>
+          <CheckBox v-if="item.controlType==2"
+                :item="item"
+                :key="item.id"
+                :slide="!!item.slide"
+                :detail="1"
+                @updata="updataData"/>
+          <!-- 文本域 -->
+          <ComTextArea v-if="item.controlType == 5"
+                :item="item"
+                :slide="!!item.slide"
+                :detail="1"
+                @updata="updataData"/>
+          <!-- 输入框 -->
+          <Input v-if="item.controlType==6 || item.controlType==7"
+                :item="item"
+                :key="item.id"
+                :slide="!!item.slide"
+                :detail="1"
+                @updata="updataData"/>
+          <div class="multiWrap" :style="{'display':!!item.slide?'block':'none'}" v-if="item.controlType == 3">
+            <template
+              v-for="(part,index) in item.questionDetailList"
+            >
+              <MultiLineInput
+                v-if="item.controlType == 3"
+                :msg="part.description||part.name"
+                :part="part"
+                :isLast="item.questionDetailList.length-1 == index"
+                @updata="updataData($event,item)"
+              ></MultiLineInput>
+            </template>
+          </div>
+          <PickTime v-if="item.controlType == 9" 
+                  @updata="updataData"
+                  :slide="!!item.slide"
+                  :detail="1"
+                  :item="item"/>
+        </div>
+        <!-- <p ref="btm"></p> -->
+      </div>
     </div>
   </div>
 </template>
@@ -46,23 +80,49 @@
 import Radio from '../common/Radio.vue';
 import CheckBox from '../common/CheckBox.vue';
 import Input from '../common/Input.vue';
+import BScroll from 'better-scroll';
 import ComTextArea from '../common/ComTextArea.vue';
 import RadioSelect from '../common/RadioSelect.vue';
 import MultiLineInput from '../common/MultiLineInput.vue';
 import PickTime from '../common/PickTime.vue';
-import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
+import {patt,trimDots,imageUrlPrefix,setScroll} from '@utils/tools.js';
+import $ from 'jquery';
 // 将获取到的数据源转换成私有数据,处理选择事件。点击完成后统一存到store中,便于回读
   export default {
     name:'Detail',
     data(){
+    let { pathInfo } = this.$store.state;
       return{
         checkDatas:{},
+        showCheckDatas:[],
         imgUrl:imageUrlPrefix,
+        age: pathInfo.patientAge,
+        scroll:''
       }
     },
-    props:['datas','data'],
+    props:['datas','data','checkF','tips','sex','flags'],
     created(){
-      this.checkDatas = JSON.parse(JSON.stringify(this.datas));
+      let tmpData = JSON.parse(JSON.stringify(this.datas));
+      this.checkDatas = tmpData
+    },
+    mounted(){
+      this.$nextTick(()=>{
+          let scroll = setScroll(BScroll,true,'.viewPrew')
+          this.scroll = scroll
+          scroll.on('scroll', this.onScroll)
+          let mapping = this.checkDatas.questionMapping;
+          let num = 0;
+          for(let i in mapping){
+            if(mapping[i].slide != 1){
+              ++num
+            }
+          }
+          if(num == mapping.length){//没有任何展开项
+            this.$emit('setBtnTxt','展开全部')
+          }else{//有已经展开的了,就折叠已展开的
+            this.$emit('setBtnTxt','折叠全部')
+          }
+      })
     },
     components:{
       Radio,
@@ -74,6 +134,58 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
       PickTime
     },
     methods:{
+      onScroll(data) {
+        this.$store.commit('setScroll', data)
+        document.activeElement.scrollIntoViewIfNeeded(true);        
+      },
+      close(){
+        this.$emit('close')
+      },
+      handleClear(){
+        this.$emit('handleClear')
+      },
+      slideAll(){
+        let mapping = this.checkDatas.questionMapping;
+        let num = 0;
+        for(let i in mapping){
+          if(mapping[i].slide != 1){
+            ++num
+          }
+        }
+        if(num == mapping.length){//没有任何展开项
+          for(let i in mapping){
+            mapping[i].slide = 1
+          }
+          this.$emit('setBtnTxt','折叠全部')
+        }else{//有已经展开的了,就折叠已展开的
+          for(let i in mapping){
+            mapping[i].slide = 0
+          }
+          this.$emit('setBtnTxt','展开全部')
+        }
+        this.checkDatas = Object.assign({},this.checkDatas);
+      },
+      slideToggle(e,idx){
+        document.activeElement.blur();
+        let mapping = this.checkDatas.questionMapping;
+        let num = 0;
+        for(let i in mapping){
+          if(i == idx){
+            mapping[i].slide = mapping[i].slide==1?0:1
+          }
+        }
+        for(let i in mapping){
+          if(mapping[i].slide != 1){
+            ++num
+          }
+        }
+        if(num == mapping.length){//没有任何展开项
+          this.$emit('setBtnTxt','展开全部')
+        }else{//有已经展开的了,就折叠已展开的
+          this.$emit('setBtnTxt','折叠全部')
+        }
+        this.checkDatas = Object.assign({},this.checkDatas);
+      },
       updataData(data,item){
         const origMapping = this.datas.questionMapping;
         let mapping = this.checkDatas.questionMapping;
@@ -87,7 +199,7 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
                 if(detList[k].id==data.id){
                   detList.splice(k,1,data)
                 }
-              }
+              } 
               for(let n in detList){//给父级赋值
                 if(detList[n].value){
                   tempVal += detList[n].name.replace(patt,detList[n].value)+',';
@@ -103,7 +215,7 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
               mapping.splice(i,1,data)
             }
           }
-
+          
         }
         // 实时更新清空样式
         if(data.value){
@@ -117,23 +229,24 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
           }
         }
         // 更新完成样式
-        /*let checkReq = this.checkReq();
-        if(checkReq){
+        let checkReq = this.checkReq();
+        if(true){
           this.$emit('checkReq',true)
         }else{
           this.$emit('checkReq',false)
-        }*/
+        }
       },
       saveData(){//存值
         this.checkDatas = Object.assign({},this.checkDatas,{select:1});
         const datas = this.checkDatas.questionMapping;
         const id = this.checkDatas.id;
         let chooseSymp = this.$store.state.symptom.choose;
-
+        
         let text = ""; //医生
         let textP = "";//患者
         let special = ""; //拼到主诉
         let specialP = "";
+        let bj1 = "",bjP1 = "",bj2 = "",bjP2 = "",bj3="",bjP3="",signNum1=1,signNum2=1,signNum3=1;
         for(let i in datas){
           // 校验必填项
          /* if(datas[i].required==1 && !datas[i].value){
@@ -141,13 +254,42 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
             return
           }*/
           // 拼到主诉
-          if(datas[i].specFlag==1 && datas[i].value){
-            special += datas[i].value;
-            specialP += datas[i].valueP;
+          // if(datas[i].specFlag==1 && datas[i].value){
+          //   special += datas[i].value;
+          //   specialP += datas[i].valueP;
+          // }
+          if(datas[i].flag==1 && datas[i].value){
+            if(signNum3 == 1){
+              ++signNum3
+              special += datas[i].value;
+              specialP += datas[i].valueP;
+            }else{
+
+            }
           }
           if(datas[i].value){
-            text += datas[i].value+',';
-            textP += datas[i].valueP+',';
+            if(datas[i].flag == 1){
+              if(signNum1 == 1){
+                ++signNum1
+                bj1 += '于'+datas[i].value+'前';
+                bjP1 += '于'+datas[i].valueP+'前';
+              }else{
+                bj3 += datas[i].value+',';
+                bjP3 += datas[i].valueP+',';
+              }
+            }else if(datas[i].flag == 2){
+              if(signNum2 == 1){
+                ++signNum2
+                bj2 += datas[i].value;
+                bjP2 += datas[i].valueP;
+              }else{
+                bj3 += datas[i].value+',';
+                bjP3 += datas[i].valueP+',';
+              }
+            }else{
+              bj3 += datas[i].value+',';
+              bjP3 += datas[i].valueP+',';
+            }
           }
         }
         if(special){//拼接到主诉的内容存到chooseSymp
@@ -158,9 +300,9 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
             }
           }
         }
-
-        let msg = this.checkDatas.name+ ',' + text;
-        let msgP = (this.checkDatas.description || this.checkDatas.name)+ ',' + textP;
+        
+        let msg =  (this.flags == 51?'':(this.age>=18?'患者':'患儿'))+bj1+bj2+(this.flags == 51?'':'出现')+this.checkDatas.name+ ','+bj3;
+        let msgP =  (this.flags == 51?'':(this.age>=18?'患者':'患儿'))+bjP1+bjP2+(this.flags == 51?'':'出现')+(this.checkDatas.description || this.checkDatas.name)+ ','+bjP3;
         let newMsg = "";
         let newMsgP = "";
         if(msg[msg.length-1] == ','){
@@ -170,22 +312,23 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
           newMsg = msg;
           newMsgP = msgP;
         }
-        this.$store.commit('setDatas',{data:this.checkDatas,pId:id,type:this.data.moduleType,ppId:this.data.ppId});
+        this.$store.commit('setDatas',{data:this.checkDatas,pId:id,type:this.data.moduleType,ppId:this.data.ppId,idx:1});
         // flag是区分点开已选症状 未点完成
-        this.$store.commit('setText',{text:trimDots(newMsg),textP:trimDots(newMsgP),pId:id,type:this.data.moduleType,flag:true,order:this.data.order,arrFlag:true,index:this.data.index});
+        this.$store.commit('setText',{text:trimDots(newMsg),textP:trimDots(newMsgP),pId:id,type:this.data.moduleType,flag:true,order:this.data.order,arrFlag:true,index:this.data.index,idx:1});
         // 关闭详情
         this.$store.commit('setDetail',{detail:{}})
       },
       clearData(){//清空
         // const datas = this.checkDatas.questionMapping;
         const datas = JSON.parse(JSON.stringify(this.checkDatas.questionMapping))
+        let chooseSymp = this.$store.state.symptom.choose;
         let reqFlag = false;//必填项标识
         for(let i in datas){
           // 时间控件需要清除缓存的index
           if(datas[i].controlType ==9){
             if(datas[i].pickIndex){
               datas[i].pickIndex = [];
-            }
+            } 
           }
           datas[i].value = "";
           datas[i].valueP = "";
@@ -215,8 +358,7 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
         }else{
           this.$store.commit('setDatas',{data:Object.assign({},this.checkDatas,{select:1}),pId:this.checkDatas.id,type:this.data.moduleType,ppId:this.data.ppId});
         }
-
-        this.$store.commit('setText',{text:msg,textP:msgP,pId:this.checkDatas.id,type:this.data.moduleType,flag:true,order:this.data.order,arrFlag:true,index:this.data.index});
+        this.$store.commit('setText',{text:msg,textP:msgP,pId:this.checkDatas.id,type:this.data.moduleType,flag:true,order:this.data.order,arrFlag:true,index:this.data.index,idx:1});
       },
       check(){// 校验是否有已填项
         const datas = this.checkDatas.questionMapping;
@@ -234,13 +376,12 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
             }
           }
         }
-
         if(checkArr.length>0){
           return true;
         }
         return false;
       },
-      /*checkReq(){// 校验必填项
+      checkReq(){// 校验必填项
         const datas = this.checkDatas.questionMapping;
         for(let k in datas){
           if(datas[k].required==1 && !datas[k].value){
@@ -248,27 +389,119 @@ import {patt,trimDots,imageUrlPrefix} from '@utils/tools.js'
           }
         }
         return true;
-      }*/
+      }
     },
   }
 </script>
 <style lang="less" scoped>
 @import '../less/base.less';
   .detail-wrap{
-    // padding: .3rem .5rem 1.2rem .6rem;
-    padding: .3rem .4rem 1rem ;
     font-size: .3rem;
+    padding:0;
+    .viewPrew {
+      position: fixed;
+      width: 100%;
+      height: 100%;
+      top: 2.6rem;
+      left: 0;
+      .content {
+        padding-bottom: 3.88rem;
+        padding-top: 0;
+      }
+    }
     .quest{
       color:#colors[quest];
-      margin-bottom: .2rem;
-      img{
-        width: 16px;
-        vertical-align: text-top;
-        margin-right: 4px;
+      position: relative;
+      .pubques;
+      padding-right: 1.1rem;
+      .sign {
+        display: inline-block;
+        position: absolute;
+        left: 0.22rem;
+        top: 0.55rem;
+        width: 0.14rem;
+        height: .14rem;
+        border-radius: 50%;
+        background-color: #FFAD00;
+      }
+      .order {
+        // float: left;
+      }
+      .result {
+        font-size: .3rem;
+        color: #colors[theme];
+        padding:.1rem .3rem;
+      }
+      .title {
+        color: #000;
+        padding-left: .22rem;
+        display: inline-block;
+      }
+      i{
+        position: absolute;
+        right: .25rem;
+        top: 50%;
+        margin-top: -.16rem;
+        width: .32rem;
+        height: .32rem;
+        background: url("../images/slideT.png") no-repeat;
+        background-size: cover;
+        transition: all 0.03s;
+      }
+      .slideT {
+        transform: rotateZ(-180deg);
+        transform-origin: center center;
       }
     }
     .questionImg {
       width: 100%;
     }
+    .multiWrap {
+      .bgques;
+      background-color: #colors[bgques];
+    }
+    .head{
+      height: 1.6rem; //增加了提示
+      line-height: .88rem;
+      display: flex; //有清空时
+      justify-content: space-between;
+      border-bottom: 1px solid #E6E7EF;
+      padding: 0 .4rem 0 .32rem;
+      font-size: .28rem;
+      color: #7C828E;
+      position: fixed;
+      z-index: 100;
+      width: 100%;
+      background-color: #fff;
+      // top: 45px;
+      box-sizing: border-box;
+      border-radius:.2rem .2rem 0px 0px;
+      i{
+        position: absolute;
+        bottom:0;
+        left:0;
+        font-size: .24rem;
+        width:100%;
+        height: .6rem;
+        line-height: .6rem;
+        display: inline-block;
+        background-color: #EAF1F9;
+        color: #colors[btn];
+        text-indent: .4rem;
+      }
+      .icon{
+        display: inline-block;
+        height: 100%;
+        padding: 0 .1rem;
+        img{
+          width:.34rem;
+          vertical-align: middle;
+        }
+      }
+      .name{
+        font-size: .32rem;
+        color: #1A1A1A;
+      }
+    }
   }
 </style>

+ 87 - 110
src/components/DetailBox.vue

@@ -1,31 +1,30 @@
 <template>
   <portal to="notification-detail">
     <div class="detailBoxMask"></div>
-    <div class="detailBox-wrap viewPrew">
+    <div class="detailBox-wrap">
       <div class="content detailBoxMain" ref="detailBox">
-        <div class="tmpDom"></div>
         <div class="main">
-          <Detail :datas="privateData"
+          <Detail :datas="privateData" 
                   ref="detail"
+                  :flags="flags"
                   :data="data"
-                  @check="changeCheck($event)"/>
+                  :tips="tips"
+                  :checkF="checkF"
+                  @check="changeCheck($event)"
+                  @setBtnTxt="setBtnTxt($event)"
+                  @close="close($event)"
+                  @handleClear="handleClear($event)"
+                  @checkReq="changeFins($event)"/>
         </div>
-        <!-- <div class="foot" @click="complete">完成</div> -->
-      </div>
-      <div class="head">
-        <span class="icon" @click="close">
-          <img src="../images/small-close.png">
-        </span>
-        <span class="name">{{(privateData.description ||privateData.name)+'详情'}}</span>
-        <span @click="handleClear" :class="{'check':checkF}">清空</span>
-        <i>{{tips}}</i>
       </div>
     </div>
-    <!-- <div :class="['foot',{'noCheck':!checkF}]" @click="complete">完成</div> -->
-    <div style="position:absolute" :class="['foot']" @click="complete">完成</div>
-    <Toast :message="clearTxt"
+    <div style="position:absolute" class="foot">
+      <div class="slide" @click="slideAll">{{btnTxt}}</div>
+      <div class="nextBtn compete" @click="complete">完成</div>
+    </div>
+    <Toast :message="clearTxt" 
           :show="showToast"
-          @comfirn="comfirnDel"
+          @comfirn="comfirnDel" 
           @cancel="cancelDel"/>
   </portal>
 </template>
@@ -33,49 +32,64 @@
   import Detail from './Detail.vue';
   import Toast from '../common/Toast.vue';
   import Picker from '../common/Picker.vue';
-  import {fixedKeyboard,setScroll,moduleCP} from '@utils/tools.js';
-  import BScroll from 'better-scroll';
+  import {fixedKeyboard,moduleCP} from '@utils/tools.js';
   import $ from 'jquery';
   export default {
     name:'DetailBox', //点开详情的盒子
+    props:['flags'],
     data(){
       const {detailInfo,detailShow} = this.$store.state;
+      const {detail} = this.$store.state.detailInfo;
+      let signNum = 1,tmpData = this.$store.state.detailInfo.detail,tmpArr=[];
+      if(tmpData.checkedAll != 1){
+        for(let i = 0;i < tmpData.questionMapping.length;i++){
+          if(tmpData.questionMapping[i].flag != 3){
+              tmpArr.push(tmpData.questionMapping[i])
+          }else{
+            if(signNum != 1){
+              tmpArr.push(tmpData.questionMapping[i])
+            }else{
+              ++signNum
+            }
+          }
+        }
+        tmpData.questionMapping = tmpArr
+        tmpData.checkedAll = 1
+      }
       return{
         msg:"胸痛详情",
         data:detailInfo,
-        privateData:detailInfo.detail||{},
+        privateData:tmpData||{},
         compFlag:false,
         clearTxt:"是否清空当前已选内容?",
         showToast:false,
-        tips:"(请完成病情预问诊可让医生提前了解病情)",
+        tips:"温馨提示:请完成病情预问诊可让医生提前了解病情",
         checkF:false, //详情页有无已选项标识
         show:detailShow,
-        //reqFinish:false,
-        showPic:false
+        reqFinish:false,
+        showPic:false,
+        btnTxt:'展开全部'
       }
     },
     mounted(){
       this.$nextTick(()=>{
         // 校验是否有已填项,有--弹窗;无--return
         let hasCheck = this.$refs.detail.check();
-        //let checkReq = this.$refs.detail.checkReq();
+        let checkReq = true || this.$refs.detail.checkReq();
         if(hasCheck){
           this.checkF = true;
         }
-        /*if(checkReq && hasCheck){
+        if(checkReq && hasCheck){
           this.reqFinish = true;
-        }*/
-        setTimeout(() => {
-          let scroll = setScroll(BScroll,true,'.viewPrew')
-          this.scroll = scroll
-          scroll.on('scroll', this.onScroll)
-        }, 400);
+        }
       })
     },
     methods:{
-      onScroll(data) {
-        this.$store.commit('setScroll', data)
-        document.activeElement.scrollIntoViewIfNeeded(true);
+      setBtnTxt(txt){
+        this.btnTxt = txt
+      },
+      slideAll(){
+        this.$refs.detail.slideAll();
       },
       close(){
         // 有必填项但没值则将choose移除 8-19
@@ -89,48 +103,51 @@
             for(let i in list){
               // if(list[i].required==1 && !list[i].value){
               if(list[i].required==1){
-                this.$store.commit('delChoose', {id: this.privateData.id })
-                this.$store.commit('delText', { type: moduleCP['symp'], pId: this.privateData.id })
+                // this.$store.commit('delChoose', {id: this.privateData.id })
+                // this.$store.commit('delText', { type: moduleCP['symp'], pId: this.privateData.id })
               }
             }
           }
         }
-
         this.$store.commit('setDetail',{detail:{}})
       },
       complete(){
       //有选中内容才可以点完成#1919
         // if(this.checkF){
       //必填项都填完了才可以点完成
-        //if(this.checkF){
-          this.$refs.detail.saveData();
-          this.$store.commit('setSearchShow', false);
-       // }
+        // if(this.reqFinish && this.checkF){
+        //   this.$refs.detail.saveData();
+        //   this.$store.commit('setSearchShow', false);
+        // }
+        this.$refs.detail.saveData();
+        this.$store.commit('setSearchShow', false);
       },
       changeCheck(flag){//是否有选中项
         this.checkF = flag;
       },
-      /*changeFins(flag){//必填项是否都填了
+      changeFins(flag){//必填项是否都填了
         this.reqFinish = flag;
-      },*/
+      },
       handleClear(){//清空
         // 校验是否有已填项,有--弹窗;无--return
         if(this.checkF){
           this.showToast = true;
-          $(".btscroll").css({'position':'fixed'})
-          $(".foot").css({'position':'fixed'})
-        }
+          $(".btscroll").css({'position':'fixed','top':'1rem'})
+          $(".foot").css({'position':'fixed','bottom':'0'})
+        }  
       },
       cancelDel(){
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
         this.showToast = false;
       },
       comfirnDel(){
-        $(".btscroll").css({'position':'absolute'})
+        $(".btscroll").css({'position':'absolute','top':'0'})
+        $(".foot").css({'position':'absolute','bottom':'0'})
         this.$refs.detail.clearData();
         this.showToast = false;
         this.checkF = false;
-        //this.reqFinish = false;
+        this.reqFinish = false;
         // 让detail组件更新
         const type = this.data.moduleType;
         if(type == moduleCP['symp']){ //症状情况单独处理
@@ -139,7 +156,6 @@
           const data = read[id];
           this.$store.commit('setDetail',{detail:data,ppId:null,moduleType:moduleCP['symp']})
         }
-
       },
     },
     components:{
@@ -169,79 +185,40 @@
     z-index: 110;
   }
   .tmpDom {
-    height: 1rem;
+    height: 1.5rem;
   }
   .detailBox-wrap{
+    position: fixed;
     width: 100%;
-    // overflow-y: auto;
-    position: absolute;
-    // bottom: 0; //iPhone6plus键盘收起会跳转
-    top:45px;
+    height: 100%;
+    top:1rem;
     bottom: 0;
     left: 0;
     z-index: 666;
     background: #fff;
-    border-radius: .08rem .08rem 0 0;
     font-size: .3rem;
-    animation: wave .6s linear;
-    height: 100%;
+    animation: wave .4s linear;
+    border-radius:.2rem .2rem 0px 0px;
     overflow: hidden;
-    .head{
-      height: 1rem; //增加了提示
-      line-height: .88rem;
-      display: flex; //有清空时
-      justify-content: space-between;
-      border-bottom: 1px solid #E6E7EF;
-      padding: 0 .4rem 0 .32rem;
-      font-size: .28rem;
-      color: #7C828E;
-      position: fixed;
-      width: 100%;
-      background-color: #fff;
-      top: 45px;
-      box-sizing: border-box;
-      i{
-        position: absolute;
-        top:0.64rem;
-        left:0;
-        font-size: .22rem;
-        width:100%;
-        height: .33rem;
-        line-height: .33rem;
-        display: inline-block;
-        text-align: center;
-      }
-      .icon{
-        display: inline-block;
-        height: 100%;
-        padding: 0 .1rem;
-        img{
-          width:.34rem;
-          vertical-align: middle;
-        }
-      }
-      .name{
-        font-size: .32rem;
-        color: #1A1A1A;
-      }
-    }
-    .main{
-      height: 100%;
-      width:100%;
-      padding-bottom: 1rem;
+    .content{
+      // height: 100%;
+      // width:100%;
+      // padding-bottom: 1rem;
     }
   }
   .foot{
     .footer;
+    .slide {
+      color: #7C828E;
+      width: 49%;
+      display: inline-block;
+    }
+    .compete {
+      width: 49%;
+      display: inline-block;
+    }
     animation-delay:.6s;
     animation: foo .4s linear;
-    /* width:100%;
-    height: .88rem;
-    line-height: .88rem;
-    text-align: center;
-    color:#fff;
-    font-size: .32rem;
-    background: linear-gradient(-270deg, #4F4FFF,#4F8BFF); */
   }
   .check{
     color: #1A1A1A;
@@ -255,9 +232,9 @@
     50% {top: 50%;}
     75% {top: 25%;}
     100% {top: 45px;}
-  }
+  } 
   @keyframes foo {
     0% {bottom:-1rem;}
     100% {bottom:0;}
   }
-</style>
+</style>

+ 21 - 8
src/components/DiagTreat.vue

@@ -52,18 +52,21 @@
             @updata="updataData($event,it.id,i)"/>
       </div>
       <div class="result" v-if="getText()">
-        <p class="title">{{datas.name}}</p>
-        <p>{{getText()}}</p>
+        <p class="title"><span class="line"></span>{{datas.name}}</p>
+        <p class="contentP bgResult">{{getText()}}</p>
       </div>
     </div>
 
     <div class="foot" v-if="modluesLen==2">
-      <span class="back" @click="beBack">{{'返回'+ preName}}</span>
-      <span class="next" @click="toNext">{{'预览并提交病历'}}</span>
+      <!-- <span class="back" @click="beBack">{{'返回'+ preName}}</span> -->
+      <span class="back" @click="beBack">上一步</span>
+      <span class="next" @click="toNext">预览并提交病历</span>
     </div>
     <div class="foot" v-else>
-      <span class="back" @click="beBack">{{'返回'+ preName}}</span>
-      <span class="next" @click="toNext">{{'进入'+ nextName}}</span>
+      <!-- <span class="back" @click="beBack">{{'返回'+ preName}}</span> -->
+      <!-- <span class="next" @click="toNext">{{'进入'+ nextName}}</span> -->
+      <span class="back" @click="beBack">上一步</span>
+      <span class="next" @click="toNext">下一步</span>
     </div>
   </div>
 </template>
@@ -196,17 +199,27 @@
 @import '../less/base.less';
   .treat-wrap{
     font-size: .3rem;
-    // .btscroll;    
+    .bgques,.toast-wrap,.inp-wrap,.comArea {
+      padding-left:0;
+      padding-right: 0;
+    }
+    .label-wrap {
+      padding-bottom: 0;
+    } 
     .quest{
       color: #colors[quest];
-      margin-bottom: .36rem;
       font-weight: 700;
     }
     .label{
       .label;
+      padding-bottom: 0;
     }
     .result{
       .result;
+        word-break: break-all;
+      .contentP {
+        word-break: break-all;
+      }
     }
   }
   .foot{

+ 216 - 81
src/components/Login.vue

@@ -7,27 +7,38 @@
       <h4>欢迎使用智能预问诊</h4>
     </div>
     <div class="main">
-      <div class="iptWrap choose">
-        <p @click="handleShow">
+      <div class="iptWrap choose" v-if="hospitalShow">
+        <p @click="handleShow(1)">
+          {{hospitalName}}
+          <img src="../images/down.png" />
+        </p>
+        <div class="slideType" v-if="showH">
+          <ul>
+            <li v-for="(item,idx) in hospitalList" :key="idx"  @click="handleCode(item,idx)" :style="{'border':(idx == (hospitalList.length-1))?'0 none':''}">{{item.hospitalName}}</li>
+          </ul>
+        </div>
+      </div>
+      <div class="iptWrap choose iptWrapS">
+        <p @click="handleShow(2)">
           {{name}}
           <img src="../images/down.png" />
         </p>
         <div class="slideType" v-if="show">
           <ul>
             <!-- <li @click="handleType('手机号',103)">手机号</li> -->
-            <li @click="handleType('病历号',102)">病历号</li>
             <li @click="handleType('身份证号',101)">身份证号</li>
+            <li @click="handleType('病历号',102)">病历号</li>
             <li @click="handleType('市民卡号',104)" style="border:0 none">市民卡号</li>
           </ul>
         </div>
       </div>
       <div class="iptWrap number numberIpt">
         <input
+          @focus="focus"
           @blur="blur"
-          :maxlength="type==103?11:type==101?18:type==102?7:type==104?9:30"
+          :maxlength="type==103?11:type==101?18:type==102?20:type==104?9:30"
           v-model="value"
           @input="changeVal"
-          :type="type==101||type==104?'text':'tel'"
           class="input"
           type="text"
           :placeholder="'请输入'+name"
@@ -36,6 +47,7 @@
       <div class="iptWrap number">
         <input
           @blur="blur"
+          @focus="focus"
           :maxlength="30"
           v-model="patName"
           @input="changeName"
@@ -44,10 +56,11 @@
           placeholder="请输入姓名"
         />
       </div>
-      <div :class="['btn',value&&patName?'btnClick':'btnDis']" @click="handleDepart">进入预问诊</div>
+      <div :class="['btn',canClick?'btnClick':'btnDis']" @click.stop.prevent="handleDepart">进入预问诊</div>
     </div>
-    <!--<div class="tip">注:建议您可先输入病情情况,方便医生提前了解情况</div>-->
+    <!-- <div class="tip">注:建议您可先输入病情情况,方便医生提前了解情况</div> -->
     <Submit v-if="submit" :showType="showType" :fail="failMsg" @showSubmit="showSubmit"></Submit>
+    <Loading v-if="this.$store.state.loadingShow"></Loading>
     <Tiptoast
         :show="showTip"
 				@close="close"
@@ -59,15 +72,20 @@ import { phoneTest, identify, jgpattern,name } from "@utils/tools.js";
 import Submit from "../common/Submit";
 import Tiptoast from "../common/Tiptoast";
 import api from "@utils/api.js";
+import Loading from '../common/Loading';
+import $ from "jquery";
+// let iscanscrollpage = false
 export default {
   name: "Login",
   data() {
     return {
+      loadingShow: this.$store.state.loadingShow,
       showTip: false,
       showType: "fail",
       failMsg: "",
       submit: false,
       show: false,
+      showH:false,
       type: "102",
       name: "病历号",
       patName:'',
@@ -76,14 +94,110 @@ export default {
         title: "",
         text: ""
       },
-      code:''
+      code:'',
+      allow:false,
+      canClick:false,
+      hospitalName:'',
+      hospitalNum:'',
+      hospitalList:[],
+      hospitalShow:false,
+      son:false,//有无子医院
+      clique:1
     };
   },
   created(){
-    this.code = this.$route.query.hospitalCode||''
+    let query = this.$route.query;
+    let type = query.patientInfoType,name = query.patientName,value = query.patientInfo,code=query.hospitalCode,sonHospitalCode=query.sonHospitalCode,sonHospitalName=query.sonHospitalName,clique=(query.clique!=2?1:query.clique);
+    this.code = code||'';
+    if(value&&name&&type&&code){
+      this.type = type
+      this.name = type == 101?'身份证号':type == 102?'病历号':type == 104?'市民卡号':''
+      this.value = value
+      this.patName = name
+      if(sonHospitalCode&&sonHospitalName){
+        this.hospitalNum=sonHospitalCode
+        this.hospitalName=sonHospitalName
+        this.son = true
+      }else{
+        this.son = false
+      }
+    }
+    this.clique = clique
+    this.getSysConfig(code)
   },
-
+  watch:{
+    value:{
+      handler: function(val, oldVal) {
+        if(val&&this.patName){
+          this.canClick = true
+        }else{
+          this.canClick = false
+        }
+      },
+      deep: true
+    },
+    patName:{
+      handler: function(val, oldVal) {
+        if(val&&this.value){
+          this.canClick = true
+        }else{
+          this.canClick = false
+        }
+      },
+      deep: true
+    }
+  },
+  beforeRouteLeave(to, from, next){
+    const { value,patName,allow } = this;
+    if(!value||!patName){
+      return
+    }
+    next();
+  },
+  
   methods: {
+    getHospitalList(code){
+      api.getHospitalDatas({'hospitalCode':code}).then(res => {
+        let result = res.data;
+        if (result.code == 0) {
+          let tmpMain = result.data.superiorsInfo;
+          let tmpLis = result.data.juniorHospital;
+          if(this.clique == 1){
+            tmpLis.unshift(tmpMain)
+          }
+          this.hospitalList = tmpLis
+          if(!this.son){
+            this.hospitalName = tmpLis[0].hospitalName  //默认第一个
+            this.hospitalNum = tmpLis[0].hospitalCode   
+          }
+        }else{
+          // this.defaultWaring(res.data.msg);
+        }
+      })
+    },
+    getSysConfig(code){
+      api.getSysConfig({'hospitalCode':code}).then((res)=>{
+        const result = res.data;
+        if(result.code==0){
+          const datas = result.data;
+          this.child = datas.filter((item)=>{return item.code == "constitution_show"})
+          this.$store.commit('saveSysConfig',datas)
+          for(let i = 0;i < datas.length;i++){
+            if(datas[i].code == 'junior_show'){
+              this.hospitalShow = +datas[i].value==1?true:false
+              if(datas[i].value==1){
+                this.hospitalShow = true
+                this.getHospitalList(code)
+              }else{
+                this.hospitalShow = false
+              }
+            }
+          }
+        }else{
+          this.defaultWaring(res.data.msg);
+        }
+      })
+    },
     close() {
       this.showTip = false;
     },
@@ -96,35 +210,46 @@ export default {
       }
       this.show = false;
     },
-    handleShow() {
-      const { show } = this;
-      this.show = !show;
+    handleCode(item,idx) {
+      this.hospitalName = item.hospitalName
+      this.hospitalNum = item.hospitalCode
+      this.showH = false;
     },
-    blur() {
-      if(MobileDevice.getModels().join(' or ').indexOf('6') == -1){
-        document.activeElement.scrollIntoView({behavior: "smooth", block: "end"});
-        /*document.activeElement.scrollIntoViewIfNeeded(true);
-        setTimeout(() => {
-          document.activeElement.scrollIntoViewIfNeeded(true);
-        }, 300);*/
+    handleShow(flg) {
+      const { show,showH } = this;
+      if(flg == 1){
+        if(!showH){
+          this.show=false
+        }
+        this.showH = !showH;
+      }else{
+        if(!show){
+          this.showH=false
+        }
+        this.show = !show;
       }
     },
-    changeName() {
-      document.activeElement.scrollIntoViewIfNeeded(true);
-      const { patName } = this;
-      this.patName = patName.replace(/[`~!@#$%^&)(*_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/im,'')
+    focus(){   
+      // iscanscrollpage = false; 
+    },
+    blur() {
+      // iscanscrollpage = true;
+      // if(MobileDevice.getModels().join(' or ').indexOf('6') == -1){
+      //   document.activeElement.scrollIntoView({behavior: "smooth",block:'end'})
+      // }
+    },
+    changeName(e) {
+      this.patName = e.target.value.replace(/[`~!@#$%^&)(*_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/im,'')
     },
     changeVal() {
-      document.activeElement.scrollIntoViewIfNeeded(true);
       const { type, value } = this;
-      if (type == 102 || type == 103) {
+      if (type == 103) {
         this.value = value.replace(/[^\d]/g, "");
-      } else if (type == 101 || type == 104) {
+      } else if (type == 102 || type == 101 || type == 104) {
         this.value = value.replace(/[^\w\.\/]/ig, "");
       }
     },
     defaultWaring(msg) {
-      this.$store.commit("handleToggleShow", false);
       this.showType = "fail";
       this.failMsg = msg;
       this.submit = true;
@@ -133,47 +258,52 @@ export default {
         clearTimeout(timer);
       }, 2000);
     },
-    showSubmit(flg) {
+    showSubmit(flg){
       this.submit = flg;
     },
-    handleDepart() {
-      const { type, value,patName } = this;
+    handleDepart(){
+      const { type, value,patName,allow,hospitalNum,hospitalName,code,hospitalList } = this;
+      if(allow){
+        return
+      }
       if (value&&patName) {
+        this.allow = true
         let timer = setTimeout(() => {
-          if (type == 103) {
-            if (!phoneTest.test(value)) {
-              //验证不通过
-              this.defaultWaring("输入信息格式有误");
+          if (type == 102) {
+            if (!jgpattern.test(value) || value.length > 20) {//验证不通过
+              this.defaultWaring("请输入正确的病历号");
+              this.allow = false;
               return;
             }
-          } else if (type == 101) {
-            //身份证
-            if (!identify.test(value)) {
-              //验证不通过
-              this.defaultWaring("输入信息格式有误");
+          } else if (type == 101) {//身份证
+            if (!identify.test(value) || value.length > 18) {//验证不通过
+              this.defaultWaring("请输入正确的身份证号");
+              this.allow = false;
               return;
             }
-          } else if (type == 104) {
-            //病历号只能输入数字字母
-            if (!jgpattern.test(value)) {
-              //验证不通过
-              this.defaultWaring("输入信息格式有误");
+          } else if (type == 104) {//市民卡号只能输入数字字母
+            if (!jgpattern.test(value)||value.length!=9) {//验证不通过
+              this.defaultWaring("请输入正确的9位市民卡号");
+              this.allow = false;
               return;
             }
           }
           if(!this.code){
             this.defaultWaring("医院编码必填");
+            this.allow = false;
             return;
           }
+          this.$store.commit('handleToggleShow', true);
           const param = {
-            patientInfo: this.value,
-            patientInfoType: this.type,
-            hospitalCode:this.code,
-            patientName:patName
+            patientInfo: value,
+            patientInfoType: type,
+            hospitalCode:code,
+            hospitalName:hospitalList.length>0&&hospitalList[0].hospitalName||'',
+            patientName:patName,
+            sonHospitalCode: code==hospitalNum?'':hospitalNum||'',
+            sonHospitalName: code==hospitalNum?'':hospitalName||''
           };
-          api
-          .signIn(param)
-          .then(res => {
+          api.signIn(param).then(res => {
             let result = res.data;
             if (result.code == 0) {
               // result.data.splice(0,1);//测试只有一条数据
@@ -183,21 +313,24 @@ export default {
                   name: "Department",
                   params: { result: result.data }
                 });
+                this.allow = false
               } else if (result.data.length == 1) {
                 let msg = result.data[0];
                 let params = {
                   hospitalCode: msg.hospitalCode,
                   hospitalDeptCode: msg.hospitalDeptCode,
-                  doctorCode: msg.doctorCode,
-                  patientCode: msg.patientCode,
-                  recordId: msg.recordId,
-                  time:(new Date((msg.recordTime).replace(/\-/g, "/"))).getTime()
+                  doctorCode: msg.doctorCode||'',
+                  patientCode: msg.patientCode||'',
+                  recordId: msg.recordId||'',
+                  sonHospitalCode:msg.sonHospitalCode||'',
+                  time:msg.recordTime&&(new Date((msg.recordTime).replace(/\-/g, "/"))).getTime()||''
                 };
-                localStorage.setItem('loginParam',JSON.stringify(params))//保存登陆信息,扫码进入删除该参数
+                localStorage.setItem('loginParam',JSON.stringify(params))//保存登陆信息,扫码进入删除该参数
                 this.$router.push({
                   path: "/home",
                   query: params
                 });
+                this.allow = false
               } else {
                 this.message.title = '温馨提示'
                 this.message.text = '暂无今日挂号信息,可更换登录方式再次尝试。'
@@ -205,40 +338,42 @@ export default {
               }
               clearTimeout(timer)
             } else {
-              if(res.msg.indexOf('暂无今日挂号信息') != -1){
-                this.message.title = '温馨提示'
-                this.message.text = '暂无今日挂号信息,可更换登录方式再次尝试。'
-                this.showTip = true
-              }else{
-                this.defaultWaring(res.msg);
-              }
+              // if(res.msg.indexOf('暂无今日挂号信息') != -1){
+              //   this.message.title = '温馨提示'
+              //   this.message.text = '暂无今日挂号信息,可更换登录方式再次尝试。'
+              //   this.showTip = true
+              // }else{
+              //   this.defaultWaring(res.data.msg);
+              // }
+              this.allow = false
+              this.defaultWaring(res.data.msg||"网络异常请稍后重试");
               clearTimeout(timer)
             }
-          })
-          .catch(() => {
+            this.$store.commit('handleToggleShow', false);
+          }).catch(() => {
+            this.allow = false
             clearTimeout(timer)
+            this.$store.commit('handleToggleShow', false);
             this.defaultWaring("网络异常请稍后重试");
           });
-        }, 300);
+        }, 200);
       }
     }
   },
   components: {
     Submit,
-    Tiptoast
+    Tiptoast,
+    Loading
   }
 };
 </script>
 <style lang="less" scoped>
+@import "../less/index.less";
 .login {
   height: 100%;
   width: 100%;
   position: absolute;
-  background: linear-gradient(
-    180deg,
-    rgba(79, 79, 255, 1) 0%,
-    rgba(79, 137, 255, 1) 100%
-  );
+  background: #colors[btn];
   padding: 0rem 0.6rem;
   box-sizing: border-box;
   .top {
@@ -279,6 +414,10 @@ export default {
       padding: 0.23rem 0.3rem;
       box-sizing: border-box;
     }
+
+    .iptWrapS{
+      margin-top: 0.3rem;
+    }
     .choose {
       position: relative;
       p {
@@ -307,8 +446,8 @@ export default {
         font-size: 0.28rem;
         li {
           border-bottom: 1px solid #f5f5f5;
-          height: 0.6rem;
-          line-height: 0.6rem;
+          height: .88rem;
+          line-height: .88rem;
           box-sizing: border-box;
         }
       }
@@ -333,12 +472,8 @@ export default {
       height: 0.88rem;
       line-height: 0.88rem;
       text-align: center;
-      background: linear-gradient(
-        270deg,
-        rgba(79, 139, 255, 1) 0%,
-        rgba(79, 79, 255, 1) 100%
-      );
-      border-radius: 0.44rem;
+      background: #colors[btn];
+      border-radius: 0.2rem;
       color: #fff;
       font-size: 0.32rem;
       font-weight: 500;

+ 19 - 10
src/components/Others.vue

@@ -5,7 +5,7 @@
           v-if="dtoList"
           :key="it.id"
           class="label">
-        <p class="quest">{{i + 1 +'.' + (it.description||it.name)}}</p>
+        <p class="quest" :style="{'margin-bottom':it.controlType==0?'.3rem':'0'}">{{i + 1 +'.' + (it.description||it.name)}}</p>
         <img class="questionImg" :src="it.url.replace('{imageUrlPrefix}',imgUrl)" v-if="it.url">
         <Label v-if="it.controlType==0"
               :item="it"
@@ -47,17 +47,20 @@
             @updata="updataData($event,it.id,i)"/>
       </div>
       <div class="result" v-if="getText()">
-        <p class="title">{{datas.name}}</p>
-        <p>{{getText()}}</p>
+        <p class="title"><span class="line"></span>{{datas.name}}</p>
+        <p class="bgResult">{{getText()}}</p>
       </div>
     </div>
     <div class="foot" v-if="modluesLen==3&&!nextName||modluesLen==2">
-      <span class="back" @click="beBack">{{'返回'+ preName}}</span>
-      <span class="next" @click="toNext">{{'预览并提交病历'}}</span>
+      <!-- <span class="back" @click="beBack">{{'返回'+ preName}}</span> -->
+      <span class="back" @click="beBack">上一步</span>
+      <span class="next" @click="toNext">预览并提交病历</span>
     </div>
     <div class="foot" v-else>
-      <span class="back" @click="beBack">{{'返回'+ preName}}</span>
-      <span class="next" @click="toNext">{{'进入'+ nextName}}</span>
+      <!-- <span class="back" @click="beBack">{{'返回'+ preName}}</span>
+      <span class="next" @click="toNext">{{'进入'+ nextName}}</span> -->
+      <span class="back" @click="beBack">上一步</span>
+      <span class="next" @click="toNext">下一步</span>
     </div>
   </div>
 </template>
@@ -136,10 +139,8 @@
             }
           }
         }
-        
         this.$store.commit('setDatas',{type:moduleCP['other'],data:data,pId:data.id,ppId:id});
         this.$store.commit('setText',{type:moduleCP['other'],text:value.replace(patt,'').replace(/\#\{/g,'').replace(/\}/g,''),textP:valueP.replace(patt,'').replace(/\#\{/g,'').replace(/\}/g,''),pId:data.id,flag:true,order:order}); 
-        
         this.$nextTick(()=>{
           this.scroll.refresh()
         })
@@ -193,13 +194,21 @@
   .other-wrap{
     font-size: .3rem;
     // .btscroll;
+    .inp-wrap,.toast-wrap,.comArea {
+      padding-left: 0;
+      padding-right: 0;
+    }
+    .bgques {
+      padding-left:0;
+      padding-right: 0;
+    } 
     .quest{
       color: #colors[quest];
-      margin-bottom: .36rem;
       font-weight: 700;
     }
     .label{
       .label;
+      padding-bottom: 0;
     }
     .result{
       .result;

+ 143 - 151
src/components/PathInfo.vue

@@ -1,56 +1,51 @@
 <template>
   <div class="path-wrap">
     <div class="content">
-      <p class="info">挂号用户信息查询如下:</p>
-      <div class="con">
-        <p class="name">
-          <span>{{pathInfo.patientName}}</span>|
-          <span>{{pathInfo.patientSex}}</span>|
-          <span>{{pathInfo.patientAge}}岁</span>
+      <div class="topContent">
+        <p class="hospitalName">{{pathInfo.sonHospitalName||pathInfo.hospitalName}}</p>
+        <h2>智能预问诊</h2>
+        <p class="explain">请认真填写以下内容,以便就诊时医生可以更好的了解病情,感谢您的配合!</p>
+      </div>
+      <div class="minContent">
+        <p class="msg"><i class="person"></i>挂号信息</p>
+        <p class="perMsg perLine">
+          <span class="msgTitle">患者信息:</span>
+          <span class="perDetail">{{pathInfo.patientName}}</span>
+          <span class="perDetail">{{pathInfo.patientSex}}</span>
+          <span class="perDetail">{{pathInfo.patientAge}}岁</span>
         </p>
-        <p>
-          <span>挂号科室:</span>
-          <span>{{pathInfo.hospitalDeptName}}</span>
+        <p class="perLine">
+          <span class="msgTitle">挂号科室:</span>
+          <span>{{pathInfo.hospitalDeptName}}</span>  
         </p>
-        <p>
-          <span>门诊号:</span>
-          <span>{{pathInfo.recordId}}</span>
-          <span style="margin-left:.20rem">预约医生:</span>
+        <p class="perLine">
+          <span class="msgTitle">{{pathInfo.doctorName?'预约医生:':''}}</span>
           <span>{{pathInfo.doctorName}}</span>
         </p>
-        <p>
-          <span>预约时间:</span>
+        <p class="perLine">
+          <span class="msgTitle">{{pathInfo.recordId?'门诊号:':''}}</span>
+          <span>{{pathInfo.recordId}}</span>
+        </p>
+        <p class="perLine">
+          <span class="msgTitle">{{time?'预约时间:':''}}</span>
           <span>{{time}}</span>
         </p>
-        <p class="already" v-if="type !== 1">{{text[type]}}</p>
-      </div>
-      <div class="out-box">
-        <div class="emery">
-          <div class="baner">
-            <p>{{pathInfo.hospitalName}}</p>
-            <p class="big">智能预问诊</p>
-          </div>
-          <div class="inner">
-            <p>请认真填写以下内容,以便就诊时医生可以更好的了解病情,感谢您的配合!</p>
-            <button @click="getStart">开始</button>
-          </div>
-          <!-- <p v-if="type==3">您已完成过一次预问诊,是否再次录入</p> -->
-        </div>
-        <div class="child" v-if="child.length>0&&child[0].value==1 && !hideChild">
-          <div class="baner">
-            <p>{{pathInfo.hospitalName}}</p>
-            <p class="big">儿童体质检测</p>
-          </div>
-          <div class="inner">
-            <p>该标准将为0-12岁儿童在为体质辨识及与中医体质相关疾病的预防、养生保健、健康管理提供依据,使体质分类科学化、规范化。</p>
-            <button>开始</button>
-          </div>
-        </div>
       </div>
+      <div class="btmContent" @click="getStart">开始</div>
+      <!-- <div class="con">
+        <p class="already" v-if="type !== 1">{{text[type]}}</p>
+      </div> -->
     </div>
+    
+    <Toast
+      :message="message"
+      :show="showToast"
+      @comfirn="comfirnDel"
+      @cancel="cancelDel"
+    />
     <Submit
       v-if="submit"
-      :fail="message"
+      :fail="tipMsg"
       showType="fail"
     ></Submit>
   </div>
@@ -58,14 +53,15 @@
 <script type="text/javascript">
   import api from '@utils/api.js'
   import Submit from '../common/Submit';
-  import {getUrlArgObject,setScroll,dateParser} from '@utils/tools.js'
+  import Toast from '../common/Toast.vue';
+  import {setScroll,dateParser} from '@utils/tools.js'
   import BScroll from 'better-scroll';
   export default {
     name:'PathInfo',
     data(){
       return {
         pathInfo:{},
-        child:[],
+        // child:[],
         type:null, //1-未做过;3-只做过问诊;4-只做过体质辨识;6-都做过
         text:{
           "3":'您已完成过一次预问诊,是否再次录入',
@@ -74,12 +70,14 @@
           "6":'您已完成过一次预问诊,是否再次录入',
         },
         isReady:false,
-        hideChild:true,  //隐藏儿童
+        // hideChild:true,  //隐藏儿童
         submit:false,
         scroll:null,
-        message:'',
+        tipMsg:'',
         time:'',
-        params:{}
+        params:{},
+        showToast:false,
+        message:'您已完成一次预问诊,是否重新录入?'
       }
     },
     created(){
@@ -94,6 +92,12 @@
       })
     },
     methods:{
+      comfirnDel() {
+        this.goNext()
+      },
+      cancelDel() {
+        this.showToast = false
+      },
       getPathInfo(){
         let query = this.$route.query
         let hasQuery = JSON.stringify(query) == '{}'
@@ -105,7 +109,7 @@
           'doctorCode':!hasQuery&&query.doctorCode||'',
           'patientCode':!hasQuery&&query.patientCode||'',
           'recordId':!hasQuery&&query.recordId||'',
-          'recordTime':!hasQuery&&query.recordTime||''
+          "sonHospitalCode": !hasQuery&&query.sonHospitalCode||''
         }
         if(!hasQuery&&query.scan){//扫码进入的
           localStorage.removeItem('loginParam')
@@ -121,14 +125,13 @@
           if(result.code==0){
             this.pathInfo = result.data;
             this.$store.commit('savePathInfo',result.data);
-            this.recordCheck(); //校验是否填过
             this.getAll(); //获取模板
           }
         })
       },
       getSysConfig(){
         let query = this.$route.query
-        let hasQuery = JSON.stringify(query) == '{}'
+        let hasQuery = JSON.stringify(query) == '{}';
         const param = {
           'hospitalCode':!hasQuery&&query.hospitalCode||'',
         }
@@ -136,7 +139,7 @@
           const result = res.data;
           if(result.code==0){
             const datas = result.data;
-            this.child = datas.filter((item)=>{return item.code == "constitution_show"})
+            // this.child = datas.filter((item)=>{return item.code == "constitution_show"})
             this.$store.commit('saveSysConfig',datas)
           }
         })
@@ -152,10 +155,22 @@
         api.recordCheck(param).then((res)=>{
           const result = res.data;
           if(result.code==0){
-            this.type = result.data.type;
+            let type = result.data.type;
+            if(type == 3||type == 6){//有预问诊信息
+              this.showToast = true
+            }else{
+              this.goNext()
+            }
           }
         })
       },
+      goNext(){
+        if(this.isReady){
+          this.$router.replace({path:'/tab'})
+        }else{
+          this.defaultWaring('请先维护症状模块')
+        }
+      },
       getAll(){
         const param = {
           'age':this.pathInfo.patientAge,
@@ -181,24 +196,20 @@
           this.defaultWaring('网络异常请稍后重试');
           return
         }
-        if(this.isReady){
-          // this.$router.push({path:'/tab'})
-          this.$router.replace({path:'/tab'})
-        }else{
-          this.defaultWaring('请先维护症状模块')
-        }
+        this.recordCheck(); //校验是否填过
       },
       defaultWaring(msg){
         this.submit = true
-        this.message = msg
+        this.tipMsg = msg
         let timer = setTimeout(() => {
           this.submit = false
           clearTimeout(timer)
         }, 2000);
-      },
+      }, 
     },
     components:{
-      Submit
+      Submit,
+      Toast
     }
   }
 </script>
@@ -210,109 +221,90 @@
     width: 100%;
     height: 100%;
     .content {
-      padding-top: .5rem;
-      padding-bottom: .2rem;
+      padding-bottom: .16rem;
       box-sizing: border-box;
+      position: absolute;
+      width: 100%;
+      height: 100%;
     }
-    .info{
-      font-size: .32rem;
-      font-weight: 700;
-      color: #040428;
-      margin-left: .6rem;
-      font-weight: bold;
-    }
-    .con{
-      margin-left: .6rem;
-      position: relative;
-      >p{
-        color: #colors[text];
-        margin-top: .27rem;
-      }
-      .name{
-        color: #colors[text];
-        margin-top: .27rem;
-        span{
-          margin-right: .08rem;
-        }
+    .topContent {
+      // background-color: #6678FF;
+      height: 4.78rem;
+      padding: .72rem .6rem;
+      box-sizing: border-box;
+      background:url(../images/topContent.png) no-repeat;
+      background-size: cover;
+      .hospitalName {
+        color: #FFFFFF;
+        font-size: .32rem;
       }
-      .dept{
-        p{
-          display: inline-block;
-          margin-top: .27rem;
-          span{
-            color: #colors[text];
-          }
-        }
-        p:first-child{
-          margin-right: .25rem;
-        }
+      h2 {
+        font-size: .56rem;
+        padding: .36rem 0 .18rem 0;
+        color: #fff;
       }
-      .already{
-        position: absolute;
-        left: 0;
-        bottom:-.6rem;
-        color: #colors[text];
+      .explain {
+        font-size: .24rem;
+        color: #fff;
+        line-height: .4rem;
       }
     }
-    .out-box{
-      white-space: nowrap;
-      overflow-x: auto;
-      padding:0 .15rem .15rem 0;
-      -webkit-overflow-scrolling: touch;
-      text-align: center;//隐藏儿童
-    }
-    .emery,.child{
-      display: inline-block;
-      vertical-align: top;
-      width:5.1rem;
-      margin-top: .91rem;
+    .minContent {
+      padding: .3rem .6rem .6rem .6rem;
       box-sizing: border-box;
-      .baner{
-        box-sizing: border-box;
-        width:100%;
-        height: 2.3rem;
-        padding-top: .5rem;
-        p{
-          color:#fff;
-        }
-        .big{
-          font-size: .56rem;
-          margin-top: .12rem;
+      border-radius: 5px;
+      width: 90%;
+      box-shadow:0px 12px 24px 0px rgba(198,187,224,0.15);
+      position: relative;
+      top: -0.9rem;
+      background-color: #fff;
+      margin: 0 auto;
+      .msg {
+        font-size: .32rem;
+        padding-bottom: .28rem;
+        border-bottom: 1px solid #E6E6E6;
+        margin-bottom: .6rem;
+        .person {
+          display: inline-block;
+          width: .38rem;
+          height: .4rem;
+          background: url(../images/person.png) no-repeat;
+          background-size: cover;
+          margin-right: .3rem;
+          position: relative;
+          top: .06rem;
         }
       }
-      .inner{
-        height: 4.5rem;
-        box-shadow:-.05rem .05rem .10rem -.04rem #989da3,.05rem .05rem .10rem -.04rem #989da3;
-        border-radius: 0 0 .20rem .20rem;
-        padding: .45rem .6rem .6rem;
-        box-sizing: border-box;
-        position: relative;
-        p{
-          font-size: .24rem;
-          line-height: .5rem;
-          white-space: normal;
-          min-height: 100px;
-        }
-        button{
-          width: 4rem;
-          height: .88rem;
-          color: #fff;
-          font-size: .32rem;
-          margin: .40rem 0 0 -.05rem;
-          background: -webkit-gradient(linear, right top, left top, from(#4F8BFF), to(#4F4FFF));
-          background: -webkit-linear-gradient(right, #4F8BFF, #4F4FFF);
-          box-shadow: 0 .12rem .24rem 0 rgba(79,129,255,0.40);
-          border-radius: .44rem;
+      .perLine {
+        font-size: .3rem;
+        padding-bottom: .2rem;
+      }
+      .msgTitle {
+        display: inline-block;
+        width: 1.6rem;
+        color: #777777;
+      }
+      .perMsg {
+        .perDetail {
+          margin-right: .24rem;
         }
       }
+      
     }
-    .emery .baner{
-      background: url('../images/banerbg@1.5x.png') no-repeat;
-      background-size: cover;
-    }
-    .child .baner{
-      background: url('../images/childbg@1.5x.png') no-repeat;
-      background-size: cover;
+    .btmContent {
+      width: 94%;
+      height: .88rem;
+      line-height: .88rem;
+      text-align: center;
+      background-color: #colors[btn];
+      font-size: .32rem;
+      color: #fff;
+      margin: 0 auto;
+      border-radius: 5px;
+      position: absolute;
+      bottom: .68rem;
+      transform: translateX(-50%);
+      left: 50%;
     }
   }
-</style>
+</style>

+ 87 - 48
src/components/Preview.vue

@@ -7,14 +7,16 @@
           <p class="baseMsg">{{pathInfo.patientName}}&nbsp;&nbsp;&nbsp;&nbsp;{{pathInfo.patientSex}}&nbsp;&nbsp;&nbsp;&nbsp;{{pathInfo.patientAge}}岁</p>
           <table>
             <tr>
-              <td colspan="2">挂号科室:{{pathInfo.selfDeptName}}</td>
+              <td><span>挂号科室:</span>{{pathInfo.selfDeptName}}</td>
             </tr>
-            <tr>
-              <td>门诊号:{{pathInfo.recordId}}</td>
-              <td>预约医生:{{pathInfo.doctorName}}</td>
+            <tr v-if="pathInfo.recordId">
+              <td><span>门诊号:</span>{{pathInfo.recordId}}</td>
             </tr>
-            <tr>
-              <td colspan="2">就诊时间:{{time}}</td>
+            <tr v-if="pathInfo.doctorName">
+              <td><span>预约医生:</span>{{pathInfo.doctorName}}</td>
+            </tr>
+            <tr v-if="time">
+              <td><span>就诊时间:</span>{{time}}</td>
             </tr>
           </table>
           <!-- <div class="line"></div>
@@ -22,22 +24,25 @@
         </div>
         <div class="personMsg personMsg2">
           <ul class="previewParts">
-            <!-- <li v-if="symptom.choose.length>0"> -->
             <li>
-              <h4><i :style="{'background': '#FF9A9A'}"></i> 主诉:</h4>
+              <h4><i></i>主诉:</h4>
               <p>
-                <span v-for="(item,idx) in symptom.choose" :key="item.name+idx">
-                {{item.specialP?(item.description||item.name)+item.specialP+(idx == symptom.choose.length-1?'':','):(item.description||item.name)+(idx == symptom.choose.length-1?'':',')}}
+                <span v-for="(item,idx) in symptom.choose" :key="item.name+idx" v-if="item.idx == 1">
+                  {{item.specialP?(item.description||item.name)+item.specialP:(item.description||item.name)}}
                 </span>
               </p>
             </li>
-            <!-- <li v-if="diagnose.text.length>0||symptom.choose.length>0"> -->
             <li>
-              <h4><i :style="{'background': '#3D69D9'}"></i> 现病史:</h4>
-              <p v-for="item in symptom.text">{{item.textP}}</p>
+              <h4><i></i> 现病史:</h4>
               <p>
-                <span>{{getDetailText(diagnose.text,false).view}}</span>
+                <template v-for="(value,index) in checkText">
+                  <!-- 患者于时间单位前诱因出现症状,其余题目的内容; -->
+                  <span :key="index" v-if="index==0">{{(value.idx==1?'':'伴')+value.textP}}{{checkText.length==1?'':','}}</span>
+                  <span :key="index" v-if="index==1">{{(checkText[0].idx == 1?'伴':'')+value.text}}{{checkText.length==2?'':'、'}}</span>
+                  <span :key="index" v-if="index>1">{{value.text}}{{index == checkText.length-1?'':'、'}}</span>
+                </template>
               </p>
+              <p><span>{{getDetailText(diagnose.text,false).view}}</span></p>
             </li>
             <li v-if="showLis[moduleCP['other']]==1">
               <h4><i></i> 其他史:</h4>
@@ -57,14 +62,18 @@
             </li>
           </ul>
         </div>
-        <!--<div class="doctorData" @click="handleClick(true)">医生端数据展示</div>-->
+        <div class="doctorData" @click="handleClick(true)">医生端数据展示</div>
       </div>
     </div>
     <div class="foot">
+        <!-- <span
+          class="back"
+          @click="back"
+        >{{'返回'+ preName}}</span> -->
         <span
           class="back"
           @click="back"
-        >{{'返回'+ preName}}</span>
+        >上一步</span>
         <span
           class="next"
           @click="saveAllImage"
@@ -76,29 +85,36 @@
         @showSubmit="showSubmit"
       ></Submit>
       <Loading v-if="loadingShow"></Loading>
-      <div class="personMsgDoc" v-if="showDoc">
+      <div class="personMsgDoc" v-show="showDoc">
         <div class="personMsgDocModal" @click="handleClick(false)"></div>
         <div class="personMsgDocDetail">
           <img class="close" src="../images/small-close.png" alt="" @click="handleClick(false)">
-          <div class="personMsg personMsg2">
+          <div class="personMsg personMsg2 modal">
             <ul class="previewParts">
               <li>
-                <h4><i :style="{'background': '#FF9A9A'}"></i> 主诉:</h4>
+                <h4><i></i> 主诉:</h4>
                 <p>
-                  <span v-for="(item,idx) in symptom.choose" :key="item.name+idx">{{item.special?item.name+item.special+(idx == symptom.choose.length-1?'':','):item.name+(idx == symptom.choose.length-1?'':',')}}</span>
-                </p>
+                  <span v-for="(item,idx) in symptom.choose" :key="item.name+idx" v-if="item.idx == 1">
+                    {{item.special?item.name+item.special:item.name}}
+                  </span>
+                </p>                
               </li>
               <li>
-                <h4><i :style="{'background': '#3D69D9'}"></i> 现病史:</h4>
-                <p v-for="item in symptom.text">{{item.text}}</p>
+                <h4><i></i> 现病史:</h4>
                 <p>
-                  <span>{{getDetailText(diagnose.text,false).content}}</span>
+                  <template v-for="(value,index) in checkText">
+                    <!-- 患者于时间单位前诱因出现症状,其余题目的内容; -->
+                    <span :key="index" v-if="index==0">{{(value.idx==1?'':'伴')+value.text}}{{checkText.length==1?'':','}}</span>
+                    <span :key="index" v-if="index==1">{{(checkText[0].idx == 1?'伴':'')+value.textP}}{{checkText.length==2?'':'、'}}</span>
+                    <span :key="index" v-if="index>1">{{value.textP}}{{index == checkText.length-1?'':'、'}}</span>
+                  </template>
                 </p>
+                <p><span>{{getDetailText(diagnose.text,false).view}}</span></p>
               </li>
               <li v-if="showLis[moduleCP['other']]==1">
                 <h4><i></i> 其他史:</h4>
                 <p>
-                  <span>{{getDetailText(others.text,false).content}}</span>
+                  <span>{{getDetailText(others.text,false).view}}</span>
                 </p>
               </li>
               <li v-if="showLis[moduleCP['suplement']]==1">
@@ -138,6 +154,7 @@ export default {
       diagnose: diagnoseDate,
       others: othersDate,
       addContent: addContentDate,
+      checkText: symptomDate.text, //症状情况文字
       submit: false,
       showType: 'fail',
       imgList:[],
@@ -156,6 +173,7 @@ export default {
       let scroll = setScroll(BScroll,true,'.previewper')
       this.scroll = scroll
     })
+
   },
   methods: {
     getTime() {
@@ -212,12 +230,10 @@ export default {
             let result = data.data;
             for(let i = 0;i < result.length;i++){
               let obg = {}
-              obg.narrowImage = result[i].thumbnail.url
-              obg.narrowName = result[i].thumbnail.original
-              obg.originalImage = result[i].source.url
-              obg.originalName = result[i].source.original
+              obg.originalImage = result[i].url+'?width='+imgList[i].imgWidth+'&height='+imgList[i].imgHeight
+              obg.originalName = result[i].original
               obg.orderNum = i+1
-              obg.type = result[i].source.type
+              obg.type = result[i].type
               reportList.push(obg)
             }
             this.imgList = reportList
@@ -241,16 +257,16 @@ export default {
     getDetailText(textArr,flg){
       let msg = "",obg={},msgP = "";
       if(flg == 1){
-        for(let k in textArr){
-          let item = textArr[k]
+        // for(let k in textArr){
+          let item = textArr[0];
           if(item.special){
-            msg+=item.name+item.special+(k == textArr.length-1?'':',')
-            msgP+=item.name+item.specialP+(k == textArr.length-1?'':',')
+            msg+=item.name+item.special
+            msgP+=item.name+item.specialP
           }else{
-            msg+=item.name+(k == textArr.length-1?'':',')
-            msgP+=item.name+(k == textArr.length-1?'':',')
+            msg+=item.name
+            msgP+=item.name
           }
-        }
+        // }
       }else{
         for(let k in textArr){
           if(textArr[k] && Array.isArray(textArr[k])){
@@ -267,7 +283,6 @@ export default {
           }
         }
       }
-
       obg.view=trimDots(msgP.replace(/,$/,''))
       obg.content=trimDots(msg.replace(/,$/,''))
       obg.contentJson=trimDots(msg.replace(/,$/,''))
@@ -277,26 +292,31 @@ export default {
     },
     saveAllDate() {
       const {pathInfo,symptom,diagnose,others,addContent} = this
+      let tmpSymptom = JSON.parse(JSON.stringify(symptom))
       let detailList = [{type:1},{type:2},{type:3},{type:4}]
       for(let i = 0;i < detailList.length;i++){
         if(i == 0){
-          detailList[0]=this.getDetailText(symptom.choose,1)
+          detailList[0]=this.getDetailText(tmpSymptom.choose,1)
         }else if(i == 1){
           let tmpArr = []
           let tmpStr = this.getDetailText(diagnose.text,2).content
-          for(let j = 0;j < symptom.text.length;j++){
-            tmpArr.push(symptom.text[j].text)
+          for(let j = 0;j < tmpSymptom.text.length;j++){
+            if(j == 1){
+              let tmpTxt = '伴'+tmpSymptom.text[1].text
+              tmpSymptom.text[1].text = tmpTxt
+            }
+            tmpArr.push(tmpSymptom.text[j].text)
           }
           tmpStr.length>0?tmpArr.push(tmpStr):null
-          detailList[1].content=tmpArr.join()+tmpStr
+          detailList[1].content=tmpArr.join()
           detailList[1].contentJson=JSON.stringify(tmpArr)
-          detailList[1].contentValue=tmpArr.join()+tmpStr
+          detailList[1].contentValue=tmpArr.join()
         }else if(i == 2){
           detailList[2] = this.getDetailText(others.text,3)
         }else if(i == 3){
           detailList[3].content=addContent.txtDoc
           detailList[3].contentJson=addContent.txtDoc
-          detailList[3].contentValue=addContent.txt
+          detailList[3].contentValue=addContent.txtDoc
         }
       }
       let params = {
@@ -321,6 +341,9 @@ export default {
         "patientSex": pathInfo.patientSex=='男'?1:2,//患者性别:1男2女(非)
         // "regVisitedState": pathInfo,//就诊状态(0待接诊,1接诊中,2完成接诊)(非)
         "reportList": this.imgList,
+        "sonHospitalCode": pathInfo.sonHospitalCode,
+        "sonHospitalId": pathInfo.sonHospitalId,
+        "sonHospitalName": pathInfo.sonHospitalName,
         // "type": 0//病历分类(1:门诊,2:住院)
       }
       // console.log(params)
@@ -365,7 +388,7 @@ export default {
 }
 .preview {
   color: red;
-  background-color: #f2f2f5;
+  background-color: #fff;
   position: fixed;
   width: 100%;
   height: 100%;
@@ -376,6 +399,10 @@ export default {
   overflow: hidden;
   -webkit-overflow-scrolling:touch;
   .btscroll;
+  .content {
+    padding-top: 0;
+    padding-bottom: 2rem;
+  }
 }
 .tmpDiv {
   height: .3rem;
@@ -409,6 +436,7 @@ export default {
   background-color: #fff;
   border-radius: 0.16rem;
   margin-bottom: 0.38rem;
+  box-shadow:0px 3px 20px 0px rgba(192,187,224,0.23);
   .previewParts {
     li {
       padding: .1rem .3rem;
@@ -427,7 +455,7 @@ export default {
         width: .16rem;
         height: .16rem;
         border-radius: 50%;
-        background: #767676;
+        background: #colors[theme];
         display: inline-block;
         position: absolute;
         top: .15rem;
@@ -447,11 +475,11 @@ export default {
     letter-spacing: 0;
     text-align: justify;
     font-weight: bold;
-    margin-bottom: 0.13rem;
+    margin-bottom: 0.15rem;
   }
   table {
     width: 100%;
-    font-size: 0.26rem;
+    font-size: 0.3rem;
     color: #333333;
     letter-spacing: 0;
     text-align: justify;
@@ -459,6 +487,14 @@ export default {
     tr {
       padding: .2rem 0;
       line-height: .5rem;
+      td {
+        padding-bottom: 0.1rem;
+      }
+      span {
+        color:#777;
+        width: 1.6rem;
+        display: inline-block;
+      }
     }
   }
   .line {
@@ -472,6 +508,9 @@ export default {
 .personMsg2 {
   padding-right: 0;
 }
+.personMsg2.modal {
+  margin-bottom: 0;
+}
 .personMsgDoc {
   position: fixed;
   height: 100%;

+ 7 - 6
src/components/Search.vue

@@ -69,16 +69,15 @@ export default {
   },
   methods: {
     showDetil(item) {
-      if(this.chooseSymp.length>0){     //已有选中症状,不展开详情
-        this.$emit('setText',item);     //选中症状
-        this.search();      //关闭搜索页
-        return;
-      }
       let flg = false;
       if(JSON.stringify(this.tmpItem)==JSON.stringify(item)){//eg:重复点击胸痛bug
         flg = true
       }
       this.tmpItem = item
+      
+      if(this.chooseSymp.length == 0){
+        item.idx = 1
+      }
       let timer = setTimeout(() => {
         this.$emit('showDetil',item,flg)
         clearTimeout(timer)
@@ -91,7 +90,9 @@ export default {
     searchList() {
       let tmpArr = [], chooseSymp = this.chooseSymp;
       for (let i = 0; i < chooseSymp.length; i++) {
-        tmpArr.push(chooseSymp[i].conceptId)
+        if(chooseSymp[i].conceptId){
+          tmpArr.push(chooseSymp[i].conceptId)
+        }
       }
       const param = {
         "age": this.age,

+ 213 - 114
src/components/Symptom.vue

@@ -1,16 +1,16 @@
 <template>
   <div class="symp-wrap symper btscroll">
     <div class="content">
+      <p class="quest" v-if="chooseSymp.length>0">已选症状</p>
       <div
         class="choose"
         v-if="chooseSymp.length>0"
       >
-        <p class="quest">已选症状</p>
         <p
           class="choo-symp"
           v-for="(v,i) in chooseSymp"
         >
-          <span @click="showChecked(v)">{{v.description || v.name}}</span>
+          <span @click="showChecked(v,i)">{{v.description || v.name}}</span>
           <span @click="deletSymp(v,i)"><img
               src="../images/del.png"
               alt=""
@@ -24,50 +24,54 @@
             src="../images/search.png"
             alt=""
           ></p>
-        <!-- <span
-          class="symp"
-          v-for="(it,ind) in symp"
-          :key="it.conceptId"
-          @click="showDetil(it)"
-        >{{it.description || it.name}}</span> -->
-        <!-- 暂时隐藏长按显示功能 -->
-        <span
-          class="symp"
-          v-for="(it,ind) in symp"
-          v-if="ind<9||showAll"
-          :key="it.conceptId"
-          @touchstart.stop.prevent="touchstart(it)"
-          @touchend.stop.prevent="touchend(it)"
-        >{{it.description || it.name}}</span>
-        <p class="show-all" v-if="chooseSymp.length===0" @click="showAllLabel">{{showAll?"收起":"展开全部"}}</p>
-        <p class="tip" v-show="chooseSymp.length==0">长按症状按钮可显示症状解释说明</p>
+        <div class="showHide" ref="showHide">
+          <span
+            class="symp"
+            v-for="(it,ind) in symp"
+            :key="it.conceptId"
+            @touchstart.prevent="touchstart(it,ind)"
+            @touchend.prevent="touchend(it,ind+1)"
+          >{{it.description || it.name}}</span>
+        </div>
+        <p class="tip" v-show="chooseSymp.length==0">长按症状按钮可显示症状解释说明 <span @click="slideToggle" v-show="slide">{{slideTxt}}</span></p>
       </div>
       <div
         class="result"
         v-if="checkText.length>0"
       >
-        <p class="title">{{nameStr}}</p>
-        <p v-for="(value,index) in checkText">{{value.textP}}</p>
+        <p class="title"><span class="line"></span>{{nameStr}}</p>
+        <div class="bgResult">
+          <template v-for="(value,index) in checkText">
+            <!-- 患者于时间单位前诱因出现症状,其余题目的内容; -->
+            <span :key="index" v-if="index==0">{{(value.idx==1?'':'伴')+value.textP}}{{checkText.length==1?'':','}}</span>
+            <span :key="index" v-if="index==1">{{(checkText[0].idx == 1?'伴':'')+value.textP}}{{checkText.length==2?'':'、'}}</span>
+            <span :key="index" v-if="index>1">{{value.textP}}{{index == checkText.length-1?'':'、'}}</span>
+          </template>
+        </div>
       </div>
     </div>
     <div v-if="modluesLen>1"
-      :class="['footer',{'nofoot':chooseSymp.length==0}]"
       @click="toNext"
-    >下一步</div>
+      class="footer"
+    >
+      <div class="nextBtn" :class="{'nofoot':chooseSymp.length==0}">下一步</div>
+    </div>
     <div v-if="modluesLen==1"
-      :class="['footer',{'nofoot':chooseSymp.length==0}]"
+      class="footer"
       @click="toNext"
-    >预览并提交病历</div>
+    >
+      <div class="nextBtn" :class="{'nofoot':chooseSymp.length==0}">预览并提交病历</div>    
+    </div>
     <Toast
       :message="delText"
       :show="showToast"
       @comfirn="comfirnDel"
       @cancel="cancelDel"
     />
+    <Submit v-if="submit" showType="fail" :fail="failMsg" @showSubmit="showSubmit"></Submit>
     <Search
       v-if="this.$store.state.searchShow"
       @search="search"
-      @setText="common"
       @showDetil="showDetil"
       :age="age"
       :chooseSymp="chooseSymp"
@@ -78,11 +82,11 @@
 </template>
 <script type="text/javascript">
 import api from '@utils/api.js';
-import DetailBox from './DetailBox.vue';
 import Toast from '../common/Toast.vue';
 import Tiptoast from '../common/Tiptoast.vue';
 import Search from './Search.vue';
 import {moduleCP,setScroll,trimDots} from '@utils/tools'
+import Submit from "../common/Submit";
 import BScroll from 'better-scroll';
 import $ from 'jquery';
 export default {
@@ -112,11 +116,16 @@ export default {
       startTime:'',
       timer:null,
       showExp:false,
-      showAll:false,    //默认显示9个症状,showAll=true展开全部
       message:{
         title:'',
         text:''
-      }
+      },
+      submit:false,
+      start:{},
+      end:{},
+      slide:false,
+      slideTxt:'展开',
+      failMsg: "无法选择症状,已超过最大个数",
     }
   },
   created() {
@@ -136,11 +145,57 @@ export default {
       scroll.on('scroll', this.onScroll)
     })
   },
+  watch:{
+    checkText:{//更新推送
+      handler(newVal,oldVal){
+        const sympText = this.getSympText();
+        if(sympText){
+          if(this.chooseSymp.length>1||localStorage.getItem("staticSymp")){
+            this.getPush(sympText);
+          }
+          this.quesText = "请问您还有其他不适吗?";
+        }else{
+          this.getSympList();
+          this.quesText = "请问您这次哪里最不舒服?";
+        } 
+      },
+      deep:true
+    }
+  },
   methods: {
+    showSubmit(flg){
+      this.submit = flg;
+    },
+    slideToggle(){
+      let flg = this.slideTxt;
+      if(flg == '展开'){
+        this.$refs.showHide.style.height = 'auto'
+        this.slideTxt = '收起'
+      }else{
+        this.$refs.showHide.style.height = '3rem'
+        this.slideTxt = '展开'
+      }
+    },  
+    touchend(item,flg) {//症状点开详情
+      clearTimeout(this.timer);
+      this.end = this.$store.state.scroll
+      if(JSON.stringify(this.start) != JSON.stringify(this.end)){
+        return
+      }
+      let endTime = +new Date();
+      if(endTime - this.startTime < 500){//点击事件
+        if(this.chooseSymp.length == 0){
+          item.idx = 1
+        }
+        this.common(item,flg);
+        this.slideTxt = '展开'
+      }
+      this.startTime = "";
+    },
     touchstart(it){
+      this.start = this.$store.state.scroll
       this.startTime = +new Date();
       const that = this;
-      this.start = this.$store.state.scroll;
       this.timer = setTimeout(function(){
         // 长按事件
           that.showExp = true;
@@ -151,7 +206,6 @@ export default {
             that.message.title = "";
             that.message.text = "暂无资料";
           }
-
         },600)
     },
     closeTip(){
@@ -177,6 +231,11 @@ export default {
         const result = res.data;
         if (result.code == 0) {
           this.symp = result.data;
+          if(result.data.length>9){
+            this.slide = true
+          }else{
+            this.slide = false
+          }
         }
       })
     },
@@ -191,60 +250,91 @@ export default {
         this.$emit('next');
       }
     },
-    common(item,flg){
+    common(item,flg,sign){
+      if(this.chooseSymp.length>12){
+        this.$store.commit('setSearchShow', false);
+        this.submit = true
+        let timer = setTimeout(() => {
+          this.submit = false;
+          clearTimeout(timer);
+        }, 2000);
+        return
+      }
       this.questId = item.questionId || item.id || item.conceptId;
       const id = item.questionId || item.id; //常见症状questionId,推送id,两者均有可能没有
       //将选中的name存到store中的text
-      this.$store.commit('setText', { type: moduleCP['symp'], text: item.name,textP: item.description||item.name, pId: this.questId });
-      //不是第一个症状,都不弹出详情
-      if (this.chooseSymp.length === 0&&id) {
+      if (id&&this.chooseSymp.length == 0) {//只有第一次
         const param = {
           "age": this.age,
           "id": id,
           "sexType": this.sexType
         }
+        localStorage.setItem("staticSymp",null)
+        this.$store.commit('setText', { type: moduleCP['symp'], text: (this.chooseSymp.length == 0?'患者出现':'')+item.name,textP: (this.chooseSymp.length == 0?'患者出现':'')+(item.description||item.name), pId: this.questId,idx:this.chooseSymp.length == 0?1:'' });
         api.getById(param).then((res) => {
           const result = res.data;
+          // this.labelDetail = result.data;
           if (result.code == 0) {
             const mapping = result.data.questionMapping;
-            this.labelDetail = result.data;
-            //this.$store.commit('setOrigin', { type: moduleCP['symp'], data: result.data }); //2544暂时不存,被删除后加上详情不会再显示
+            if(this.chooseSymp.length == 0){
+              result.data.idx = 1
+            }
+            this.$store.commit('setOrigin', { type: moduleCP['symp'], data: result.data });
             if (mapping && mapping.length > 0) {
-              this.$store.commit('setDetail',{detail:result.data,ppId:null,moduleType:moduleCP['symp']})
-              if(flg){
+              let numPlus = 0;
+              let signNum = 1;//第一个打标的,保存为伴随
+              for(let i = 0;i < mapping.length;i++){
+                let tmpMap = mapping[i]
+                tmpMap.slide = 1
+                if(tmpMap.flag == 3 && signNum == 1){
+                  ++signNum
+                  for(let j = 0;j < tmpMap.questionDetailList.length;j++){
+                    tmpMap.questionDetailList[j].questionId = tmpMap.questionDetailList[j].name
+                  }
+                  localStorage.setItem("staticSymp",JSON.stringify(tmpMap.questionDetailList))
+                }
+              }
+              if(numPlus == mapping.length){
+                localStorage.setItem("staticSymp",null)
+              }
+              this.$store.commit('setDetail',{detail:result.data,ppId:null,moduleType:moduleCP['symp'],sign:1,idx:this.chooseSymp.length})
+              if(sign){
                 return
               }
+              this.$store.commit('setSearchShow', false);
               this.chooseSymp.push(item);
-            } else {
-              this.chooseSymp.push(item);
+            } else { 
               this.$store.commit('setSearchShow', false);
+              this.chooseSymp.push(item);
             }
+            result.data.questionMapping = mapping
+            this.labelDetail = result.data;
+            const sympText = this.getSympText();
+            this.getPush(sympText);
+          }
+        }).catch(()=>{
+          if(this.chooseSymp.length == 1){
+            const sympText = this.getSympText();
+            this.getPush(sympText);
           }
         })
-      } else {//没有questionId或id
+      } else {//没有questionId或id 
+        if(this.chooseSymp.length == 0){
+          item.idx = 1
+        }
+        this.$store.commit('setText', { type: moduleCP['symp'], text: (this.chooseSymp.length == 0?'患者出现':'')+item.name,textP: (this.chooseSymp.length == 0?'患者出现':'')+(item.description||item.name), pId: this.questId,idx:this.chooseSymp.length == 0?1:'' });
+        this.$store.commit('setSearchShow', false);
         this.chooseSymp.push(item);
-        this.checkText = this.$store.state.symptom.text;
+        const sympText = this.getSympText();
+        this.getPush(sympText);
+        // this.checkText = this.$store.state.symptom.text;
       }
     },
     showDetil(item,flg) {//搜索点开的详情
       this.tmpItem=item
       this.isSearch=flg||false
-      this.common(item,flg);
-    },
-    touchend(item,flg) {//症状点开详情
-      clearTimeout(this.timer);
-      this.end = this.$store.state.scroll;
-      if(JSON.stringify(this.start)!== JSON.stringify(this.end)){
-        return;
-      }
-      let endTime = +new Date();
-      if(endTime - this.startTime < 500){//点击事件
-        this.common(item,flg);
-      }
-      this.startTime = "";
-    },
-    showAllLabel(){
-      this.showAll = !this.showAll;
+      let num = this.chooseSymp.length+1;
+      this.common(item,num,flg);
     },
     getSympText() {//推送使用医生端信息
       const text = this.$store.state.symptom.text;
@@ -266,26 +356,54 @@ export default {
       api.getPush(param).then((res) => {
         const result = res.data;
         if (result.code == 0) {
-          this.symp = result.data.symptom;
+          let symp = result.data.symptom||[];
+          let symped = JSON.parse(JSON.stringify(this.chooseSymp));//已选症状
+          let sympStic = JSON.parse(localStorage.getItem('staticSymp'))||[];//首次有无症状
+          let sympAll = sympStic.concat(symp);
+          var obj = {};
+          sympAll = sympAll.reduce(function(item, next) {
+            obj[next.name] ? '' : obj[next.name] = true && item.push(next);
+            return item;
+          }, []);
+          for(let i = 0;i < symped.length;i++){//去掉已选的已选症状
+            for(let j = 0;j < sympAll.length;j++){//去掉
+              if(sympAll[j].name == symped[i].name){
+                sympAll.splice(j,1)
+              }
+            }
+          }
+          this.symp = sympAll.slice(0,12);
+          this.$refs.showHide.style.height = 'auto'
         }
+      }).catch(()=>{
+
       })
     },
     deletSymp(item, index) {
       this.delIndex = index;
       this.questId = item.questionId || item.id || item.conceptId;
+
       if (this.chooseSymp.length == 1) {
-        this.delText = "是否删除该信息?<br/>删除后将重新填写预问诊流程 <br/>(已填内容将清除)"
+        if(item.idx != 1){
+          this.delText = "是否删除该信息?<br/>删除后将重新填写预问诊流程 <br/>"
+        }else{
+          this.delText = "是否删除该信息?<br/>删除后将重新填写预问诊流程 <br/>(已填内容将清除)"
+        }
+      }else{
+        if(item.idx != 1){
+          this.delText = "是否删除该信息?"
+        }
       }
       this.showToast = true;
       $(".btscroll").css({'position':'fixed'})
-      $(".foot").css({'position':'fixed'})
+      $(".foot").css({'position':'fixed','bottom':'0'})
     },
     comfirnDel() {
-      $(".btscroll").css({'position':'absolute'})
+      $(".btscroll").css({'position':'absolute','top':'0'})
+      $(".foot").css({'position':'absolute','bottom':'0'})
       this.chooseSymp.splice(this.delIndex, 1);
       this.checkText.splice(this.delIndex, 1);
-      this.$store.commit('delText', { type: moduleCP['symp'], pId: this.questId });
-      console.log(this.$store.state)
+      this.$store.commit('delText', { type: moduleCP['symp'], pId: this.questId })
       // 删除setDatas数据,防止回读
       this.$store.commit('setDatas', { type: moduleCP['symp'], pId: this.questId ,data:''})
       // 删除完-常见;其他-推送
@@ -302,50 +420,43 @@ export default {
       this.cancelDel();
     },
     cancelDel() {
-      $(".btscroll").css({'position':'absolute'})
+      $(".btscroll").css({'position':'absolute','top':'0'})
+      $(".foot").css({'position':'absolute','bottom':'0'})
       this.showToast = false;
       this.delIndex = null;
       this.questId = null;
       this.delText = "是否删除该信息?<br/>(已填内容将清除)";
     },
-    showChecked(item) {
+    showChecked(item,i) {
       const origin = this.$store.state.symptom.origin;
       const read = this.$store.state.symptom.datas;
       const data = read[(item.questionId||item.id)] || origin[(item.questionId||item.id)];
       if (data&&data.questionMapping && data.questionMapping.length > 0) {
-        this.$store.commit('setDetail',{detail:data,ppId:null,moduleType:moduleCP['symp']})
+        this.$store.commit('setDetail',{detail:data,ppId:null,moduleType:moduleCP['symp'],sign:1,idx:i})       
       }
     },
   },
   components: {
-    DetailBox,
     Toast,
     Search,
-    Tiptoast
-  },
-  watch:{
-    checkText:{//更新推送
-      handler(newVal,oldVal){
-        const sympText = this.getSympText();
-        if(sympText){
-          this.getPush(sympText);
-          this.quesText = "请问您还有其他不适吗?";
-        }else{
-          this.getSympList();
-          this.quesText = "请问您这次哪里最不舒服?";
-        }
-      },
-      deep:true
-    }
+    Tiptoast,
+    Submit
   }
 }
 </script>
 <style lang="less" scoped>
 @import "../less/base.less";
-
+.showHide {
+  overflow: hidden;
+  height: 3rem;
+}
+.tip span {
+  color: #colors[theme];
+  float: right;
+  font-size: .28rem;
+}
 .symp-wrap {
   font-size: 0.3rem;
-  // .btscroll;
   .quest {
     color: #colors[quest];
     margin-bottom: 0.36rem;
@@ -359,15 +470,16 @@ export default {
 }
 .choose{
   padding-bottom: .2rem;
+  position: relative;
+  left: -0.12rem;
   .choo-symp{
       display: inline-block;
-      min-width:1.9rem;
+      min-width:2rem;
       height: .74rem;
-      background: linear-gradient(-270deg, #3638EE, #4E72FF);
-      box-shadow: 0 .08rem .16rem 0 rgba(79,129,255,0.40);
+      background: #colors[btn];
       border-radius: .08rem;
       white-space: nowrap;
-      margin: 0 .25rem .3rem 0;
+      margin: 0 .12rem .3rem 0.12rem;
       span{
         display: inline-block;
         vertical-align: top;
@@ -384,21 +496,20 @@ export default {
         height: .74rem;
       }
     }
-    .choo-symp:last-child{
-      margin-right: 0;
-    }
+    // .choo-symp:nth-child(3n+3){
+    //   margin-right: 0;
+    // }
   .label{
     .label;
   }
   .result{
     padding-right: .3rem;
-    .title{
-      color: #4F50FF;
-      padding-left: .1rem;
-      border-left: .08rem solid #4F50FF;
-      margin-bottom: .19rem;
-      font-weight: 700;
-    }
+    // .title{
+    //   color: #colors[btn];
+    //   padding-left: .1rem;
+    //   margin-bottom: .19rem;
+    //   font-weight: 700;
+    // }
     p{
       color: #666;
       line-height: .44rem;
@@ -410,18 +521,6 @@ export default {
 }
 .label{
   .label;
-  .show-all{
-    text-align: right;
-    color: #4f7aff;
-    font-size: 0.25rem;
-    height:35px;
-    line-height: 35px;
-    float: right;
-   /* width: 80px;
-    border:1px #4f7aff solid;
-    border-radius: 5px;
-    margin: auto;*/
-  }
 }
 .result{
   .result;
@@ -430,6 +529,6 @@ export default {
   .footer;
 }
 .nofoot{
-  background:#CACCFF;
+  background:#CACCFF!important;
 }
 </style>

+ 16 - 9
src/components/TabPage.vue

@@ -7,8 +7,9 @@
         :key="it.id"
         @click="clickTab(it,index)">
         <span :class="{current:index==number,comp:finish[it.type]}" v-if="type[it.type]==1">
-          <i>{{index+1}}</i>
+          <i class="order">{{index+1}}</i>
           {{it.name}}
+          <i class="line" v-if="index==number"></i>
         </span>
       </p>
     </div>
@@ -21,7 +22,6 @@
           :nameStr="item.name"
           :modluesLen="modluesLen"
         />
-      
         <DiagTreat
           v-if="flag==moduleCP['diagT']&&item.type==moduleCP['diagT']&&moduleShow"
           :datas="item"
@@ -31,7 +31,6 @@
           @next="toNext"
           @back="beBack"
         />
-
         <Others
           v-if="flag==moduleCP['other']&&item.type==moduleCP['other']&&moduleShow"
           :modluesLen="modluesLen"
@@ -60,7 +59,7 @@
     </div>
     <!-- 详情页 -->
     <div class="detail" v-if="this.$store.state.detailShow">
-    <DetailBox />
+      <DetailBox :flags="flag"/>
     </div>
   </div>
 </template>
@@ -221,6 +220,7 @@ export default {
   height: 100%;
   padding-bottom: 0.88rem;
   padding-top: 0.82rem;
+  background-color: #fff;
   .tab {
     position: fixed;
     top: 0;
@@ -239,7 +239,7 @@ export default {
       box-sizing: border-box;
     }
     span {
-      font-size: 0.24rem;
+      font-size: 0.28rem;
       display: inline-block;
       vertical-align: top;
       width: 100%;
@@ -247,19 +247,26 @@ export default {
       line-height: 0.5rem;
       color: #colors[text];
       text-align: center;
+      position: relative;
+    }
+    .line {
+      width: .6rem;
+      height: .04rem;
+      background-color: #colors[btn];
+      display: inline-block;
+      position: relative;
+      bottom: .2rem;
     }
     .current {
-      color: #0043e8;
-      background: #e5ecfc;
+      color: #colors[btn];
       border-radius: 25px;
     }
     .comp{
-      color: #0043e8;
+      color: #colors[btn];
     }
 }
   .content {
     font-size: 0.3rem;
-    padding: 0.45rem 0 0.45rem 0.3rem;
   }
 }
 </style>

二进制
src/images/addimg.png


二进制
src/images/closeimg.png


二进制
src/images/icon_close@2x.png


文件差异内容过多而无法显示
+ 1 - 0
src/images/important.svg


二进制
src/images/iptdis.png


二进制
src/images/iptselect.png


二进制
src/images/person.png


二进制
src/images/slideT.png


二进制
src/images/topContent.png


+ 76 - 22
src/less/base.less

@@ -3,10 +3,13 @@
 // @theme-color:#4F50FF;
 // 命名空间和访问符,映射
 #colors(){
-  theme:#4F50FF; //主题色,选中色
+  theme:#6678FF; //主题色,选中色
   text:#7C828E; //患者信息及选项文字颜色
-  quest:#000000; //问题颜色
+  quest:#333333; //问题颜色
   exclu:#e6e7e9; //互斥文字颜色
+  btn:#6678FF;//按钮颜色
+  line:#E6E6E6;//按钮颜色
+  bgques:#F9F9F9;//问题背景颜色
 }
 .mask{
   width:100%;
@@ -18,42 +21,58 @@
 }
 .footer{
   width:100%;
-  height: .88rem;
-  line-height: .88rem;
   text-align: center;
-  color:#fff;
-  font-size: .32rem;
-  background: linear-gradient(-270deg, #4F4FFF,#4F8BFF);
-  position: fixed;
+  position: absolute;
   bottom: 0;
   left: 0;
   z-index: 998;
+  padding: .22rem .3rem .18rem .3rem;
+  box-sizing: border-box;
+  box-shadow:0px -2px 10px 0px rgba(0,0,0,0.06);
+  font-size: .32rem;
+  background-color: #fff;
+  .nextBtn {
+    color:#fff;
+    height: .88rem;
+    line-height: .88rem;
+    background: #colors[btn];
+    border-radius: 5px;
+  }
 }
 .dbfooter{
   width:100%;
   font-size: .32rem;
-  position: fixed;
+  position: absolute;
   bottom: 0;
   left: 0;
-  background: #e5ecfc;
+  background: #fff;
   z-index: 66;
+  padding: .22rem .3rem .18rem .3rem;
+  box-sizing: border-box;
+  box-shadow:0px -2px 10px 0px rgba(0,0,0,0.06);
   display: flex;
   justify-content: space-between;
+  overflow: hidden;
   .back,.next{
     display: inline-block;
     height: .88rem;
     line-height: .88rem;
     text-align: center;
     vertical-align: top;
+    border: 1px solid #colors[theme];  
+    box-sizing: border-box;
+    border-radius: 5px;
   }
   .back{
-    width: 40%;
-    color: #0043E8;
+    width: 48%;
+    float: left;
+    color: #colors[theme];
   }
   .next{
-    width: 58%;
+    width: 48%;
     color: #fff;
-    background: linear-gradient(-270deg, #4F4FFF,#4F8BFF);
+    float: right;
+    background: #colors[theme];
   }
 }
 .over{
@@ -63,7 +82,7 @@
   padding-bottom: .2rem;
   .symp{
     display: inline-block;
-    min-width:1.9rem;
+    min-width:2rem;
     height: .74rem;
     line-height: .74rem;
     border: 1px solid #DFE0E4;
@@ -89,19 +108,32 @@
 }
 
 .result{
-  padding-right: .3rem;
+  // padding-right: .3rem;
   .title{
-    // color: #4F50FF;
-    // color: #colors[theme];
-    padding-left: .1rem;
-    border-left: .08rem solid #colors[theme];
+    color: #333;
+    // padding-left: .1rem;
     margin-bottom: .19rem;
     font-weight: 700;
+    .line {
+      width: .08rem;
+      height: .32rem;
+      background-color: #colors[btn];
+      display: inline-block;
+      border-radius: .04rem;
+      position: relative;
+      top: .03rem;
+      margin-right: .08rem;
+    }
   }
-  p{
+  p {
     color: #666;
     line-height: .44rem;
   }
+  .bgResult {
+    background-color: #f5f5f5;
+    padding: .24rem;
+    border-radius: 5px;
+  }
 }
 
 .btscroll {
@@ -109,16 +141,38 @@
   height: 100%;
   width: 100%;
   left: 0;
+  top: 0;
   padding-left: .3rem;
   padding-right: .3rem;
   z-index: 99;
   box-sizing: border-box;
+  background-color: #fff;
   .content {
-    padding-bottom: 2.3rem;
+    padding-bottom: 1.5rem;
     box-sizing: border-box;
+    padding-top:1rem;
   }
 }
 
 .toastWrapper {
   background-color: #colors[quest];
+}
+.bgques {//问题内容
+  padding: .24rem .3rem .2rem .3rem;
+  // display: none;
+}
+.pubques {//问题题目
+  font-size: .32rem;
+  // font-weight: 800;
+  padding: .4rem 0.5rem .4rem .3rem;
+  word-break: break-all;
+  background-color: #fff;
+  box-shadow:0px 2px 8px 0px rgba(0,0,0,0.07);
+}
+
+.displayBlock {
+  display: block !important;
+}
+.displayNone {
+  display: none !important;
 }

+ 1 - 1
src/less/index.less

@@ -3,7 +3,7 @@ body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, input, textarea, p, t
   margin: 0;
   padding: 0;
   font-family: Arial, sans-serif, "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB";
-  color: #323232;
+  color: #333333;
   // -webkit-text-size-adjust:100%;
   -webkit-text-size-adjust:auto;
   -webkit-tap-highlight-color: rgba(0,0,0,0);

+ 13 - 0
src/main.js

@@ -4,12 +4,25 @@ import store from './store.js';
 import App from './App.vue';
 import preview from 'vue-photo-preview';
 import 'vue-photo-preview/dist/skin.css';
+import VueAwesomeSwiper from 'vue-awesome-swiper'
+import 'swiper/dist/css/swiper.css'
 import PortalVue from 'portal-vue';
 import './utils/getfile.js';
 // import {Picker} from 'vant';
 import Picker from 'vant/lib/picker';
 import 'vant/lib/picker/style';
+
+
 Vue.use(PortalVue);
+
+Vue.use(VueAwesomeSwiper,{
+  direction:'vertical',
+  // loop:true,
+  slidesPerView: 3,
+  spaceBetween: 0,
+  freeMode: false,
+})
+
 Vue.use(preview);
 Vue.use(Picker);
 Vue.config.productionTip = false;

+ 15 - 6
src/store.js

@@ -9,7 +9,9 @@ const store = new Vuex.Store({
     pathInfo:{}, //患者信息-后续提交要用
     sysConfig:[], //系统配置项
     allMoudles:[], //模板
-    scroll:{},
+    scroll:{
+      x:0,y:0
+    },
     symptom:{ //症状情况
       choose:[],
       origin:{},
@@ -72,8 +74,17 @@ const store = new Vuex.Store({
       if(JSON.stringify(detail)=='{}'){
         state.detailShow = false;
       }else{
-        state.detailInfo = Object.assign({},param);
-        state.detailShow = true;
+        if(param.sign!=1){
+          state.detailInfo = Object.assign({},param);
+          state.detailShow = true;
+        }else{
+          if(param.idx == 0&&detail.idx == 1){
+            state.detailInfo = Object.assign({},param);
+            state.detailShow = true;
+          }else{
+            state.detailShow = false;
+          }
+        }
       }
     },
     setSearchShow(state,flg){//搜索显示与否
@@ -207,10 +218,8 @@ const store = new Vuex.Store({
                 return
               }
             }
-            text.push(param);
-          }else{
-            text.push(param);
           }
+          text.push(param);
           break;
         case moduleCP['diagT']: //诊疗情况
           let diaText = JSON.parse(JSON.stringify(state.diagnose.text)); 

+ 5 - 0
src/utils/api.js

@@ -3,6 +3,7 @@ import axios from 'axios';
 const urls = {
   getPathInfo:'/api/prec/patientInfo/getTopPatientInfo',//患者信息
   getSysConfig:'/api/prec/sysSet/getSysSetInfoDatas',//配置项
+  getHospitalDatas:'/api/prec/sysSet/getHospitalDatas',//获取医院列表
   recordCheck:'/api/prec/inquiryInfo/recordCheck',//校验是否已做过
   getAll:'/api/prec/moduleInfo/getAll',//获取模板
   getSymptom:'/api/prec/questionUsual/getQuestionUsual',//常用症状
@@ -11,12 +12,16 @@ const urls = {
   saveInquiry:'/api/prec/inquiryInfo/saveInquiry',//保存问诊记录
   uploadImageThum:'/api/prec/file/uploadImageThum',//单个文件上传同时生成缩略图
   uploadImageThums:'/api/prec/file/uploadImageThums',//多个文件上传同时生成缩略图
+  // uploadImageThums:'http://192.168.3.117:5050/api/prec/file/uploadImageThums',//多个文件上传同时生成缩略图
   getTagInfos:'/api/prec/retrieval/getTagInfos',//检索
   signIn:'/api/prec/patientInfo/signIn',//登录
   // uploadImageThums:'http://192.168.3.1:8849/file/uploadImageThums',//多个文件上传同时生成缩略图
 }
 
 export default {
+  getHospitalDatas(param){
+    return axios.post(urls.getHospitalDatas,param)
+  },
   getPathInfo(param){
     return axios.post(urls.getPathInfo,param)
   },

+ 19 - 12
src/utils/tools.js

@@ -245,7 +245,7 @@ function fixedKeyboard() {
           activeElement.scrollIntoView(true);
           let top = $('.main').scrollTop();
           let tops = $('.detailBoxMain').css("transform").replace(/[^0-9\-,]/g,'').split(',')[5];
-          console.log(tops,4444)
+          // console.log(tops,4444)
           $('.main').scrollTop(top-30); //预留题目位置
           $('.detailBoxMain').css({"transform":'translate(0px, -'+tops+'"30") scale(1) translateZ("0px")'}); // translate(0px, -47px) scale(1) translateZ(0px);
 
@@ -282,19 +282,26 @@ function trimDots(str){
 }
 
 // 拼值,并去掉占位符
-function concatVal(data,flg){
+function concatVal(data,flg,flag){
   let value = ""; //医生
   let valueP = ""; //患者
   let tmpStrHas = [],tmpStrNo = [],tmpAll=[];
   if(flg){
-    tmpStrHas = data.filter((item)=>item.select == 1)
-    tmpStrNo = data.filter((item)=>item.select == 2)
-    tmpAll = tmpStrHas.concat(tmpStrNo)
-    for(let k in tmpAll){
-      let tmpStr = tmpAll[k].select==1?'有':'无';
-      value += tmpStr+tmpAll[k].name.replace(patt,'') + ',';
-      valueP += tmpStr+(tmpAll[k].description || tmpAll[k].name).replace(patt,'') + ',';
+    tmpStrHas = data.filter((item)=>(item.select == 1&&item.flg==1))
+    tmpStrNo = data.filter((item)=>(item.select == 1&&item.flg == 2))
+    // tmpAll = tmpStrHas.concat(tmpStrNo)
+    let valH='',valN='',valPH='',valPN='';
+    for(let k in tmpStrHas){
+      valH += tmpStrHas[k].name.replace(patt,'') + ',';
+      valPH += (tmpStrHas[k].description || tmpStrHas[k].name).replace(patt,'') + ',';
     }
+    for(let k in tmpStrNo){
+      valN += tmpStrNo[k].name.replace(patt,'') + ',';
+      valPN += (tmpStrNo[k].description || tmpStrNo[k].name).replace(patt,'') + ',';
+    }
+    // console.log(valN)
+    value = ((valH!='')?('有:'+valH):'')+((valN!='')?('无:'+valN):'');
+    valueP = ((valPH!='')?('有:'+valPH):'')+((valPN!='')?('无:'+valPN):'');
   }else{
     for(let k in data){
       if(data[k].select){
@@ -304,8 +311,8 @@ function concatVal(data,flg){
           value += str + ',';
           valueP += strP + ',';
         }else{
-          value += data[k].name.replace(patt,'') + ',';
-          valueP += (data[k].description || data[k].name).replace(patt,'') + ',';
+          value += data[k].name.replace(patt,'') +( flag == 2?'、':',');
+          valueP += (data[k].description || data[k].name).replace(patt,'') + (flag == 2?'、':',');
         }
       }
     }
@@ -320,7 +327,7 @@ function setScroll(scroll,flg,wrapper){
       click: true,
       tap: true,
       probeType:3,
-      // bounceTime:800,
+      bounceTime:800,
       momentumLimitTime:300,//只有在屏幕上快速滑动的时间小于 momentumLimitTime,才能开启 momentum 动画。
       momentumLimitDistance:15,//只有在屏幕上快速滑动的距离大于 momentumLimitDistance,才能开启 momentum 动画。
       swipeTime:500,//设置 momentum 动画的动画时长