li.shaoyi hai 1 ano
pai
achega
03775e50cf

+ 59 - 108
package-lock.json

@@ -29,7 +29,7 @@
         "vant": "^4.8.1",
         "vue": "^3.2.13",
         "vue-class-component": "^8.0.0-0",
-        "vue-i18n": "^9.2.2",
+        "vue-i18n": "^9.14.0",
         "vue-router": "^4.0.3",
         "vuedraggable": "^4.1.0"
       },
@@ -1827,68 +1827,44 @@
       "dev": true
     },
     "node_modules/@intlify/core-base": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
-      "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.0.tgz",
+      "integrity": "sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==",
       "dependencies": {
-        "@intlify/devtools-if": "9.2.2",
-        "@intlify/message-compiler": "9.2.2",
-        "@intlify/shared": "9.2.2",
-        "@intlify/vue-devtools": "9.2.2"
+        "@intlify/message-compiler": "9.14.0",
+        "@intlify/shared": "9.14.0"
       },
       "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/@intlify/devtools-if": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
-      "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
-      "dependencies": {
-        "@intlify/shared": "9.2.2"
+        "node": ">= 16"
       },
-      "engines": {
-        "node": ">= 14"
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
       }
     },
     "node_modules/@intlify/message-compiler": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
-      "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.0.tgz",
+      "integrity": "sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==",
       "dependencies": {
-        "@intlify/shared": "9.2.2",
-        "source-map": "0.6.1"
+        "@intlify/shared": "9.14.0",
+        "source-map-js": "^1.0.2"
       },
       "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/@intlify/message-compiler/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
       }
     },
     "node_modules/@intlify/shared": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
-      "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.0.tgz",
+      "integrity": "sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg==",
       "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/@intlify/vue-devtools": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
-      "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
-      "dependencies": {
-        "@intlify/core-base": "9.2.2",
-        "@intlify/shared": "9.2.2"
+        "node": ">= 16"
       },
-      "engines": {
-        "node": ">= 14"
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
       }
     },
     "node_modules/@jridgewell/resolve-uri": {
@@ -3904,9 +3880,9 @@
       "dev": true
     },
     "node_modules/@vue/devtools-api": {
-      "version": "6.4.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.1.tgz",
-      "integrity": "sha512-tY5m7kwu0R+9GWHSncsE40rCX9ou4HhjhlbgdEMci8j08BE7pLlOpHRcyv6eEP0VYrW1JV0zFh6AoWsoHrVyFw=="
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
+      "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw=="
     },
     "node_modules/@vue/eslint-config-typescript": {
       "version": "9.1.0",
@@ -12521,17 +12497,19 @@
       "dev": true
     },
     "node_modules/vue-i18n": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
-      "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.0.tgz",
+      "integrity": "sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==",
       "dependencies": {
-        "@intlify/core-base": "9.2.2",
-        "@intlify/shared": "9.2.2",
-        "@intlify/vue-devtools": "9.2.2",
-        "@vue/devtools-api": "^6.2.1"
+        "@intlify/core-base": "9.14.0",
+        "@intlify/shared": "9.14.0",
+        "@vue/devtools-api": "^6.5.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/kazupon"
       },
       "peerDependencies": {
         "vue": "^3.0.0"
@@ -14733,53 +14711,27 @@
       "dev": true
     },
     "@intlify/core-base": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
-      "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.0.tgz",
+      "integrity": "sha512-zJn0imh9HIsZZUtt9v8T16PeVstPv6bP2YzlrYJwoF8F30gs4brZBwW2KK6EI5WYKFi3NeqX6+UU4gniz5TkGg==",
       "requires": {
-        "@intlify/devtools-if": "9.2.2",
-        "@intlify/message-compiler": "9.2.2",
-        "@intlify/shared": "9.2.2",
-        "@intlify/vue-devtools": "9.2.2"
-      }
-    },
-    "@intlify/devtools-if": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
-      "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
-      "requires": {
-        "@intlify/shared": "9.2.2"
+        "@intlify/message-compiler": "9.14.0",
+        "@intlify/shared": "9.14.0"
       }
     },
     "@intlify/message-compiler": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
-      "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.0.tgz",
+      "integrity": "sha512-sXNsoMI0YsipSXW8SR75drmVK56tnJHoYbPXUv2Cf9lz6FzvwsosFm6JtC1oQZI/kU+n7qx0qRrEWkeYFTgETA==",
       "requires": {
-        "@intlify/shared": "9.2.2",
-        "source-map": "0.6.1"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        }
+        "@intlify/shared": "9.14.0",
+        "source-map-js": "^1.0.2"
       }
     },
     "@intlify/shared": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
-      "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q=="
-    },
-    "@intlify/vue-devtools": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
-      "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
-      "requires": {
-        "@intlify/core-base": "9.2.2",
-        "@intlify/shared": "9.2.2"
-      }
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.0.tgz",
+      "integrity": "sha512-r+N8KRQL7LgN1TMTs1A2svfuAU0J94Wu9wWdJVJqYsoMMLIeJxrPjazihfHpmJqfgZq0ah3Y9Q4pgWV2O90Fyg=="
     },
     "@jridgewell/resolve-uri": {
       "version": "3.0.5",
@@ -16259,9 +16211,9 @@
       }
     },
     "@vue/devtools-api": {
-      "version": "6.4.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.1.tgz",
-      "integrity": "sha512-tY5m7kwu0R+9GWHSncsE40rCX9ou4HhjhlbgdEMci8j08BE7pLlOpHRcyv6eEP0VYrW1JV0zFh6AoWsoHrVyFw=="
+      "version": "6.6.3",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
+      "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw=="
     },
     "@vue/eslint-config-typescript": {
       "version": "9.1.0",
@@ -22644,14 +22596,13 @@
       "dev": true
     },
     "vue-i18n": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
