li.shaoyi преди 2 години
родител
ревизия
363812dfa5
променени са 33 файла, в които са добавени 332 реда и са изтрити 280 реда
  1. 7 3
      oem/gstj/config/appconfig.json
  2. 4 1
      oem/qdhs/config/appconfig.json
  3. 4 1
      oem/qxst/config/appconfig.json
  4. 5 1
      oem/sbyj/config/appconfig.json
  5. 5 1
      oem/tc/config/appconfig.json
  6. 5 1
      oem/zrwyt/config/appconfig.json
  7. 11 11
      package.json
  8. 1 2
      public/config/appconfig.j2
  9. 8 5
      public/config/appconfig.json
  10. 23 6
      src/business/login/index.ts
  11. 2 1
      src/packages/mobile/views/order/position/components/goods/list/Index.vue
  12. 1 1
      src/packages/mobile/views/user/login/Index.vue
  13. 5 0
      src/packages/pc/components/layouts/page/index.less
  14. 14 1
      src/packages/pc/components/layouts/page/index.vue
  15. 2 2
      src/packages/pc/components/modules/quote/price/index.vue
  16. 2 2
      src/packages/pc/views/auth/login/index.vue
  17. 2 2
      src/packages/pc/views/footer/goods/detail/index.vue
  18. 5 1
      src/packages/pc/views/footer/presell/presellposition/deposit/index.vue
  19. 1 1
      src/packages/qdhs/views/user/login/Index.vue
  20. 2 3
      src/services/api/account/index.ts
  21. 1 2
      src/services/api/trade/index.ts
  22. 3 1
      src/services/bus/types.ts
  23. 50 33
      src/services/http/index.ts
  24. 14 1
      src/services/index.ts
  25. 42 79
      src/services/websocket/trade.ts
  26. 11 18
      src/stores/modules/login.ts
  27. 2 2
      src/stores/storage.ts
  28. 4 4
      src/types/proto/account.d.ts
  29. 16 14
      src/types/proto/bank.d.ts
  30. 1 1
      src/types/proto/credit.d.ts
  31. 4 4
      src/types/proto/performance.d.ts
  32. 69 69
      src/types/proto/trade.d.ts
  33. 6 6
      src/types/proto/user.d.ts

+ 7 - 3
oem/gstj/config/appconfig.json

@@ -1,7 +1,11 @@
 {
   "appName": "甘肃碳交",
-  "version": "1.0.2",
-  "versionCode": "100002",
+  "version": "1.0.0",
+  "versionCode": "100000",
   "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
-  "shwoRegister": true
+  "tradeChannel": "ws",
+  "modules": [
+    "register",
+    "delivery"
+  ]
 }

+ 4 - 1
oem/qdhs/config/appconfig.json

@@ -3,5 +3,8 @@
   "version": "1.0.0",
   "versionCode": "100000",
   "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
-  "shwoRegister": false
+  "tradeChannel": "ws",
+  "modules": [
+    "delivery"
+  ]
 }

+ 4 - 1
oem/qxst/config/appconfig.json

@@ -3,5 +3,8 @@
   "version": "1.0.0",
   "versionCode": "100000",
   "apiUrl": "http://8.130.72.213:8280/cfg?key=mtp_20",
-  "shwoRegister": true
+  "tradeChannel": "ws",
+  "modules": [
+    "register"
+  ]
 }

+ 5 - 1
oem/sbyj/config/appconfig.json

@@ -3,5 +3,9 @@
   "version": "1.0.0",
   "versionCode": "100000",
   "apiUrl": "http://192.168.31.171:8080/cfg?key=test_171",
-  "shwoRegister": true
+  "tradeChannel": "ws",
+  "modules": [
+    "register",
+    "delivery"
+  ]
 }

+ 5 - 1
oem/tc/config/appconfig.json

@@ -3,5 +3,9 @@
   "version": "1.0.0",
   "versionCode": "100000",
   "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
-  "shwoRegister": true
+  "tradeChannel": "ws",
+  "modules": [
+    "register",
+    "delivery"
+  ]
 }

+ 5 - 1
oem/zrwyt/config/appconfig.json

@@ -3,5 +3,9 @@
   "version": "1.0.0",
   "versionCode": "100000",
   "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
-  "shwoRegister": true
+  "tradeChannel": "ws",
+  "modules": [
+    "register",
+    "delivery"
+  ]
 }

+ 11 - 11
package.json

@@ -14,17 +14,17 @@
     "dev:tc": "vue-cli-service serve --mode tc",
     "build:pc": "set \"NODE_ENV=production\" && vue-cli-service build --mode pc",
     "build:mobile": "set \"NODE_ENV=production\" && vue-cli-service build --mode mobile",
-    "build:gstj": "set \"NODE_ENV=production\" && vue-cli-service build --mode gstj",
-    "build:gstj@pc": "set \"NODE_ENV=production\" && vue-cli-service build --mode gstj@pc",
-    "build:sbyj": "set \"NODE_ENV=production\" && vue-cli-service build --mode sbyj",
-    "build:qxst": "set \"NODE_ENV=production\" && vue-cli-service build --mode qxst",
-    "build:qxst@pc": "set \"NODE_ENV=production\" && vue-cli-service build --mode qxst@pc",
-    "build:zrwyt": "set \"NODE_ENV=production\" && vue-cli-service build --mode zrwyt",
-    "build:zrwyt@pc": "set \"NODE_ENV=production\" && vue-cli-service build --mode zrwyt@pc",
-    "build:qdhs": "set \"NODE_ENV=production\" && vue-cli-service build --mode qdhs",
-    "build:qdhs@pc": "set \"NODE_ENV=production\" && vue-cli-service build --mode qdhs@pc",
-    "build:tc": "set \"NODE_ENV=production\" && vue-cli-service build --mode tc",
-    "build:tc@pc": "set \"NODE_ENV=production\" && vue-cli-service build --mode tc@pc",
+    "build:gstj": "vue-cli-service build --mode gstj",
+    "build:gstj@pc": "vue-cli-service build --mode gstj@pc",
+    "build:sbyj": "vue-cli-service build --mode sbyj",
+    "build:qxst": "vue-cli-service build --mode qxst",
+    "build:qxst@pc": "vue-cli-service build --mode qxst@pc",
+    "build:zrwyt": "vue-cli-service build --mode zrwyt",
+    "build:zrwyt@pc": "vue-cli-service build --mode zrwyt@pc",
+    "build:qdhs": "vue-cli-service build --mode qdhs",
+    "build:qdhs@pc": "&& vue-cli-service build --mode qdhs@pc",
+    "build:tc": "vue-cli-service build --mode tc",
+    "build:tc@pc": "vue-cli-service build --mode tc@pc",
     "lint": "vue-cli-service lint",
     "dev": "electron .",
     "build": "node app/electron.build.js",

