Browse Source

Merge branch 'master' of http://47.101.159.18:3000/Muchinfo/MTP20_WEB_GLOBAL

zhou.xiaoning 2 years ago
parent
commit
3c7638b4a0
73 changed files with 1071 additions and 2636 deletions
  1. 4 200
      package-lock.json
  2. 1 3
      package.json
  3. 1 1
      public/config/appconfig.json
  4. 430 0
      public/config/router.json
  5. 6 6
      src/business/bank/index.ts
  6. 4 1
      src/business/common/index.ts
  7. 10 5
      src/business/login/index.ts
  8. 3 1
      src/business/user/address.ts
  9. 28 0
      src/constants/certificate.ts
  10. 2 4
      src/hooks/echarts/timeline/index.ts
  11. 0 33
      src/mock/goods.ts
  12. 0 17
      src/mock/index.ts
  13. 0 30
      src/mock/quote.ts
  14. 0 492
      src/mock/router.ts
  15. 1 6
      src/packages/gstj/components/modules/quote/chart/index.vue
  16. 30 30
      src/packages/gstj/components/modules/quote/forex/index.vue
  17. 2 12
      src/packages/gstj/components/modules/quote/index.vue
  18. 15 11
      src/packages/gstj/components/modules/quote/tik/index.vue
  19. 2 10
      src/packages/gstj/views/goods/detail/Index.vue
  20. 1 6
      src/packages/mobile/components/modules/quote/chart/index.vue
  21. 30 30
      src/packages/mobile/components/modules/quote/forex/index.vue
  22. 2 12
      src/packages/mobile/components/modules/quote/index.vue
  23. 15 11
      src/packages/mobile/components/modules/quote/tik/index.vue
  24. 2 10
      src/packages/mobile/views/goods/detail/Index.vue
  25. 3 12
      src/packages/mobile/views/market/detail/Index.vue
  26. 0 1
      src/packages/pc/components/layouts/sidebar/index.vue
  27. 4 0
      src/packages/pc/components/modules/listing/index.less
  28. 6 6
      src/packages/pc/components/modules/listing/index.vue
  29. 1 7
      src/packages/pc/components/modules/quote/chart/index.vue
  30. 8 1
      src/packages/pc/components/modules/quote/forex/index.less
  31. 30 30
      src/packages/pc/components/modules/quote/forex/index.vue
  32. 2 12
      src/packages/pc/components/modules/quote/index.vue
  33. 11 11
      src/packages/pc/components/modules/quote/price/index.vue
  34. 5 4
      src/packages/pc/components/modules/quote/tik/index.less
  35. 21 17
      src/packages/pc/components/modules/quote/tik/index.vue
  36. 0 1
      src/packages/pc/main.ts
  37. 2 2
      src/packages/pc/views/account/address/index.vue
  38. 2 0
      src/packages/pc/views/account/receipt/index.vue
  39. 1 1
      src/packages/pc/views/account/sign/index.vue
  40. 0 1
      src/packages/pc/views/footer/capital/statement/index.vue
  41. 22 8
      src/packages/pc/views/footer/capital/summary/withdraw/index.vue
  42. 13 9
      src/packages/pc/views/footer/goods/position/index.vue
  43. 2 2
      src/packages/pc/views/footer/performance/components/contracted/index.vue
  44. 2 12
      src/packages/pc/views/market/trade/goods/detail/components/chart/index.vue
  45. 11 10
      src/packages/pc/views/market/trade/goods/index.vue
  46. 8 4
      src/packages/pc/views/market/trade/spot/index.vue
  47. 163 0
      src/packages/pc/views/market/trade/spot/listing/index.vue
  48. 3 0
      src/packages/pc/views/market/trade/spot/order/index.vue
  49. 1 2
      src/packages/pc/views/query/capital/history/index.vue
  50. 0 1
      src/packages/pc/views/query/capital/list/index.vue
  51. 1 1
      src/packages/pc/views/query/order/goods/history/index.vue
  52. 1 1
      src/packages/pc/views/query/order/spot/history/index.vue
  53. 30 2
      src/packages/pc/views/query/performance/buy/all/index.vue
  54. 30 2
      src/packages/pc/views/query/performance/sell/all/index.vue
  55. 1 1
      src/packages/pc/views/query/trade/goods/history/index.vue
  56. 1 1
      src/packages/pc/views/query/trade/spot/history/index.vue
  57. 1 6
      src/packages/sbyj/components/modules/quote/chart/index.vue
  58. 30 30
      src/packages/sbyj/components/modules/quote/forex/index.vue
  59. 2 12
      src/packages/sbyj/components/modules/quote/index.vue
  60. 15 11
      src/packages/sbyj/components/modules/quote/tik/index.vue
  61. 9 7
      src/services/api/account/index.ts
  62. 2 0
      src/services/api/bank/index.ts
  63. 3 1
      src/services/api/common/index.ts
  64. 1 1
      src/services/api/credit/index.ts
  65. 4 12
      src/services/api/goods/index.ts
  66. 11 0
      src/services/api/market/index.ts
  67. 11 2
      src/services/websocket/trade.ts
  68. 1 4
      src/shims-vue.d.ts
  69. 2 2
      src/stores/modules/futures.ts
  70. 1 1
      src/stores/modules/menu.ts
  71. 2 0
      src/types/model/goods.d.ts
  72. 1 0
      src/types/model/market.d.ts
  73. 1 1454
      src/types/proto/proto.d.ts

+ 4 - 200
package-lock.json

@@ -21,7 +21,6 @@
         "long": "^5.2.0",
         "moment": "^2.29.3",
         "photoswipe": "^5.3.6",
-        "protobufjs": "^6.11.2",
         "qrcode": "^1.5.1",
         "sortablejs": "^1.15.0",
         "uuid": "^8.3.2",
@@ -50,7 +49,6 @@
         "eslint-plugin-vue": "^8.0.3",
         "less": "^4.0.0",
         "less-loader": "^8.0.0",
-        "mockjs-x": "^1.0.1-beta5",
         "postcss": "7.0.32",
         "postcss-px-to-viewport": "^1.1.1",
         "resize-observer-polyfill": "^1.5.1",
@@ -1966,60 +1964,6 @@
       "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
       "dev": true
     },
-    "node_modules/@protobufjs/aspromise": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
-      "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
-    },
-    "node_modules/@protobufjs/base64": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
-      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
-    },
-    "node_modules/@protobufjs/codegen": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
-      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
-    },
-    "node_modules/@protobufjs/eventemitter": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
-      "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
-    },
-    "node_modules/@protobufjs/fetch": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
-      "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
-      "dependencies": {
-        "@protobufjs/aspromise": "^1.1.1",
-        "@protobufjs/inquire": "^1.1.0"
-      }
-    },
-    "node_modules/@protobufjs/float": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
-      "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
-    },
-    "node_modules/@protobufjs/inquire": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
-      "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
-    },
-    "node_modules/@protobufjs/path": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
-      "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
-    },
-    "node_modules/@protobufjs/pool": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
-      "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
-    },
-    "node_modules/@protobufjs/utf8": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
-      "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
-    },
     "node_modules/@sideway/address": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -2279,11 +2223,6 @@
         "@types/lodash": "*"
       }
     },
-    "node_modules/@types/long": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
-      "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
-    },
     "node_modules/@types/mime": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
@@ -2299,7 +2238,8 @@
     "node_modules/@types/node": {
       "version": "17.0.24",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz",
-      "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g=="
+      "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==",
+      "dev": true
     },
     "node_modules/@types/normalize-package-data": {
       "version": "2.4.1",
@@ -9693,18 +9633,6 @@
         "mkdirp": "bin/cmd.js"
       }
     },
-    "node_modules/mockjs-x": {
-      "version": "1.0.1-beta5",
-      "resolved": "https://registry.npmmirror.com/mockjs-x/-/mockjs-x-1.0.1-beta5.tgz",
-      "integrity": "sha512-entZrUc5lOJ+af4jcM+OM7QiKp0Usszi7DKYIKX2oIss6k+cUC94BxcsJ35oN1Vm4XqqomlVIAyNFWMHTeZ67g==",
-      "dev": true,
-      "dependencies": {
-        "commander": "*"
-      },
-      "bin": {
-        "random": "bin/random"
-      }
-    },
     "node_modules/module-alias": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz",
@@ -10575,36 +10503,6 @@
         "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
       }
     },
-    "node_modules/protobufjs": {
-      "version": "6.11.2",
-      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz",
-      "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==",
-      "hasInstallScript": true,
-      "dependencies": {
-        "@protobufjs/aspromise": "^1.1.2",
-        "@protobufjs/base64": "^1.1.2",
-        "@protobufjs/codegen": "^2.0.4",
-        "@protobufjs/eventemitter": "^1.1.0",
-        "@protobufjs/fetch": "^1.1.0",
-        "@protobufjs/float": "^1.0.2",
-        "@protobufjs/inquire": "^1.1.0",
-        "@protobufjs/path": "^1.1.2",
-        "@protobufjs/pool": "^1.1.0",
-        "@protobufjs/utf8": "^1.1.0",
-        "@types/long": "^4.0.1",
-        "@types/node": ">=13.7.0",
-        "long": "^4.0.0"
-      },
-      "bin": {
-        "pbjs": "bin/pbjs",
-        "pbts": "bin/pbts"
-      }
-    },
-    "node_modules/protobufjs/node_modules/long": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
-      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
-    },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
@@ -14840,60 +14738,6 @@
       "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
       "dev": true
     },
-    "@protobufjs/aspromise": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
-      "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
-    },
-    "@protobufjs/base64": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
-      "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
-    },
-    "@protobufjs/codegen": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
-      "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
-    },
-    "@protobufjs/eventemitter": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
-      "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
-    },
-    "@protobufjs/fetch": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
-      "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
-      "requires": {
-        "@protobufjs/aspromise": "^1.1.1",
-        "@protobufjs/inquire": "^1.1.0"
-      }
-    },
-    "@protobufjs/float": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
-      "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
-    },
-    "@protobufjs/inquire": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
-      "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
-    },
-    "@protobufjs/path": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
-      "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
-    },
-    "@protobufjs/pool": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
-      "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
-    },
-    "@protobufjs/utf8": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
-      "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
-    },
     "@sideway/address": {
       "version": "4.1.4",
       "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
@@ -15125,11 +14969,6 @@
         "@types/lodash": "*"
       }
     },
-    "@types/long": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
-      "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w=="
-    },
     "@types/mime": {
       "version": "1.3.2",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
@@ -15145,7 +14984,8 @@
     "@types/node": {
       "version": "17.0.24",
       "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.24.tgz",
-      "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g=="
+      "integrity": "sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==",
+      "dev": true
     },
     "@types/normalize-package-data": {
       "version": "2.4.1",
@@ -20596,15 +20436,6 @@
         "minimist": "^1.2.6"
       }
     },
-    "mockjs-x": {
-      "version": "1.0.1-beta5",
-      "resolved": "https://registry.npmmirror.com/mockjs-x/-/mockjs-x-1.0.1-beta5.tgz",
-      "integrity": "sha512-entZrUc5lOJ+af4jcM+OM7QiKp0Usszi7DKYIKX2oIss6k+cUC94BxcsJ35oN1Vm4XqqomlVIAyNFWMHTeZ67g==",
-      "dev": true,
-      "requires": {
-        "commander": "*"
-      }
-    },
     "module-alias": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz",
@@ -21269,33 +21100,6 @@
         "log-update": "^2.3.0"
       }
     },
-    "protobufjs": {
-      "version": "6.11.2",
-      "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz",
-      "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==",
-      "requires": {
-        "@protobufjs/aspromise": "^1.1.2",
-        "@protobufjs/base64": "^1.1.2",
-        "@protobufjs/codegen": "^2.0.4",
-        "@protobufjs/eventemitter": "^1.1.0",
-        "@protobufjs/fetch": "^1.1.0",
-        "@protobufjs/float": "^1.0.2",
-        "@protobufjs/inquire": "^1.1.0",
-        "@protobufjs/path": "^1.1.2",
-        "@protobufjs/pool": "^1.1.0",
-        "@protobufjs/utf8": "^1.1.0",
-        "@types/long": "^4.0.1",
-        "@types/node": ">=13.7.0",
-        "long": "^4.0.0"
-      },
-      "dependencies": {
-        "long": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
-          "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
-        }
-      }
-    },
     "proxy-addr": {
       "version": "2.0.7",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",

+ 1 - 3
package.json

@@ -27,7 +27,6 @@
     "long": "^5.2.0",
     "moment": "^2.29.3",
     "photoswipe": "^5.3.6",
-    "protobufjs": "^6.11.2",
     "qrcode": "^1.5.1",
     "sortablejs": "^1.15.0",
     "uuid": "^8.3.2",
@@ -56,7 +55,6 @@
     "eslint-plugin-vue": "^8.0.3",
     "less": "^4.0.0",
     "less-loader": "^8.0.0",
-    "mockjs-x": "^1.0.1-beta5",
     "postcss": "7.0.32",
     "postcss-px-to-viewport": "^1.1.1",
     "resize-observer-polyfill": "^1.5.1",
@@ -64,4 +62,4 @@
     "vconsole": "^3.14.6",
     "worker-loader": "^3.0.8"
   }
-}
+}

+ 1 - 1
public/config/appconfig.json

@@ -1,5 +1,5 @@
 {
   "version": "1.0.0",
   "versionCode": "100000",
-  "apiUrl": "http://192.168.31.171:8080/cfg?key=test_171"
+  "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204"
 }

+ 430 - 0
public/config/router.json