-      "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==",
+      "version": "9.14.0",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.0.tgz",
+      "integrity": "sha512-LxmpRuCt2rI8gqU+kxeflRZMQn4D5+4M3oP3PWZdowW/ePJraHqhF7p4CuaME52mUxdw3Mmy2yAUKgfZYgCRjA==",
       "requires": {
-        "@intlify/core-base": "9.2.2",
-        "@intlify/shared": "9.2.2",
-        "@intlify/vue-devtools": "9.2.2",
-        "@vue/devtools-api": "^6.2.1"
+        "@intlify/core-base": "9.14.0",
+        "@intlify/shared": "9.14.0",
+        "@vue/devtools-api": "^6.5.0"
       }
     },
     "vue-loader": {

+ 1 - 1
package.json

@@ -29,7 +29,7 @@
     "vant": "^4.8.1",
     "vue": "^3.2.13",
     "vue-class-component": "^8.0.0-0",
-    "vue-i18n": "^9.2.2",
+    "vue-i18n": "^9.14.0",
     "vue-router": "^4.0.3",
     "vuedraggable": "^4.1.0"
   },

+ 4 - 0
public/locales/zh-CN.json

@@ -0,0 +1,4 @@
+{
+    "common": {},
+    "routes": {}
+}

+ 47 - 0
src/constants/report.ts

@@ -0,0 +1,47 @@
+/**
+ * 报表类型
+ */
+export enum ReportType {
+    Day = 0, // 日报表
+    Week = 4, // 周报表
+    Month = 1, // 月报表
+    Quarter = 2, // 季报表
+    Year = 3, // 年报表
+}
+
+/**
+ * 获取报表类型列表
+ * @returns 
+ */
+export function getReportTypeList() {
+    return [
+        { label: '日报表', value: ReportType.Day },
+        { label: '周报表', value: ReportType.Week },
+        { label: '月报表', value: ReportType.Month },
+        { label: '季报表', value: ReportType.Quarter },
+        { label: '年报表', value: ReportType.Year },
+    ]
+}
+
+/**
+ * 季度
+ */
+export enum Quarter {
+    First = 1,
+    Second = 2,
+    Third = 3,
+    Fourth = 4,
+}
+
+/**
+ * 获季度列表
+ * @returns 
+ */
+export function getQuarterList() {
+    return [
+        { label: '第一季度', value: Quarter.First },
+        { label: '第二季度', value: Quarter.Second },
+        { label: '第三季度', value: Quarter.Third },
+        { label: '第四季度', value: Quarter.Fourth },
+    ]
+}

+ 76 - 0
src/packages/pc/components/modules/select-account/index.vue