+ 1 - 2
public/config/appconfig.j2

@@ -1,6 +1,5 @@
 {
   "version": "1.0.0",
   "versionCode": "100000",
-  "apiUrl": "{apiUrl}",
-  "shwoRegister": "{shwoRegister}",
+  "apiUrl": "{apiUrl}"
 }

+ 8 - 5
public/config/appconfig.json

@@ -1,8 +1,11 @@
 {
   "appName": "多元世纪交易中心",
-  "version": "1.0.4",
-  "versionCode": "100004",
-  "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
-  "shwoRegister": true,
-  "tradeService": "http"
+  "version": "1.0.0",
+  "versionCode": "100000",
+  "apiUrl": "http://192.168.31.158:18240/cfg?key=dev_104",
+  "tradeChannel": "ws",
+  "modules": [
+    "register",
+    "delivery"
+  ]
 }

+ 23 - 6
src/business/login/index.ts

@@ -27,12 +27,12 @@ export function useLogin(persist = false) {
 
     const remember = shallowRef(true) // 记住账号
     const formData = reactive<Proto.LoginReq>({
-        LoginID: localStorage.getItem('muchinfo_loginId') ?? '',
+        LoginID: localStorage.getItem('app_loginId') ?? '',
         LoginPWD: '',
         GUID: v4(),
         LoginType: 0,
         ClientType: 0,
-        Version: '1.0.0',
+        Version: '2.0.0.0',
         DeviceID: ''
     })
 
@@ -65,7 +65,11 @@ export function useLogin(persist = false) {
                 if (autoLogin) {
                     const params = loginStore.getAutoLoginData()
                     if (params) {
-                        resolve(params)
+                        resolve({
+                            ...formData,
+                            LoginID: params.userName,
+                            LoginPWD: params.password
+                        })
                     } else {
                         reject('自动登录失败')
                     }
@@ -86,9 +90,22 @@ export function useLogin(persist = false) {
                 }
             })
             await login(payload).then(async (res) => {
-                loginStore.setLoginInfo(res, persist)
-                loginStore.setAutoLoginData(payload)
-                localStorage.setItem('muchinfo_loginId', formData.LoginID) // 记住登录ID
+                // 更新登录信息
+                loginStore.setLoginInfo({
+                    expiresAt: 0,
+                    loginId: res.LoginID,
+                    token: res.Token,
+                    userId: res.UserID,
+                }, persist)
+                
+                // 更新自动登录信息
+                loginStore.setAutoLoginData({
+                    clientType: payload.ClientType,
+                    password: payload.LoginPWD,
+                    userName: payload.LoginID 
+                })
+
+                localStorage.setItem('app_loginId', formData.LoginID) // 记住登录ID
                 await loadUserData()
                 eventBus.$emit('LoginNotify') // 登录成功通知
             })

+ 2 - 1
src/packages/mobile/views/order/position/components/goods/list/Index.vue

@@ -46,7 +46,7 @@
                 <div class="g-order-list__btnbar" v-if="item.enableqty">
                     <Button size="small" @click="showComponent('close', item)" round>转让</Button>
                     <Button size="small" @click="showComponent(item.trademode === 16 ? 'delivery16' : 'delivery50', item)"
-                        round>交收</Button>
+                        round v-if="service.hasSystemModule('delivery')">交收</Button>
                 </div>
             </div>
         </div>
@@ -63,6 +63,7 @@ import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import { getBuyOrSellName } from '@/constants/order'
 import { formatDecimal, handleNumberValue } from '@/filters'
 import { usePosition } from '@/business/position'
+import service from '@/services'
 import eventBus from '@/services/bus'
 
 const componentMap = new Map<string, unknown>([

+ 1 - 1
src/packages/mobile/views/user/login/Index.vue

@@ -16,7 +16,7 @@
       </div>
     </Form>
     <div class="login-link">
-      <span @click="navigationTo('user-register')" v-if="service.getSystemInfo('shwoRegister')">用户注册</span>
+      <span @click="navigationTo('user-register')" v-if="service.hasSystemModule('register')">用户注册</span>
       <span @click="navigationTo('user-forget')">忘记密码</span>
     </div>
     <div class="login-footer">

+ 5 - 0
src/packages/pc/components/layouts/page/index.less

@@ -3,6 +3,11 @@
     flex-direction: column;
     height: 100%;
 
+    .el-loading-mask {
+        --el-mask-color: rgba(0, 0, 0, .5);
+        --el-color-primary: #fff;
+    }
+
     &__statusbar {
         display: flex;
         align-items: center;

+ 14 - 1
src/packages/pc/components/layouts/page/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-page">
+  <div class="app-page" v-loading="fullLoading" element-loading-text="服务连接中...">
     <div class="app-page__header">
       <app-header>
         <!-- <template #left>
@@ -68,6 +68,7 @@ import AppSidebar from '../sidebar/index.vue'
 
 const globalStore = useGlobalStore()
 const loginStore = useLoginStore()
+const fullLoading = ref(false)
 const isCollapse = ref(globalStore.isMobile)
 const serverTime = ref<Moment>()
 
@@ -100,6 +101,16 @@ const documentVisibilityStateNotify = eventBus.$on('DocumentVisibilityStateNotif
   }
 })
 
+// 接收交易服务重连通知
+const tradeServerReconnectNotify = eventBus.$on('TradeServerReconnectNotify', () => {
+  fullLoading.value = true
+})
+
+// 接收交易服务重连成功通知
+const tradeServerReconnectSuccessNotify = eventBus.$on('TradeServerReconnectSuccessNotify', () => {
+  fullLoading.value = false
+})
+
 onMounted(() => {
   serverTime.value = moment(new Date())
   timerTask.setInterval(() => {
@@ -112,6 +123,8 @@ onUnmounted(() => {
   timerTask.clearInterval('refreshTime')
   timerTask.clearTimeout('getServerTime')
   documentVisibilityStateNotify.cancel()
+  tradeServerReconnectNotify.cancel()
+  tradeServerReconnectSuccessNotify.cancel()
 })
 </script>
 

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

@@ -53,10 +53,10 @@
                     <span>振幅</span>
                     <span>{{ parsePercent(quote.amplitude) }}</span>
                 </li>
-                <li>
+                <!-- <li>
                     <span>成交量</span>
                     <span>{{ handleNumberValue(quote.totalvolume) }}</span>
-                </li>
+                </li> -->
                 <li>
                     <span>成交额</span>
                     <span>{{ quote.totalturnover ? changeUnit(quote.totalturnover) : handleNumberValue() }}</span>

+ 2 - 2
src/packages/pc/views/auth/login/index.vue

@@ -104,8 +104,8 @@ const formSubmit = () => {
   })
 }
 
-service.systemInfoAsync.then((res) => {
-  shwoRegister.value = res.shwoRegister
+service.systemInfoAsync.then(() => {
+  shwoRegister.value = service.hasSystemModule('register')
 })
 </script>
 

+ 2 - 2
src/packages/pc/views/footer/goods/detail/index.vue

@@ -56,12 +56,12 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
 ])
 
 // 接收头寸变化通知通知
-const posChangedNtf = eventBus.$on('PosChangedNtf', () => run())
+//const posChangedNtf = eventBus.$on('PosChangedNtf', () => run())
 
 const showComponent = (componentName: string, row: Model.TradeHolderDetailRsp) => {
     selectedRow.value = row
     openComponent(componentName)
 }
 
-onUnmounted(() => posChangedNtf.cancel())
+//onUnmounted(() => posChangedNtf.cancel())
 </script>

+ 5 - 1
src/packages/pc/views/footer/presell/presellposition/deposit/index.vue

@@ -1,6 +1,6 @@
 <!-- 预售转让-预售持仓-补足定金 -->
 <template>
-    <app-drawer title="提示" v-model:show="show" :refresh="refresh">
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
         <div>是否补足转让定金?</div>
         <template #footer>
             <el-button type="info" @click="onCancel(false)">取消</el-button>
@@ -24,6 +24,7 @@ const props = defineProps({
 
 const show = ref(true)
 const refresh = ref(false)
+const loading = ref(false)
 
 const onCancel = (isRefresh = false) => {
     show.value = false
@@ -31,6 +32,7 @@ const onCancel = (isRefresh = false) => {
 }
 
 const onMakeUpDeposit = () => {
+    loading.value = true
     /// 提交
     makeUpDeposit({
         data: {
@@ -44,6 +46,8 @@ const onMakeUpDeposit = () => {
         onCancel(true)
     }).catch((err) => {
         ElMessage.error('提交失败:' + err)
+    }).finally(() => {
+        loading.value = false
     })
 }
 </script>

+ 1 - 1
src/packages/qdhs/views/user/login/Index.vue

@@ -16,7 +16,7 @@
       </div>
     </Form>
     <div class="login-link">
-      <span @click="navigationTo('user-register')" v-if="service.getSystemInfo('shwoRegister')">用户注册</span>
+      <span @click="navigationTo('user-register')" v-if="service.hasSystemModule('register')">用户注册</span>
       <span @click="navigationTo('user-forget')">忘记密码</span>
     </div>
     <div class="login-footer">

+ 2 - 3
src/services/api/account/index.ts

@@ -2,7 +2,6 @@ import service from '@/services'
 import http from '@/services/http'
 import { RequestConfig } from '@/services/http/types'
 import { useLoginStore } from '@/stores'
-import tradeService from '@/services/websocket/trade'
 
 const loginStore = useLoginStore()
 
@@ -10,7 +9,7 @@ const loginStore = useLoginStore()
  * 账户登录
  */
 export function login(data: Proto.LoginReq) {
-    return tradeService.sendMessage<Proto.LoginRsp>({
+    return http.mqRequest<Proto.LoginRsp>({
         data,
         requestCode: 'LoginReq',
         responseCode: 'LoginRsp'
@@ -31,7 +30,7 @@ export function logout(config: RequestConfig = {}) {
  * Token校验
  */
 export function tokenCheck(data: Proto.TokenCheckReq) {
-    return tradeService.sendMessage<Proto.TokenCheckRsp>({
+    return http.mqRequest<Proto.TokenCheckRsp>({
         data,
         requestCode: 'TokenCheckReq',
         responseCode: 'TokenCheckRsp'

+ 1 - 2
src/services/api/trade/index.ts

@@ -3,7 +3,6 @@ import http from '@/services/http'
 import { RequestConfig } from '@/services/http/types'
 import { ClientType } from '@/constants/client'
 import { useLoginStore, useAccountStore } from '@/stores'
-import tradeService from '@/services/websocket/trade'
 
 const loginStore = useLoginStore()
 const accountStore = useAccountStore()
@@ -189,7 +188,7 @@ export function cancelOrder(config: RequestConfig<Proto.CancelOrderReq>) {
  * 交易下单
  */
 export function order(config: RequestConfig<Proto.OrderReq>) {
-    return tradeService.sendMessage<Proto.OrderRsp>({
+    return http.mqRequest<Proto.OrderRsp>({
         data: config.data,
         requestCode: 'OrderReq',
         responseCode: 'OrderRsp',

+ 3 - 1
src/services/bus/types.ts

@@ -4,7 +4,9 @@
 export enum EventCode {
     DocumentVisibilityStateNotify, // 窗口页面状态通知
     QuotePushNotify, // 行情推送通知
-    QuoteServerReconnectNotify, // 行情服务重连成功通知
+    QuoteServerReconnectSuccessNotify, // 行情服务重连成功通知
+    TradeServerReconnectNotify, // 交易服务重连通知
+    TradeServerReconnectSuccessNotify, // 交易服务重连成功通知
     LoginNotify, // 用户登入通知
     LogoutNotify, // 用户登出通知
     MoneyChangedNotify, // 资金变动通知

+ 50 - 33
src/services/http/index.ts

@@ -9,6 +9,7 @@ import { useLoginStore, useAccountStore, useErrorInfoStore } from '@/stores'
 import { CommonResult, ResultCode, SendMsgToMQ } from './types'
 import { FunCode } from '@/constants/funcode'
 import service from '@/services'
+import tradeService from '@/services/websocket/trade'
 import eventBus from '@/services/bus'
 
 export default new (class {
@@ -31,9 +32,9 @@ export default new (class {
                 //设置请求头
                 config.headers = {
                     Authorization: sign.token,
-                    LoginID: loginStore.loginId,
-                    Group: loginStore.getClientType(),
-                    'x-token': sign.token,
+                    // LoginID: loginStore.loginId,
+                    // Group: loginStore.getClientType(),
+                    // 'x-token': sign.token,
                     //Signid: 'eecd3f37625f4501b88e9f0fa14b4b51',
                     //Sign: cryptojs.SHA256(qs.stringify(sign)).toString(),
                     //Timestamp: sign.timestamp.toString(),
@@ -178,7 +179,11 @@ export default new (class {
      * @param errMsg 
      * @returns 
      */
-    async mqRequest<T>({ data, requestCode, responseCode, marketId = 0 }: SendMsgToMQ<{ Header?: IMessageHead }>, errMsg?: string) {
+    async mqRequest<T extends {
+        RetCode: number;
+        RetDesc: string;
+        Status?: number;
+    }>({ data, requestCode, responseCode, marketId = 0 }: SendMsgToMQ<{ Header?: IMessageHead }>, errMsg?: string) {
         const loginStore = useLoginStore()
         const accountStore = useAccountStore()
         const requestId = FunCode[requestCode]
@@ -196,55 +201,67 @@ export default new (class {
         }
         console.log(requestCode, data)
 
-        const config: AxiosRequestConfig = {
-            method: 'post',
-            url: '/MQ/SendMsgToMQ',
-            data: {
-                data: encryptBody(JSON.stringify(data ?? '{}')),
-                funCodeReq: requestId,
-                funCodeRsp: responseId,
-                isEncrypted: true,
-            }
-        }
-
         try {
-            const res = await this.goRequest<{ data: string }>(config, errMsg)
-            return await this.package50Parse<T>(responseCode, res.data.data)
+            if (service.getSystemInfo('tradeChannel') === 'ws') {
+                // 长连通道
+                const res = await tradeService.send<T>({
+                    data,
+                    requestCode,
+                    responseCode
+                })
+                return await this.pkg50Response<T>(res, responseCode)
+            } else {
+                // 短连通道
+                const config: AxiosRequestConfig = {
+                    method: 'post',
+                    url: '/MQ/SendMsgToMQ',
+                    data: {
+                        data: encryptBody(JSON.stringify(data ?? '{}')),
+                        funCodeReq: requestId,
+                        funCodeRsp: responseId,
+                        isEncrypted: true,
+                    }
+                }
+                const res = await this.goRequest<{ data: string }>(config, errMsg)
+                const decryptedData = decryptBody(res.data.data) // 解析 package50 数据
+                return await this.pkg50Response<T>(JSON.parse(decryptedData), responseCode)
+            }
         } catch (err) {
             return await Promise.reject(err)
         }
     }
 
     /**
-     * 解析 package50 数据
+     * 处理 package50 响应
      * @param responseCode 
      * @param data 
      * @returns 
      */
-    private package50Parse<T>(responseCode: keyof typeof FunCode, data: string) {
-        const decryptedData = decryptBody(data)
-        const res = JSON.parse(decryptedData)
-        console.log(responseCode, res)
-
-        switch (res.RetCode) {
+    private pkg50Response<T extends {
+        RetCode: number;
+        RetDesc: string;
+        Status?: number;
+    }>(response: T, responseCode: keyof typeof FunCode) {
+        console.log(responseCode, response)
+        switch (response.RetCode) {
             case 0: {
-                return Promise.resolve(res as T)
+                return Promise.resolve(response)
             }
             case 12018: {
-                if (res.RetDesc) {
-                    const word = cryptojs.enc.Base64.parse(res.RetDesc) // 解析base64
-                    res.RetDesc = cryptojs.enc.Utf8.stringify(word)
+                if (response.RetDesc) {
+                    const word = cryptojs.enc.Base64.parse(response.RetDesc) // 解析base64
+                    response.RetDesc = cryptojs.enc.Utf8.stringify(word)
                 }
-                return Promise.reject(res.RetDesc)
+                return Promise.reject(response.RetDesc)
             }
             default: {
                 // 银行 业务 以 Status 作为判断依据
-                if (res.Status === 0 || res.Status == 6007) {
-                    return Promise.resolve(res as T)
+                if (response.Status === 0 || response.Status == 6007) {
+                    return Promise.resolve(response)
                 }
                 const { getErrorInfoByCode } = useErrorInfoStore()
-                const msg = getErrorInfoByCode([6003, 6066, 6019].includes(res.Status) ? res.Status : res.RetCode)
-                const error = String(res.RetDesc || res.RetCode || res.Status)
+                const msg = getErrorInfoByCode(response.Status && [6003, 6066, 6019].includes(response.Status) ? response.Status : response.RetCode)
+                const error = String(response.RetDesc || response.RetCode || response.Status)
                 return Promise.reject(msg ?? error)
             }
         }

+ 14 - 1
src/services/index.ts

@@ -1,6 +1,9 @@
 import axios from 'axios'
 import plus from '@/utils/h5plus'
 
+// 可配置的模块
+const modules = ['register', 'delivery'] as const
+
 export default new (class {
     constructor() {
         this.systemInfoAsync = this.getAppConfig()
@@ -12,7 +15,8 @@ export default new (class {
         version: '1.0.0',
         versionCode: '100000',
         apiUrl: 'http://localhost',
-        shwoRegister: true
+        tradeChannel: <'http' | 'ws'>'ws', // 交易服务通道
+        modules // 启用的模块
     }
 
     /** 服务配置信息 */
@@ -157,4 +161,13 @@ export default new (class {
     getSystemInfo<K extends keyof typeof this.systemInfo>(key: K) {
         return this.systemInfo[key]
     }
+
+    /**
+     * 是否包含某个系统模块
+     * @param module 
+     * @returns 
+     */
+    hasSystemModule(module: typeof modules[number]) {
+        return this.systemInfo.modules.includes(module)
+    }
 })

+ 42 - 79
src/services/websocket/trade.ts

@@ -1,31 +1,31 @@
-import { v4 } from 'uuid'
 import { timerInterceptor } from '@/utils/timer'
 import { FunCode } from '@/constants/funcode'
-import { useLoginStore, useAccountStore, useErrorInfoStore } from '@/stores'
 import service from '@/services'
 import eventBus from '@/services/bus'
+import { checkToken, stopCheckToken, checkTokenLoop } from '@/business/common'
 import { MTP2WebSocket } from './build'
 import { Package50 } from './package'
-import { IMessageHead } from '@/types/proto/proto'
 import { encodeProto, decodeProto } from './package/package50/proto'
-import cryptojs from 'crypto-js'
-
-export interface SendParams<T extends object = { Header?: IMessageHead }> {
-    data?: T; // 请求参数
-    requestCode: keyof typeof FunCode; // 请求功能码
-    responseCode: keyof typeof FunCode; // 回复功能码
-    marketId?: number;
-}
 
 export default new (class {
-    private loginStore = useLoginStore()
-    private accountStore = useAccountStore()
-    private errorInfoStore = useErrorInfoStore()
-
     /** 交易链路 */
     private socket = new MTP2WebSocket(Package50);
 
     constructor() {
+        this.socket.onBeforeReconnect = (count) => {
+            // 停止令牌校验
+            stopCheckToken()
+            // 交易服务重连通知
+            eventBus.$emit('TradeServerReconnectNotify', count)
+        }
+
+        this.socket.onReconnect = () => {
+            // 重新进行令牌校验
+            checkToken().then(() => checkTokenLoop())
+            // 交易服务重连成功通知
+            eventBus.$emit('TradeServerReconnectSuccessNotify')
+        }
+
         this.socket.onPush = (p) => {
             const { funCode, content } = p
             const delay = 500 // 延迟推送消息,防止短时间内重复请求
@@ -35,7 +35,7 @@ export default new (class {
                     //console.log('接收到用户登出通知', funCode)
                     // 用户登出通知
                     eventBus.$emit('LogoutNotify', '账号已登出')
-                    break;
+                    break
                 }
                 case FunCode.MoneyChangedNotify: {
                     //console.log('接收到资金变动通知', funCode)
@@ -54,14 +54,16 @@ export default new (class {
                     break
                 }
                 case FunCode.MarketStatusChangeNtf: {
-                    const res = new TextDecoder().decode(content)
-                    const { Status } = JSON.parse(res) as Proto.MarketStatusChangeNtf
-                    // 运行状态 - 0:初始化 1:待开市 2:开市 3:休市 4:手工休市 5:闭市 6:确认行权开始 7:确认行权结束 10:日终处理开始 11:日终处理成功 12:日终处理失败 13基础服务结算开始 14基础服务结算成功 23.资金结算开始 24.资金结算成功 25.资金结算失败 26.系统结算成功 27.系统结算失败 28.盘中处理开始 29.盘中处理成功 30.盘中处理失败 31.资金结算开始(内) 32.资金结算成功(内) 33.资金结算失败(内) 40.签到开始 41.签到成功 42.签到部份成功 43.签到失败 44.签退开始 45.签退成功 46.签退部份成功 47.签退失败 48.对账开始 49.对账成功 50.对账失败 51.清算开始 52.清算成功 53.清算失败 54.清算部分成功 55. 系统结算开始 62.今日免清算
-                    if ([1, 26].includes(Status)) {
-                        //console.log('接收到市场状态变更通知', Status)
-                        // 用户登出通知
-                        eventBus.$emit('LogoutNotify', '系统维护,请稍后重新登录')
-                    }
+                    decodeProto<Proto.MarketStatusChangeNtf>('MarketStatusChangeNtf', content).then((res) => {
+                        // 运行状态 - 0:初始化 1:待开市 2:开市 3:休市 4:手工休市 5:闭市 6:确认行权开始 7:确认行权结束 10:日终处理开始 11:日终处理成功 12:日终处理失败 13基础服务结算开始 14基础服务结算成功 23.资金结算开始 24.资金结算成功 25.资金结算失败 26.系统结算成功 27.系统结算失败 28.盘中处理开始 29.盘中处理成功 30.盘中处理失败 31.资金结算开始(内) 32.资金结算成功(内) 33.资金结算失败(内) 40.签到开始 41.签到成功 42.签到部份成功 43.签到失败 44.签退开始 45.签退成功 46.签退部份成功 47.签退失败 48.对账开始 49.对账成功 50.对账失败 51.清算开始 52.清算成功 53.清算失败 54.清算部分成功 55. 系统结算开始 62.今日免清算
+                        if ([1, 26].includes(res.Status)) {
+                            //console.log('接收到市场状态变更通知', Status)
+                            // 用户登出通知
+                            eventBus.$emit('LogoutNotify', '系统维护,请稍后重新登录')
+                        }
+                    }).catch(() => {
+                        console.error('报文解析失败', FunCode.MarketStatusChangeNtf)
+                    })
                     break
                 }
                 case FunCode.ListingOrderChangeNtf: {
@@ -70,7 +72,7 @@ export default new (class {
                         // 挂牌委托变更广播通知
                         eventBus.$emit('ListingOrderChangeNtf')
                     }, delay, funCode.toString())
-                    break;
+                    break
                 }
                 case FunCode.PosChangedNtf: {
                     //console.log('接收到头寸变化通知', funCode)
@@ -78,14 +80,16 @@ export default new (class {
                         // 头寸变化通知
                         eventBus.$emit('PosChangedNtf')
                     }, delay, funCode.toString())
-                    break;
+                    break
                 }
                 case FunCode.RiskControlNtf: {
-                    console.log('接收到风控通知', funCode)
-                    const res = new TextDecoder().decode(content)
-                    const riskControlNtf = JSON.parse(res) as Proto.RiskControlNtf
-                    eventBus.$emit('RiskControlNtf', riskControlNtf.MsgContent)
-                    break;
+                    decodeProto<Proto.RiskControlNtf>('RiskControlNtf', content).then((res) => {
+                        //console.log('接收到风控通知', funCode)
+                        eventBus.$emit('RiskControlNtf', res.MsgContent)
+                    }).catch(() => {
+                        console.error('报文解析失败', FunCode.RiskControlNtf)
+                    })
+                    break
                 }
                 default: {
                     if (funCode) {
@@ -106,22 +110,14 @@ export default new (class {
      * @param params
      * @returns 
      */
-    private send<T>({ data, requestCode, responseCode, marketId = 0 }: SendParams) {
+    send<T>({ data, requestCode, responseCode }: {
+        data: unknown;
+        requestCode: keyof typeof FunCode;
+        responseCode: keyof typeof FunCode;
+    }) {
         const requestId = FunCode[requestCode]
         const responseId = FunCode[responseCode]
 
-        if (data) {
-            data.Header = {
-                AccountID: this.accountStore.currentAccountId,
-                FunCode: requestId,
-                UUID: v4(),
-                UserID: this.loginStore.userId,
-                MarketID: marketId,
-                ...data.Header,
-            }
-        }
-        console.log(requestCode, data)
-
         return new Promise<T>((resolve, reject) => {
             encodeProto(requestCode, data).then((res) => {
                 this.connect().then(() => {
@@ -132,7 +128,6 @@ export default new (class {
                         },
                         success: (raw) => {
                             decodeProto<T>(responseCode, raw.content).then((res) => {
-                                console.log(responseCode, responseId, res)
                                 resolve(res)
                             }).catch(() => {
                                 console.error(responseCode, raw)
@@ -144,6 +139,8 @@ export default new (class {
                             reject(err)
                         }
                     })
+                }).catch(() => {
+                    reject('服务连接失败')
                 })
             }).catch((msg) => {
                 console.error(requestCode, msg)
@@ -153,40 +150,6 @@ export default new (class {
     }
 
     /**
-     * 向交易服务器发送请求
-     * @param params 
-     * @returns 
-     */
-    async sendMessage<T extends {
-        RetCode: number;
-        RetDesc: string;
-        Status?: number;
-    }>(params: SendParams) {
-        const res = await this.send<T>(params)
-        switch (res.RetCode) {
-            case 0: {
-                return Promise.resolve(res as T)
-            }
-            case 12018: {
-                if (res.RetDesc) {
-                    const word = cryptojs.enc.Base64.parse(res.RetDesc) // 解析base64
-                    res.RetDesc = cryptojs.enc.Utf8.stringify(word)
-                }
-                return Promise.reject(res.RetDesc)
-            }
-            default: {
-                // 银行 业务 以 Status 作为判断依据
-                if (res.Status === 0 || res.Status == 6007) {
-                    return Promise.resolve(res as T)
-                }
-                const msg = this.errorInfoStore.getErrorInfoByCode(res.Status && [6003, 6066, 6019].includes(res.Status) ? res.Status : res.RetCode)
-                const error = String(res.RetDesc || res.RetCode || res.Status)
-                return Promise.reject(msg ?? error)
-            }
-        }
-    }
-
-    /**
      * 关闭交易链路
      */
     close() {

+ 11 - 18
src/stores/modules/login.ts

@@ -6,19 +6,12 @@ import { localData, sessionData } from '../storage'
 import plus from '@/utils/h5plus'
 
 // 初始化登录信息
-function initLoginInfo(): Proto.LoginRsp {
+function initLoginInfo(): Model.LoginRsp {
     return {
-        RetCode: 0, // 返回码
-        RetDesc: '', // 描述信息
-        LoginID: 0, // 登录ID
-        LoginUserType: 0, // 登陆用户类型
-        AccountStatus: 0, // 用户状态
-        UserID: 0, // 用户ID
-        MemberUserID: 0, // 用户所属会员用户ID
-        AccountIDs: [], // 账户ID列表(有权限的)
-        Token: '', // 用户令牌
-        LoginCode: '', // 登陆码
-        ClientID: 0 // 终端ID(登陆服务分配,用于通道交易关联链路)
+        expiresAt: 0, // 过期时间
+        loginId: 0, // 登录ID
+        token: '', // 新服务Token
+        userId: 0, // 用户ID
     }
 }
 
@@ -35,13 +28,13 @@ export const useLoginStore = defineStore(() => {
     })
 
     // 登录令牌
-    const token = computed(() => state.loginInfo.Token)
+    const token = computed(() => state.loginInfo.token)
 
     // 用户ID
-    const userId = computed(() => state.loginInfo.UserID)
+    const userId = computed(() => state.loginInfo.userId)
 
     // 登录ID
-    const loginId = computed(() => state.loginInfo.LoginID)
+    const loginId = computed(() => state.loginInfo.loginId)
 
     // 获取终端类型
     const getClientType = () => {
@@ -60,7 +53,7 @@ export const useLoginStore = defineStore(() => {
     }
 
     // 更新登录信息
-    const setLoginInfo = (data: Proto.LoginRsp, persist = false) => {
+    const setLoginInfo = (data: Model.LoginRsp, persist = false) => {
         state.loginInfo = data
         if (persist) {
             localData.setValue('loginInfo', data) // 缓存登录状态到本地
@@ -76,7 +69,7 @@ export const useLoginStore = defineStore(() => {
         try {
             const encryptedData = localData.getValue('autoLoginEncryptedData')
             const decryptedString = decryptAES(encryptedData)
-            return JSON.parse(decryptedString) as Proto.LoginReq
+            return JSON.parse(decryptedString) as Model.LoginReq
         } catch (err) {
             clearAutoLoginData()
             return undefined
@@ -84,7 +77,7 @@ export const useLoginStore = defineStore(() => {
     }
 
     // 更新自动登录信息
-    const setAutoLoginData = (data: Proto.LoginReq) => {
+    const setAutoLoginData = (data: Model.LoginReq) => {
         const encryptedString = encryptAES(JSON.stringify(data)) // 数据加密
         localData.setValue('autoLoginEncryptedData', encryptedString)
     }

+ 2 - 2
src/stores/storage.ts

@@ -6,7 +6,7 @@ function createLocalData() {
     return {
         appLanguage: Language.ZhCN,
         appTheme: AppTheme.Default,
-        loginInfo: <Proto.LoginRsp | undefined>undefined,
+        loginInfo: <Model.LoginRsp | undefined>undefined,
         autoLoginEncryptedData: '', // 自动登录加密数据
         settings: <Model.LocalSetting[]>([]),
         reportTime: '', 
@@ -16,7 +16,7 @@ function createLocalData() {
 
 function createSessionData() {
     return {
-        loginInfo: <Proto.LoginRsp | undefined>undefined,
+        loginInfo: <Model.LoginRsp | undefined>undefined,
         userRoutes: <Model.UserRoutes[]>[],
         allEnums: <Model.EnumRsp[]>[], // 枚举信息
         errorInfos: <Model.ErrorInfosRsp[]>[], // 错误信息

+ 4 - 4
src/types/proto/account.d.ts

@@ -54,7 +54,7 @@ declare global {
 
         /** 用户令牌校验响应 */
         interface TokenCheckRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             LoginID: number; // 登陆账户ID
@@ -77,7 +77,7 @@ declare global {
 
         /** 用户登出应答 */
         interface LogoutRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
         }
@@ -93,7 +93,7 @@ declare global {
 
         // 修改账户密码应答
         interface ModifyPwdRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
         }
@@ -107,7 +107,7 @@ declare global {
 
         // 投资者销户申请请求响应
         interface InvestorDelRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
         }

+ 16 - 14
src/types/proto/bank.d.ts

@@ -42,7 +42,7 @@ declare global {
 
         /** 签约应答 */
         interface t2bBankSignRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ExtOperatorID: number; // 外部操作流水号
@@ -79,7 +79,7 @@ declare global {
 
         /** 解约应答 */
         interface t2bBankCancelSignRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ExtOperatorID: number; // 外部操作流水号
@@ -121,7 +121,7 @@ declare global {
 
         /** 出金应答 */
         interface t2bBankWithdrawRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ExtOperatorID: number; // 外部操作流水号
@@ -160,7 +160,7 @@ declare global {
 
         /** 入金应答 */
         interface t2bBankDepositRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ExtOperatorID: number; // 外部操作流水号
@@ -185,7 +185,7 @@ declare global {
 
         // 账户资金信息响应 0 4 7
         interface AccountFundInfoRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // int32 返回码
             RetDesc: string; // string 描述信息
             OrderId: number; // uint64 查询委托单号
@@ -211,15 +211,17 @@ declare global {
 
         /** 短信验证码应答应答 */
         interface t2bSWSVerificationCodeRsp {
-            Header?: IMessageHead;
-            ExtOperatorID?: number; // 外部操作流水号
-            Status?: number; // 状态(0成功,其他数值参考银行服务的错误码)
-            ExchTicket?: string; // 交易所流水号
-            ExchId?: string; // 交易所编号
-            TradeDate?: string; // 交易日
-            CenterTicket?: number; // 中心流水号
-            CenterErrCode?: string; // 中心返回码
-            CenterErrMsg?: string; // 中心返回结果说明
+            Header: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            CenterTicket: number; // 中心流水号
+            CenterErrCode: string; // 中心返回码
+            CenterErrMsg: string; // 中心返回结果说明
         }
     }
 }

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

@@ -12,7 +12,7 @@ declare global {
 
         /** 铁合金抽奖接口响应 */
         interface THJRedPacketLotteryRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID,必填

+ 4 - 4
src/types/proto/performance.d.ts

@@ -20,7 +20,7 @@ declare global {
         // 违约申请应答 0 20 10
         interface PerformanceContractedApplyRsp {
             /// MessageHead 消息头
-            Header?: IMessageHead;
+            Header: IMessageHead;
             /// 返回码
             RetCode: number;
             /// 描述信息
@@ -44,7 +44,7 @@ declare global {
         // 延期申请应答 0 20 6
         interface PerformanceDelayApplyRsp {
             /// MessageHead 消息头
-            Header?: IMessageHead;
+            Header: IMessageHead;
             /// 返回码
             RetCode: number;
             /// 描述信息
@@ -74,7 +74,7 @@ declare global {
         // 履约手动确认应答 0 20 4
         interface PerformanceManualConfirmRsp {
             /// MessageHead 消息头
-            Header?: IMessageHead;
+            Header: IMessageHead;
             /// 返回码
             RetCode: number;
             /// 描述信息
@@ -96,7 +96,7 @@ declare global {
         // 履约修改联络信息回应 0 20 16
         interface PerformanceModifyContactRsp {
             /// MessageHead 消息头
-            Header?: IMessageHead;
+            Header: IMessageHead;
             /// 返回码
             RetCode: number;
             /// 描述信息

+ 69 - 69
src/types/proto/trade.d.ts

@@ -25,7 +25,7 @@ declare global {
 
         /** 铁合金现货预售摘牌接口应答 */
         interface SpotPresaleDestingOrderRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             PresaleApplyID: string; // 预售申请ID
@@ -45,7 +45,7 @@ declare global {
 
         /** 铁合金现货预售交收确认接口应答 */
         interface SpotPresaleDeliveryConfirmRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID,必填
@@ -66,7 +66,7 @@ declare global {
 
         /** 铁合金现货预售违约确认接口应答 */
         interface SpotPresaleBreachOfContractConfirmRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID,必填
@@ -85,7 +85,7 @@ declare global {
 
         // 铁合金现货预售违约申请接口应答
         interface SpotPresaleBreachOfContractApplyRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID,必填
@@ -103,7 +103,7 @@ declare global {
         }
         // 铁合金现货预售付款处理接口应答
         interface SpotPresalePlaymentRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID,必填
@@ -127,16 +127,16 @@ declare global {
         }
         // 挂牌撤单应答
         interface WRListingCancelOrderRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
-            WRTradeCancelID?: string // 仓单贸易撤单号
-            OldWRTradeOrderID?: string // 目标仓单贸易委托单ID
-            UserID?: number // 用户ID
-            AccountID?: number // 资金账号
-            CancelQty?: number // 撤单数量
-            OrderTime?: string // 接受撤单的时间
-            ClientSerialNo?: string // 客户端流水号
+            WRTradeCancelID: string // 仓单贸易撤单号
+            OldWRTradeOrderID: string // 目标仓单贸易委托单ID
+            UserID: number // 用户ID
+            AccountID: number // 资金账号
+            CancelQty: number // 撤单数量
+            OrderTime: string // 接受撤单的时间
+            ClientSerialNo: string // 客户端流水号
         }
 
         // 仓单出库提单明细数据
@@ -172,7 +172,7 @@ declare global {
 
         // 仓单出库申请响应
         interface WROutApplyRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ClientSerialID: string; // 客户端唯一ID
@@ -243,7 +243,7 @@ declare global {
 
         // 持仓单挂牌应答
         interface HdWROrderRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID
@@ -281,7 +281,7 @@ declare global {
 
         // 持仓单摘牌应答
         interface HdWRDealOrderRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID
@@ -305,7 +305,7 @@ declare global {
 
         // 铁合金现货预售转让挂牌接口响应
         interface SpotPresaleTransferListingRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID,必填
@@ -325,7 +325,7 @@ declare global {
 
         // 铁合金现货预售转让撤销接口响应
         interface SpotPresaleTransferCancelRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             TransferID: number; // 协议转让ID
@@ -345,7 +345,7 @@ declare global {
 
         // 铁合金现货预售转让摘牌接口响应
         interface SpotPresaleTransferDestingRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID
@@ -367,7 +367,7 @@ declare global {
 
         // 铁合金收益支取申请接口响应
         interface THJProfitDrawApplyRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID
@@ -386,7 +386,7 @@ declare global {
 
         /** 铁合金预售点价响应 */
         interface SpotPresalePointPriceRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             UserID: number; // 用户ID
@@ -409,11 +409,11 @@ declare global {
 
         // 撤单应答
         interface CancelOrderRsp {
-            Header?: IMessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            ExchActionID?: number; // 交易所操作号
-            OrderTime?: string; // 接收委托交易的时间
+            Header: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExchActionID: number; // 交易所操作号
+            OrderTime: string; // 接收委托交易的时间
         }
 
         // 交易委托请求
@@ -484,11 +484,11 @@ declare global {
 
         // 按单平仓应答 0 3 106
         interface HolderCloseRsp {
-            Header?: IMessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            OrderID?: number; // 一级生成的订单号
-            OrderTime?: string; // 接收委托交易的时间
+            Header: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            OrderID: number; // 一级生成的订单号
+            OrderTime: string; // 接收委托交易的时间
         }
 
         /** 交割申报单明细 */
@@ -532,7 +532,7 @@ declare global {
 
         /** 交割申报应答 */
         interface DeliveryOrderRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ClientSerialNo: string; // 客户端流水号
@@ -552,7 +552,7 @@ declare global {
 
         /** 补足定金应答 */
         interface MakeUpDepositRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             TradeID: number; // 成交单号,必填
@@ -570,7 +570,7 @@ declare global {
 
         /** 持仓追加定金接口应答 */
         interface HoldAppendDepositRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             GoodsID: number; // 商品ID,必填
@@ -592,7 +592,7 @@ declare global {
         }
         // 线下交收申请请求
         interface OfflineDeliveryRsp {
-            Header?: IMessageHead; // 消息头
+            Header: IMessageHead; // 消息头
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             AccountID: number; // 交易账号,必填
@@ -616,13 +616,13 @@ declare global {
 
         // 补充定金接口响应
         interface SupplementDepositRsp {
-            Header?: MessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            TradeID?: number; // 成交单号,必填
-            UserID?: number; // 用户ID,必填
-            AccountID?: number; // 交易账号,必填
-            ClientSerialNo?: string; // 客户端流水号
+            Header: MessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            TradeID: number; // 成交单号,必填
+            UserID: number; // 用户ID,必填
+            AccountID: number; // 交易账号,必填
+            ClientSerialNo: string; // 客户端流水号
         }
 
         // 退返定金接口请求
@@ -640,13 +640,13 @@ declare global {
 
         // 退返定金接口响应
         interface RefundedDepositRsp {
-            Header?: MessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            TradeID?: number; // 成交单号,必填
-            UserID?: number; // 用户ID,必填
-            AccountID?: number; // 交易账号,必填
-            ClientSerialNo?: string; // 客户端流水号
+            Header: MessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            TradeID: number; // 成交单号,必填
+            UserID: number; // 用户ID,必填
+            AccountID: number; // 交易账号,必填
+            ClientSerialNo: string; // 客户端流水号
         }
 
         // 持仓明细
@@ -668,12 +668,12 @@ declare global {
 
         // 按单做市交收申请接口响应
         interface MarketOrderDeliveryApplyRsp {
-            Header?: MessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            UserID?: number; // 用户ID,必填
-            AccountID?: number; // 交易账号,必填
-            ClientSerialNo?: string; // 客户端流水号
+            Header: MessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            UserID: number; // 用户ID,必填
+            AccountID: number; // 交易账号,必填
+            ClientSerialNo: string; // 客户端流水号
         }
 
         // 付款凭证
@@ -702,13 +702,13 @@ declare global {
 
         // 交收终端操作接口响应
         interface DeliveryClientOperatorRsp {
-            Header?: MessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            DeliveryOrderID?: number; // 交收单号,必填
-            UserID?: number; // 用户ID,必填
-            AccountID?: number; // 交易账号,必填
-            ClientSerialNo?: string; // 客户端流水号
+            Header: MessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            DeliveryOrderID: number; // 交收单号,必填
+            UserID: number; // 用户ID,必填
+            AccountID: number; // 交易账号,必填
+            ClientSerialNo: string; // 客户端流水号
         }
         // 线下交收申请撤销接口请求 0 3 137
         interface OfflineDeliveryApplyCancelOrderReq {
@@ -721,13 +721,13 @@ declare global {
         }
         // 线下交收申请撤销接口响应 0 3 138
         interface OfflineDeliveryApplyCancelOrderRsp {
-            Header?: MessageHead; // 消息头
-            RetCode?: number; // 返回码
-            RetDesc?: string; // 描述信息
-            DeliveryOrderID?: number; // 交收单号,必填
-            UserID?: number; // 用户ID,必填
-            AccountID?: number; // 交易账号,必填
-            ClientSerialNo?: string; // 客户端流水号
+            Header: MessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            DeliveryOrderID: number; // 交收单号,必填
+            UserID: number; // 用户ID,必填
+            AccountID: number; // 交易账号,必填
+            ClientSerialNo: string; // 客户端流水号
         }
     }
 }

+ 6 - 6
src/types/proto/user.d.ts

@@ -13,7 +13,7 @@ declare global {
 
         /** 交易商头像应答 */
         interface DealerHeadRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ClientSerialID: number; // 客户端唯一ID
@@ -39,7 +39,7 @@ declare global {
 
         /** 新增修改收货地址请求响应 */
         interface UserReceiveInfoRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ReceiveInfoId: number; // 响应返回autoid
@@ -53,7 +53,7 @@ declare global {
 
         /** 删除收货地址请求响应 */
         interface DelUserReceiveInfoRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
         }
@@ -67,7 +67,7 @@ declare global {
 
         /** 设置默认收货地址应答 */
         interface UserReceiveIsDefaultRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             AutoId: number; // 提货地址ID
@@ -92,7 +92,7 @@ declare global {
 
         /** 新增修改用户发票信息响应 */
         interface UserReceiptInfoRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
             ReceiptInfoId: number; // 响应返回发票信息id
@@ -106,7 +106,7 @@ declare global {
 
         /** 删除用户发票信息请求响应 */
         interface DelUserReceiptInfoRsp {
-            Header?: IMessageHead;
+            Header: IMessageHead;
             RetCode: number; // 返回码
             RetDesc: string; // 描述信息
         }