@@ -0,0 +1,430 @@
+[
+    {
+        "authType": 2,
+        "sort": 0,
+        "title": "底部单据菜单",
+        "code": "bottom",
+        "children": [
+            {
+                "authType": 2,
+                "sort": 1,
+                "title": "资金信息",
+                "code": "bottom_capital",
+                "component": "views/footer/index.vue",
+                "children": [
+                    {
+                        "authType": 2,
+                        "sort": 1,
+                        "title": "资金汇总",
+                        "code": "bottom_capital_summary",
+                        "component": "views/footer/capital/summary/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 2,
+                        "title": "资金流水",
+                        "code": "bottom_capital_statement",
+                        "component": "views/footer/capital/statement/index.vue"
+                    }
+                ]
+            },
+            {
+                "authType": 2,
+                "sort": 2,
+                "title": "商品订单",
+                "code": "bottom_goods",
+                "component": "views/footer/index.vue",
+                "children": [
+                    {
+                        "authType": 2,
+                        "sort": 1,
+                        "title": "合约汇总",
+                        "code": "bottom_goods_position",
+                        "component": "views/footer/goods/position/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 2,
+                        "title": "委托",
+                        "code": "bottom_goods_order",
+                        "component": "views/footer/goods/order/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 3,
+                        "title": "成交",
+                        "code": "bottom_goods_trade",
+                        "component": "views/footer/goods/trade/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 4,
+                        "title": "交收",
+                        "code": "bottom_goods_delivery",
+                        "component": "views/footer/goods/delivery/index.vue"
+                    }
+                ]
+            },
+            {
+                "authType": 2,
+                "sort": 3,
+                "title": "现货仓单",
+                "code": "bottom_spot",
+                "component": "views/footer/index.vue",
+                "children": [
+                    {
+                        "authType": 2,
+                        "sort": 1,
+                        "title": "现货明细",
+                        "code": "bottom_spot_position",
+                        "component": "views/footer/spot/position/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 2,
+                        "title": "挂单",
+                        "code": "bottom_spot_order",
+                        "component": "views/footer/spot/order/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 3,
+                        "title": "成交",
+                        "code": "bottom_spot_trade",
+                        "component": "views/footer/spot/trade/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 4,
+                        "title": "提货",
+                        "code": "bottom_spot_pickup",
+                        "component": "views/footer/spot/pickup/index.vue"
+                    }
+                ]
+            },
+            {
+                "authType": 2,
+                "sort": 4,
+                "title": "履约信息",
+                "code": "bottom_performance",
+                "component": "views/footer/index.vue",
+                "children": [
+                    {
+                        "authType": 2,
+                        "sort": 1,
+                        "title": "买履约",
+                        "code": "bottom_performance_buy",
+                        "component": "views/footer/performance/buy/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 2,
+                        "title": "卖履约",
+                        "code": "bottom_performance_sell",
+                        "component": "views/footer/performance/sell/index.vue"
+                    }
+                ]
+            }
+        ]
+    },
+    {
+        "authType": 1,
+        "sort": 1,
+        "title": "交易市场",
+        "code": "market",
+        "url": "/market",
+        "urlType": 1,
+        "component": "Page",
+        "icon": "TrendCharts",
+        "children": [
+            {
+                "authType": 1,
+                "sort": 1,
+                "title": "交易市场",
+                "code": "market_trade",
+                "url": "trade",
+                "urlType": 1,
+                "component": "Main",
+                "children": [
+                    {
+                        "authType": 1,
+                        "sort": 1,
+                        "title": "订单交易",
+                        "code": "market_trade_goods",
+                        "url": "goods",
+                        "urlType": 1,
+                        "component": "views/market/trade/goods/index.vue"
+                    },
+                    {
+                        "authType": 1,
+                        "sort": 2,
+                        "title": "仓单交易",
+                        "code": "market_trade_spot",
+                        "url": "spot",
+                        "urlType": 1,
+                        "component": "views/market/trade/spot/index.vue"
+                    }
+                ]
+            }
+        ]
+    },
+    {
+        "authType": 1,
+        "sort": 2,
+        "title": "查询",
+        "code": "query",
+        "url": "/query",
+        "urlType": 1,
+        "component": "Page",
+        "icon": "TrendCharts",
+        "children": [
+            {
+                "authType": 1,
+                "sort": 1,
+                "title": "委托记录",
+                "code": "query_order",
+                "url": "order",
+                "urlType": 1,
+                "component": "Main",
+                "children": [
+                    {
+                        "authType": 1,
+                        "sort": 1,
+                        "title": "商品合约",
+                        "code": "query_order_goods",
+                        "url": "goods",
+                        "urlType": 1,
+                        "component": "views/query/order/goods/index.vue",
+                        "children": [
+                            {
+                                "authType": 2,
+                                "sort": 1,
+                                "title": "当前记录",
+                                "code": "query_order_goods_list",
+                                "component": "views/query/order/goods/list/index.vue"
+                            },
+                            {
+                                "authType": 2,
+                                "sort": 2,
+                                "title": "历史记录",
+                                "code": "query_order_goods_history",
+                                "component": "views/query/order/goods/history/index.vue"
+                            }
+                        ]
+                    },
+                    {
+                        "authType": 1,
+                        "sort": 2,
+                        "title": "现货仓单",
+                        "code": "query_order_spot",
+                        "url": "spot",
+                        "urlType": 1,
+                        "component": "views/query/order/spot/index.vue",
+                        "children": [
+                            {
+                                "authType": 2,
+                                "sort": 1,
+                                "title": "当前记录",
+                                "code": "query_order_spot_list",
+                                "component": "views/query/order/spot/list/index.vue"
+                            },
+                            {
+                                "authType": 2,
+                                "sort": 2,
+                                "title": "历史记录",
+                                "code": "query_order_spot_history",
+                                "component": "views/query/order/spot/history/index.vue"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "authType": 1,
+                "sort": 2,
+                "title": "成交记录",
+                "code": "query_trade",
+                "url": "trade",
+                "urlType": 1,
+                "component": "Main",
+                "children": [
+                    {
+                        "authType": 1,
+                        "sort": 1,
+                        "title": "商品合约",
+                        "code": "query_trade_goods",
+                        "url": "goods",
+                        "urlType": 1,
+                        "component": "views/query/trade/goods/index.vue",
+                        "children": [
+                            {
+                                "authType": 2,
+                                "sort": 1,
+                                "title": "当前记录",
+                                "code": "query_trade_goods_list",
+                                "component": "views/query/trade/goods/list/index.vue"
+                            },
+                            {
+                                "authType": 2,
+                                "sort": 2,
+                                "title": "历史记录",
+                                "code": "query_trade_goods_history",
+                                "component": "views/query/trade/goods/history/index.vue"
+                            }
+                        ]
+                    },
+                    {
+                        "authType": 1,
+                        "sort": 2,
+                        "title": "现货仓单",
+                        "code": "query_trade_spot",
+                        "url": "spot",
+                        "urlType": 1,
+                        "component": "views/query/trade/spot/index.vue",
+                        "children": [
+                            {
+                                "authType": 2,
+                                "sort": 1,
+                                "title": "当前记录",
+                                "code": "query_trade_spot_list",
+                                "component": "views/query/trade/spot/list/index.vue"
+                            },
+                            {
+                                "authType": 2,
+                                "sort": 2,
+                                "title": "历史记录",
+                                "code": "query_trade_spot_history",
+                                "component": "views/query/trade/spot/history/index.vue"
+                            }
+                        ]
+                    }
+                ]
+            },
+            {
+                "authType": 1,
+                "sort": 3,
+                "title": "资金流水",
+                "code": "query_capital",
+                "url": "capital",
+                "urlType": 1,
+                "component": "views/query/capital/index.vue",
+                "children": [
+                    {
+                        "authType": 2,
+                        "sort": 1,
+                        "title": "当前记录",
+                        "code": "query_capital_list",
+                        "component": "views/query/capital/list/index.vue"
+                    },
+                    {
+                        "authType": 2,
+                        "sort": 2,
+                        "title": "历史记录",
+                        "code": "query_capital_history",
+                        "component": "views/query/capital/history/index.vue"
+                    }
+                ]
+            },
+            {
+                "authType": 1,
+                "sort": 4,
+                "title": "履约查询",
+                "code": "query_performance",
+                "url": "performance",
+                "urlType": 1,
+                "component": "Main",
+                "children": [
+                    {
+                        "authType": 1,
+                        "sort": 1,
+                        "title": "买履约",
+                        "code": "query_performance_buy",
+                        "url": "buy",
+                        "urlType": 1,
+                        "component": "views/query/performance/buy/index.vue",
+                        "children": [
+                            {
+                                "authType": 2,
+                                "sort": 1,
+                                "title": "执行中",
+                                "code": "query_performance_buy_running",
+                                "component": "views/query/performance/buy/running/index.vue"
+                            },
+                            {
+                                "authType": 2,
+                                "sort": 2,
+                                "title": "全部",
+                                "code": "query_performance_buy_all",
+                                "component": "views/query/performance/buy/all/index.vue"
+                            }
+                        ]
+                    },
+                    {
+                        "authType": 1,
+                        "sort": 2,
+                        "title": "卖履约",
+                        "code": "query_performance_sell",
+                        "url": "sell",
+                        "urlType": 1,
+                        "component": "views/query/performance/sell/index.vue",
+                        "children": [
+                            {
+                                "authType": 2,
+                                "sort": 1,
+                                "title": "执行中",
+                                "code": "query_performance_sell_running",
+                                "component": "views/query/performance/sell/running/index.vue"
+                            },
+                            {
+                                "authType": 2,
+                                "sort": 2,
+                                "title": "全部",
+                                "code": "query_performance_sell_all",
+                                "component": "views/query/performance/sell/all/index.vue"
+                            }
+                        ]
+                    }
+                ]
+            }
+        ]
+    },
+    {
+        "authType": 1,
+        "sort": 3,
+        "title": "账户管理",
+        "code": "account",
+        "url": "/account",
+        "urlType": 1,
+        "component": "Page",
+        "icon": "TrendCharts",
+        "children": [
+            {
+                "authType": 1,
+                "sort": 1,
+                "title": "签约账号管理",
+                "code": "account_sign",
+                "url": "sign",
+                "urlType": 1,
+                "component": "views/account/sign/index.vue"
+            },
+            {
+                "authType": 1,
+                "sort": 2,
+                "title": "收货地址管理",
+                "code": "account_address",
+                "url": "address",
+                "urlType": 1,
+                "component": "views/account/address/index.vue"
+            },
+            {
+                "authType": 1,
+                "sort": 3,
+                "title": "发票信息管理",
+                "code": "account_receipt",
+                "url": "receipt",
+                "urlType": 1,
+                "component": "views/account/receipt/index.vue"
+            }
+        ]
+    }
+]

+ 6 - 6
src/business/bank/index.ts

@@ -20,6 +20,12 @@ export function useDoWithdraw() {
         return {}
     })
 
+    const formData = reactive<Partial<Proto.t2bBankWithdrawReq>>({
+        AccountType: 0,
+        AppDateTime: moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),
+        extend_info: JSON.stringify({ "sex": 1 })
+    })
+
     /// 查询签约信息
     const request = queryBankAccountSign().then((res) => {
         if (res.data.length) {
@@ -36,12 +42,6 @@ export function useDoWithdraw() {
         }
     })
 
-    const formData = reactive<Partial<Proto.t2bBankWithdrawReq>>({
-        AccountType: 0,
-        AppDateTime: moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),
-        extend_info: JSON.stringify({ "sex": 1 })
-    })
-
     const onSubmit = async () => {
         await request
         loading.value = true

+ 4 - 1
src/business/common/index.ts

@@ -9,7 +9,10 @@ export async function checkToken() {
     try {
         return await tokenCheck()
     } catch (err) {
-        eventBus.$emit('LogoutNotify')
+        // 临时解决方案,有可能出现网络问题导致超时后账号被登出
+        if (err !== '令牌无效') {
+            eventBus.$emit('LogoutNotify')
+        }
         return Promise.reject(err)
     }
 }

+ 10 - 5
src/business/login/index.ts

@@ -1,12 +1,12 @@
 import { shallowRef, reactive } from 'vue'
 import { timerTask } from '@/utils/timer'
-import { login } from '@/services/api/account'
+import { login, logout } from '@/services/api/account'
 import { useLoginStore, useEnumStore, useErrorInfoStore, useUserStore, useFuturesStore, useAccountStore } from '@/stores'
 import service from '@/services'
 import tradeSocket from '@/services/websocket/trade'
 import quoteSocket from '@/services/websocket/quote'
 import eventBus from '@/services/bus'
-import { checkToken } from '@/business/common'
+import { checkToken, checkTokenLoop, stopCheckToken } from '@/business/common'
 import { encryptBody } from '@/services/websocket/package/crypto'
 
 /**
@@ -48,6 +48,7 @@ export function useLogin(persist = false) {
         futuresStore.getGoodsList()
         tradeSocket.connect()
         quoteSocket.connect()
+        checkTokenLoop()
     }
 
     // 用户登录
@@ -83,12 +84,16 @@ export function useLogin(persist = false) {
 
     // 用户登出
     const userLogout = (callback?: () => void) => {
+        stopCheckToken()
         tradeSocket.close()
         quoteSocket.close()
         timerTask.clearAll()
-        loginStore.clearAutoLoginData()
-        loginStore.clearLoginInfo()
-        callback && callback()
+
+        logout().finally(() => {
+            loginStore.clearAutoLoginData()
+            loginStore.clearLoginInfo()
+            callback && callback()
+        })
     }
 
     // 初始化业务数据

+ 3 - 1
src/business/user/address.ts

@@ -2,7 +2,7 @@ import { shallowRef, reactive, computed } from 'vue'
 import { useDataTable } from '@/hooks/datatable'
 import { useLoginStore } from '@/stores'
 import { queryUserReceiveInfo, userReceiveInfo, delUserReceiveInfo, userReceiveIsDefault } from '@/services/api/user'
-import { getCertificateTypeList } from '@/constants/certificate'
+import { getCertificateTypeList, getSCertificateTypeList } from '@/constants/certificate'
 
 const loginStore = useLoginStore()
 
@@ -34,6 +34,7 @@ export function useAddress() {
 export function useAddressForm(selectedRow?: Model.UserReceiveInfoRsp) {
     const loading = shallowRef(false)
     const certificateTypeList = getCertificateTypeList()
+    const scertificateTypeList = getSCertificateTypeList()
 
     const formData = reactive<Proto.UserReceiveInfoReq>({
         ReceiveInfoId: 0,
@@ -111,6 +112,7 @@ export function useAddressForm(selectedRow?: Model.UserReceiveInfoRsp) {
     return {
         loading,
         certificateTypeList,
+        scertificateTypeList,
         formData,
         regionName,
         addOrUpdate,

+ 28 - 0
src/constants/certificate.ts

@@ -2,6 +2,34 @@ import { useEnumStore } from '@/stores'
 
 const { getEnumTypeList, getEnumTypeName } = useEnumStore()
 
+/// 特殊处理证件类型
+export enum SCertificateType {
+    /// 个人
+    Person = 1,
+    /// 通用
+    Normal = 3,
+}
+
+/**
+ * 特殊处理证件类型列表
+ * @returns 
+ */
+export function getSCertificateTypeList() {
+    return [
+        { label: '个人', value: SCertificateType.Person },
+        { label: '通用', value: SCertificateType.Normal },
+    ]
+}
+
+/**
+ * 特殊处理证件类型名称
+ * @returns 
+ */
+export function getSCertificateTypeName(value?: number) {
+    const enums = getSCertificateTypeList()
+    return getEnumTypeName(enums, value)
+}
+
 /**
  * 获取证件类型列表
  * @returns 

+ 2 - 4
src/hooks/echarts/timeline/index.ts

@@ -1,4 +1,4 @@
-import { ref, computed, watch, getCurrentInstance } from 'vue'
+import { ref, computed, watch } from 'vue'
 //import { timerInterceptor } from '@/utils/timer'
 import { queryTSData } from '@/services/api/quote'
 import { useFuturesStore } from '@/stores'
@@ -7,7 +7,6 @@ import { useOptions } from './options'
 import moment from 'moment'
 
 export function useTimelineChart(goodscode: string) {
-    const context = getCurrentInstance()
     const futuresStore = useFuturesStore()
     const { dataset, handleData, clearData, calcIndicator } = useDataset()
     const { options, initOptions, updateOptions } = useOptions(dataset)
@@ -41,13 +40,12 @@ export function useTimelineChart(goodscode: string) {
                 goodsCode: goodscode
             }
         }).then((res) => {
-            const { historyDatas, startTime, endTime } = res.data
+            const { historyDatas } = res.data
             if (historyDatas.length) {
                 dataIndex.value = historyDatas.length - 1
                 isEmpty.value = false
                 handleData(res.data)
             }
-            context?.emit('ready', startTime, endTime)
         }).finally(() => {
             loading.value = false
         })

+ 0 - 33
src/mock/goods.ts

@@ -1,33 +0,0 @@
-const queryGoodsList = {
-    url: '/goods',
-    type: 'get',
-    response: {
-        code: 0,
-        msg: 'success',
-        total: 3,
-        data: [
-            {
-                id: 1000,
-                goodsName: '黄金',
-                goodsCode: 'CFN001',
-                price: 100,
-            },
-            {
-                id: 1001,
-                goodsName: '昆特牌',
-                goodsCode: 'CFN002',
-                price: 200,
-            },
-            {
-                id: 1002,
-                goodsName: '大豆',
-                goodsCode: 'CFN003',
-                price: 300,
-            },
-        ]
-    }
-}
-
-export default [
-    queryGoodsList,
-]

+ 0 - 17
src/mock/index.ts

@@ -1,17 +0,0 @@
-import Mock from 'mockjs-x'
-
-Mock.setup({
-    timeout: '100-200'
-})
-
-// 遍历目录所有ts文件
-const files = require.context('.', false, /\.ts$/);
-
-files.keys().forEach((key) => {
-    if (key !== './index.ts') {
-        const list = files(key).default;
-        list.forEach((req: { [key: string]: unknown }) => {
-            Mock.mock(RegExp(req.url + '.*'), req.type, req.response);
-        })
-    }
-})

+ 0 - 30
src/mock/quote.ts

@@ -1,30 +0,0 @@
-const queryKline = {
-    url: '/quotes/kline',
-    type: 'get',
-    response: {
-        code: 0,
-        msg: 'success',
-        total: 0,
-        data: []
-    }
-}
-
-const queryTimeline = {
-    url: '/quotes/timeline',
-    type: 'get',
-    response: {
-        code: 0,
-        msg: 'success',
-        total: 0,
-        data: {
-            startTime: "2022-05-23T09:00:00+08:00",
-            endTime: "2022-05-23T15:00:00+08:00",
-            history: []
-        }
-    }
-}
-
-export default [
-    queryKline,
-    queryTimeline,
-]

+ 0 - 492
src/mock/router.ts

@@ -1,492 +0,0 @@
-const appmenu = {
-    url: '/account/menu',
-    type: 'get',
-    response: {
-        code: 200,
-        msg: 'success',
-        total: 0,
-        data: [
-            {
-                authType: 2,
-                sort: 0,
-                title: '底部单据菜单',
-                code: 'bottom',
-                children: [
-                    {
-                        authType: 2,
-                        sort: 1,
-                        title: '资金信息',
-                        code: 'bottom_capital',
-                        component: 'views/footer/index.vue',
-                        children: [
-                            {
-                                authType: 2,
-                                sort: 1,
-                                title: '资金汇总',
-                                code: 'bottom_capital_summary',
-                                component: 'views/footer/capital/summary/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 2,
-                                title: '资金流水',
-                                code: 'bottom_capital_statement',
-                                component: 'views/footer/capital/statement/index.vue',
-                            }
-                        ]
-                    },
-                    {
-                        authType: 2,
-                        sort: 2,
-                        title: '商品订单',
-                        code: 'bottom_goods',
-                        component: 'views/footer/index.vue',
-                        children: [
-                            {
-                                authType: 2,
-                                sort: 1,
-                                title: '合约汇总',
-                                code: 'bottom_goods_position',
-                                component: 'views/footer/goods/position/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 2,
-                                title: '委托',
-                                code: 'bottom_goods_order',
-                                component: 'views/footer/goods/order/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 3,
-                                title: '成交',
-                                code: 'bottom_goods_trade',
-                                component: 'views/footer/goods/trade/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 4,
-                                title: '交收',
-                                code: 'bottom_goods_delivery',
-                                component: 'views/footer/goods/delivery/index.vue',
-                            }
-                        ]
-                    },
-                    {
-                        authType: 2,
-                        sort: 3,
-                        title: '现货仓单',
-                        code: 'bottom_spot',
-                        component: 'views/footer/index.vue',
-                        children: [
-                            {
-                                authType: 2,
-                                sort: 1,
-                                title: '现货明细',
-                                code: 'bottom_spot_position',
-                                component: 'views/footer/spot/position/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 2,
-                                title: '挂单',
-                                code: 'bottom_spot_order',
-                                component: 'views/footer/spot/order/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 3,
-                                title: '成交',
-                                code: 'bottom_spot_trade',
-                                component: 'views/footer/spot/trade/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 4,
-                                title: '提货',
-                                code: 'bottom_spot_pickup',
-                                component: 'views/footer/spot/pickup/index.vue',
-                            }
-                        ]
-                    },
-                    {
-                        authType: 2,
-                        sort: 4,
-                        title: '履约信息',
-                        code: 'bottom_performance',
-                        component: 'views/footer/index.vue',
-                        children: [
-                            {
-                                authType: 2,
-                                sort: 1,
-                                title: '买履约',
-                                code: 'bottom_performance_buy',
-                                component: 'views/footer/performance/buy/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 2,
-                                title: '卖履约',
-                                code: 'bottom_performance_sell',
-                                component: 'views/footer/performance/sell/index.vue',
-                            }
-                        ]
-                    },
-                ]
-            },
-            {
-                authType: 1,
-                sort: 1,
-                title: '交易市场',
-                code: 'market',
-                url: '/market',
-                urlType: 1,
-                component: 'Page',
-                icon: 'TrendCharts',
-                children: [
-                    {
-                        authType: 1,
-                        sort: 1,
-                        title: '交易市场',
-                        code: 'market_trade',
-                        url: 'trade',
-                        urlType: 1,
-                        component: 'Main',
-                        children: [
-                            {
-                                authType: 1,
-                                sort: 1,
-                                title: '订单交易',
-                                code: 'market_trade_goods',
-                                url: 'goods',
-                                urlType: 1,
-                                component: 'views/market/trade/goods/index.vue',
-                            },
-                            {
-                                authType: 1,
-                                sort: 2,
-                                title: '仓单交易',
-                                code: 'market_trade_spot',
-                                url: 'spot',
-                                urlType: 1,
-                                component: 'views/market/trade/spot/index.vue',
-                            }
-                        ],
-                    },
-                ]
-            },
-            {
-                authType: 1,
-                sort: 2,
-                title: '查询',
-                code: 'query',
-                url: '/query',
-                urlType: 1,
-                component: 'Page',
-                icon: 'TrendCharts',
-                children: [
-                    {
-                        authType: 1,
-                        sort: 1,
-                        title: '委托记录',
-                        code: 'query_order',
-                        url: 'order',
-                        urlType: 1,
-                        component: 'Main',
-                        children: [
-                            {
-                                authType: 1,
-                                sort: 1,
-                                title: '商品合约',
-                                code: 'query_order_goods',
-                                url: 'goods',
-                                urlType: 1,
-                                component: 'views/query/order/goods/index.vue',
-                                children: [
-                                    {
-                                        authType: 2,
-                                        sort: 1,
-                                        title: '当前记录',
-                                        code: 'query_order_goods_list',
-                                        component: 'views/query/order/goods/list/index.vue',
-                                    },
-                                    {
-                                        authType: 2,
-                                        sort: 2,
-                                        title: '历史记录',
-                                        code: 'query_order_goods_history',
-                                        component: 'views/query/order/goods/history/index.vue',
-                                    }
-                                ]
-                            },
-                            {
-                                authType: 1,
-                                sort: 2,
-                                title: '现货仓单',
-                                code: 'query_order_spot',
-                                url: 'spot',
-                                urlType: 1,
-                                component: 'views/query/order/spot/index.vue',
-                                children: [
-                                    {
-                                        authType: 2,
-                                        sort: 1,
-                                        title: '当前记录',
-                                        code: 'query_order_spot_list',
-                                        component: 'views/query/order/spot/list/index.vue',
-                                    },
-                                    {
-                                        authType: 2,
-                                        sort: 2,
-                                        title: '历史记录',
-                                        code: 'query_order_spot_history',
-                                        component: 'views/query/order/spot/history/index.vue',
-                                    }
-                                ]
-                            }
-                        ],
-                    },
-                    {
-                        authType: 1,
-                        sort: 2,
-                        title: '成交记录',
-                        code: 'query_trade',
-                        url: 'trade',
-                        urlType: 1,
-                        component: 'Main',
-                        children: [
-                            {
-                                authType: 1,
-                                sort: 1,
-                                title: '商品合约',
-                                code: 'query_trade_goods',
-                                url: 'goods',
-                                urlType: 1,
-                                component: 'views/query/trade/goods/index.vue',
-                                children: [
-                                    {
-                                        authType: 2,
-                                        sort: 1,
-                                        title: '当前记录',
-                                        code: 'query_trade_goods_list',
-                                        component: 'views/query/trade/goods/list/index.vue',
-                                    },
-                                    {
-                                        authType: 2,
-                                        sort: 2,
-                                        title: '历史记录',
-                                        code: 'query_trade_goods_history',
-                                        component: 'views/query/trade/goods/history/index.vue',
-                                    }
-                                ]
-                            },
-                            {
-                                authType: 1,
-                                sort: 2,
-                                title: '现货仓单',
-                                code: 'query_trade_spot',
-                                url: 'spot',
-                                urlType: 1,
-                                component: 'views/query/trade/spot/index.vue',
-                                children: [
-                                    {
-                                        authType: 2,
-                                        sort: 1,
-                                        title: '当前记录',
-                                        code: 'query_trade_spot_list',
-                                        component: 'views/query/trade/spot/list/index.vue',
-                                    },
-                                    {
-                                        authType: 2,
-                                        sort: 2,
-                                        title: '历史记录',
-                                        code: 'query_trade_spot_history',
-                                        component: 'views/query/trade/spot/history/index.vue',
-                                    }
-                                ]
-                            }
-                        ],
-                    },
-                    {
-                        authType: 1,
-                        sort: 3,
-                        title: '资金流水',
-                        code: 'query_capital',
-                        url: 'capital',
-                        urlType: 1,
-                        component: 'views/query/capital/index.vue',
-                        children: [
-                            {
-                                authType: 2,
-                                sort: 1,
-                                title: '当前记录',
-                                code: 'query_capital_list',
-                                component: 'views/query/capital/list/index.vue',
-                            },
-                            {
-                                authType: 2,
-                                sort: 2,
-                                title: '历史记录',
-                                code: 'query_capital_history',
-                                component: 'views/query/capital/history/index.vue',
-                            }
-                        ]
-                    },
-                    {
-                        authType: 1,
-                        sort: 4,
-                        title: '履约查询',
-                        code: 'query_performance',
-                        url: 'performance',
-                        urlType: 1,
-                        component: 'Main',
-                        children: [
-                            {
-                                authType: 1,
-                                sort: 1,
-                                title: '买履约',
-                                code: 'query_performance_buy',
-                                url: 'buy',
-                                urlType: 1,
-                                component: 'views/query/performance/buy/index.vue',
-                                children: [
-                                    {
-                                        authType: 2,
-                                        sort: 1,
-                                        title: '执行中',
-                                        code: 'query_performance_buy_running',
-                                        component: 'views/query/performance/buy/running/index.vue',
-                                    },
-                                    {
-                                        authType: 2,
-                                        sort: 2,
-                                        title: '全部',
-                                        code: 'query_performance_buy_all',
-                                        component: 'views/query/performance/buy/all/index.vue',
-                                    }
-                                ]
-                            },
-                            {
-                                authType: 1,
-                                sort: 2,
-                                title: '卖履约',
-                                code: 'query_performance_sell',
-                                url: 'sell',
-                                urlType: 1,
-                                component: 'views/query/performance/sell/index.vue',
-                                children: [
-                                    {
-                                        authType: 2,
-                                        sort: 1,
-                                        title: '执行中',
-                                        code: 'query_performance_sell_running',
-                                        component: 'views/query/performance/sell/running/index.vue',
-                                    },
-                                    {
-                                        authType: 2,
-                                        sort: 2,
-                                        title: '全部',
-                                        code: 'query_performance_sell_all',
-                                        component: 'views/query/performance/sell/all/index.vue',
-                                    }
-                                ]
-                            }
-                        ],
-                    },
-                ]
-            },
-            {
-                authType: 1,
-                sort: 3,
-                title: '账户管理',
-                code: 'account',
-                url: '/account',
-                urlType: 1,
-                component: 'Page',
-                icon: 'TrendCharts',
-                children: [
-                    {
-                        authType: 1,
-                        sort: 1,
-                        title: '签约账号管理',
-                        code: 'account_sign',
-                        url: 'sign',
-                        urlType: 1,
-                        component: 'views/account/sign/index.vue',
-                    },
-                    {
-                        authType: 1,
-                        sort: 2,
-                        title: '收货地址管理',
-                        code: 'account_address',
-                        url: 'address',
-                        urlType: 1,
-                        component: 'views/account/address/index.vue',
-                        children: [
-                            {
-                                authType: 3,
-                                title: '新增地址',
-                                code: 'account_address_add',
-                                component: 'views/account/address/components/edit/index.vue',
-                                className: 'el-button--primary',
-                            },
-                            {
-                                authType: 3,
-                                title: '修改',
-                                code: 'account_address_edit',
-                                component: 'views/account/address/components/edit/index.vue',
-                            },
-                            {
-                                authType: 3,
-                                title: '默认',
-                                code: 'account_address_default',
-                                component: 'views/account/address/components/default/index.vue',
-                            },
-                            {
-                                authType: 3,
-                                title: '删除',
-                                code: 'account_address_delete',
-                                component: 'views/account/address/components/delete/index.vue',
-                            },
-                        ]
-                    },
-                    {
-                        authType: 1,
-                        sort: 3,
-                        title: '发票信息管理',
-                        code: 'account_receipt',
-                        url: 'receipt',
-                        urlType: 1,
-                        component: 'views/account/receipt/index.vue',
-                        children: [
-                            {
-                                authType: 3,
-                                title: '新增发票',
-                                code: 'account_receipt_add',
-                                component: 'views/account/receipt/components/edit/index.vue',
-                                className: 'el-button--primary',
-
-                            },
-                            {
-                                authType: 3,
-                                title: '修改',
-                                code: 'account_receipt_edit',
-                                component: 'views/account/receipt/components/edit/index.vue',
-                            },
-                            {
-                                authType: 3,
-                                title: '删除',
-                                code: 'account_receipt_delete',
-                                component: 'views/account/receipt/components/delete/index.vue',
-                            }
-                        ]
-                    },
-                ]
-            },
-        ]
-    }
-};
-
-export default [
-    appmenu,
-]

+ 1 - 6
src/packages/gstj/components/modules/quote/chart/index.vue

@@ -16,7 +16,7 @@
             </Tabs>
             <Icon name="setting-o" style="padding: 0 .32rem;" v-if="false" />
         </div>
-        <TimeLine v-bind="{ goodsCode }" @ready="onReady" v-if="tabIndex === 0" />
+        <TimeLine v-bind="{ goodsCode }" v-if="tabIndex === 0" />
         <KLine v-bind="{ goodsCode, cycleType }" v-else />
     </div>
 </template>
@@ -35,7 +35,6 @@ defineProps({
     }
 })
 
-const emit = defineEmits(['ready'])
 const tabIndex = shallowRef(0) // 当前选中的标签
 const selectedText = shallowRef('') // 当前选中的分钟线
 const cycleType = shallowRef(ChartCycleType.Minutes) // 图表周期类型
@@ -104,10 +103,6 @@ const onPopoverSelect = (action: PopoverAction) => {
         }
     }
 }
-
-const onReady = (startTime: string, endTime: string) => {
-    emit('ready', startTime, endTime)
-}
 </script>
 
 <style lang="less">

+ 30 - 30
src/packages/gstj/components/modules/quote/forex/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="app-quote-forex">
-        <dl>
+        <dl v-if="quote">
             <dt>
                 <span>卖挂牌</span>
                 <span @click="navigateTo(BuyOrSell.Sell)" v-if="showMore">更多
@@ -9,31 +9,31 @@
             </dt>
             <dd @click="onSellClick(1)">
                 <span>卖一</span>
-                <span :class="quote?.askColor">{{ handleNumberValue(quote?.ask) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume) }}</span>
+                <span :class="quote.askColor">{{ handleNumberValue(quote.ask) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume) }}</span>
             </dd>
-            <dd @click="onSellClick(2)">
+            <dd @click="onSellClick(2)" v-if="quote.quotegear > 1">
                 <span>卖二</span>
-                <span :class="quote?.ask2Color">{{ handleNumberValue(quote?.ask2) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume2) }}</span>
+                <span :class="quote.ask2Color">{{ handleNumberValue(quote.ask2) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume2) }}</span>
             </dd>
-            <dd @click="onSellClick(3)">
+            <dd @click="onSellClick(3)" v-if="quote.quotegear > 2">
                 <span>卖三</span>
-                <span :class="quote?.ask3Color">{{ handleNumberValue(quote?.ask3) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume3) }}</span>
+                <span :class="quote.ask3Color">{{ handleNumberValue(quote.ask3) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume3) }}</span>
             </dd>
-            <dd @click="onSellClick(4)">
+            <dd @click="onSellClick(4)" v-if="quote.quotegear > 3">
                 <span>卖四</span>
-                <span :class="quote?.ask4Color">{{ handleNumberValue(quote?.ask4) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume4) }}</span>
+                <span :class="quote.ask4Color">{{ handleNumberValue(quote.ask4) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume4) }}</span>
             </dd>
-            <dd @click="onSellClick(5)">
+            <dd @click="onSellClick(5)" v-if="quote.quotegear > 4">
                 <span>卖五</span>
-                <span :class="quote?.ask5Color">{{ handleNumberValue(quote?.ask5) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume5) }}</span>
+                <span :class="quote.ask5Color">{{ handleNumberValue(quote.ask5) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume5) }}</span>
             </dd>
         </dl>
-        <dl>
+        <dl v-if="quote">
             <dt>
                 <span>买挂牌</span>
                 <span @click="navigateTo(BuyOrSell.Buy)" v-if="showMore">更多
@@ -42,28 +42,28 @@
             </dt>
             <dd @click="onBuyClick(1)">
                 <span>买一</span>
-                <span :class="quote?.bidColor">{{ handleNumberValue(quote?.bid) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume) }}</span>
+                <span :class="quote.bidColor">{{ handleNumberValue(quote.bid) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume) }}</span>
             </dd>
-            <dd @click="onBuyClick(2)">
+            <dd @click="onBuyClick(2)" v-if="quote.quotegear > 1">
                 <span>买二</span>
-                <span :class="quote?.bid2Color">{{ handleNumberValue(quote?.bid2) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume2) }}</span>
+                <span :class="quote.bid2Color">{{ handleNumberValue(quote.bid2) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume2) }}</span>
             </dd>
-            <dd @click="onBuyClick(3)">
+            <dd @click="onBuyClick(3)" v-if="quote.quotegear > 2">
                 <span>买三</span>
-                <span :class="quote?.bid3Color">{{ handleNumberValue(quote?.bid3) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume3) }}</span>
+                <span :class="quote.bid3Color">{{ handleNumberValue(quote.bid3) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume3) }}</span>
             </dd>
-            <dd @click="onBuyClick(4)">
+            <dd @click="onBuyClick(4)" v-if="quote.quotegear > 3">
                 <span>买四</span>
-                <span :class="quote?.bid4Color">{{ handleNumberValue(quote?.bid4) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume4) }}</span>
+                <span :class="quote.bid4Color">{{ handleNumberValue(quote.bid4) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume4) }}</span>
             </dd>
-            <dd @click="onBuyClick(5)">
+            <dd @click="onBuyClick(5)" v-if="quote.quotegear > 4">
                 <span>买五</span>
-                <span :class="quote?.bid5Color">{{ handleNumberValue(quote?.bid5) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume5) }}</span>
+                <span :class="quote.bid5Color">{{ handleNumberValue(quote.bid5) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume5) }}</span>
             </dd>
         </dl>
     </div>

+ 2 - 12
src/packages/gstj/components/modules/quote/index.vue

@@ -1,15 +1,13 @@
 <template>
     <div class="app-quote">
         <Price v-bind="{ goodsCode }" />
-        <Chart v-bind="{ goodsCode }" @ready="onReady" />
+        <Chart v-bind="{ goodsCode }" />
         <Forex v-bind="{ goodsCode }" v-if="showForex" />
-        <Tik v-bind="{ goodsCode, startTime, endTime }" />
+        <Tik v-bind="{ goodsCode }" />
     </div>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { formatDate } from '@/filters'
 import Price from './price/index.vue'
 import Chart from './chart/index.vue'
 import Forex from './forex/index.vue'
@@ -22,12 +20,4 @@ defineProps({
     },
     showForex: Boolean,
 })
-
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
-
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
 </script>

+ 15 - 11
src/packages/gstj/components/modules/quote/tik/index.vue

@@ -10,10 +10,10 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, watchEffect, watch } from 'vue'
+import { ref, watch } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
-import { queryHistoryTikDatas } from '@/services/api/market'
+import { queryHistoryTikDatas, queryMarketRun } from '@/services/api/market'
 import { useFuturesStore } from '@/stores'
 import AppList from '../../../base/list/index.vue'
 
@@ -22,8 +22,6 @@ const props = defineProps({
         type: String,
         required: true
     },
-    startTime: String,
-    endTime: String,
 })
 
 const futuresStore = useFuturesStore()
@@ -36,7 +34,7 @@ const columns: Model.TableColumn[] = [
     { prop: 'Vol', label: '现量' },
 ]
 
-const { run } = useRequest(queryHistoryTikDatas, {
+const { run: getHistoryTikDatas } = useRequest(queryHistoryTikDatas, {
     manual: true,
     params: {
         goodsCode: props.goodsCode,
@@ -47,12 +45,18 @@ const { run } = useRequest(queryHistoryTikDatas, {
     }
 })
 
-watchEffect(() => {
-    if (props.startTime && props.endTime) {
-        run({
-            startTime: formatDate(props.startTime),
-            endTime: formatDate(props.endTime),
-        })
+useRequest(queryMarketRun, {
+    params: {
+        marketID: quote.value?.marketid
+    },
+    onSuccess: (res) => {
+        const market = res.data[0]
+        if (market) {
+            getHistoryTikDatas({
+                startTime: formatDate(market.startTime),
+                endTime: formatDate(market.endTime),
+            })
+        }
     }
 })
 

+ 2 - 10
src/packages/gstj/views/goods/detail/Index.vue

@@ -4,9 +4,9 @@
             <app-navbar :title="quote ? quote.goodscode + '/' + quote.goodsname : '挂牌大厅'" />
         </template>
         <component :is="Price" v-bind="{ goodsCode }" />
-        <component :is="Chart" v-bind="{ goodsCode }" @ready="onReady" />
+        <component :is="Chart" v-bind="{ goodsCode }" />
         <component :is="Forex" v-bind="{ goodsCode }" />
-        <component :is="Tik" v-bind="{ goodsCode, startTime, endTime }" />
+        <component :is="Tik" v-bind="{ goodsCode }" />
         <template #footer>
             <div class="g-form__footer">
                 <Button block type="danger" square @click="onListing(EBuildType.BUILDTYPE_OPEN)">订立</Button>
@@ -22,7 +22,6 @@
 <script lang="ts" setup>
 import { shallowRef, defineAsyncComponent, computed } from 'vue'
 import { Button } from 'vant'
-import { formatDate } from '@/filters'
 import { useNavigation } from '../../../router/navigation'
 import { useComponent } from '@/hooks/component'
 import { EBuildType } from '@/constants/client'
@@ -45,18 +44,11 @@ const goodsid = getQueryStringToNumber('goodsid')
 const quote = futuresStore.getQuoteInfo(goodsid)
 
 const goodsCode = computed(() => quote.value?.goodscode ?? '')
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
 const buildType = shallowRef<EBuildType>() // 挂牌类型
 const isDisabledClose = shallowRef(true)
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
-
 const onListing = (type: EBuildType) => {
     buildType.value = type
     openComponent('listing')

+ 1 - 6
src/packages/mobile/components/modules/quote/chart/index.vue

@@ -16,7 +16,7 @@
             </Tabs>
             <Icon name="setting-o" style="padding: 0 .32rem;" v-if="false" />
         </div>
-        <TimeLine v-bind="{ goodsCode }" @ready="onReady" v-if="tabIndex === 0" />
+        <TimeLine v-bind="{ goodsCode }" v-if="tabIndex === 0" />
         <KLine v-bind="{ goodsCode, cycleType }" v-else />
     </div>
 </template>
@@ -35,7 +35,6 @@ defineProps({
     }
 })
 
-const emit = defineEmits(['ready'])
 const tabIndex = shallowRef(0) // 当前选中的标签
 const selectedText = shallowRef('') // 当前选中的分钟线
 const cycleType = shallowRef(ChartCycleType.Minutes) // 图表周期类型
@@ -104,10 +103,6 @@ const onPopoverSelect = (action: PopoverAction) => {
         }
     }
 }
-
-const onReady = (startTime: string, endTime: string) => {
-    emit('ready', startTime, endTime)
-}
 </script>
 
 <style lang="less">

+ 30 - 30
src/packages/mobile/components/modules/quote/forex/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="app-quote-forex">
-        <dl>
+        <dl v-if="quote">
             <dt>
                 <span>卖挂牌</span>
                 <span @click="navigateTo(BuyOrSell.Sell)" v-if="showMore">更多
@@ -9,31 +9,31 @@
             </dt>
             <dd @click="onSellClick(1)">
                 <span>卖一</span>
-                <span :class="quote?.askColor">{{ handleNumberValue(quote?.ask) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume) }}</span>
+                <span :class="quote.askColor">{{ handleNumberValue(quote.ask) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume) }}</span>
             </dd>
-            <dd @click="onSellClick(2)">
+            <dd @click="onSellClick(2)" v-if="quote.quotegear > 1">
                 <span>卖二</span>
-                <span :class="quote?.ask2Color">{{ handleNumberValue(quote?.ask2) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume2) }}</span>
+                <span :class="quote.ask2Color">{{ handleNumberValue(quote.ask2) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume2) }}</span>
             </dd>
-            <dd @click="onSellClick(3)">
+            <dd @click="onSellClick(3)" v-if="quote.quotegear > 2">
                 <span>卖三</span>
-                <span :class="quote?.ask3Color">{{ handleNumberValue(quote?.ask3) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume3) }}</span>
+                <span :class="quote.ask3Color">{{ handleNumberValue(quote.ask3) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume3) }}</span>
             </dd>
-            <dd @click="onSellClick(4)">
+            <dd @click="onSellClick(4)" v-if="quote.quotegear > 3">
                 <span>卖四</span>
-                <span :class="quote?.ask4Color">{{ handleNumberValue(quote?.ask4) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume4) }}</span>
+                <span :class="quote.ask4Color">{{ handleNumberValue(quote.ask4) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume4) }}</span>
             </dd>
-            <dd @click="onSellClick(5)">
+            <dd @click="onSellClick(5)" v-if="quote.quotegear > 4">
                 <span>卖五</span>
-                <span :class="quote?.ask5Color">{{ handleNumberValue(quote?.ask5) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume5) }}</span>
+                <span :class="quote.ask5Color">{{ handleNumberValue(quote.ask5) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume5) }}</span>
             </dd>
         </dl>
-        <dl>
+        <dl v-if="quote">
             <dt>
                 <span>买挂牌</span>
                 <span @click="navigateTo(BuyOrSell.Buy)" v-if="showMore">更多
@@ -42,28 +42,28 @@
             </dt>
             <dd @click="onBuyClick(1)">
                 <span>买一</span>
-                <span :class="quote?.bidColor">{{ handleNumberValue(quote?.bid) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume) }}</span>
+                <span :class="quote.bidColor">{{ handleNumberValue(quote.bid) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume) }}</span>
             </dd>
-            <dd @click="onBuyClick(2)">
+            <dd @click="onBuyClick(2)" v-if="quote.quotegear > 1">
                 <span>买二</span>
-                <span :class="quote?.bid2Color">{{ handleNumberValue(quote?.bid2) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume2) }}</span>
+                <span :class="quote.bid2Color">{{ handleNumberValue(quote.bid2) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume2) }}</span>
             </dd>
-            <dd @click="onBuyClick(3)">
+            <dd @click="onBuyClick(3)" v-if="quote.quotegear > 2">
                 <span>买三</span>
-                <span :class="quote?.bid3Color">{{ handleNumberValue(quote?.bid3) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume3) }}</span>
+                <span :class="quote.bid3Color">{{ handleNumberValue(quote.bid3) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume3) }}</span>
             </dd>
-            <dd @click="onBuyClick(4)">
+            <dd @click="onBuyClick(4)" v-if="quote.quotegear > 3">
                 <span>买四</span>
-                <span :class="quote?.bid4Color">{{ handleNumberValue(quote?.bid4) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume4) }}</span>
+                <span :class="quote.bid4Color">{{ handleNumberValue(quote.bid4) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume4) }}</span>
             </dd>
-            <dd @click="onBuyClick(5)">
+            <dd @click="onBuyClick(5)" v-if="quote.quotegear > 4">
                 <span>买五</span>
-                <span :class="quote?.bid5Color">{{ handleNumberValue(quote?.bid5) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume5) }}</span>
+                <span :class="quote.bid5Color">{{ handleNumberValue(quote.bid5) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume5) }}</span>
             </dd>
         </dl>
     </div>

+ 2 - 12
src/packages/mobile/components/modules/quote/index.vue

@@ -1,15 +1,13 @@
 <template>
     <div class="app-quote">
         <Price v-bind="{ goodsCode }" />
-        <Chart v-bind="{ goodsCode }" @ready="onReady" />
+        <Chart v-bind="{ goodsCode }" />
         <Forex v-bind="{ goodsCode }" v-if="showForex" />
-        <Tik v-bind="{ goodsCode, startTime, endTime }" />
+        <Tik v-bind="{ goodsCode }" />
     </div>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { formatDate } from '@/filters'
 import Price from './price/index.vue'
 import Chart from './chart/index.vue'
 import Forex from './forex/index.vue'
@@ -22,12 +20,4 @@ defineProps({
     },
     showForex: Boolean,
 })
-
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
-
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
 </script>

+ 15 - 11
src/packages/mobile/components/modules/quote/tik/index.vue

@@ -10,10 +10,10 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, watchEffect, watch } from 'vue'
+import { ref, watch } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
-import { queryHistoryTikDatas } from '@/services/api/market'
+import { queryHistoryTikDatas, queryMarketRun } from '@/services/api/market'
 import { useFuturesStore } from '@/stores'
 import AppList from '../../../base/list/index.vue'
 
@@ -22,8 +22,6 @@ const props = defineProps({
         type: String,
         required: true
     },
-    startTime: String,
-    endTime: String,
 })
 
 const futuresStore = useFuturesStore()
@@ -36,7 +34,7 @@ const columns: Model.TableColumn[] = [
     { prop: 'Vol', label: '现量' },
 ]
 
-const { run } = useRequest(queryHistoryTikDatas, {
+const { run: getHistoryTikDatas } = useRequest(queryHistoryTikDatas, {
     manual: true,
     params: {
         goodsCode: props.goodsCode,
@@ -47,12 +45,18 @@ const { run } = useRequest(queryHistoryTikDatas, {
     }
 })
 
-watchEffect(() => {
-    if (props.startTime && props.endTime) {
-        run({
-            startTime: formatDate(props.startTime),
-            endTime: formatDate(props.endTime),
-        })
+useRequest(queryMarketRun, {
+    params: {
+        marketID: quote.value?.marketid
+    },
+    onSuccess: (res) => {
+        const market = res.data[0]
+        if (market) {
+            getHistoryTikDatas({
+                startTime: formatDate(market.startTime),
+                endTime: formatDate(market.endTime),
+            })
+        }
     }
 })
 

+ 2 - 10
src/packages/mobile/views/goods/detail/Index.vue

@@ -4,9 +4,9 @@
             <app-navbar :title="quote ? quote.goodscode + '/' + quote.goodsname : '挂牌大厅'" />
         </template>
         <component :is="Price" v-bind="{ goodsCode }" />
-        <component :is="Chart" v-bind="{ goodsCode }" @ready="onReady" />
+        <component :is="Chart" v-bind="{ goodsCode }" />
         <component :is="Forex" v-bind="{ goodsCode }" />
-        <component :is="Tik" v-bind="{ goodsCode, startTime, endTime }" />
+        <component :is="Tik" v-bind="{ goodsCode }" />
         <template #footer>
             <div class="g-form__footer">
                 <Button block type="danger" square @click="onListing(EBuildType.BUILDTYPE_OPEN)">订立</Button>
@@ -22,7 +22,6 @@
 <script lang="ts" setup>
 import { shallowRef, defineAsyncComponent, computed } from 'vue'
 import { Button } from 'vant'
-import { formatDate } from '@/filters'
 import { useNavigation } from '../../../router/navigation'
 import { useComponent } from '@/hooks/component'
 import { EBuildType } from '@/constants/client'
@@ -45,18 +44,11 @@ const goodsid = getQueryStringToNumber('goodsid')
 const quote = futuresStore.getQuoteInfo(goodsid)
 
 const goodsCode = computed(() => quote.value?.goodscode ?? '')
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
 const buildType = shallowRef<EBuildType>() // 挂牌类型
 const isDisabledClose = shallowRef(true)
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
-
 const onListing = (type: EBuildType) => {
     buildType.value = type
     openComponent('listing')

+ 3 - 12
src/packages/mobile/views/market/detail/Index.vue

@@ -4,14 +4,13 @@
             <app-navbar :title="futuresStore.getGoodsName(goodsCode) ?? '商品详情'" />
         </template>
         <component :is="Price" v-bind="{ goodsCode }" />
-        <component :is="Chart" v-bind="{ goodsCode }" @ready="onReady" />
-        <component :is="Tik" v-bind="{ goodsCode, startTime, endTime }" />
+        <component :is="Chart" v-bind="{ goodsCode }" />
+        <component :is="Tik" v-bind="{ goodsCode }" />
     </app-view>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, defineAsyncComponent } from 'vue'
-import { formatDate } from '@/filters'
+import { defineAsyncComponent } from 'vue'
 import { useNavigation } from '../../../router/navigation'
 import { useFuturesStore } from '@/stores'
 
@@ -22,12 +21,4 @@ const Tik = defineAsyncComponent(() => import('../../../components/modules/quote
 const { getQueryString } = useNavigation()
 const goodsCode = getQueryString('goodscode')
 const futuresStore = useFuturesStore()
-
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
-
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
 </script>

+ 0 - 1
src/packages/pc/components/layouts/sidebar/index.vue

@@ -13,7 +13,6 @@
 
 <script lang="ts" setup>
 import { watch } from 'vue'
-import { useRouter } from 'vue-router'
 import { useMenu } from '@/hooks/menu'
 import { useGlobalStore } from '@/stores'
 import AppSidemenu from '../sidemenu/index.vue'

+ 4 - 0
src/packages/pc/components/modules/listing/index.less

@@ -9,6 +9,10 @@
 
         .app-quote-forex {
             height: 100%;
+
+            li {
+                cursor: pointer;
+            }
         }
     }
 

+ 6 - 6
src/packages/pc/components/modules/listing/index.vue

@@ -39,19 +39,19 @@
             </el-form>
             <div class="footer-btnbar">
                 <template v-if="formData.BuyOrSell === BuyOrSell.Buy">
-                    <el-button type="primary" :loading="loading" :disabled="!goodsStore.goodsId"
+                    <el-button type="primary" size="small" :loading="loading" :disabled="!goodsStore.goodsId"
                         @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立买入</el-button>
-                    <el-button type="primary" :loading="loading" :disabled="(sellQty === 0) || (orderQty > sellQty)"
-                        @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
+                    <el-button type="primary" size="small" :loading="loading"
+                        :disabled="(sellQty === 0) || (orderQty > sellQty)" @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
                         <span>转让买入</span>
                         <span v-if="sellQty">(≤{{ sellQty }})</span>
                     </el-button>
                 </template>
                 <template v-if="formData.BuyOrSell === BuyOrSell.Sell">
-                    <el-button type="primary" :loading="loading" :disabled="!goodsStore.goodsId"
+                    <el-button type="primary" size="small" :loading="loading" :disabled="!goodsStore.goodsId"
                         @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立卖出</el-button>
-                    <el-button type="primary" :loading="loading" :disabled="(buyQty === 0) || (orderQty > buyQty)"
-                        @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
+                    <el-button type="primary" size="small" :loading="loading"
+                        :disabled="(buyQty === 0) || (orderQty > buyQty)" @click="onSubmit(EBuildType.BUILDTYPE_CLOSE)">
                         <span>转让卖出</span>
                         <span v-if="buyQty">(≤{{ buyQty }})</span>
                     </el-button>

+ 1 - 7
src/packages/pc/components/modules/quote/chart/index.vue

@@ -3,8 +3,7 @@
         <div class="app-quote-chart__header">
             <app-tabs class="app-tabs--info" :data-list="dataList" @change="onTabChange" />
         </div>
-        <TimeLine class="app-quote-chart__body" v-bind="{ goodsCode }" @ready="onReady"
-            v-if="cycleType === ChartCycleType.Time" />
+        <TimeLine class="app-quote-chart__body" v-bind="{ goodsCode }" v-if="cycleType === ChartCycleType.Time" />
         <KLine class="app-quote-chart__body" v-bind="{ goodsCode, cycleType }" v-else />
     </div>
 </template>
@@ -23,7 +22,6 @@ defineProps({
     }
 })
 
-const emit = defineEmits(['ready'])
 const dataList = getChartCycleTypeList()
 const cycleType = shallowRef(ChartCycleType.Time) // 图表周期类型
 
@@ -31,10 +29,6 @@ const cycleType = shallowRef(ChartCycleType.Time) // 图表周期类型
 const onTabChange = (index: number) => {
     cycleType.value = dataList[index].value
 }
-
-const onReady = (startTime: string, endTime: string) => {
-    emit('ready', startTime, endTime)
-}
 </script>
 
 <style lang="less">

+ 8 - 1
src/packages/pc/components/modules/quote/forex/index.less

@@ -7,7 +7,6 @@
         flex: 1;
         display: flex;
         flex-direction: column;
-        justify-content: space-evenly;
         padding: 5px;
 
         +ul {
@@ -32,5 +31,13 @@
                 }
             }
         }
+
+        &.top li {
+            margin-top: auto;
+        }
+
+        &.bottom li {
+            margin-bottom: auto;
+        }
     }
 }

+ 30 - 30
src/packages/pc/components/modules/quote/forex/index.vue

@@ -1,57 +1,57 @@
 <template>
     <div class="app-quote-forex">
-        <ul>
-            <li @click="onSellClick(5)">
+        <ul class="top" v-if="quote">
+            <li @click="onSellClick(5)" v-if="quote.quotegear > 4">
                 <span>卖五</span>
-                <span :class="quote?.ask5Color">{{ handleNumberValue(quote?.ask5) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume5) }}</span>
+                <span :class="quote.ask5Color">{{ handleNumberValue(quote.ask5.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume5) }}</span>
             </li>
-            <li @click="onSellClick(4)">
+            <li @click="onSellClick(4)" v-if="quote.quotegear > 3">
                 <span>卖四</span>
-                <span :class="quote?.ask4Color">{{ handleNumberValue(quote?.ask4) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume4) }}</span>
+                <span :class="quote.ask4Color">{{ handleNumberValue(quote.ask4.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume4) }}</span>
             </li>
-            <li @click="onSellClick(3)">
+            <li @click="onSellClick(3)" v-if="quote.quotegear > 2">
                 <span>卖三</span>
-                <span :class="quote?.ask3Color">{{ handleNumberValue(quote?.ask3) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume3) }}</span>
+                <span :class="quote.ask3Color">{{ handleNumberValue(quote.ask3.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume3) }}</span>
             </li>
-            <li @click="onSellClick(2)">
+            <li @click="onSellClick(2)" v-if="quote.quotegear > 1">
                 <span>卖二</span>
-                <span :class="quote?.ask2Color">{{ handleNumberValue(quote?.ask2) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume2) }}</span>
+                <span :class="quote.ask2Color">{{ handleNumberValue(quote.ask2.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume2) }}</span>
             </li>
             <li @click="onSellClick(1)">
                 <span>卖一</span>
-                <span :class="quote?.askColor">{{ handleNumberValue(quote?.ask) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume) }}</span>
+                <span :class="quote.askColor">{{ handleNumberValue(quote.ask.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume) }}</span>
             </li>
         </ul>
-        <ul>
+        <ul class="bottom" v-if="quote">
             <li @click="onBuyClick(1)">
                 <span>买一</span>
-                <span :class="quote?.bidColor">{{ handleNumberValue(quote?.bid) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume) }}</span>
+                <span :class="quote.bidColor">{{ handleNumberValue(quote.bid.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume) }}</span>
             </li>
-            <li @click="onBuyClick(2)">
+            <li @click="onBuyClick(2)" v-if="quote.quotegear > 1">
                 <span>买二</span>
-                <span :class="quote?.bid2Color">{{ handleNumberValue(quote?.bid2) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume2) }}</span>
+                <span :class="quote.bid2Color">{{ handleNumberValue(quote.bid2.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume2) }}</span>
             </li>
-            <li @click="onBuyClick(3)">
+            <li @click="onBuyClick(3)" v-if="quote.quotegear > 2">
                 <span>买三</span>
-                <span :class="quote?.bid3Color">{{ handleNumberValue(quote?.bid3) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume3) }}</span>
+                <span :class="quote.bid3Color">{{ handleNumberValue(quote.bid3.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume3) }}</span>
             </li>
-            <li @click="onBuyClick(4)">
+            <li @click="onBuyClick(4)" v-if="quote.quotegear > 3">
                 <span>买四</span>
-                <span :class="quote?.bid4Color">{{ handleNumberValue(quote?.bid4) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume4) }}</span>
+                <span :class="quote.bid4Color">{{ handleNumberValue(quote.bid4.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume4) }}</span>
             </li>
-            <li @click="onBuyClick(5)">
+            <li @click="onBuyClick(5)" v-if="quote.quotegear > 4">
                 <span>买五</span>
-                <span :class="quote?.bid5Color">{{ handleNumberValue(quote?.bid5) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume5) }}</span>
+                <span :class="quote.bid5Color">{{ handleNumberValue(quote.bid5.toFixed(quote.decimalplace)) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume5) }}</span>
             </li>
         </ul>
     </div>

+ 2 - 12
src/packages/pc/components/modules/quote/index.vue

@@ -1,15 +1,13 @@
 <template>
     <div class="app-quote">
         <Price v-bind="{ goodsCode }" />
-        <Chart v-bind="{ goodsCode }" @ready="onReady" />
+        <Chart v-bind="{ goodsCode }" />
         <Forex v-bind="{ goodsCode }" v-if="showForex" />
-        <Tik v-bind="{ goodsCode, startTime, endTime }" />
+        <Tik v-bind="{ goodsCode }" />
     </div>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { formatDate } from '@/filters'
 import Price from './price/index.vue'
 import Chart from './chart/index.vue'
 import Forex from './forex/index.vue'
@@ -22,12 +20,4 @@ defineProps({
     },
     showForex: Boolean,
 })
-
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
-
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
 </script>

+ 11 - 11
src/packages/pc/components/modules/quote/price/index.vue

@@ -7,7 +7,7 @@
             </div>
             <div class="block-bottom">
                 <div class="block-bottom-left">
-                    <span :class="quote.lastColor">{{ handleNumberValue(quote.last) }}</span>
+                    <span :class="quote.lastColor">{{ handleNumberValue(quote.last.toFixed(quote.decimalplace)) }}</span>
                 </div>
                 <div class="block-bottom-right">
                     <span :class="quote.lastColor">{{ quote.rise.toFixed(quote.decimalplace) }}</span>
@@ -19,31 +19,33 @@
             <ul>
                 <li>
                     <span>开盘</span>
-                    <span>{{ handleNumberValue(quote.opened) }}</span>
+                    <span>{{ handleNumberValue(quote.opened.toFixed(quote.decimalplace)) }}</span>
                 </li>
                 <li>
                     <span>昨结</span>
-                    <span>{{ handleNumberValue(quote.presettle) }}</span>
+                    <span>{{ handleNumberValue(quote.presettle.toFixed(quote.decimalplace)) }}</span>
                 </li>
                 <li>
                     <span>最高</span>
-                    <span :class="quote.highestColor">{{ handleNumberValue(quote.highest) }}</span>
+                    <span :class="quote.highestColor">{{ handleNumberValue(quote.highest.toFixed(quote.decimalplace))
+                    }}</span>
                 </li>
                 <li>
                     <span>最低</span>
-                    <span :class="quote.lowestColor">{{ handleNumberValue(quote.lowest) }}</span>
+                    <span :class="quote.lowestColor">{{ handleNumberValue(quote.lowest.toFixed(quote.decimalplace))
+                    }}</span>
                 </li>
                 <li>
                     <span>涨停</span>
-                    <span class="g-price-up">{{ handleNumberValue(quote.limitup) }}</span>
+                    <span class="g-price-up">{{ handleNumberValue(quote.limitup.toFixed(quote.decimalplace)) }}</span>
                 </li>
                 <li>
                     <span>跌停</span>
-                    <span class="g-price-down">{{ handleNumberValue(quote.limitdown) }}</span>
+                    <span class="g-price-down">{{ handleNumberValue(quote.limitdown.toFixed(quote.decimalplace)) }}</span>
                 </li>
                 <li>
                     <span>均价</span>
-                    <span>{{ handleNumberValue(quote.averageprice) }}</span>
+                    <span>{{ handleNumberValue(quote.averageprice.toFixed(quote.decimalplace)) }}</span>
                 </li>
                 <li>
                     <span>振幅</span>
@@ -75,6 +77,4 @@ onMounted(() => subscribe.start(props.goodsCode))
 onUnmounted(() => subscribe.stop())
 </script>
 
-<style lang="less">
-@import './index.less';
-</style>
+<style lang="less">@import './index.less';</style>

+ 5 - 4
src/packages/pc/components/modules/quote/tik/index.less

@@ -1,22 +1,23 @@
 .app-quote-tik {
-    color: #fff;
+    color: #ACB8C0;
 
     &__header {
         display: flex;
         justify-content: space-between;
         align-items: center;
         background-color: #333;
-        padding: 5px;
+        padding: 6px;
     }
 
     &__body {
         ul {
+            font-size: 12px;
             text-align: center;
-            padding: 5px;
+            padding: 8px;
 
             li {
                 display: flex;
-                padding: 3px 0;
+                padding: 4px 0;
 
                 span {
                     flex: 1;

+ 21 - 17
src/packages/pc/components/modules/quote/tik/index.vue

@@ -2,13 +2,13 @@
     <div class="app-quote-tik">
         <div class="app-quote-tik__header">
             <h4>成交明细</h4>
-            <span>更多</span>
+            <!-- <span>更多</span> -->
         </div>
-        <div class="app-quote-tik__body">
+        <div class="app-quote-tik__body" v-if="quote">
             <ul>
                 <li v-for="(item, index) in dataList" :key="index">
                     <span>{{ formatDate(item.TS, 'HH:mm:ss') }}</span>
-                    <span>{{ item.PE }}</span>
+                    <span :class="handlePriceColor(quote.presettle, item.PE)">{{ item.PE }}</span>
                     <span>{{ item.Vol }}</span>
                 </li>
             </ul>
@@ -17,10 +17,10 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, watchEffect, watch } from 'vue'
-import { formatDate } from '@/filters'
+import { ref, watch } from 'vue'
+import { formatDate, handlePriceColor } from '@/filters'
 import { useRequest } from '@/hooks/request'
-import { queryHistoryTikDatas } from '@/services/api/market'
+import { queryHistoryTikDatas, queryMarketRun } from '@/services/api/market'
 import { useFuturesStore } from '@/stores'
 
 const props = defineProps({
@@ -28,38 +28,42 @@ const props = defineProps({
         type: String,
         required: true
     },
-    startTime: String,
-    endTime: String,
 })
 
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getQuoteInfo(props.goodsCode)
 const dataList = ref<Model.HistoryTikDatasRsp[]>([])
 
-const { run } = useRequest(queryHistoryTikDatas, {
+const { run: getHistoryTikDatas } = useRequest(queryHistoryTikDatas, {
     manual: true,
     params: {
         goodsCode: props.goodsCode,
-        count: 10
+        count: 20
     },
     onSuccess: (res) => {
         dataList.value = res.data
     }
 })
 
-watchEffect(() => {
-    if (props.startTime && props.endTime) {
-        run({
-            startTime: formatDate(props.startTime),
-            endTime: formatDate(props.endTime),
-        })
+useRequest(queryMarketRun, {
+    params: {
+        marketID: quote.value?.marketid
+    },
+    onSuccess: (res) => {
+        const market = res.data[0]
+        if (market) {
+            getHistoryTikDatas({
+                startTime: formatDate(market.startTime),
+                endTime: formatDate(market.endTime),
+            })
+        }
     }
 })
 
 watch(() => quote.value?.last, () => {
     if (quote.value) {
         const list = dataList.value
-        if (list.length > 9) {
+        if (list.length > 19) {
             // 移除列表最后一条记录
             list.pop()
         }

+ 0 - 1
src/packages/pc/main.ts

@@ -2,7 +2,6 @@ import { createApp } from 'vue'
 import App from './App.vue'
 import router from './router'
 import directives from '@/directives' // 自定义指令集
-import '@/mock' // 模拟数据
 import layouts from "./components/layouts" // 布局组件
 import ElementPlus from 'element-plus'
 import * as ElementIcons from '@element-plus/icons-vue'

+ 2 - 2
src/packages/pc/views/account/address/index.vue

@@ -18,10 +18,10 @@
             {{ value ? '是' : '否' }}
         </template>
         <!-- 操作 -->
-        <template #expand>
+    <template #expand="{ row }">
             <div class="buttonbar">
                 <el-button type="primary" size="small" @click="openComponent('edit')">编辑</el-button>
-                <el-button type="success" size="small" @click="openComponent('default')">设置默认</el-button>
+                <el-button type="success" size="small" v-if="row?.isdefault === 0" @click="openComponent('default')">设置默认</el-button>
                 <el-button type="danger" size="small" @click="openComponent('delete')">删除</el-button>
             </div>
         </template>

+ 2 - 0
src/packages/pc/views/account/receipt/index.vue

@@ -49,6 +49,8 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'receipttype', label: '发票类型' },
     { prop: 'username', label: '发票抬头' },
     { prop: 'taxpayerid', label: '税号' },
+    { prop: 'receiptbank', label: '开户银行' },
+    { prop: 'receiptaccount', label: '银行账号' },
     { prop: 'contactinfo', label: '企业电话' },
     { prop: 'information', label: '企业信息' },
 ])

+ 1 - 1
src/packages/pc/views/account/sign/index.vue

@@ -19,7 +19,7 @@
                 <el-button v-if="row.signstatus === SignStatus.Signed" type="danger" size="small"
                     @click="showComponent('cancel', row)">解约</el-button>
                 <el-button v-if="[SignStatus.Unsigned, SignStatus.Refuse, SignStatus.Signed].includes(row.signstatus)"
-                    type="danger" size="small" @click="showComponent('cancel', row)">修改</el-button>
+                    type="danger" size="small" @click="showComponent('sign', row)">修改</el-button>
             </div>
         </template>
     </app-table>

+ 0 - 1
src/packages/pc/views/footer/capital/statement/index.vue

@@ -21,7 +21,6 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'accountid', label: '资金账号' },
     { prop: 'operatetypename', label: '资金类型' },
     { prop: 'amount', label: '金额' },
-    { prop: 'currentbalance', label: '余额' },
     { prop: 'createtime', label: '时间' }
 ])
 </script>

+ 22 - 8
src/packages/pc/views/footer/capital/summary/withdraw/index.vue

@@ -39,7 +39,17 @@ const show = ref(true)
 const refresh = ref(false)
 
 const formRules: FormRules = {
-    Amount: [{ required: true, message: '请输入金额', trigger: 'blur' }],
+    Amount: [{ 
+        required: true, 
+        message: '请输入金额', 
+        validator: (rule, value, callback) => {
+            if (value<=(accountStore.accountInfo.currentbalance ?? 0.0)) {
+                callback()
+            } else {
+                callback(new Error('超出可出金额'))
+            }
+        }
+    }],
 }
 
 const onCancel = (isRefresh = false) => {
@@ -50,13 +60,17 @@ const onCancel = (isRefresh = false) => {
 const formSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
-            onSubmit().then(() => {
-                ElMessage.success('提交成功')
-            }).catch((err) => {
-                ElMessage.warning(err)
-            }).finally(() => {
-                onCancel(true)
-            })
+            if (formData.CusBankID) {
+                onSubmit().then(() => {
+                    ElMessage.success('提交成功')
+                }).catch((err) => {
+                    ElMessage.warning(err)
+                }).finally(() => {
+                    onCancel(true)
+                })
+            } else {
+                ElMessage.error('未签约')
+            }
         }
     })
 }

+ 13 - 9
src/packages/pc/views/footer/goods/position/index.vue

@@ -6,12 +6,14 @@
             {{ getBuyOrSellName(value) }}
         </template>
         <!-- 最新价 -->
-        <template #last="{ row }">
-            {{ last(row.goodsCode) }}
+        <template #lastprice="{ row }">
+            <span :class="lastColor(row)">
+                {{ lastprice(row) }}
+            </span>
         </template>
         <!-- 浮动盈亏-->
         <template #closepl="{ row }">
-            <span :class="lastColor(row.goodscode)">{{ closepl(row).toFixed(2) }}</span>
+            <span :class="handlePriceColor(closepl(row), 0.0)">{{ closepl(row).toFixed(2) }}</span>
         </template>
          <!-- 展开行 -->
          <template #expand>
@@ -34,15 +36,17 @@ import { useComposeTable } from '@pc/components/base/table'
 import { queryTradePosition } from '@/services/api/order'
 import { useFuturesStore } from '@/stores'
 import AppTable from '@pc/components/base/table/index.vue'
+import { handlePriceColor } from '@/filters'
 
 const futuresStore = useFuturesStore()
 
-const last = (goodsCode: string) => {
-    return futuresStore.getQuotePrice(goodsCode)
+const lastprice = (item: Model.TradePositionRsp) => {
+    const { last = 0 } = futuresStore.getQuoteInfo(item.goodscode).value ?? {}
+    return last
 }
 
-const lastColor = (goodsCode: string) => {
-    return futuresStore.getQuoteInfo(goodsCode).value?.lastColor
+const lastColor = (item: Model.TradePositionRsp) => {
+    return futuresStore.getQuoteInfo(item.goodscode).value?.lastColor
 }
 
 /// 计算参考损益
@@ -71,7 +75,7 @@ const { loading, dataList, run } = useRequest(queryTradePosition, {
     },
 })
 
-const { rowKey, expandKeys, selectedRow, rowClick } = useComposeTable<Model.TradePositionRsp>({ rowKey: 'accountid' })
+const { rowKey, expandKeys, selectedRow, rowClick } = useComposeTable<Model.TradePositionRsp>({ rowKey: 'goodsid' })
 
 const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'goodsname', label: '订单合约' },
@@ -80,7 +84,7 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'enableqty', label: '可用数量' },
     { prop: 'frozenqty', label: '冻结数量' },
     { prop: 'averageprice', label: '均价' },
-    { prop: 'last', label: '现价' },
+    { prop: 'lastprice', label: '现价' },
     { prop: 'curholderamount', label: '持仓金额' },
     { prop: 'usedmargin', label: '占用保证金' },
     { prop: 'closepl', label: '浮动盈亏' },

+ 2 - 2
src/packages/pc/views/footer/performance/components/contracted/index.vue

@@ -9,7 +9,7 @@
                 <span>{{ handleNumberValue(getPerformanceStepStatusName(selectedRow.steptypeid)) }}</span>
             </el-form-item>
             <el-form-item label="备注" prop="ApplyRemark">
-                <el-input type="textarea" :rows="3" v-model="formData.ApplyRemark" />
+                <el-input type="textarea" :rows="4" v-model="formData.ApplyRemark" />
             </el-form-item>
             <el-form-item label="附件" prop="Attachment">
                 <app-upload :file-types="['image']" type-message="请选择正确的图片类型" @change="onUploadChange" />
@@ -47,7 +47,7 @@ const formRules: FormRules = {
     Attachment: [{
         required: true,
         validator: (rule, value, callback) => {
-            if (formData.Attachment) {
+            if (value) {
                 callback()
             } else {
                 callback(new Error('请上传附件'))

+ 2 - 12
src/packages/pc/views/market/trade/goods/detail/components/chart/index.vue

@@ -1,19 +1,17 @@
 <template>
     <div class="market-trade-goods-detail-chart">
         <div class="block-left">
-            <Chart v-bind="{ goodsCode }" @ready="onReady" />
+            <Chart v-bind="{ goodsCode }" />
         </div>
         <div class="block-right">
             <Price v-bind="{ goodsCode }" />
             <Forex v-bind="{ goodsCode }" />
-            <Tik v-bind="{ goodsCode, startTime, endTime }" />
+            <Tik v-bind="{ goodsCode }" />
         </div>
     </div>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { formatDate } from '@/filters'
 import Price from '@pc/components/modules/quote/price/index.vue'
 import Chart from '@pc/components/modules/quote/chart/index.vue'
 import Forex from '@pc/components/modules/quote/forex/index.vue'
@@ -25,14 +23,6 @@ defineProps({
         required: true
     },
 })
-
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
-
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
 </script>
 
 <style lang="less">

+ 11 - 10
src/packages/pc/views/market/trade/goods/index.vue

@@ -60,7 +60,8 @@ const { componentRef, componentId, openComponent, closeComponent } = useComponen
 const tableList = computed(() => {
     return quoteGoodsList.value.map((item) => {
         const quote = futuresStore.getQuoteInfo(item.goodscode)
-        const { bid, bidColor, bidvolume, ask, askColor, askvolume, limitdown, limitup, lastColor, openedColor, lowestColor, highestColor, last, presettle, rise, change, amplitude, highest, lowest, opened } = quote.value ?? {}
+        const { bid, bidColor, bidvolume, ask, askColor, askvolume, limitdown, limitup, lastColor, openedColor, lowestColor, highestColor, last, presettle, rise, change, amplitude, highest, lowest, opened, decimalplace } = quote.value ?? {}
+        // console.log(item.goodscode, last)
         return {
             ...item,
             lastColor,
@@ -69,20 +70,20 @@ const tableList = computed(() => {
             highestColor,
             askColor,
             bidColor,
-            bid: handleNumberValue(bid),
+            bid: handleNumberValue(bid?.toFixed(decimalplace)),
             bidvolume: handleNumberValue(bidvolume),
-            ask: handleNumberValue(ask),
+            ask: handleNumberValue(ask?.toFixed(decimalplace)),
             askvolume: handleNumberValue(askvolume),
-            last: handleNumberValue(last),
+            last: handleNumberValue(last?.toFixed(decimalplace)),
             rise: rise?.toFixed(item.decimalplace),
             change: parsePercent(change),
-            opened: handleNumberValue(opened),
-            presettle: handleNumberValue(presettle),
-            lowest: handleNumberValue(lowest),
-            highest: handleNumberValue(highest),
+            opened: handleNumberValue(opened?.toFixed(decimalplace)),
+            presettle: handleNumberValue(presettle?.toFixed(decimalplace)),
+            lowest: handleNumberValue(lowest?.toFixed(decimalplace)),
+            highest: handleNumberValue(highest?.toFixed(decimalplace)),
             amplitude: parsePercent(amplitude),
-            limitdown: handleNumberValue(limitdown),
-            limitup: handleNumberValue(limitup),
+            limitdown: handleNumberValue(limitdown?.toFixed(decimalplace)),
+            limitup: handleNumberValue(limitup?.toFixed(decimalplace)),
         }
     })
 })

+ 8 - 4
src/packages/pc/views/market/trade/spot/index.vue

@@ -2,11 +2,13 @@
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading" @row-click="onRowClick" showIndex>
         <template #header>
-            <app-filter :options="filterOptons" :loading="loading" />
+            <app-filter :options="filterOptons" />
+        </template>
+        <template #footer>
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </template>
     </app-table>
-    <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"
-        v-if="componentId" />
 </template>
 
 <script lang="ts" setup>
@@ -20,6 +22,7 @@ import AppFilter from '@pc/components/base/table-filter/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['order', defineAsyncComponent(() => import('./order/index.vue'))], // 买卖大厅
+    ['listing', defineAsyncComponent(() => import('./listing/index.vue'))], // 挂牌求购
 ])
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => run(), false)
@@ -52,7 +55,8 @@ filterOptons.selectList = [
 
 filterOptons.buttonList = [
     { lable: '查询', className: 'el-button--info', onClick: () => onSearch() },
-    { lable: '重置', className: 'el-button--info', onClick: () => onSearch(true) }
+    { lable: '重置', className: 'el-button--info', onClick: () => onSearch(true) },
+    { lable: '挂牌求购', className: 'el-button--primary', onClick: () => openComponent('listing') }
 ]
 
 const onSearch = (clear = false) => {

+ 163 - 0
src/packages/pc/views/market/trade/spot/listing/index.vue

@@ -0,0 +1,163 @@
+<!-- 交易市场-仓单交易-挂牌 -->
+<template>
+    <app-drawer title="挂牌" v-model:show="show" :width="800" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="100px" :model="formData" :rules="formRules">
+            <el-form-item prop="PerformanceTemplateID" label="履约方式">
+                <Performance :market-id="17201" v-model="formData.PerformanceTemplateID" />
+            </el-form-item>
+            <el-form-item prop="DeliveryGoodsID" label="品种">
+                <el-select placeholder="请选择" v-model="formData.DeliveryGoodsID" @change="onDeliveryGoodsChange">
+                    <el-option :label="item.deliverygoodsname" :value="item.deliverygoodsid"
+                        v-for="(item, index) in ftDeliveryGoodsList" :key="index" />
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="WRStandardID" label="商品">
+                <el-select placeholder="请选择" v-model="formData.WRStandardID" @change="onGoodsChange">
+                    <el-option :label="item.wrstandardname" :value="item.wrstandardid" v-for="(item, index) in goodsList"
+                        :key="index" />
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="dgFactoryItemId" label="仓库">
+                <el-select placeholder="请选择" v-model="dgFactoryItemId" @change="onWarehouseChange">
+                    <el-option :label="item.dgfactoryitemvalue" :value="item.dgfactoryitemid"
+                        v-for="(item, index) in warehouseList" :key="index" />
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="FixedPrice" label="挂牌价格">
+                <el-input-number placeholder="请输入" :min="0" :precision="2" v-model="formData.FixedPrice" />
+            </el-form-item>
+            <el-form-item prop="OrderQty" label="挂牌数量">
+                <el-input-number placeholder="请输入" :min="0" :precision="0" v-model="formData.OrderQty" />
+            </el-form-item>
+            <el-form-item label="货款金额">
+                <span>{{ amount }}</span>
+            </el-form-item>
+            <el-form-item label="可用资金">
+                <span>{{ accountStore.avaiableMoney.toFixed(2) }}</span>
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)">取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { BuyOrSell } from '@/constants/order'
+import { useRequest } from '@/hooks/request'
+import { queryFtDeliveryGoods, queryWrStandardFactoryItem } from '@/services/api/goods'
+import { useHdWROrder } from '@/business/trade'
+import { useAccountStore } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import Performance from '@pc/components/modules/performance/index.vue'
+
+const { formData, listingSubmit, loading, amount } = useHdWROrder()
+const accountStore = useAccountStore()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const formRef = shallowRef<FormInstance>()
+const dgFactoryItemId = shallowRef<number>()
+
+const { dataList: ftDeliveryGoodsList } = useRequest(queryFtDeliveryGoods)
+const { dataList: wrStandardFactoryItems, run: getWrStandardFactoryItems } = useRequest(queryWrStandardFactoryItem, { manual: true })
+const goodsList = shallowRef<Model.FtDeliveryGoodsRsp['wdlst']>([]) // 商品列表
+
+// 仓库列表
+const warehouseList = computed(() => {
+    return wrStandardFactoryItems.value.reduce((res, item) => [...res, ...item.itemlst], [] as Model.WrStandardFactoryItemRsp['itemlst'])
+})
+
+const formRules: FormRules = {
+    PerformanceTemplateID: [{
+        required: true,
+        message: '请选择履约方式'
+    }],
+    DeliveryGoodsID: [{
+        required: true,
+        message: '请选择品类'
+    }],
+    WRStandardID: [{
+        required: true,
+        message: '请选择商品'
+    }],
+    dgFactoryItemId: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (dgFactoryItemId.value) {
+                callback()
+            } else {
+                callback(new Error('请选择仓库'))
+            }
+        }
+    }],
+    FixedPrice: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                callback()
+            } else {
+                callback(new Error('请输入挂牌价格'))
+            }
+        }
+    }],
+    OrderQty: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                callback()
+            } else {
+                callback(new Error('请输入挂牌数量'))
+            }
+        }
+    }],
+}
+
+// 选择品类时触发
+const onDeliveryGoodsChange = (deliverygoodsid: number) => {
+    const item = ftDeliveryGoodsList.value.find((e) => e.deliverygoodsid === deliverygoodsid)
+    if (item) {
+        goodsList.value = item.wdlst
+    }
+    formData.WRStandardID = undefined
+    formData.FactoryItems = undefined
+    dgFactoryItemId.value = undefined
+}
+
+// 选择商品时触发
+const onGoodsChange = (wrstandardid: number) => {
+    formData.FactoryItems = undefined
+    dgFactoryItemId.value = undefined
+    getWrStandardFactoryItems({ wrstandardid })
+}
+
+// 选择仓库时触发
+const onWarehouseChange = (dgfactoryitemid: number) => {
+    formData.FactoryItems = [{
+        DGFactoryItemTypeID: 1, // 要素项类型ID
+        DGFactoryItemID: dgfactoryitemid, // 预约要素项类型值
+        ItemTypeMode: 1, // 要素项类型模式
+    }]
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            formData.BuyOrSell = BuyOrSell.Buy
+            listingSubmit().then(() => {
+                ElMessage.success('提交成功')
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 3 - 0
src/packages/pc/views/market/trade/spot/order/index.vue

@@ -12,6 +12,9 @@
                             <span>{{ quoteItem.deliverygoodsname }}</span>
                         </li>
                         <li>
+                            <span>{{ quoteItem.wrgoodsname }}</span>
+                        </li>
+                        <li>
                             <span>{{ quoteItem.warehousename }}</span>
                         </li>
                     </ul>

+ 1 - 2
src/packages/pc/views/query/capital/history/index.vue

@@ -2,7 +2,7 @@
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
         <template #header>
-            <app-filter :options="filterOptons" :loading="loading">
+            <app-filter :options="filterOptons">
                 <template #before>
                     <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
                         v-model="filterDate" />
@@ -34,7 +34,6 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'accountid', label: '资金账号' },
     { prop: 'operatetypename', label: '资金类型' },
     { prop: 'amount', label: '金额' },
-    { prop: 'currentbalance', label: '余额' },
     { prop: 'createtime', label: '时间' }
 ])
 

+ 0 - 1
src/packages/pc/views/query/capital/list/index.vue

@@ -21,7 +21,6 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'accountid', label: '资金账号' },
     { prop: 'operatetypename', label: '资金类型' },
     { prop: 'amount', label: '金额' },
-    { prop: 'currentbalance', label: '余额' },
     { prop: 'createtime', label: '时间' }
 ])
 </script>

+ 1 - 1
src/packages/pc/views/query/order/goods/history/index.vue

@@ -2,7 +2,7 @@
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
         <template #header>
-            <app-filter :options="filterOptons" :loading="loading">
+            <app-filter :options="filterOptons">
                 <template #before>
                     <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
                         v-model="filterDate" />

+ 1 - 1
src/packages/pc/views/query/order/spot/history/index.vue

@@ -2,7 +2,7 @@
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
         <template #header>
-            <app-filter :options="filterOptons" :loading="loading">
+            <app-filter :options="filterOptons">
                 <template #before>
                     <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
                         v-model="filterDate" />

+ 30 - 2
src/packages/pc/views/query/performance/buy/all/index.vue

@@ -1,6 +1,14 @@
 <!-- 资金流水-买履约-全部 -->
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+        <template #header>
+            <app-filter :options="filterOptons">
+                <template #before>
+                    <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
+                        v-model="filterDate" />
+                </template>
+            </app-filter>
+        </template>
          <!-- 履约状态 -->
          <template #performancestatus="{ value }">
             {{ getPerformanceStatusName(value) }}
@@ -23,13 +31,17 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { formatDate } from '@/filters'
+import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
 import { queryPerformancePlan } from '@/services/api/performance'
 import { BuyOrSell, getPaymentTypeName, getPerformanceStatusName, getPerformanceTypeName } from '@/constants/order'
 import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
 
+const { filterOptons, getQueryParams } = useDataFilter<Model.WrOrderDetailRsp>()
+const filterDate = shallowRef<string[]>([])
 
-const { loading, dataList } = useRequest(queryPerformancePlan, {
+const { loading, dataList, run } = useRequest(queryPerformancePlan, {
     params: {
         buyorsell: BuyOrSell.Buy
     },
@@ -50,6 +62,22 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'performancestatus', label: '履约状态' },
     { prop: 'curstepname', label: '当前步骤' },
     { prop: 'starttime', label: '开始时间' },
-    
 ])
+
+filterOptons.buttonList = [
+    { lable: '查询', className: 'el-button--info', onClick: () => onSearch() },
+    { lable: '重置', className: 'el-button--info', onClick: () => onSearch(true) }
+]
+
+const onSearch = (clear = false) => {
+    if (clear) {
+        filterDate.value = []
+    }
+    getQueryParams((qs) => {
+        qs.begindate = filterDate.value[0]
+        qs.enddate = filterDate.value[1]
+        run(qs)
+    }, clear)
+}
+
 </script>

+ 30 - 2
src/packages/pc/views/query/performance/sell/all/index.vue

@@ -1,6 +1,14 @@
 <!-- 资金流水-卖履约-全部 -->
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+        <template #header>
+            <app-filter :options="filterOptons">
+                <template #before>
+                    <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
+                        v-model="filterDate" />
+                </template>
+            </app-filter>
+        </template>
          <!-- 履约状态 -->
          <template #performancestatus="{ value }">
             {{ getPerformanceStatusName(value) }}
@@ -23,13 +31,17 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { formatDate } from '@/filters'
+import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
 import { queryPerformancePlan } from '@/services/api/performance'
 import { BuyOrSell, getPaymentTypeName, getPerformanceStatusName, getPerformanceTypeName } from '@/constants/order'
 import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
 
+const { filterOptons, getQueryParams } = useDataFilter<Model.WrOrderDetailRsp>()
+const filterDate = shallowRef<string[]>([])
 
-const { loading, dataList } = useRequest(queryPerformancePlan, {
+const { loading, dataList, run } = useRequest(queryPerformancePlan, {
     params: {
         buyorsell: BuyOrSell.Sell
     },
@@ -50,6 +62,22 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'performancestatus', label: '履约状态' },
     { prop: 'curstepname', label: '当前步骤' },
     { prop: 'starttime', label: '开始时间' },
-    
 ])
+
+filterOptons.buttonList = [
+    { lable: '查询', className: 'el-button--info', onClick: () => onSearch() },
+    { lable: '重置', className: 'el-button--info', onClick: () => onSearch(true) }
+]
+
+const onSearch = (clear = false) => {
+    if (clear) {
+        filterDate.value = []
+    }
+    getQueryParams((qs) => {
+        qs.begindate = filterDate.value[0]
+        qs.enddate = filterDate.value[1]
+        run(qs)
+    }, clear)
+}
+
 </script>

+ 1 - 1
src/packages/pc/views/query/trade/goods/history/index.vue

@@ -2,7 +2,7 @@
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
         <template #header>
-            <app-filter :options="filterOptons" :loading="loading">
+            <app-filter :options="filterOptons">
                 <template #before>
                     <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
                         v-model="filterDate" />

+ 1 - 1
src/packages/pc/views/query/trade/spot/history/index.vue

@@ -2,7 +2,7 @@
 <template>
     <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
         <template #header>
-            <app-filter :options="filterOptons" :loading="loading">
+            <app-filter :options="filterOptons">
                 <template #before>
                     <el-date-picker type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
                         v-model="filterDate" />

+ 1 - 6
src/packages/sbyj/components/modules/quote/chart/index.vue

@@ -16,7 +16,7 @@
             </Tabs>
             <Icon name="setting-o" style="padding: 0 .32rem;" v-if="false" />
         </div>
-        <TimeLine v-bind="{ goodsCode }" @ready="onReady" v-if="tabIndex === 0" />
+        <TimeLine v-bind="{ goodsCode }" v-if="tabIndex === 0" />
         <KLine v-bind="{ goodsCode, cycleType }" v-else />
     </div>
 </template>
@@ -35,7 +35,6 @@ defineProps({
     }
 })
 
-const emit = defineEmits(['ready'])
 const tabIndex = shallowRef(0) // 当前选中的标签
 const selectedText = shallowRef('') // 当前选中的分钟线
 const cycleType = shallowRef(ChartCycleType.Minutes) // 图表周期类型
@@ -104,10 +103,6 @@ const onPopoverSelect = (action: PopoverAction) => {
         }
     }
 }
-
-const onReady = (startTime: string, endTime: string) => {
-    emit('ready', startTime, endTime)
-}
 </script>
 
 <style lang="less">

+ 30 - 30
src/packages/sbyj/components/modules/quote/forex/index.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="app-quote-forex">
-        <dl>
+        <dl v-if="quote">
             <dt>
                 <span>卖挂牌</span>
                 <span @click="navigateTo(BuyOrSell.Sell)" v-if="showMore">更多
@@ -9,31 +9,31 @@
             </dt>
             <dd @click="onSellClick(1)">
                 <span>卖一</span>
-                <span :class="quote?.askColor">{{ handleNumberValue(quote?.ask) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume) }}</span>
+                <span :class="quote.askColor">{{ handleNumberValue(quote.ask) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume) }}</span>
             </dd>
-            <dd @click="onSellClick(2)">
+            <dd @click="onSellClick(2)" v-if="quote.quotegear > 1">
                 <span>卖二</span>
-                <span :class="quote?.ask2Color">{{ handleNumberValue(quote?.ask2) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume2) }}</span>
+                <span :class="quote.ask2Color">{{ handleNumberValue(quote.ask2) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume2) }}</span>
             </dd>
-            <dd @click="onSellClick(3)">
+            <dd @click="onSellClick(3)" v-if="quote.quotegear > 2">
                 <span>卖三</span>
-                <span :class="quote?.ask3Color">{{ handleNumberValue(quote?.ask3) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume3) }}</span>
+                <span :class="quote.ask3Color">{{ handleNumberValue(quote.ask3) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume3) }}</span>
             </dd>
-            <dd @click="onSellClick(4)">
+            <dd @click="onSellClick(4)" v-if="quote.quotegear > 3">
                 <span>卖四</span>
-                <span :class="quote?.ask4Color">{{ handleNumberValue(quote?.ask4) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume4) }}</span>
+                <span :class="quote.ask4Color">{{ handleNumberValue(quote.ask4) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume4) }}</span>
             </dd>
-            <dd @click="onSellClick(5)">
+            <dd @click="onSellClick(5)" v-if="quote.quotegear > 4">
                 <span>卖五</span>
-                <span :class="quote?.ask5Color">{{ handleNumberValue(quote?.ask5) }}</span>
-                <span>{{ handleNumberValue(quote?.askvolume5) }}</span>
+                <span :class="quote.ask5Color">{{ handleNumberValue(quote.ask5) }}</span>
+                <span>{{ handleNumberValue(quote.askvolume5) }}</span>
             </dd>
         </dl>
-        <dl>
+        <dl v-if="quote">
             <dt>
                 <span>买挂牌</span>
                 <span @click="navigateTo(BuyOrSell.Buy)" v-if="showMore">更多
@@ -42,28 +42,28 @@
             </dt>
             <dd @click="onBuyClick(1)">
                 <span>买一</span>
-                <span :class="quote?.bidColor">{{ handleNumberValue(quote?.bid) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume) }}</span>
+                <span :class="quote.bidColor">{{ handleNumberValue(quote.bid) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume) }}</span>
             </dd>
-            <dd @click="onBuyClick(2)">
+            <dd @click="onBuyClick(2)" v-if="quote.quotegear > 1">
                 <span>买二</span>
-                <span :class="quote?.bid2Color">{{ handleNumberValue(quote?.bid2) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume2) }}</span>
+                <span :class="quote.bid2Color">{{ handleNumberValue(quote.bid2) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume2) }}</span>
             </dd>
-            <dd @click="onBuyClick(3)">
+            <dd @click="onBuyClick(3)" v-if="quote.quotegear > 2">
                 <span>买三</span>
-                <span :class="quote?.bid3Color">{{ handleNumberValue(quote?.bid3) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume3) }}</span>
+                <span :class="quote.bid3Color">{{ handleNumberValue(quote.bid3) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume3) }}</span>
             </dd>
-            <dd @click="onBuyClick(4)">
+            <dd @click="onBuyClick(4)" v-if="quote.quotegear > 3">
                 <span>买四</span>
-                <span :class="quote?.bid4Color">{{ handleNumberValue(quote?.bid4) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume4) }}</span>
+                <span :class="quote.bid4Color">{{ handleNumberValue(quote.bid4) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume4) }}</span>
             </dd>
-            <dd @click="onBuyClick(5)">
+            <dd @click="onBuyClick(5)" v-if="quote.quotegear > 4">
                 <span>买五</span>
-                <span :class="quote?.bid5Color">{{ handleNumberValue(quote?.bid5) }}</span>
-                <span>{{ handleNumberValue(quote?.bidvolume5) }}</span>
+                <span :class="quote.bid5Color">{{ handleNumberValue(quote.bid5) }}</span>
+                <span>{{ handleNumberValue(quote.bidvolume5) }}</span>
             </dd>
         </dl>
     </div>

+ 2 - 12
src/packages/sbyj/components/modules/quote/index.vue

@@ -1,15 +1,13 @@
 <template>
     <div class="app-quote">
         <Price v-bind="{ goodsCode }" />
-        <Chart v-bind="{ goodsCode }" @ready="onReady" />
+        <Chart v-bind="{ goodsCode }" />
         <Forex v-bind="{ goodsCode }" v-if="showForex" />
-        <Tik v-bind="{ goodsCode, startTime, endTime }" />
+        <Tik v-bind="{ goodsCode }" />
     </div>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { formatDate } from '@/filters'
 import Price from './price/index.vue'
 import Chart from './chart/index.vue'
 import Forex from './forex/index.vue'
@@ -22,12 +20,4 @@ defineProps({
     },
     showForex: Boolean,
 })
-
-const startTime = shallowRef<string>()
-const endTime = shallowRef<string>()
-
-const onReady = (start: string, end: string) => {
-    startTime.value = formatDate(start)
-    endTime.value = formatDate(end)
-}
 </script>

+ 15 - 11
src/packages/sbyj/components/modules/quote/tik/index.vue

@@ -10,10 +10,10 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, watchEffect, watch } from 'vue'
+import { ref, watch } from 'vue'
 import { formatDate } from '@/filters'
 import { useRequest } from '@/hooks/request'
-import { queryHistoryTikDatas } from '@/services/api/market'
+import { queryHistoryTikDatas, queryMarketRun } from '@/services/api/market'
 import { useFuturesStore } from '@/stores'
 import AppList from '@/packages/sbyj/components/base/list/index.vue'
 
@@ -22,8 +22,6 @@ const props = defineProps({
         type: String,
         required: true
     },
-    startTime: String,
-    endTime: String,
 })
 
 const futuresStore = useFuturesStore()
@@ -36,7 +34,7 @@ const columns: Model.TableColumn[] = [
     { prop: 'Vol', label: '现量' },
 ]
 
-const { run } = useRequest(queryHistoryTikDatas, {
+const { run: getHistoryTikDatas } = useRequest(queryHistoryTikDatas, {
     manual: true,
     params: {
         goodsCode: props.goodsCode,
@@ -47,12 +45,18 @@ const { run } = useRequest(queryHistoryTikDatas, {
     }
 })
 
-watchEffect(() => {
-    if (props.startTime && props.endTime) {
-        run({
-            startTime: formatDate(props.startTime),
-            endTime: formatDate(props.endTime),
-        })
+useRequest(queryMarketRun, {
+    params: {
+        marketID: quote.value?.marketid
+    },
+    onSuccess: (res) => {
+        const market = res.data[0]
+        if (market) {
+            getHistoryTikDatas({
+                startTime: formatDate(market.startTime),
+                endTime: formatDate(market.endTime),
+            })
+        }
     }
 })
 

+ 9 - 7
src/services/api/account/index.ts

@@ -19,11 +19,10 @@ export function login(config: RequestConfig<Model.LoginReq> = {}) {
 /**
  * 用户登出
  */
-export function logout(config: RequestConfig<Proto.LogoutReq>) {
-    return http.mqRequest<Proto.LogoutRsp>({
-        data: config.data,
-        requestCode: 'LogoutReq',
-        responseCode: 'LogoutRsp',
+export function logout(config: RequestConfig = {}) {
+    return http.goRequest<Model.LoginRsp>({
+        url: '/Account/Loginout',
+        params: config.data,
     })
 }
 
@@ -33,6 +32,7 @@ export function logout(config: RequestConfig<Proto.LogoutReq>) {
 export function tokenCheck(config: RequestConfig = {}) {
     return http.goRequest({
         url: '/Account/TokenCheck',
+        params: config.data,
     })
 }
 
@@ -40,8 +40,9 @@ export function tokenCheck(config: RequestConfig = {}) {
  * 查询账户菜单
  */
 export function queryAccountMenu(config: RequestConfig = {}) {
-    return http.commonRequest<Model.UserRoutes[]>({
-        url: '/account/menu',
+    return http.request<Model.UserRoutes[]>({
+        url: './config/router.json',
+        params: config.data,
     })
 }
 
@@ -94,6 +95,7 @@ export function queryTaAccounts(config: RequestConfig<Model.TaAccountsReq> = {})
 export function queryAccountRole(config: RequestConfig = {}) {
     return http.commonRequest<Model.UserRole[]>({
         url: '/account/role',
+        params: config.data,
     })
 }
 

+ 2 - 0
src/services/api/bank/index.ts

@@ -66,6 +66,7 @@ export function t2bBankDeposit(config: RequestConfig<Partial<Proto.t2bBankDeposi
 export function queryCusBankSignBank(config: RequestConfig = {}) {
     return http.commonRequest<Model.CusBankSignBankRsp[]>({
         url: '/Qhj/QueryCusBankSignBank',
+        params: config.data,
     })
 }
 
@@ -75,6 +76,7 @@ export function queryCusBankSignBank(config: RequestConfig = {}) {
 export function queryBankInfo(config: RequestConfig = {}) {
     return http.commonRequest<Model.BankInfoRsp[]>({
         url: '/Qhj/QueryBankInfo',
+        params: config.data,
     })
 }
 

+ 3 - 1
src/services/api/common/index.ts

@@ -20,6 +20,7 @@ const loginStore = useLoginStore()
 export function GetAppUpdateInfo(config: RequestConfig = {}) {
     return http.request<string>({
         url: service.getConfig('androidUpdateUrl'),
+        params: config.data,
     })
 }
 
@@ -150,6 +151,7 @@ export function queryUserLevelInfo(config: RequestConfig<Model.UserLevelInfoReq>
 export function queryInvestorLevelGroup(config: RequestConfig = {}) {
     return http.commonRequest<Model.InvestorLevelGroupRsp[]>({
         url: '/Ferroalloy/QueryInvestorLevelGroup',
+        params: config.data,
     })
 }
 
@@ -242,7 +244,7 @@ export function postNoticeReaded(config: RequestConfig<Model.NoticeReadedReq> =
 /**
  * 获取金10资讯数据
  */
- export function getJ10News(config: RequestConfig<Model.J10NewsReq> = {}) {
+export function getJ10News(config: RequestConfig<Model.J10NewsReq> = {}) {
     return http.commonRequest<Model.J10NewsRsp[]>({
         url: '/Common/GetJ10News',
         params: config.data,

+ 1 - 1
src/services/api/credit/index.ts

@@ -31,6 +31,6 @@ export function queryTHJScoreConfig(config: RequestConfig<Model.THJScoreConfigRe
 /**
  * 铁合金抽奖
  */
-export function thjRedPacketLottery(params: Proto.THJRedPacketLotteryReq) {
+export function thjRedPacketLottery() {
     return Promise.reject('thjRedPacketLottery')
 }

+ 4 - 12
src/services/api/goods/index.ts

@@ -130,16 +130,6 @@ export function queryTHJProduct(config: RequestConfig<Model.THJProductReq> = {})
 }
 
 /**
- * 查询市场运行信息
- */
-export function queryMarketRun(config: RequestConfig<Model.MarketRunReq> = {}) {
-    return http.commonRequest<Model.MarketRunRsp[]>({
-        url: '/Market/QueryMarketRun',
-        params: config.data,
-    })
-}
-
-/**
  * 查询市场交易参数配置
  */
 export function queryWrMarketTradeConfig(config: RequestConfig<Model.WrMarketTradeConfigReq> = {}) {
@@ -155,6 +145,7 @@ export function queryWrMarketTradeConfig(config: RequestConfig<Model.WrMarketTra
 export function queryFtDeliveryGoods(config: RequestConfig = {}) {
     return http.commonRequest<Model.FtDeliveryGoodsRsp[]>({
         url: '/WrTrade2/QueryFtDeliveryGoods',
+        params: config.data,
     })
 }
 
@@ -171,16 +162,17 @@ export function queryWrStandardFactoryItem(config: RequestConfig<Model.WrStandar
 /**
  * 查询企业风管期货商品信息
  */
- export function queryTouristGoods(config: RequestConfig = {}) {
+export function queryTouristGoods(config: RequestConfig = {}) {
     return http.commonRequest<Model.GoodsRsp[]>({
         url: '/sbyj/GetTouristGoods',
+        params: config.data,
     })
 }
 
 /**
  * 获取游客商品盘面信息
  */
- export function queryTouristQuoteDay(config: RequestConfig<Model.QuoteDayReq> = {}) {
+export function queryTouristQuoteDay(config: RequestConfig<Model.QuoteDayReq> = {}) {
     return http.commonRequest<Model.QuoteDayRsp[]>({
         url: '/Quote/GetTouristQuoteDay',
         params: config.data,

+ 11 - 0
src/services/api/market/index.ts

@@ -2,6 +2,16 @@ import http from '@/services/http'
 import { RequestConfig } from '@/services/http/types'
 
 /**
+ * 查询市场运行信息
+ */
+export function queryMarketRun(config: RequestConfig<Model.MarketRunReq> = {}) {
+    return http.commonRequest<Model.MarketRunRsp[]>({
+        url: '/Market/QueryMarketRun',
+        params: config.data,
+    })
+}
+
+/**
  * 获取现货行情
  */
 export function querySpotGoodsPrice(config: RequestConfig<Model.SpotGoodsPriceReq> = {}) {
@@ -27,6 +37,7 @@ export function querySpotgoodsPrice(config: RequestConfig<Model.SpotgoodsPriceRe
 export function queryThjSpotQuote(config: RequestConfig = {}) {
     return http.commonRequest<Model.ThjSpotQuoteRsp[]>({
         url: '/Ferroalloy/QueryThjSpotQuote',
+        params: config.data,
     })
 }
 

+ 11 - 2
src/services/websocket/trade.ts

@@ -1,6 +1,6 @@
 import { timerInterceptor } from '@/utils/timer'
 import { FunCode } from '@/constants/funcode'
-import { useLoginStore } from '@/stores'
+import { useLoginStore, useErrorInfoStore } from '@/stores'
 import service from '@/services'
 import eventBus from '@/services/bus'
 import { MTP2WebSocket } from './build'
@@ -14,10 +14,19 @@ export default new (class {
 
     constructor() {
         this.socket.onPush = (p) => {
-            const { funCode } = p
+            const { funCode, content } = p
             const delay = 1000 // 延迟推送消息,防止短时间内重复请求
 
             switch (funCode) {
+                case FunCode.LogoutRsp: {
+                    const { getErrorInfoByCode } = useErrorInfoStore()
+                    const decryptedData = new TextDecoder().decode(content)
+                    const res: Proto.LogoutRsp = JSON.parse(decryptedData)
+
+                    // 用户登出通知
+                    eventBus.$emit('LogoutNotify', getErrorInfoByCode(res.RetCode))
+                    break;
+                }
                 case FunCode.MoneyChangedNotify: {
                     timerInterceptor.debounce(() => {
                         // 资金变动通知

+ 1 - 4
src/shims-vue.d.ts

@@ -15,7 +15,4 @@ declare module 'worker-loader!*' {
   // Uncomment this if you set the `esModule` option to `false`
   // export = WebpackWorker;
   export default WebpackWorker;
-}
-
-declare module 'mockjs-x'
-declare module 'protobufjs'
+}

+ 2 - 2
src/stores/modules/futures.ts

@@ -21,7 +21,7 @@ export const useFuturesStore = defineStore(() => {
     // 行情列表
     const quoteList = computed(() => {
         return state.goodsList.reduce((res, cur) => {
-            const { agreeunit, goodsid, goodscode, goodsname, goodunitid, goodsgroupid, marketid, decimalplace, quoteminunit, trademode } = cur
+            const { agreeunit, goodsid, goodscode, goodsname, goodunitid, goodsgroupid, marketid, decimalplace, quoteminunit, trademode, quotegear } = cur
             const quoteDayInfo = state.quoteDayList.find((e) => e.goodscode.toUpperCase() === goodscode.toUpperCase())
             const {
                 averageprice = 0,
@@ -141,6 +141,7 @@ export const useFuturesStore = defineStore(() => {
                 highestColor: handleColor(highest),
                 lowestColor: handleColor(lowest),
                 trademode,
+                quotegear,
             }
             res.push(item)
             return res
@@ -188,7 +189,6 @@ export const useFuturesStore = defineStore(() => {
     const getQuotePrice = (code?: string | number) => {
         return computed(() => {
             const quote = getQuoteInfo(code)
-            console.log(quote.value)
             return quote.value?.last ?? 0
         })
     }

+ 1 - 1
src/stores/modules/menu.ts

@@ -12,7 +12,7 @@ export const useMenuStore = defineStore(() => {
         try {
             loading.value = true
             const res = await queryAccountMenu()
-            userRoutes.value = res.data
+            userRoutes.value = res
         } finally {
             loading.value = false
         }

+ 2 - 0
src/types/model/goods.d.ts

@@ -261,6 +261,7 @@ declare namespace Model {
         afternexttradedate: string
         /// 行情清盘标志- 1:未发送 2:已发送 3:已回复
         clearquoteflag: number
+        endTime: string; // 结束时间
         /// 最新交易日(结算成功)
         lastreckondate: string
         /// 机器时间
@@ -279,6 +280,7 @@ declare namespace Model {
         runstatus: number
         /// 时间段号[多时段时用]
         sectionid: number
+        startTime: string; // 开始时间
         /// 当前交易日(服务) 资金结算完成即变更,供交易服务使用
         tradedate: string
         /// 当前交易日(行情) 在第一个市场待开市时变更为TradeDate,供行情及终端系统使用

+ 1 - 0
src/types/model/market.d.ts

@@ -129,5 +129,6 @@ declare namespace Model {
         limitup: number; // 涨停价
         quoteminunit: number;//行情最小变动单位 [整数,报价小数位一起使用]
         trademode: number;
+        quotegear: number;//行情档位
     }
 }

+ 1 - 1454
src/types/proto/proto.d.ts

@@ -1,4 +1,3 @@
-import * as $protobuf from 'protobufjs';
 /** Properties of a MessageHead. */
 export interface IMessageHead {
     /** MessageHead FunCode */
@@ -33,1456 +32,4 @@ export interface IMessageHead {
 
     /** MessageHead AccountID2 */
     AccountID2?: number | Long | null;
-}
-
-/** Represents a MessageHead. */
-export class MessageHead implements IMessageHead {
-    /**
-     * Constructs a new MessageHead.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: IMessageHead);
-
-    /** MessageHead FunCode. */
-    public FunCode: number;
-
-    /** MessageHead RequestID. */
-    public RequestID: number;
-
-    /** MessageHead AccountID. */
-    public AccountID: number | Long;
-
-    /** MessageHead AccessID. */
-    public AccessID: number;
-
-    /** MessageHead ClientTime. */
-    public ClientTime: number | Long;
-
-    /** MessageHead GoodsID. */
-    public GoodsID: number;
-
-    /** MessageHead UUID. */
-    public UUID: string;
-
-    /** MessageHead MarketID. */
-    public MarketID: number;
-
-    /** MessageHead UserID. */
-    public UserID: number;
-
-    /** MessageHead ResponseTopic. */
-    public ResponseTopic: string;
-
-    /** MessageHead AccountID2. */
-    public AccountID2: number | Long;
-
-    /**
-     * Creates a new MessageHead instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns MessageHead instance
-     */
-    public static create(properties?: IMessageHead): MessageHead;
-
-    /**
-     * Encodes the specified MessageHead message. Does not implicitly {@link MessageHead.verify|verify} messages.
-     * @param message MessageHead message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: IMessageHead, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified MessageHead message, length delimited. Does not implicitly {@link MessageHead.verify|verify} messages.
-     * @param message MessageHead message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: IMessageHead, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a MessageHead message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns MessageHead
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): MessageHead;
-
-    /**
-     * Decodes a MessageHead message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns MessageHead
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): MessageHead;
-
-    /**
-     * Verifies a MessageHead message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a MessageHead message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns MessageHead
-     */
-    public static fromObject(object: { [k: string]: any }): MessageHead;
-
-    /**
-     * Creates a plain object from a MessageHead message. Also converts values to other types if specified.
-     * @param message MessageHead
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: MessageHead, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this MessageHead to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a QueryReqPageInfo. */
-export interface IQueryReqPageInfo {
-    /** QueryReqPageInfo PageNumber */
-    PageNumber?: number | null;
-
-    /** QueryReqPageInfo RecordPerPage */
-    RecordPerPage?: number | null;
-
-    /** QueryReqPageInfo QueryMark */
-    QueryMark?: number | null;
-
-    /** QueryReqPageInfo SortField */
-    SortField?: string | null;
-
-    /** QueryReqPageInfo SortOrder */
-    SortOrder?: number | null;
-
-    /** QueryReqPageInfo NeedTotalCount */
-    NeedTotalCount?: number | null;
-}
-
-/** Represents a QueryReqPageInfo. */
-export class QueryReqPageInfo implements IQueryReqPageInfo {
-    /**
-     * Constructs a new QueryReqPageInfo.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: IQueryReqPageInfo);
-
-    /** QueryReqPageInfo PageNumber. */
-    public PageNumber: number;
-
-    /** QueryReqPageInfo RecordPerPage. */
-    public RecordPerPage: number;
-
-    /** QueryReqPageInfo QueryMark. */
-    public QueryMark: number;
-
-    /** QueryReqPageInfo SortField. */
-    public SortField: string;
-
-    /** QueryReqPageInfo SortOrder. */
-    public SortOrder: number;
-
-    /** QueryReqPageInfo NeedTotalCount. */
-    public NeedTotalCount: number;
-
-    /**
-     * Creates a new QueryReqPageInfo instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns QueryReqPageInfo instance
-     */
-    public static create(properties?: IQueryReqPageInfo): QueryReqPageInfo;
-
-    /**
-     * Encodes the specified QueryReqPageInfo message. Does not implicitly {@link QueryReqPageInfo.verify|verify} messages.
-     * @param message QueryReqPageInfo message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: IQueryReqPageInfo, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified QueryReqPageInfo message, length delimited. Does not implicitly {@link QueryReqPageInfo.verify|verify} messages.
-     * @param message QueryReqPageInfo message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: IQueryReqPageInfo, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a QueryReqPageInfo message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns QueryReqPageInfo
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): QueryReqPageInfo;
-
-    /**
-     * Decodes a QueryReqPageInfo message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns QueryReqPageInfo
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): QueryReqPageInfo;
-
-    /**
-     * Verifies a QueryReqPageInfo message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a QueryReqPageInfo message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns QueryReqPageInfo
-     */
-    public static fromObject(object: { [k: string]: any }): QueryReqPageInfo;
-
-    /**
-     * Creates a plain object from a QueryReqPageInfo message. Also converts values to other types if specified.
-     * @param message QueryReqPageInfo
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: QueryReqPageInfo, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this QueryReqPageInfo to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a QueryRspPageInfo. */
-export interface IQueryRspPageInfo {
-    /** QueryRspPageInfo PageNumber */
-    PageNumber?: number | null;
-
-    /** QueryRspPageInfo RecordPerPage */
-    RecordPerPage?: number | null;
-
-    /** QueryRspPageInfo QueryMark */
-    QueryMark?: number | null;
-
-    /** QueryRspPageInfo SortField */
-    SortField?: string | null;
-
-    /** QueryRspPageInfo SortOrder */
-    SortOrder?: number | null;
-
-    /** QueryRspPageInfo RecordCount */
-    RecordCount?: number | null;
-
-    /** QueryRspPageInfo TotalCount */
-    TotalCount?: number | null;
-}
-
-/** Represents a QueryRspPageInfo. */
-export class QueryRspPageInfo implements IQueryRspPageInfo {
-    /**
-     * Constructs a new QueryRspPageInfo.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: IQueryRspPageInfo);
-
-    /** QueryRspPageInfo PageNumber. */
-    public PageNumber: number;
-
-    /** QueryRspPageInfo RecordPerPage. */
-    public RecordPerPage: number;
-
-    /** QueryRspPageInfo QueryMark. */
-    public QueryMark: number;
-
-    /** QueryRspPageInfo SortField. */
-    public SortField: string;
-
-    /** QueryRspPageInfo SortOrder. */
-    public SortOrder: number;
-
-    /** QueryRspPageInfo RecordCount. */
-    public RecordCount: number;
-
-    /** QueryRspPageInfo TotalCount. */
-    public TotalCount: number;
-
-    /**
-     * Creates a new QueryRspPageInfo instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns QueryRspPageInfo instance
-     */
-    public static create(properties?: IQueryRspPageInfo): QueryRspPageInfo;
-
-    /**
-     * Encodes the specified QueryRspPageInfo message. Does not implicitly {@link QueryRspPageInfo.verify|verify} messages.
-     * @param message QueryRspPageInfo message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: IQueryRspPageInfo, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified QueryRspPageInfo message, length delimited. Does not implicitly {@link QueryRspPageInfo.verify|verify} messages.
-     * @param message QueryRspPageInfo message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: IQueryRspPageInfo, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a QueryRspPageInfo message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns QueryRspPageInfo
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): QueryRspPageInfo;
-
-    /**
-     * Decodes a QueryRspPageInfo message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns QueryRspPageInfo
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): QueryRspPageInfo;
-
-    /**
-     * Verifies a QueryRspPageInfo message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a QueryRspPageInfo message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns QueryRspPageInfo
-     */
-    public static fromObject(object: { [k: string]: any }): QueryRspPageInfo;
-
-    /**
-     * Creates a plain object from a QueryRspPageInfo message. Also converts values to other types if specified.
-     * @param message QueryRspPageInfo
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: QueryRspPageInfo, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this QueryRspPageInfo to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a CommonPackage. */
-export interface ICommonPackage {
-    /** CommonPackage Header */
-    Header: IMessageHead;
-}
-
-/** Represents a CommonPackage. */
-export class CommonPackage implements ICommonPackage {
-    /**
-     * Constructs a new CommonPackage.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ICommonPackage);
-
-    /** CommonPackage Header. */
-    public Header: IMessageHead;
-
-    /**
-     * Creates a new CommonPackage instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns CommonPackage instance
-     */
-    public static create(properties?: ICommonPackage): CommonPackage;
-
-    /**
-     * Encodes the specified CommonPackage message. Does not implicitly {@link CommonPackage.verify|verify} messages.
-     * @param message CommonPackage message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ICommonPackage, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified CommonPackage message, length delimited. Does not implicitly {@link CommonPackage.verify|verify} messages.
-     * @param message CommonPackage message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ICommonPackage, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a CommonPackage message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns CommonPackage
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): CommonPackage;
-
-    /**
-     * Decodes a CommonPackage message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns CommonPackage
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): CommonPackage;
-
-    /**
-     * Verifies a CommonPackage message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a CommonPackage message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns CommonPackage
-     */
-    public static fromObject(object: { [k: string]: any }): CommonPackage;
-
-    /**
-     * Creates a plain object from a CommonPackage message. Also converts values to other types if specified.
-     * @param message CommonPackage
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: CommonPackage, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this CommonPackage to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a NotifyHead. */
-export interface INotifyHead {
-    /** NotifyHead NtfMode */
-    NtfMode?: number | null;
-
-    /** NotifyHead ExcludeAcctIDs */
-    ExcludeAcctIDs?: number[] | null;
-
-    /** NotifyHead ExchIDs */
-    ExchIDs?: number[] | null;
-
-    /** NotifyHead MemberIDs */
-    MemberIDs?: number[] | null;
-
-    /** NotifyHead AccountIDs */
-    AccountIDs?: (number | Long)[] | null;
-}
-
-/** Represents a NotifyHead. */
-export class NotifyHead implements INotifyHead {
-    /**
-     * Constructs a new NotifyHead.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: INotifyHead);
-
-    /** NotifyHead NtfMode. */
-    public NtfMode: number;
-
-    /** NotifyHead ExcludeAcctIDs. */
-    public ExcludeAcctIDs: number[];
-
-    /** NotifyHead ExchIDs. */
-    public ExchIDs: number[];
-
-    /** NotifyHead MemberIDs. */
-    public MemberIDs: number[];
-
-    /** NotifyHead AccountIDs. */
-    public AccountIDs: (number | Long)[];
-
-    /**
-     * Creates a new NotifyHead instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns NotifyHead instance
-     */
-    public static create(properties?: INotifyHead): NotifyHead;
-
-    /**
-     * Encodes the specified NotifyHead message. Does not implicitly {@link NotifyHead.verify|verify} messages.
-     * @param message NotifyHead message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: INotifyHead, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified NotifyHead message, length delimited. Does not implicitly {@link NotifyHead.verify|verify} messages.
-     * @param message NotifyHead message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: INotifyHead, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a NotifyHead message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns NotifyHead
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): NotifyHead;
-
-    /**
-     * Decodes a NotifyHead message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns NotifyHead
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): NotifyHead;
-
-    /**
-     * Verifies a NotifyHead message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a NotifyHead message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns NotifyHead
-     */
-    public static fromObject(object: { [k: string]: any }): NotifyHead;
-
-    /**
-     * Creates a plain object from a NotifyHead message. Also converts values to other types if specified.
-     * @param message NotifyHead
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: NotifyHead, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this NotifyHead to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a CommonNtf. */
-export interface ICommonNtf {
-    /** CommonNtf Header */
-    Header?: IMessageHead | null;
-
-    /** CommonNtf NtfHeader */
-    NtfHeader?: INotifyHead | null;
-}
-
-/** Represents a CommonNtf. */
-export class CommonNtf implements ICommonNtf {
-    /**
-     * Constructs a new CommonNtf.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ICommonNtf);
-
-    /** CommonNtf Header. */
-    public Header?: IMessageHead | null;
-
-    /** CommonNtf NtfHeader. */
-    public NtfHeader?: INotifyHead | null;
-
-    /**
-     * Creates a new CommonNtf instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns CommonNtf instance
-     */
-    public static create(properties?: ICommonNtf): CommonNtf;
-
-    /**
-     * Encodes the specified CommonNtf message. Does not implicitly {@link CommonNtf.verify|verify} messages.
-     * @param message CommonNtf message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ICommonNtf, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified CommonNtf message, length delimited. Does not implicitly {@link CommonNtf.verify|verify} messages.
-     * @param message CommonNtf message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ICommonNtf, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a CommonNtf message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns CommonNtf
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): CommonNtf;
-
-    /**
-     * Decodes a CommonNtf message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns CommonNtf
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): CommonNtf;
-
-    /**
-     * Verifies a CommonNtf message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a CommonNtf message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns CommonNtf
-     */
-    public static fromObject(object: { [k: string]: any }): CommonNtf;
-
-    /**
-     * Creates a plain object from a CommonNtf message. Also converts values to other types if specified.
-     * @param message CommonNtf
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: CommonNtf, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this CommonNtf to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a LoginReq. */
-export interface ILoginReq {
-    /** LoginReq Header */
-    Header?: IMessageHead | null;
-
-    /** LoginReq LoginID */
-    LoginID?: number | Long | null;
-
-    /** LoginReq LoginPWD */
-    LoginPWD?: string | null;
-
-    /** LoginReq LoginType */
-    LoginType?: number | null;
-
-    /** LoginReq ClientType */
-    ClientType?: number | null;
-
-    /** LoginReq Version */
-    Version?: string | null;
-
-    /** LoginReq MobilePhone */
-    MobilePhone?: string | null;
-
-    /** LoginReq GUID */
-    GUID?: string | null;
-
-    /** LoginReq LoginIp */
-    LoginIp?: string | null;
-
-    /** LoginReq LoginPort */
-    LoginPort?: number | null;
-
-    /** LoginReq DeviceID */
-    DeviceID?: string | null;
-
-    /** LoginReq EnvironmentInfo */
-    EnvironmentInfo?: string | null;
-
-    /** LoginReq LoginCode */
-    LoginCode?: string | null;
-}
-
-/** Represents a LoginReq. */
-export class LoginReq implements ILoginReq {
-    /**
-     * Constructs a new LoginReq.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ILoginReq);
-
-    /** LoginReq Header. */
-    public Header?: IMessageHead | null;
-
-    /** LoginReq LoginID. */
-    public LoginID: number | Long;
-
-    /** LoginReq LoginPWD. */
-    public LoginPWD: string;
-
-    /** LoginReq LoginType. */
-    public LoginType: number;
-
-    /** LoginReq ClientType. */
-    public ClientType: number;
-
-    /** LoginReq Version. */
-    public Version: string;
-
-    /** LoginReq MobilePhone. */
-    public MobilePhone: string;
-
-    /** LoginReq GUID. */
-    public GUID: string;
-
-    /** LoginReq LoginIp. */
-    public LoginIp: string;
-
-    /** LoginReq LoginPort. */
-    public LoginPort: number;
-
-    /** LoginReq DeviceID. */
-    public DeviceID: string;
-
-    /** LoginReq EnvironmentInfo. */
-    public EnvironmentInfo: string;
-
-    /** LoginReq LoginCode. */
-    public LoginCode: string;
-
-    /**
-     * Creates a new LoginReq instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns LoginReq instance
-     */
-    public static create(properties?: ILoginReq): LoginReq;
-
-    /**
-     * Encodes the specified LoginReq message. Does not implicitly {@link LoginReq.verify|verify} messages.
-     * @param message LoginReq message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ILoginReq, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified LoginReq message, length delimited. Does not implicitly {@link LoginReq.verify|verify} messages.
-     * @param message LoginReq message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ILoginReq, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a LoginReq message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns LoginReq
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): LoginReq;
-
-    /**
-     * Decodes a LoginReq message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns LoginReq
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): LoginReq;
-
-    /**
-     * Verifies a LoginReq message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a LoginReq message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns LoginReq
-     */
-    public static fromObject(object: { [k: string]: any }): LoginReq;
-
-    /**
-     * Creates a plain object from a LoginReq message. Also converts values to other types if specified.
-     * @param message LoginReq
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: LoginReq, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this LoginReq to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a LoginRsp. */
-export interface ILoginRsp {
-    /** LoginRsp Header */
-    Header?: IMessageHead | null;
-
-    /** LoginRsp RetCode */
-    RetCode?: number | null;
-
-    /** LoginRsp RetDesc */
-    RetDesc?: string | null;
-
-    /** LoginRsp LoginID */
-    LoginID?: number | Long | null;
-
-    /** LoginRsp LoginUserType */
-    LoginUserType?: number | null;
-
-    /** LoginRsp AccountStatus */
-    AccountStatus?: number | null;
-
-    /** LoginRsp UserID */
-    UserID?: number | null;
-
-    /** LoginRsp MemberUserID */
-    MemberUserID?: number | null;
-
-    /** LoginRsp AccountIDs */
-    AccountIDs?: (number | Long)[] | null;
-
-    /** LoginRsp Token */
-    Token?: string | null;
-
-    /** LoginRsp SystemTime */
-    SystemTime?: number | Long | null;
-
-    /** LoginRsp HasUpdatedPwd */
-    HasUpdatedPwd?: number | null;
-
-    /** LoginRsp PwdWrongCnt */
-    PwdWrongCnt?: number | null;
-
-    /** LoginRsp PwdWrongLockCnt */
-    PwdWrongLockCnt?: number | null;
-
-    /** LoginRsp LoginLockHourNum */
-    LoginLockHourNum?: number | null;
-
-    /** LoginRsp LoginCode */
-    LoginCode?: string | null;
-}
-
-/** Represents a LoginRsp. */
-export class LoginRsp implements ILoginRsp {
-    /**
-     * Constructs a new LoginRsp.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ILoginRsp);
-
-    /** LoginRsp Header. */
-    public Header?: IMessageHead | null;
-
-    /** LoginRsp RetCode. */
-    public RetCode: number;
-
-    /** LoginRsp RetDesc. */
-    public RetDesc: string;
-
-    /** LoginRsp LoginID. */
-    public LoginID: number | Long;
-
-    /** LoginRsp LoginUserType. */
-    public LoginUserType: number;
-
-    /** LoginRsp AccountStatus. */
-    public AccountStatus: number;
-
-    /** LoginRsp UserID. */
-    public UserID: number;
-
-    /** LoginRsp MemberUserID. */
-    public MemberUserID: number;
-
-    /** LoginRsp AccountIDs. */
-    public AccountIDs: (number | Long)[];
-
-    /** LoginRsp Token. */
-    public Token: string;
-
-    /** LoginRsp SystemTime. */
-    public SystemTime: number | Long;
-
-    /** LoginRsp HasUpdatedPwd. */
-    public HasUpdatedPwd: number;
-
-    /** LoginRsp PwdWrongCnt. */
-    public PwdWrongCnt: number;
-
-    /** LoginRsp PwdWrongLockCnt. */
-    public PwdWrongLockCnt: number;
-
-    /** LoginRsp LoginLockHourNum. */
-    public LoginLockHourNum: number;
-
-    /** LoginRsp LoginCode. */
-    public LoginCode: string;
-
-    /**
-     * Creates a new LoginRsp instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns LoginRsp instance
-     */
-    public static create(properties?: ILoginRsp): LoginRsp;
-
-    /**
-     * Encodes the specified LoginRsp message. Does not implicitly {@link LoginRsp.verify|verify} messages.
-     * @param message LoginRsp message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ILoginRsp, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified LoginRsp message, length delimited. Does not implicitly {@link LoginRsp.verify|verify} messages.
-     * @param message LoginRsp message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ILoginRsp, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a LoginRsp message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns LoginRsp
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): LoginRsp;
-
-    /**
-     * Decodes a LoginRsp message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns LoginRsp
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): LoginRsp;
-
-    /**
-     * Verifies a LoginRsp message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a LoginRsp message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns LoginRsp
-     */
-    public static fromObject(object: { [k: string]: any }): LoginRsp;
-
-    /**
-     * Creates a plain object from a LoginRsp message. Also converts values to other types if specified.
-     * @param message LoginRsp
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: LoginRsp, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this LoginRsp to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a LogoutReq. */
-export interface ILogoutReq {
-    /** LogoutReq Header */
-    Header?: IMessageHead | null;
-
-    /** LogoutReq LoginID */
-    LoginID?: number | Long | null;
-
-    /** LogoutReq Token */
-    Token?: string | null;
-
-    /** LogoutReq LoginIp */
-    LoginIp?: string | null;
-
-    /** LogoutReq LoginPort */
-    LoginPort?: number | null;
-}
-
-/** Represents a LogoutReq. */
-export class LogoutReq implements ILogoutReq {
-    /**
-     * Constructs a new LogoutReq.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ILogoutReq);
-
-    /** LogoutReq Header. */
-    public Header?: IMessageHead | null;
-
-    /** LogoutReq LoginID. */
-    public LoginID: number | Long;
-
-    /** LogoutReq Token. */
-    public Token: string;
-
-    /** LogoutReq LoginIp. */
-    public LoginIp: string;
-
-    /** LogoutReq LoginPort. */
-    public LoginPort: number;
-
-    /**
-     * Creates a new LogoutReq instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns LogoutReq instance
-     */
-    public static create(properties?: ILogoutReq): LogoutReq;
-
-    /**
-     * Encodes the specified LogoutReq message. Does not implicitly {@link LogoutReq.verify|verify} messages.
-     * @param message LogoutReq message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ILogoutReq, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified LogoutReq message, length delimited. Does not implicitly {@link LogoutReq.verify|verify} messages.
-     * @param message LogoutReq message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ILogoutReq, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a LogoutReq message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns LogoutReq
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): LogoutReq;
-
-    /**
-     * Decodes a LogoutReq message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns LogoutReq
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): LogoutReq;
-
-    /**
-     * Verifies a LogoutReq message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a LogoutReq message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns LogoutReq
-     */
-    public static fromObject(object: { [k: string]: any }): LogoutReq;
-
-    /**
-     * Creates a plain object from a LogoutReq message. Also converts values to other types if specified.
-     * @param message LogoutReq
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: LogoutReq, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this LogoutReq to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a LogoutRsp. */
-export interface ILogoutRsp {
-    /** LogoutRsp Header */
-    Header?: IMessageHead | null;
-
-    /** LogoutRsp RetCode */
-    RetCode?: number | null;
-
-    /** LogoutRsp RetDesc */
-    RetDesc?: string | null;
-}
-
-/** Represents a LogoutRsp. */
-export class LogoutRsp implements ILogoutRsp {
-    /**
-     * Constructs a new LogoutRsp.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ILogoutRsp);
-
-    /** LogoutRsp Header. */
-    public Header?: IMessageHead | null;
-
-    /** LogoutRsp RetCode. */
-    public RetCode: number;
-
-    /** LogoutRsp RetDesc. */
-    public RetDesc: string;
-
-    /**
-     * Creates a new LogoutRsp instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns LogoutRsp instance
-     */
-    public static create(properties?: ILogoutRsp): LogoutRsp;
-
-    /**
-     * Encodes the specified LogoutRsp message. Does not implicitly {@link LogoutRsp.verify|verify} messages.
-     * @param message LogoutRsp message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ILogoutRsp, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified LogoutRsp message, length delimited. Does not implicitly {@link LogoutRsp.verify|verify} messages.
-     * @param message LogoutRsp message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ILogoutRsp, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a LogoutRsp message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns LogoutRsp
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): LogoutRsp;
-
-    /**
-     * Decodes a LogoutRsp message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns LogoutRsp
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): LogoutRsp;
-
-    /**
-     * Verifies a LogoutRsp message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a LogoutRsp message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns LogoutRsp
-     */
-    public static fromObject(object: { [k: string]: any }): LogoutRsp;
-
-    /**
-     * Creates a plain object from a LogoutRsp message. Also converts values to other types if specified.
-     * @param message LogoutRsp
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: LogoutRsp, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this LogoutRsp to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a TokenCheckReq. */
-export interface ITokenCheckReq {
-    /** TokenCheckReq Header */
-    Header?: IMessageHead | null;
-
-    /** TokenCheckReq LoginID */
-    LoginID?: number | Long | null;
-
-    /** TokenCheckReq Token */
-    Token?: string | null;
-
-    /** TokenCheckReq SystemTime */
-    SystemTime?: number | Long | null;
-
-    /** TokenCheckReq CheckType */
-    CheckType?: number | null;
-}
-
-/** Represents a TokenCheckReq. */
-export class TokenCheckReq implements ITokenCheckReq {
-    /**
-     * Constructs a new TokenCheckReq.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ITokenCheckReq);
-
-    /** TokenCheckReq Header. */
-    public Header?: IMessageHead | null;
-
-    /** TokenCheckReq LoginID. */
-    public LoginID: number | Long;
-
-    /** TokenCheckReq Token. */
-    public Token: string;
-
-    /** TokenCheckReq SystemTime. */
-    public SystemTime: number | Long;
-
-    /** TokenCheckReq CheckType. */
-    public CheckType: number;
-
-    /**
-     * Creates a new TokenCheckReq instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns TokenCheckReq instance
-     */
-    public static create(properties?: ITokenCheckReq): TokenCheckReq;
-
-    /**
-     * Encodes the specified TokenCheckReq message. Does not implicitly {@link TokenCheckReq.verify|verify} messages.
-     * @param message TokenCheckReq message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ITokenCheckReq, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified TokenCheckReq message, length delimited. Does not implicitly {@link TokenCheckReq.verify|verify} messages.
-     * @param message TokenCheckReq message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ITokenCheckReq, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a TokenCheckReq message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns TokenCheckReq
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): TokenCheckReq;
-
-    /**
-     * Decodes a TokenCheckReq message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns TokenCheckReq
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): TokenCheckReq;
-
-    /**
-     * Verifies a TokenCheckReq message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a TokenCheckReq message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns TokenCheckReq
-     */
-    public static fromObject(object: { [k: string]: any }): TokenCheckReq;
-
-    /**
-     * Creates a plain object from a TokenCheckReq message. Also converts values to other types if specified.
-     * @param message TokenCheckReq
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: TokenCheckReq, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this TokenCheckReq to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
-
-/** Properties of a TokenCheckRsp. */
-export interface ITokenCheckRsp {
-    /** TokenCheckRsp Header */
-    Header?: IMessageHead | null;
-
-    /** TokenCheckRsp RetCode */
-    RetCode?: number | null;
-
-    /** TokenCheckRsp RetDesc */
-    RetDesc?: string | null;
-
-    /** TokenCheckRsp LoginID */
-    LoginID?: number | Long | null;
-
-    /** TokenCheckRsp TokenStatus */
-    TokenStatus?: number | null;
-
-    /** TokenCheckRsp LoginUserType */
-    LoginUserType?: number | null;
-
-    /** TokenCheckRsp UserID */
-    UserID?: number | null;
-
-    /** TokenCheckRsp MemberUserID */
-    MemberUserID?: number | null;
-
-    /** TokenCheckRsp AccountIDs */
-    AccountIDs?: (number | Long)[] | null;
-
-    /** TokenCheckRsp SystemTime */
-    SystemTime?: number | Long | null;
-}
-
-/** Represents a TokenCheckRsp. */
-export class TokenCheckRsp implements ITokenCheckRsp {
-    /**
-     * Constructs a new TokenCheckRsp.
-     * @param [properties] Properties to set
-     */
-    constructor(properties?: ITokenCheckRsp);
-
-    /** TokenCheckRsp Header. */
-    public Header?: IMessageHead | null;
-
-    /** TokenCheckRsp RetCode. */
-    public RetCode: number;
-
-    /** TokenCheckRsp RetDesc. */
-    public RetDesc: string;
-
-    /** TokenCheckRsp LoginID. */
-    public LoginID: number | Long;
-
-    /** TokenCheckRsp TokenStatus. */
-    public TokenStatus: number;
-
-    /** TokenCheckRsp LoginUserType. */
-    public LoginUserType: number;
-
-    /** TokenCheckRsp UserID. */
-    public UserID: number;
-
-    /** TokenCheckRsp MemberUserID. */
-    public MemberUserID: number;
-
-    /** TokenCheckRsp AccountIDs. */
-    public AccountIDs: (number | Long)[];
-
-    /** TokenCheckRsp SystemTime. */
-    public SystemTime: number | Long;
-
-    /**
-     * Creates a new TokenCheckRsp instance using the specified properties.
-     * @param [properties] Properties to set
-     * @returns TokenCheckRsp instance
-     */
-    public static create(properties?: ITokenCheckRsp): TokenCheckRsp;
-
-    /**
-     * Encodes the specified TokenCheckRsp message. Does not implicitly {@link TokenCheckRsp.verify|verify} messages.
-     * @param message TokenCheckRsp message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encode(message: ITokenCheckRsp, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Encodes the specified TokenCheckRsp message, length delimited. Does not implicitly {@link TokenCheckRsp.verify|verify} messages.
-     * @param message TokenCheckRsp message or plain object to encode
-     * @param [writer] Writer to encode to
-     * @returns Writer
-     */
-    public static encodeDelimited(message: ITokenCheckRsp, writer?: $protobuf.Writer): $protobuf.Writer;
-
-    /**
-     * Decodes a TokenCheckRsp message from the specified reader or buffer.
-     * @param reader Reader or buffer to decode from
-     * @param [length] Message length if known beforehand
-     * @returns TokenCheckRsp
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decode(reader: $protobuf.Reader | Uint8Array, length?: number): TokenCheckRsp;
-
-    /**
-     * Decodes a TokenCheckRsp message from the specified reader or buffer, length delimited.
-     * @param reader Reader or buffer to decode from
-     * @returns TokenCheckRsp
-     * @throws {Error} If the payload is not a reader or valid buffer
-     * @throws {$protobuf.util.ProtocolError} If required fields are missing
-     */
-    public static decodeDelimited(reader: $protobuf.Reader | Uint8Array): TokenCheckRsp;
-
-    /**
-     * Verifies a TokenCheckRsp message.
-     * @param message Plain object to verify
-     * @returns `null` if valid, otherwise the reason why it is not
-     */
-    public static verify(message: { [k: string]: any }): string | null;
-
-    /**
-     * Creates a TokenCheckRsp message from a plain object. Also converts values to their respective internal types.
-     * @param object Plain object
-     * @returns TokenCheckRsp
-     */
-    public static fromObject(object: { [k: string]: any }): TokenCheckRsp;
-
-    /**
-     * Creates a plain object from a TokenCheckRsp message. Also converts values to other types if specified.
-     * @param message TokenCheckRsp
-     * @param [options] Conversion options
-     * @returns Plain object
-     */
-    public static toObject(message: TokenCheckRsp, options?: $protobuf.IConversionOptions): { [k: string]: any };
-
-    /**
-     * Converts this TokenCheckRsp to JSON.
-     * @returns JSON object
-     */
-    public toJSON(): { [k: string]: any };
-}
+}