@@ -0,0 +1,76 @@
+<template>
+    <div class="el-form-item--col">
+        <el-select ref="selectRef" v-model="selectedValue" :empty-values="[null, undefined, 0]" :loading="loading"
+            :placeholder="placeholder" :remote-method="remoteMethod" @change="onChange" remote filterable clearable>
+            <el-option v-for="item in dataList" :key="item.accountid" :label="item.accountid" :value="item.accountid">
+                <div style="display: flex;justify-content: space-between;">
+                    <span>{{ item.accountid }}</span>
+                    <span>{{ item.relatedname }}</span>
+                </div>
+            </el-option>
+        </el-select>
+        <el-button icon="Plus" link @click="onPlus" />
+    </div>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed, toRaw } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { queryTAAccountChildrenSelect } from '@/services/api/report'
+
+const props = defineProps({
+    modelValue: [Number, String],
+    placeholder: {
+        type: String,
+        default: '请输入'
+    }
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+const selectRef = shallowRef()
+
+const selectedValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const { dataList, loading, runAsync } = useRequest(queryTAAccountChildrenSelect, {
+    manual: true
+})
+
+const onPlus = () => {
+    if (!loading.value) {
+        loading.value = true
+        runAsync().then((res) => {
+            if (res.data.length) {
+                selectRef.value.toggleMenu()
+            } else {
+                ElMessage.warning('暂无数据')
+            }
+        }).catch((err) => {
+            ElMessage.error(err)
+        }).finally(() => {
+            loading.value = false
+        })
+    }
+}
+
+const remoteMethod = (query: string) => {
+    if (query) {
+        loading.value = true
+        runAsync({
+            searchcode: query
+        }).finally(() => {
+            loading.value = false
+        })
+    }
+}
+
+const onChange = (id?: number) => {
+    const item = dataList.value.find((e) => e.accountid === id)
+    dataList.value = []
+    emit('change', toRaw(item))
+}
+</script>

+ 1 - 1
src/packages/pc/views/investor/manage/user/components/details/index.vue

@@ -185,7 +185,7 @@ const detailProps2 = computed<CellProp[]>(() => {
             { prop: 'bizNature', label: '企业性质:', formatValue: (val) => biznatureEnum.getEnumTypeName(val) },
             { prop: 'legalPersonName', label: '法人姓名:' },
             { prop: 'contactName', label: '联系人:' },
-            { prop: 'sex', label: '性别:' },
+            { prop: 'sex', label: '性别:', formatValue: (val) => getGenderName(val) },
             { prop: 'mobile', label: '手机号:' },
             { prop: 'telPhone', label: '联系电话:' },
             { prop: 'address', label: '通迅地址:' },

+ 1 - 1
src/packages/pc/views/member/subinstitution/manage/index.vue

@@ -12,7 +12,7 @@
             </el-tree>
         </div>
         <div class="split-layout__right">
-            <app-operation :data-list="handleHeaderButtons()" @click="openComponent" />
+            <app-operation :data-list="handleHeaderButtons()" @click="openComponent" v-if="selectedParent" />
             <app-table-details :data="selectedParent" :label-width="120" label-align="left" :cell-props="detailProps"
                 :column="3" />
             <app-table :data="dataList" v-model:columns="tableColumns">

+ 51 - 0
src/packages/pc/views/report/account/components/bank/index.vue

@@ -0,0 +1,51 @@
+<!-- 报表查询-资金账户报表-资金信息 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { taaccountReportQuery } from '@/services/api/report'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountReportReq>,
+        required: true
+    }
+})
+
+const { dataList, run } = useRequest(taaccountReportQuery, {
+    manual: true,
+    params: props.params,
+    onSuccess: (res) => {
+        dataList.value = [res.data]
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'balance', label: '期初余额' },
+    { field: 'currentbalance', label: '期末余额' },
+    { field: 'inamount', label: '期间入金' },
+    { field: 'outamount', label: '期间出金' },
+    { field: 'otherincome', label: '其他收入' },
+    { field: 'otherpay', label: '其它支出' },
+    { field: 'closepl', label: '平仓盈亏' },
+    { field: 'reckonpl', label: '结算盈亏' },
+    { field: 'usedmargin', label: '占用保证金' },
+    { field: 'freezemargin', label: '冻结保证金' },
+    { field: 'otherfreezemargin', label: '其它冻结' },
+    { field: 'paycharge', label: '总服务费支出' },
+    { field: 'tradecharge', label: '交易手续费' },
+    { field: 'deliverycharge', label: '交收手续费' },
+])
+
+defineExpose({
+    query: () => run()
+})
+</script>

+ 42 - 0
src/packages/pc/views/report/account/components/performance/index.vue

@@ -0,0 +1,42 @@
+<!-- 报表查询-资金账户报表-履约汇总表 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns" />
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { accountppQuery } from '@/services/api/report'
+import AppTable from '@pc/components/base/table/index.vue'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountReportReq>,
+        required: true
+    }
+})
+
+const { dataList, run } = useRequest(accountppQuery, {
+    manual: true,
+    params: props.params,
+    onSuccess: (res) => {
+        dataList.value = [res.data]
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'amount', label: '履约总金额' },
+    { field: 'buypaidamount', label: '已冻/已扣金额' },
+    { field: 'sellreceivedamount', label: '已收金额' },
+    { field: 'buytodayamount', label: '扣/冻金额' },
+    { field: 'selltodayamount', label: '收取金额' },
+])
+
+defineExpose({
+    query: () => run()
+})
+</script>

+ 49 - 0
src/packages/pc/views/report/account/components/position/index.vue

@@ -0,0 +1,49 @@
+<!-- 报表查询-资金账户报表-持仓汇总表 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns">
+        <template #footer>
+            <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { holderTotalQuery } from '@/services/api/report'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountReportReq>,
+        required: true
+    }
+})
+
+const { dataList, total, pageSize, pageIndex, run } = useRequest(holderTotalQuery, {
+    manual: true,
+    params: props.params,
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'goodscode', label: '代码' },
+    { field: 'goodsname', label: '商品' },
+    { field: 'buypositionqty', label: '买期初持仓数量', width: 140 },
+    { field: 'buyholderamount', label: '买持仓期初总金额', width: 140 },
+    { field: 'buycurpositionqty', label: '买当前持仓总数量', width: 140 },
+    { field: 'buycurholderamount', label: '买当前持仓总金额', width: 140 },
+    { field: 'sellpositionqty', label: '卖持仓期初数' },
+    { field: 'sellholderamount', label: '卖持仓期初总金额', width: 140 },
+    { field: 'sellcurpositionqty', label: '卖当前持仓数量', width: 140 },
+    { field: 'sellcurholderamount', label: '卖当前持仓总金额', width: 140 },
+])
+
+defineExpose({
+    query: () => run()
+})
+</script>

+ 49 - 0
src/packages/pc/views/report/account/components/trade/index.vue

@@ -0,0 +1,49 @@
+<!-- 报表查询-资金账户报表-成交汇总表 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns">
+        <template #footer>
+            <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { tradeQuery } from '@/services/api/report'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountReportReq>,
+        required: true
+    }
+})
+
+const { dataList, total, pageSize, pageIndex, run } = useRequest(tradeQuery, {
+    manual: true,
+    params: props.params,
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'goodscode', label: '代码' },
+    { field: 'goodsname', label: '商品' },
+    { field: 'marketname', label: '市场' },
+    { field: 'tradeqty', label: '成交量' },
+    { field: 'openqty', label: '建仓数量' },
+    { field: 'closeqty', label: '平仓数量' },
+    { field: 'tradeamount', label: '成交金额' },
+    { field: 'closepl', label: '平仓盈亏' },
+    { field: 'opencharge', label: '建仓手续费' },
+    { field: 'closecharge', label: '平仓手续费' },
+])
+
+defineExpose({
+    query: () => run()
+})
+</script>

+ 47 - 0
src/packages/pc/views/report/account/components/wrorder/index.vue

@@ -0,0 +1,47 @@
+<!-- 报表查询-资金账户报表-仓单汇总表 -->
+<template>
+    <app-table :data="dataList" v-model:columns="tableColumns">
+        <template #footer>
+            <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
+        </template>
+    </app-table>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { wrPositionQuery } from '@/services/api/report'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountReportReq>,
+        required: true
+    }
+})
+
+const { dataList, total, pageSize, pageIndex, run } = useRequest(wrPositionQuery, {
+    manual: true,
+    params: props.params,
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'deliverygoodsname', label: '现货品种' },
+    { field: 'wrstandardname', label: '现货商品' },
+    { field: 'startqty', label: '期初数量' },
+    { field: 'totalqty', label: '期末数量' },
+    { field: 'usedqty', label: '可用数量' },
+    { field: 'freezeqty', label: '冻结数量' },
+    { field: 'increaseqty', label: '采购数量' },
+    { field: 'decreaseqty', label: '销售数量' },
+])
+
+defineExpose({
+    query: () => run()
+})
+</script>

+ 30 - 0
src/packages/pc/views/report/account/index.less

@@ -0,0 +1,30 @@
+.report-account {
+    &__filter {
+        display: flex;
+        flex-wrap: wrap;
+        gap: 12px;
+
+        .el-form-item {
+            margin: 0;
+        }
+
+        .el-select {
+            width: 160px;
+        }
+
+        .el-input {
+            width: 160px;
+        }
+    }
+
+    &__info {
+        display: flex;
+        width: 100%;
+        border-top: 1px solid #ebebeb;
+        padding-top: 20px;
+
+        span {
+            margin-right: 20px;
+        }
+    }
+}

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

@@ -1,7 +1,168 @@
 <!-- 报表查询-资金账户报表 -->
 <template>
-    <app-view></app-view>
+    <app-view calss="report-account">
+        <template #header>
+            <el-form ref="formRef" class="report-account__filter" :model="params" :rules="formRules"
+                :show-message="false">
+                <el-form-item label="报表类型" prop="cycletype">
+                    <el-select v-model="params.cycletype" @change="onTypeChange">
+                        <el-option v-for="item in getReportTypeList()" :key="item.value" :label="item.label"
+                            :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="日期" prop="cycletime">
+                    <el-date-picker :type="dateType" v-model="params.cycletime" :format="dateFormat"
+                        :value-format="dateFormat" />
+                </el-form-item>
+                <el-form-item label="季度" prop="quarter" v-if="params.cycletype === ReportType.Quarter">
+                    <el-select v-model="params.quarter">
+                        <el-option v-for="item in getQuarterList()" :key="item.value" :label="item.label"
+                            :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="资金账户" prop="accountid">
+                    <app-select-account v-model="params.accountid" @change="onAccountChange" />
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="primary" @click="onSearch">查询</el-button>
+                </el-form-item>
+            </el-form>
+            <div class="report-account__info" v-if="selectedAccount">
+                <span>账户:{{ selectedAccount.relatedname }}</span>
+                <span>资金账户:{{ selectedAccount.accountid }}</span>
+                <span>登录账号:{{ selectedAccount.invloginids }}</span>
+            </div>
+        </template>
+        <el-tabs v-model="componentIndex" v-if="children.length" @tab-change="onSearch">
+            <template v-for="(item, index) in children" :key="index">
+                <el-tab-pane :label="item.title" :name="index" />
+            </template>
+        </el-tabs>
+        <component ref="componentRef" :is="loadComponent()" v-bind="{ params }" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
-</script>
+import { shallowRef, reactive, defineAsyncComponent, computed } from 'vue'
+import { FormInstance, FormRules } from 'element-plus'
+import { useRoute } from 'vue-router'
+import { findTreeNodeById, formatDate } from '@/filters'
+import { ReportType, getReportTypeList, getQuarterList } from '@/constants/report'
+import { useRequest } from '@/hooks/request'
+import { queryCommonFlag } from '@/services/api/account'
+import { useRouterStore } from '@/stores'
+import AppSelectAccount from '@pc/components/modules/select-account/index.vue'
+
+const route = useRoute()
+const routerStore = useRouterStore()
+const formRef = shallowRef<FormInstance>()
+const componentRef = shallowRef()
+const componentIndex = shallowRef(0)
+const selectedAccount = shallowRef<Model.TAAccountChildrenSelectRsp>()
+
+const params = reactive<Model.TaaccountReportReq>({
+    accountid: 0,
+    cycletime: '',
+    cycletype: 0,
+    pageNum: 1,
+    pageSize: 20
+})
+
+// 日期类型
+const dateType = computed(() => {
+    switch (params.cycletype) {
+        case ReportType.Week:
+            return 'week'
+        case ReportType.Month:
+            return 'month'
+        case ReportType.Quarter:
+        case ReportType.Year:
+            return 'year'
+        default:
+            return 'date'
+    }
+})
+
+// 日期格式
+const dateFormat = computed(() => {
+    switch (params.cycletype) {
+        case ReportType.Month:
+            return 'YYYY-MM'
+        case ReportType.Quarter:
+        case ReportType.Year:
+            return 'YYYY'
+        default:
+            return 'YYYY-MM-DD'
+    }
+})
+
+const { children = [] } = findTreeNodeById(routerStore.userRoutes, String(route.name), { id: 'resourceCode' }) ?? {}
+
+useRequest(queryCommonFlag, {
+    onSuccess: (res) => {
+        params.cycletime = formatDate(res.data.tradedate, 'YYYY-MM-DD')
+    }
+})
+
+// 表单验证规则
+const formRules: FormRules = {
+    cycletype: [{ required: true }],
+    cycletime: [{ required: true }],
+    quarter: [{ required: true }],
+    accountid: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                callback()
+            } else {
+                callback(new Error('请输入资金账户'))
+            }
+        },
+    }],
+}
+
+const loadComponent = () => {
+    const item = children[componentIndex.value]
+    if (item) {
+        const componentString = item.component.replace(/^\/+/, '')
+        const componentPath = componentString.replace(/\.\w+$/, '')
+        return defineAsyncComponent(() => import('/' + process.env.VUE_APP_ROOT + componentPath + '.vue'))
+    }
+    return undefined
+}
+
+const onTypeChange = (value: ReportType) => {
+    const dateValue = params.cycletime
+    if (dateValue) {
+        switch (value) {
+            case ReportType.Month:
+                params.cycletime = formatDate(dateValue, 'YYYY-MM')
+                break
+            case ReportType.Quarter:
+            case ReportType.Year:
+                params.cycletime = formatDate(dateValue, 'YYYY')
+                break
+            default:
+                params.cycletime = formatDate(dateValue, 'YYYY-MM-DD')
+        }
+    }
+}
+
+const onAccountChange = (item?: Model.TAAccountChildrenSelectRsp) => {
+    selectedAccount.value = item
+}
+
+const onSearch = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            setTimeout(() => {
+                componentRef.value.query?.()
+            }, 20)
+        }
+    })
+}
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 9 - 2
src/services/api/common/index.ts

@@ -43,8 +43,8 @@ export function enumType(options: CommonFetchOptions<{ request: Model.EnumTypeRe
  * 获取市场下拉列表
  */
 export function orderListAll(options: CommonFetchOptions<{ request: Model.OrderListAllReq; response: Model.OrderListAllRsp[]; }> = {}) {
-    if (options.data) {
-        options.data.orgztypes = userStore.userInfo.orgztypes
+    options.data = {
+        orgztypes: userStore.userInfo.orgztypes
     }
     return httpClient.commonRequest('/common/orderListAll', 'get', options)
 }
@@ -54,4 +54,11 @@ export function orderListAll(options: CommonFetchOptions<{ request: Model.OrderL
  */
 export function queryGoodsSelect(options: CommonFetchOptions<{ request: Model.GoodsSelectReq; response: Model.GoodsSelectRsp[]; }>) {
     return httpClient.commonRequest('/common/queryGoodsSelect', 'get', options)
+}
+
+/**
+ * 资金账户下拉框 平台查所有,经纪会员/子机构查自己及下级,其它角色查自己
+ */
+export function queryTAAccountChildren(options: CommonFetchOptions<{ request: Model.TAAccountChildrenReq; response: Model.TAAccountChildrenRsp[]; }>) {
+    return httpClient.commonRequest('/common/queryTAAccountChildren', 'get', options)
 }

+ 9 - 0
src/services/api/order/index.ts

@@ -1,10 +1,16 @@
 import httpClient from '@/services/http'
 import { CommonFetchOptions } from '@/services/http/types'
+import { useUserStore } from '@/stores'
+
+const userStore = useUserStore()
 
 /**
  * 委托单查询
  */
 export function queryCommissionSheet(options: CommonFetchOptions<{ request: Model.CommissionSheetReq; response: Model.CommissionSheetRsp[]; }>) {
+    if (options.data) {
+        options.data.orgztypes = userStore.userInfo.orgztypes
+    }
     return httpClient.commonRequest('/query/commissionSheet', 'get', options)
 }
 
@@ -26,6 +32,9 @@ export function commissionExport(options: CommonFetchOptions<{ request: Model.Co
  * 成交单查询
  */
 export function queryContractSheet(options: CommonFetchOptions<{ request: Model.ContractSheetReq; response: Model.ContractSheetRsp[]; }>) {
+    if (options.data) {
+        options.data.orgztypes = userStore.userInfo.orgztypes
+    }
     return httpClient.commonRequest('/query/contractSheet', 'get', options)
 }
 

+ 42 - 0
src/services/api/report/index.ts

@@ -35,4 +35,46 @@ export function shareAmountQuery(options: CommonFetchOptions<{ request: Model.Sh
  */
 export function queryTrade(options: CommonFetchOptions<{ request: Model.TradeReq; response: Model.TradeRsp[]; }>) {
     return httpClient.commonRequest('/reportForm/trade', 'get', options)
+}
+
+/**
+ * 报表管理-->资金账户报表-->资金账户下拉列表
+ */
+export function queryTAAccountChildrenSelect(options: CommonFetchOptions<{ request: Model.TAAccountChildrenSelectReq; response: Model.TAAccountChildrenSelectRsp[]; }>) {
+    return httpClient.commonRequest('/reportForm/queryTAAccountChildrenSelect', 'get', options)
+}
+
+/**
+ * 报表管理-->资金账户报表-->资金信息
+ */
+export function taaccountReportQuery(options: CommonFetchOptions<{ request: Model.TaaccountReportReq; response: Model.TaaccountReportRsp; }>) {
+    return httpClient.commonRequest('/reportForm/taaccountReportQuery', 'get', options)
+}
+
+/**
+ * 报表管理-->资金账户报表-->持仓汇总表
+ */
+export function holderTotalQuery(options: CommonFetchOptions<{ request: Model.TaaccountReportReq; response: Model.HolderTotalRsp[]; }>) {
+    return httpClient.commonRequest('/reportForm/holdertotalquery', 'get', options)
+}
+
+/**
+ * 报表管理-->资金账户报表-->仓单汇总表
+ */
+export function wrPositionQuery(options: CommonFetchOptions<{ request: Model.TaaccountReportReq; response: Model.WrPositionRsp[]; }>) {
+    return httpClient.commonRequest('/reportForm/wrpositionquery', 'get', options)
+}
+
+/**
+ * 报表管理-->资金账户报表-->成交汇总表
+ */
+export function tradeQuery(options: CommonFetchOptions<{ request: Model.TaaccountReportReq; response: Model.TradeQueryRsp[]; }>) {
+    return httpClient.commonRequest('/reportForm/tradequery', 'get', options)
+}
+
+/**
+ * 报表管理-->资金账户报表-->履约汇总表
+ */
+export function accountppQuery(options: CommonFetchOptions<{ request: Model.TaaccountReportReq; response: Model.AccountppRsp; }>) {
+    return httpClient.commonRequest('/reportForm/accountppquery', 'get', options)
 }

+ 9 - 3
src/services/http/index.ts

@@ -7,6 +7,8 @@ import { useLoginStore } from '@/stores'
 import { CommonFetchOptions, CommonResult, FetchTypes, ResultCode } from './types'
 //import { addPending, removePending } from './pending'
 
+const loginStore = useLoginStore()
+
 export default new (class {
     private readonly axiosInstance = axios.create({
         timeout: 30000,
@@ -29,6 +31,10 @@ export default new (class {
         this.axiosInstance.interceptors.response.use(
             (res) => {
                 //removePending(res) //在请求结束后,移除本次请求
+                const { authorization } = res.headers
+                if (authorization) {
+                    loginStore.setToken(authorization) // 更新 Token
+                }
                 return res
             },
             (err) => {
@@ -36,7 +42,6 @@ export default new (class {
                     return Promise.reject('网络或服务器错误')
                 }
                 if (err.response) {
-                    const loginStore = useLoginStore()
                     const { code, msg, message } = err.response.data ?? {}
                     switch (err.response.status) {
                         case 408: {
@@ -86,13 +91,14 @@ export default new (class {
      * @returns 
      */
     private fetchAuth(config: AxiosRequestConfig) {
-        const loginStore = useLoginStore()
         const timestamp = new Date().getTime()
 
         //设置请求头
         config.headers = {
-            Authorization: loginStore.token,
+            'Accept-Language': 'zh-CN',
+            'Sign-Id': loginStore.signId,
             Sign: cryptojs.SHA256(loginStore.sign + timestamp.toString()).toString(),
+            Authorization: loginStore.token,
             Timestamp: timestamp.toString(),
             ...config.headers
         }

+ 7 - 1
src/stores/modules/login.ts

@@ -1,4 +1,5 @@
 import { reactive, toRefs } from 'vue'
+import { v4 } from 'uuid'
 import { encryptAES, decryptAES } from '@/utils/crypto'
 import { defineStore } from '../store'
 import { localData, sessionData } from '../storage'
@@ -11,10 +12,15 @@ export const useLoginStore = defineStore(() => {
     const localToken = localData.getValue('accessToken')
     const sessionToken = sessionData.getValue('accessToken')
 
+    // 创建当前会话唯一ID
+    const uuid = sessionStorage.getItem('uuid') || v4()
+    sessionStorage.setItem('uuid', uuid)
+
     const state = reactive({
         isLoggedIn: false,
-        token: localToken || sessionToken,
         rsakey: 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+vKmZCnIVaI7KI1SqY2LhFXqwG9r+F135M4/EaCLKztZWokzl67SjCjmCgsk5ampDa/hPxugaAJo0KZPRaDGqVq54cLm3+dot8a1HU9rHqPCS5MvQRS7gk8ce/t8uHY40/KxLokOpXKmzM1rc3BNoh7elAnRIMCM3W8vhXZkhdwIDAQAB',
+        token: localToken || sessionToken,
+        signId: uuid,
         sign: ''
     })
 

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

@@ -73,6 +73,7 @@ declare namespace Model {
         userinfotype: number; // 资金管理银行签约用户信息类型枚举
         customername: string; // 资金管理银行签约客户名称
         mobile: string; // 资金管理银行签约手机号码
+        tradedate: string; // 报表查询日期
     }
 
     /** 网上出入金申请 请求 */

+ 11 - 0
src/types/model/common.d.ts

@@ -146,4 +146,15 @@ declare namespace Model {
         goodsId: string; // id
         goodsName: string; // 商品名称
     }
+
+    /** 资金账户下拉框 平台查所有,经纪会员/子机构查自己及下级,其它角色查自己 请求 */
+    interface TAAccountChildrenReq {
+        searchCode?: string;
+    }
+
+    /** 资金账户下拉框 平台查所有,经纪会员/子机构查自己及下级,其它角色查自己 响应 */
+    interface TAAccountChildrenRsp {
+        accountId: string;
+        relatedName: string;
+    }
 }

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

@@ -13,6 +13,7 @@ declare namespace Model {
         operateType?: number; // operatetype=0查询所有 operatetype=2查询斩仓记录
         orderId?: number; // 委托单号 operatetype == 2
         orderStatus?: number; // 委托状态
+        orgztypes?: string; // 权限控制
         pageNum: number; // 页码
         pageSize: number; // 页大小
         searchStatus?: number; // 状态 1 已成交 2 未成交

+ 163 - 5
src/types/model/report.d.ts

@@ -1,4 +1,16 @@
 declare namespace Model {
+    /** 报表管理-->资金账户报表-->资金账户下拉列表 请求 */
+    interface TAAccountChildrenSelectReq {
+        searchcode?: string;
+    }
+
+    /** 报表管理-->资金账户报表-->资金账户下拉列表 响应 */
+    interface TAAccountChildrenSelectRsp {
+        accountid: number;
+        invloginids: number;
+        relatedname: string;
+    }
+
     /** 报表管理-->经纪会员报表 请求 */
     interface OrgReportQueryReq {
         accountid?: number  // 所属机构
@@ -59,7 +71,7 @@ declare namespace Model {
         areaname?: string
         cycletime?: string
         cycletype?: number  // 报表类型
-        ismarketing?: number 
+        ismarketing?: number
         isson?: number // 是否包含子机构
         orgztypes: string  // 管理员所属机构角色类型
         pageNum?: number  // 页码
@@ -84,18 +96,18 @@ declare namespace Model {
     }
 
     /** 报表管理-->推荐成交报表-->推荐人信息 请求 */
-     interface RefUserSelectReq {
+    interface RefUserSelectReq {
         searchcode?: string
     }
 
     /** 报表管理-->推荐成交报表-->推荐人信息 响应 */
     interface RefUserSelectRsp {
-        invloginids: number  
-        relatedname: string  
+        invloginids: number
+        relatedname: string
     }
 
     /** 报表管理-->推荐成交报表 请求 */
-     interface TradeReq {
+    interface TradeReq {
         cycletime?: string // 日期
         cycletype?: number // 报表类型
         pageNum?: number  // 页码
@@ -115,4 +127,150 @@ declare namespace Model {
         tradeamount: number  // 成交金额
         tradeqty: number  // 成交量
     }
+
+    /** 报表管理-->资金账户报表-->资金信息 请求 */
+    interface TaaccountReportReq {
+        accountid: number; // 资金账户
+        cycletime: string;
+        cycletype: number  // 报表类型
+        pageNum: number;  // 页码
+        pageSize: number;  // 页大小
+        quarter?: number; // 季度
+        type?: number;
+    }
+
+    /** 报表管理-->资金账户报表-->资金信息 响应 */
+    interface TaaccountReportRsp {
+        accountid: number; // 资金账户ID
+        accountname: string; // 账户名称
+        accountpl: number; // 今日账户盈亏 = 今日净值-昨日净值+今日出金-今日入金-今日划转+今日授信减少-今日授信增加+今日其它授信减少-今日其它授信增加+今日三方出金-今日三方入金; 由统计服务更新
+        avaiablemoney: number; // 可用资金
+        avaiableoutmoney: number; // 可出资金
+        balance: number; // 期初余额
+        capitalbalance: number; // 本金余额[外部子账户实际出入金余额]
+        changeflag: number; // 变动标志(当前账户资金有任何变动更新为1系统结算时更新0;供清算时使用) 0:无变动 1:有变动
+        clearbalance: number; // 清算余额 = 期末余额 - 授信金额 - 其它授信金额
+        clearpl: number; // 真实资金变动值(除出入金、应付交易所手续费) 清算盈亏 = 期末余额 - 期初余额 - (今日入金 + 今日出金) - 今日应付交易所手续费 - 【(今日授信增加 + 今日授信减少) - (今日其它授信增加 + 今日其它授信减少) ----母账户】= 今日手续费支出 + 今日平仓盈亏 + 今日结算盈亏 + 其他支出 + 其他收入 + 今日划转金额 + 今日已收手续费分成 - 今日应付交易所手续费
+        closepl: number; // 今日平仓盈亏
+        closepl2: number; // 平仓盈亏(逐笔)
+        creditdecrease: number; // 今日授信减少
+        creditincrease: number; // 今日授信增加
+        curdebt: number; // 期末欠款
+        currencyid: number; // 货币ID
+        currentbalance: number; // 期末余额
+        defercharge: number; // 今日递延费2支出[111, 112]
+        deliveryamountin: number; // 今日交收货款收入 - 作废:数据量大汇总有性能问题
+        deliveryamountout: number; // 今日交收货款支出 - 作废:数据量大汇总有性能问题
+        deliverycharge: number; // 今日交收手续费支出 [105,106]
+        deliverycompensationfeein: number; // 今日交收补偿费收入 - 作废:数据量大汇总有性能问题
+        deliverycompensationfeeout: number; // 今日交收补偿费支出 - 作废:数据量大汇总有性能问题
+        dividedcharge: number; // 今日已收手续费分成
+        floatnetvalue: number; // 浮动净值 = 净值 + 浮动盈亏
+        floatpl: number; // 浮动盈亏 - 每日有负债类商品
+        freezecharge: number; // 手续费冻结
+        freezemargin: number; // 冻结保证金
+        fromaccountid: number; // 所属上级账户
+        holdcharge: number; // 今日持仓过夜费支出[108,109,110]
+        inamount: number; // 今日入金金额
+        interestcharge: number; // 今日递延费支出[103, 104]
+        ismain: number; // 是否账号 0:不是母账户 1:是母账户
+        ismarketaccount: number; // 是否机构接单账号 0:不是 1:是
+        isreckonaccount: number; // 是否机构分润账号 0:不是 1:是
+        mortgagecredit: number; // 授信金额
+        netvalue: number; // 净值 = 期末余额 + 所有权市值 + 仓单市值 仓单市值由统计服务更新
+        oridebt: number; // 期初欠款
+        orifreezecharge: number; // 期初手续费冻结
+        orifreezemargin: number; // 期初冻结保证金
+        orimortgagecredit: number; // 期初授信金额
+        oriothercredit: number; // 期初其它授信金额
+        oriotherfreezemargin: number; // 期初其他冻结保证金(出金冻结资金 交割买方冻结 申购冻结 全款买入 商城买入)
+        orioutamountfreeze: number; // 期初出金冻结
+        oriusedmargin: number; // 期初占用保证金
+        othercredit: number; // 其它授信金额
+        othercreditdecrease: number; // 今日其它授信减少
+        othercreditincrease: number; // 今日其它授信增加
+        otherfreezemargin: number; // 其他冻结保证金(出金冻结资金 交割买方冻结 申购冻结 全款买入 商城买入)
+        otherincome: number; // 其他收入(交割收款 申购收款 全款卖出 商城卖出 买家退货 会员手续费收入)
+        otherpay: number; // 其他支出(交割付款 申购付款 全款买入 商城买入 卖家退货)
+        outamount: number; // 今日出金金额
+        outamountfreeze: number; // 出金冻结
+        outthreshold: number; // 出金阈值
+        ownershipvalue: number; // 所有权市值
+        parentaccountid: number; // 所属根账户
+        password: string; // 资金密码
+        paycharge: number; // 今日手续费支出
+        paycharge2: number; // 今日手续费支出(外部配置)
+        payexchcharge: number; // 今日应付交易所手续费
+        reckondate: string; // 日照日期(yyyyMMdd)
+        reckonpl: number; // 今日结算盈亏
+        reckonpl2: number; // 结算盈亏(逐笔) - 汇总取期末
+        relatedaccountstatus: number; // 关联用户交易状态 - 1:正常(可交易) 2:受限(可平仓,不可建仓) 3:冻结(不可交易)
+        relateuserid: number; // 关联用户
+        riskrate: number; // 风险率 = 占用/ 浮动净值 或 浮动净值/占用
+        signstatus: number; // 签约状态 - 1:未签约 2:已签约 3:已解约
+        spotvalue: number; // 现货市值-统计服务更新
+        sublevelpath: string; // 账号层级路径(逗号分隔,首尾加逗号)
+        taaccounttype: number; // 外部/内部账号 - 1:外部账号 2:内部账号
+        thirdinamount: number; // 今日三方入金
+        thirdoutamount: number; // 今日三方出金
+        tradeamount: number; // 今日成交金额 - 作废:数据量大汇总有性能问题
+        tradecharge: number; // 今日交易手续费支出 [101,102]
+        tradeqty: number; // 今日成交量 - 作废:数据量大汇总有性能问题
+        tradestatus: number; // 交易状态 - 1:正常 2:受限 3:冻结 4:禁止建仓(人工受限) 5:禁止交易(人工冻结)
+        transferamount: number; // 今日划转金额(母子账号资金划转,从账号划入为正,从账号划出为负)
+        usedmargin: number; // 占用保证金
+        userid: number; // 用户ID
+    }
+
+    /** 报表管理-->资金账户报表-->持仓汇总表 响应 */
+    interface HolderTotalRsp {
+        accountid: number;
+        buycurholderamount: number; // 买当前持仓总金额
+        buycurpositionqty: number; // 买当前持仓总数量
+        buyholderamount: number; // 买当前持仓总数量
+        buypositionqty: number; // 买期初持仓数量
+        goodscode: string;
+        goodsname: string; // 商品/代码
+        sellcurholderamount: number; // 卖当前持仓总金额
+        sellcurpositionqty: number; // 卖当前持仓数量
+        sellholderamount: number; // 卖持仓期初总金额
+        sellpositionqty: number; // 卖持仓期初数
+    }
+
+    /** 报表管理-->资金账户报表-->仓单汇总表 响应 */
+    interface WrPositionRsp {
+        decreaseqty: number; // 销售数量
+        deliverygoodsname: string; // 现货品种
+        freezeqty: number; // 冻结数量
+        increaseqty: number; // 采购数量
+        startqty: number; // 期初数量
+        totalqty: number; // 期末数量
+        usedqty: number; // 可用数量
+        wrstandardname: string; // 现货商品
+    }
+
+    /** 报表管理-->资金账户报表-->成交汇总表 响应 */
+    interface TradeQueryRsp {
+        closecharge: number; // 平仓手续费
+        closepl: number; // 平仓盈亏
+        closeqty: number; // 平仓数量
+        goodscode: string;
+        goodsname: string; // 商品/代码
+        marketname: string; // 市场
+        opencharge: number; // 建仓手续费
+        openqty: number; // 建仓数量
+        tradeamount: number; // 成交金额
+        tradeqty: number; // 成交量
+    }
+
+    /** 报表管理-->资金账户报表-->履约汇总表 响应 */
+    interface AccountppRsp {
+        accountid: number; // 资金账户ID
+        amount: number; // 今日履约总金额(未完成履约的总金额)
+        buypaidamount: number; // 今日已冻/已扣金额(作为买方)
+        buytodayamount: number; // 今日扣/冻金额(作为买方)
+        reckondate: string; // 日照日期(yyyyMMdd) 日照日期(yyyyMMdd)
+        sellreceivedamount: number; // 今日已收金额(作为卖方)
+        selltodayamount: number; // 今日收取金额(作为卖方)
+    }
 }