li.shaoyi 1 éve
szülő
commit
dab8bc989b
58 módosított fájl, 980 hozzáadás és 412 törlés
  1. 1 0
      package-lock.json
  2. 1 0
      package.json
  3. 25 22
      src/hooks/datatable-v2/index.ts
  4. 8 8
      src/hooks/datatable-v2/types.ts
  5. 2 2
      src/hooks/operation/index.ts
  6. 1 1
      src/packages/pc/components/base/icon-select/index.vue
  7. 13 15
      src/packages/pc/components/base/table-filter-v2/index.vue
  8. 2 2
      src/packages/pc/views/account/tradeacct/index.vue
  9. 3 3
      src/packages/pc/views/admin/role/index.vue
  10. 5 5
      src/packages/pc/views/admin/user/index.vue
  11. 3 3
      src/packages/pc/views/investor/custom/group/index.vue
  12. 3 3
      src/packages/pc/views/investor/custom/riskcfg/index.vue
  13. 3 3
      src/packages/pc/views/investor/custom/tradecfg/index.vue
  14. 2 2
      src/packages/pc/views/investor/manage/modification/index.vue
  15. 13 14
      src/packages/pc/views/investor/manage/user/components/account/index.vue
  16. 27 26
      src/packages/pc/views/investor/manage/user/components/config/index.vue
  17. 17 18
      src/packages/pc/views/investor/manage/user/components/login/index.vue
  18. 3 3
      src/packages/pc/views/investor/manage/user/index.vue
  19. 3 3
      src/packages/pc/views/investor/user/initreview/index.vue
  20. 4 4
      src/packages/pc/views/investor/user/open/index.vue
  21. 3 3
      src/packages/pc/views/investor/user/rereview/index.vue
  22. 3 3
      src/packages/pc/views/marketrun/monitor/user/index.vue
  23. 4 4
      src/packages/pc/views/member/institution/open/index.vue
  24. 2 2
      src/packages/pc/views/member/institution/role/index.vue
  25. 3 3
      src/packages/pc/views/member/subinstitution/manage/index.vue
  26. 4 4
      src/packages/pc/views/member/subinstitution/user/index.vue
  27. 3 3
      src/packages/pc/views/profitshare/institution/config/index.vue
  28. 3 3
      src/packages/pc/views/profitshare/institution/group/index.vue
  29. 2 2
      src/packages/pc/views/query/order/accountsumm/index.vue
  30. 149 1
      src/packages/pc/views/query/order/deliveryorder/index.vue
  31. 2 2
      src/packages/pc/views/query/order/goodssumm/index.vue
  32. 2 2
      src/packages/pc/views/query/order/institutionsumm/index.vue
  33. 115 1
      src/packages/pc/views/query/order/liquidation/index.vue
  34. 3 3
      src/packages/pc/views/query/order/order/index.vue
  35. 3 3
      src/packages/pc/views/query/order/position/index.vue
  36. 2 2
      src/packages/pc/views/query/order/positionsumm/index.vue
  37. 4 4
      src/packages/pc/views/query/order/trade/index.vue
  38. 111 0
      src/packages/pc/views/query/order/tradesumm/index.vue
  39. 47 48
      src/packages/pc/views/query/other/bank_inout/index.vue
  40. 35 41
      src/packages/pc/views/query/other/bank_statement/index.vue
  41. 2 2
      src/packages/pc/views/query/warehouse_receipt/wrsumm/index.vue
  42. 3 3
      src/packages/pc/views/query/warehouse_receipt_order/order/index.vue
  43. 3 3
      src/packages/pc/views/query/warehouse_receipt_order/trade/index.vue
  44. 2 2
      src/packages/pc/views/report/broker/index.vue
  45. 2 2
      src/packages/pc/views/report/investor/index.vue
  46. 2 2
      src/packages/pc/views/report/profitshare/index.vue
  47. 2 2
      src/packages/pc/views/report/trade/index.vue
  48. 17 18
      src/packages/pc/views/settlement/profitsharepay/components/details/index.vue
  49. 3 3
      src/packages/pc/views/settlement/profitsharepay/index.vue
  50. 2 2
      src/packages/pc/views/system/login_failed/index.vue
  51. 6 8
      src/packages/pc/views/system/menu/components/delete/index.vue
  52. 32 33
      src/packages/pc/views/system/menu/components/edit/index.vue
  53. 9 10
      src/packages/pc/views/system/menu/index.vue
  54. 21 0
      src/services/api/order/index.ts
  55. 55 0
      src/types/model/order.d.ts
  56. 0 51
      src/utils/object/index.ts
  57. 177 0
      src/utils/worker/websocket.ts
  58. 3 0
      vue.config.js

+ 1 - 0
package-lock.json

@@ -50,6 +50,7 @@
         "eslint-plugin-vue": "^8.0.3",
         "less": "^4.0.0",
         "less-loader": "^8.0.0",
+        "lodash": "^4.17.21",
         "postcss": "^7.0.32",
         "postcss-px-to-viewport": "^1.1.1",
         "resize-observer-polyfill": "^1.5.1",

+ 1 - 0
package.json

@@ -50,6 +50,7 @@
     "eslint-plugin-vue": "^8.0.3",
     "less": "^4.0.0",
     "less-loader": "^8.0.0",
+    "lodash": "^4.17.21",
     "postcss": "^7.0.32",
     "postcss-px-to-viewport": "^1.1.1",
     "resize-observer-polyfill": "^1.5.1",

+ 25 - 22
src/hooks/datatable-v2/index.ts

@@ -1,5 +1,6 @@
 import { reactive, ref, shallowRef, computed, UnwrapRef } from 'vue'
-import { FilterValue, FilterOption, DataTableOptions } from './types'
+import { FilterData, FilterOption, DataTableOptions } from './types'
+import _ from 'lodash'
 
 export function useDataTable<T>(options: DataTableOptions = {}) {
     // 数据源
@@ -13,20 +14,20 @@ export function useDataTable<T>(options: DataTableOptions = {}) {
     // 总页数
     const pageCount = computed(() => Math.ceil(total.value / pageSize.value) || 1)
     // 过滤筛选值
-    const filters = shallowRef<FilterValue<T>[]>([])
+    const filterData = shallowRef<FilterData<T>[]>([])
 
     // 数据列表
     const dataList = computed<UnwrapRef<T[]>>({
         get() {
             const result = dataSource.value.filter((row) => {
                 // 过滤所有查询条件
-                return filters.value.every((e) => {
-                    return e.keys.some((key) => {
-                        const value = row[key]
+                return filterData.value.every((e) => {
+                    return e.fields.some((field) => {
+                        const value = row[field]
                         if (typeof value === 'number') {
-                            return e.filteredValue.includes(value as T[keyof T])
+                            return e.values.includes(value as T[keyof T])
                         }
-                        return e.filteredValue.some((text) => {
+                        return e.values.some((text) => {
                             return String(value).toLowerCase().indexOf(String(text)) >= 0
                         })
                     })
@@ -50,31 +51,33 @@ export function useDataTable<T>(options: DataTableOptions = {}) {
         pageSize,
         pageCount,
         total,
-        filters,
+        filterData,
     }
 }
 
-export function useDataFilter<T>() {
+export function useDataFilter<T>(defaultOption: FilterOption<T, keyof T>) {
     const queryParams = shallowRef<Partial<T>>({})
 
-    const filterOption: FilterOption<T, keyof T> = reactive({
-        items: [],
-        buttons: [],
-    })
+    const defaultOptionCopy = _.cloneDeep(defaultOption)
+
+    const filterOption: FilterOption<T, keyof T> = reactive(Object.create(defaultOptionCopy))
 
     // 重置所有过滤条件
     const resetFilters = () => {
-        filterOption.items.forEach((e) => {
-            if (!e.locked) {
-                e.value = undefined
-            }
+        const { filters } = _.cloneDeep(defaultOption)
+
+        const items = filters.map((defaultItem, index) => {
+            const currentItem = filterOption.filters[index]
+            return currentItem.locked ? currentItem : defaultItem
         })
+
+        filterOption.filters = items
     }
 
     // 获取过滤参数,支持多条件查询
     const getFilterParams = (clear = false) => {
-        clear && resetFilters()
-        const options: FilterValue<T>[] = []
+        if (clear) resetFilters()
+        const options: FilterData<T>[] = []
 
         // filterOption.items.forEach((e) => {
         //     const { keys, value } = e
@@ -91,12 +94,12 @@ export function useDataFilter<T>() {
 
     // 获取查询参数,支持多条件查询
     const getQueryParams = (clear = false) => {
-        clear && resetFilters()
+        if (clear) resetFilters()
         const params: Partial<T> = Object.create({})
 
-        filterOption.items.forEach((e) => {
+        filterOption.filters.forEach((e) => {
             if (e.value !== undefined) {
-                params[e.key] = e.value
+                params[e.field] = e.value
             }
         })
 

+ 8 - 8
src/hooks/datatable-v2/types.ts

@@ -1,24 +1,24 @@
 /** 
  * 数据过滤项
  */
-export interface FilterValue<T> {
-    keys: (keyof T)[], // 多条件字段
-    filteredValue: (T[keyof T])[], // 多选过滤或模糊查询
+export interface FilterData<T> {
+    fields: (keyof T)[]; // 多条件字段
+    values: (T[keyof T])[]; // 多选过滤或模糊查询
 }
 
 /**
  * 过滤选项
  */
 export interface FilterOption<T, K extends keyof T> {
-    items: FilterItem<T, K>[];
-    buttons: FilterButton[];
+    filters: FilterItem<T, K>[];
+    buttons: ActionButton[];
 }
 
 /** 
  * 过滤项
  */
 export interface FilterItem<T, K extends keyof T> {
-    key: K;
+    field: K;
     label?: string;
     value?: T[K];
     locked?: boolean; // 重置时是否阻止清空当前值
@@ -34,9 +34,9 @@ export interface FilterItem<T, K extends keyof T> {
 }
 
 /** 
- * 过滤按钮
+ * 动作按钮
  */
-export interface FilterButton {
+export interface ActionButton {
     label: string;
     className?: string;
     validateEvent?: boolean; // 是否触发表单验证

+ 2 - 2
src/hooks/operation/index.ts

@@ -29,7 +29,7 @@ export function useOperation<T>({ code, onClose }: OperationOptions = {}) {
     })
 
     // 获取按钮组
-    const getFilteredButtons = (filtered?: string[], reverse?: boolean) => {
+    const getActionButtons = (filtered?: string[], reverse?: boolean) => {
         if (filtered?.length) {
             return buttons.filter((item) => filtered.includes(item.resourceCode) === !reverse)
         }
@@ -56,6 +56,6 @@ export function useOperation<T>({ code, onClose }: OperationOptions = {}) {
         record,
         openComponent,
         closeComponent,
-        getFilteredButtons
+        getActionButtons
     }
 }

+ 1 - 1
src/packages/pc/components/base/icon-select/index.vue

@@ -2,7 +2,7 @@
     <el-popover popper-class="app-icon-select" trigger="click" :hide-after="0" :width="selectorWidth"
         :visible="visible">
         <template #reference>
-            <el-input ref="selectorInput" v-model="iconName" :placeholder="t('common.pleaseenter')" @focus="popoverShow" @blur="popoverHide" />
+            <el-input ref="selectorInput" v-model="iconName" placeholder="请输入" @focus="popoverShow" @blur="popoverHide" />
         </template>
         <el-scrollbar :height="250">
             <ul @mousedown.self="inputFocus = true" @mouseup.self="inputFocus = false">

+ 13 - 15
src/packages/pc/components/base/table-filter-v2/index.vue

@@ -1,21 +1,20 @@
 <template>
   <el-form ref="formRef" class="el-form--filter" :model="queryParams" :rules="formRules" :show-message="false">
     <slot name="before"></slot>
-    <template v-for="(item, index) in option.items" :key="index">
-      <slot :name="item.key" :item="item">
-        <el-form-item :label="item.label" :prop="item.key">
-          <el-select :placeholder="item.placeholder ?? '请选择'" v-model="item.value" :validate-event="shouldValidateEvent"
-            :multiple="item.multiple" collapse-tags @change="item.onChange" v-if="item.options">
+    <template v-for="(item, index) in option.filters" :key="index">
+      <slot :name="item.field" :item="item">
+        <el-form-item :label="item.label" :prop="item.field">
+          <el-select :placeholder="item.placeholder ?? '请选择'" v-model="item.value" :multiple="item.multiple"
+            collapse-tags @change="item.onChange" v-if="item.options">
             <el-option v-for="option in item.options()" :key="option.value" :value="option.value"
               :label="option.label" />
           </el-select>
-          <el-input :placeholder="item.placeholder ?? '请输入'" v-model="item.value"
-            :validate-event="shouldValidateEvent" v-else />
+          <el-input :placeholder="item.placeholder ?? '请输入'" v-model="item.value" v-else />
         </el-form-item>
       </slot>
     </template>
     <slot name="after"></slot>
-    <el-form-item>
+    <el-form-item v-if="option.filters.length">
       <el-button :class="item.className" v-for="(item, index) in option.buttons" :key="index" :disabled="loading"
         @click="handleButtonClick(item)">{{ item.label }}
       </el-button>
@@ -27,7 +26,7 @@
 <script lang="ts" setup>
 import { shallowRef, PropType, computed } from 'vue'
 import { FormInstance, FormRules } from 'element-plus'
-import { FilterOption, FilterButton } from '@/hooks/datatable-v2/types'
+import { FilterOption, ActionButton } from '@/hooks/datatable-v2/types'
 
 const props = defineProps({
   option: {
@@ -45,14 +44,13 @@ const props = defineProps({
 })
 
 const formRef = shallowRef<FormInstance>()
-const shouldValidateEvent = shallowRef<boolean>()
-const queryParams = computed(() => Object.fromEntries(props.option.items.map(e => [e.key, e.value])))
+const queryParams = computed(() => Object.fromEntries(props.option.filters.map(e => [e.field, e.value])))
 
 // 表单验证规则
 const formRules = computed<FormRules>(() => {
-  const rules = props.option.items.reduce<FormRules>((pre, cur) => {
+  const rules = props.option.filters.reduce<FormRules>((pre, cur) => {
     if (cur.required) {
-      pre[cur.key] = [{ required: true }]
+      pre[cur.field] = [{ required: true }]
     }
     return pre
   }, {})
@@ -60,8 +58,7 @@ const formRules = computed<FormRules>(() => {
   return { ...rules, ...props.rules }
 })
 
-const handleButtonClick = ({ validateEvent, onClick }: FilterButton) => {
-  shouldValidateEvent.value = validateEvent ?? false
+const handleButtonClick = ({ validateEvent, onClick }: ActionButton) => {
   if (validateEvent) {
     formRef.value?.validate((valid) => {
       if (valid) {
@@ -70,6 +67,7 @@ const handleButtonClick = ({ validateEvent, onClick }: FilterButton) => {
     })
   } else {
     onClick()
+    formRef.value?.resetFields()
   }
 }
 </script>

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

@@ -7,7 +7,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons()"
+                <app-operation size="small" :data-list="getActionButtons()"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -45,7 +45,7 @@ const { global: { t } } = i18n
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.TaAccountReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.TaAccountRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.TaAccountRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/admin/role/index.vue

@@ -3,7 +3,7 @@
     <app-view>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['admin_role_add'])" @click="openComponent" />
+                <app-operation :data-list="getActionButtons(['admin_role_add'])" @click="openComponent" />
             </template>
             <!-- 创建时间 -->
             <template #modifytime="{ value }">
@@ -11,7 +11,7 @@
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['admin_role_modify', 'admin_role_delete'])"
+                <app-operation size="small" :data-list="getActionButtons(['admin_role_modify', 'admin_role_delete'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -39,7 +39,7 @@ import AppOperation from '@pc/components/base/operation/index.vue'
 // 状态
 const userstatusEnum = useEnum('userstatus')
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.RoleRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.RoleRsp>({
     onClose: () => onRefresh()
 })
 

+ 5 - 5
src/packages/pc/views/admin/user/index.vue

@@ -11,7 +11,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['admin_user_add'])" @click="openComponent" />
+                <app-operation :data-list="getActionButtons(['admin_user_add'])" @click="openComponent" />
             </template>
             <!-- 创建时间 -->
             <template #modifytime="{ value }">
@@ -61,7 +61,7 @@ const isTreeSelect = computed(() => {
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.SystemmanagerReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.SystemmanagerRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.SystemmanagerRsp>({
     onClose: () => onSearch()
 })
 
@@ -116,11 +116,11 @@ const handleOperateButtons = (row: Model.SystemmanagerRsp) => {
     if (row.logincode === 'admin') return []
     switch (row.managerstatus) {
         case AdminStatus.Disable:
-            return getFilteredButtons(['admin_user_enable'])
+            return getActionButtons(['admin_user_enable'])
         case AdminStatus.Lock:
-            return getFilteredButtons(['admin_user_unlock'])
+            return getActionButtons(['admin_user_unlock'])
         default:
-            return getFilteredButtons(['admin_user_modify', 'admin_user_reset', 'admin_user_disable'])
+            return getActionButtons(['admin_user_modify', 'admin_user_reset', 'admin_user_disable'])
     }
 }
 

+ 3 - 3
src/packages/pc/views/investor/custom/group/index.vue

@@ -6,12 +6,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['investor_custom_group_add'])" @click="openComponent" />
+                <app-operation :data-list="getActionButtons(['investor_custom_group_add'])" @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-operation size="small"
-                    :data-list="getFilteredButtons(['investor_custom_group_user', 'investor_custom_group_modify', 'investor_custom_group_delete'])"
+                    :data-list="getActionButtons(['investor_custom_group_user', 'investor_custom_group_modify', 'investor_custom_group_delete'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -46,7 +46,7 @@ const customerTypeEnum = useEnum('customerType')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.PersonalizedReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.PersonalizedRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.PersonalizedRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/investor/custom/riskcfg/index.vue

@@ -6,13 +6,13 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['investor_custom_riskcfg_add'])"
+                <app-operation :data-list="getActionButtons(['investor_custom_riskcfg_add'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-operation size="small"
-                    :data-list="getFilteredButtons(['investor_custom_riskcfg_details', 'investor_custom_riskcfg_modify', 'investor_custom_riskcfg_delete'])"
+                    :data-list="getActionButtons(['investor_custom_riskcfg_details', 'investor_custom_riskcfg_modify', 'investor_custom_riskcfg_delete'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -46,7 +46,7 @@ const customerTypeEnum = useEnum('customerType')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.AccountRiskConfigReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.AccountRiskConfigRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.AccountRiskConfigRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/investor/custom/tradecfg/index.vue

@@ -30,9 +30,9 @@
             </el-form>
         </template>
         <div style="display: flex;justify-content: space-between;">
-            <app-operation :data-list="getFilteredButtons(['investor_custom_tradecfg_add'])" @click="openComponent" />
+            <app-operation :data-list="getActionButtons(['investor_custom_tradecfg_add'])" @click="openComponent" />
             <app-operation
-                :data-list="getFilteredButtons(['investor_custom_tradecfg_modify', 'investor_custom_tradecfg_delete'])"
+                :data-list="getActionButtons(['investor_custom_tradecfg_modify', 'investor_custom_tradecfg_delete'])"
                 @click="openComponent" v-if="data" />
         </div>
         <template v-if="data">
@@ -117,7 +117,7 @@ import AppOperation from '@pc/components/base/operation/index.vue'
 import AppTableDetails from '@pc/components/base/table-details/index.vue'
 import { i18n } from '@/stores'
 
-const { componentMap, componentId, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.TradeConfigViewRsp>({
+const { componentMap, componentId, openComponent, closeComponent, getActionButtons } = useOperation<Model.TradeConfigViewRsp>({
     onClose: (componentId) => {
         getNodeList()
         if (componentId === 'investor_custom_tradecfg_delete') {

+ 2 - 2
src/packages/pc/views/investor/manage/modification/index.vue

@@ -7,7 +7,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['investor_manage_modification_audit'])"
+                <app-operation size="small" :data-list="getActionButtons(['investor_manage_modification_audit'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -42,7 +42,7 @@ const modifystatusEnum = useEnum('modifystatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.ModifyPageReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.ModifyPageRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.ModifyPageRsp>({
     onClose: () => onSearch()
 })
 

+ 13 - 14
src/packages/pc/views/investor/manage/user/components/account/index.vue

@@ -64,8 +64,6 @@ const accounttypeEnum = useEnum('accounttype') // 内/外部
 const tradestatusEnum = useEnum('traderstatus') // 交易状态
 const currencyEnum = useEnum('currency') // 币种
 
-const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.ShowAccountReq>()
-
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => run())
 
 const { dataList, total, pageSize, pageIndex, run } = useRequest(showAccount, {
@@ -89,18 +87,19 @@ const tableColumns = ref<Model.TableColumn[]>([
     { field: 'operate', label: 'common.operate', fixed: 'right' }
 ])
 
-filterOption.items = [
-    {
-        key: 'accountid',
-        label: t('investor.manage.user.account.accountid'),
-        placeholder: t('investor.manage.user.account.tips1')
-    },
-]
-
-filterOption.buttons = [
-    { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
-    { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
-]
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.ShowAccountReq>({
+    filters: [
+        {
+            field: 'accountid',
+            label: t('investor.manage.user.account.accountid'),
+            placeholder: t('investor.manage.user.account.tips1')
+        }
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
+    ]
+})
 
 const onSearch = (clear = false) => {
     const qs = getQueryParams(clear)

+ 27 - 26
src/packages/pc/views/investor/manage/user/components/config/index.vue

@@ -1,9 +1,11 @@
 <!-- 交易商管理-交易商管理-交易商管理-查询个性化设置 -->
 <template>
-    <app-drawer :title="`${t('investor.manage.user.config.title')}${record.accountName}`" width="900" v-model:show="show" :loading="loading" :refresh="refresh">
+    <app-drawer :title="`${t('investor.manage.user.config.title')}${record.accountName}`" width="900"
+        v-model:show="show" :loading="loading" :refresh="refresh">
         <app-filter :option="filterOption" />
         <template v-if="data">
-            <app-table-details :title="t('investor.manage.user.config.subtitle')" :data="data" :label-width="160" :cell-props="detailProps" :column="3" />
+            <app-table-details :title="t('investor.manage.user.config.subtitle')" :data="data" :label-width="160"
+                :cell-props="detailProps" :column="3" />
             <app-table :data="data.extendRule" :columns="ruleColumns">
                 <template #headerLeft>
                     <b>{{ t('investor.manage.user.config.subtitle1') }}</b>
@@ -55,8 +57,6 @@ const refresh = ref(false)
 
 const feetypeEnum = useEnum('feetype')
 
-const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.AccountQueryReq>()
-
 const { dataList } = useRequest(showAccount, {
     params: {
         userid: props.record.userId,
@@ -90,28 +90,29 @@ const feeColumns = computed<Model.TableColumn[]>(() => [
     { field: 'memberdefaultvalue', label: 'investor.manage.user.config.memberdefaultvalue' },
 ])
 
-filterOption.items = [
-    {
-        key: 'accountid',
-        label: t('investor.manage.user.config.accountid'),
-        options: () => dataList.value.map((e) => ({
-            label: e.accountid.toString(),
-            value: e.accountid
-        })),
-        required: true
-    },
-    {
-        key: 'goodsid',
-        label: t('investor.manage.user.config.goodsid'),
-        placeholder: t('investor.manage.user.config.tips1'),
-        required: true
-    },
-]
-
-filterOption.buttons = [
-    { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
-    { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
-]
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.AccountQueryReq>({
+    filters: [
+        {
+            field: 'accountid',
+            label: t('investor.manage.user.config.accountid'),
+            options: () => dataList.value.map((e) => ({
+                label: e.accountid.toString(),
+                value: e.accountid
+            })),
+            required: true
+        },
+        {
+            field: 'goodsid',
+            label: t('investor.manage.user.config.goodsid'),
+            placeholder: t('investor.manage.user.config.tips1'),
+            required: true
+        },
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
+    ]
+})
 
 const onCancel = (isRefresh = false) => {
     show.value = false

+ 17 - 18
src/packages/pc/views/investor/manage/user/components/login/index.vue

@@ -79,8 +79,6 @@ const selectedItem = ref<Model.InvestorLoginListRsp>()
 
 const loginstatusEnum = useEnum('loginstatus') // 账号状态
 
-const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.InvestorLoginListReq>()
-
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => run())
 
 const { dataList, total, pageSize, pageIndex, run } = useRequest(queryInvestorLoginList, {
@@ -102,22 +100,23 @@ const tableColumns = ref<Model.TableColumn[]>([
     { field: 'operate', label: 'common.operate', fixed: 'right' }
 ])
 
-filterOption.items = [
-    {
-        key: 'loginid',
-        label: t('investor.manage.user.login.loginid'),
-    },
-    {
-        key: 'loginstatus',
-        label: t('investor.manage.user.login.loginstatus'),
-        options: () => loginstatusEnum.getEnumOptions()
-    },
-]
-
-filterOption.buttons = [
-    { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
-    { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
-]
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.InvestorLoginListReq>({
+    filters: [
+        {
+            field: 'loginid',
+            label: t('investor.manage.user.login.loginid'),
+        },
+        {
+            field: 'loginstatus',
+            label: t('investor.manage.user.login.loginstatus'),
+            options: () => loginstatusEnum.getEnumOptions()
+        },
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
+    ]
+})
 
 const onSearch = (clear = false) => {
     const qs = getQueryParams(clear)

+ 3 - 3
src/packages/pc/views/investor/manage/user/index.vue

@@ -6,7 +6,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['investor_manage_user_export'])"
+                <app-operation :data-list="getActionButtons(['investor_manage_user_export'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
@@ -50,7 +50,7 @@ const modifystatusEnum = useEnum('modifystatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.InvestorListReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InvestorListRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InvestorListRsp>({
     onClose: () => onSearch()
 })
 
@@ -117,7 +117,7 @@ const handleOperateButtons = (row: Model.InvestorListRsp) => {
         }
         buttons.push('investor_manage_user_config', 'investor_manage_user_account', 'investor_manage_user_login', 'investor_manage_user_delete')
     }
-    return getFilteredButtons(buttons)
+    return getActionButtons(buttons)
 }
 
 const onSearch = (clear = false) => {

+ 3 - 3
src/packages/pc/views/investor/user/initreview/index.vue

@@ -6,12 +6,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['investor_user_initreview_batch'])"
+                <app-operation :data-list="getActionButtons(['investor_user_initreview_batch'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['investor_user_initreview_audit'])"
+                <app-operation size="small" :data-list="getActionButtons(['investor_user_initreview_audit'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -48,7 +48,7 @@ const userstateEnum = useEnum('investorOpenStatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.InvestorReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InvestorRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InvestorRsp>({
     onClose: () => onSearch()
 })
 

+ 4 - 4
src/packages/pc/views/investor/user/open/index.vue

@@ -6,7 +6,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['investor_user_open_add'])" @click="openComponent" />
+                <app-operation :data-list="getActionButtons(['investor_user_open_add'])" @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
@@ -47,7 +47,7 @@ const userstateEnum = useEnum('investorOpenStatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.InvestorReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InvestorRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InvestorRsp>({
     onClose: () => onSearch()
 })
 
@@ -88,9 +88,9 @@ const handleOperateButtons = (row: Model.InvestorRsp) => {
         case 1:
         case 3:
         case 5:
-            return getFilteredButtons(['investor_user_open_details', 'investor_user_open_modify', 'investor_user_open_delete'])
+            return getActionButtons(['investor_user_open_details', 'investor_user_open_modify', 'investor_user_open_delete'])
         case 2:
-            return getFilteredButtons(['investor_user_open_details', 'investor_user_open_cancel'])
+            return getActionButtons(['investor_user_open_details', 'investor_user_open_cancel'])
         default:
             return []
     }

+ 3 - 3
src/packages/pc/views/investor/user/rereview/index.vue

@@ -6,12 +6,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['investor_user_rereview_batch'])"
+                <app-operation :data-list="getActionButtons(['investor_user_rereview_batch'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['investor_user_rereview_audit'])"
+                <app-operation size="small" :data-list="getActionButtons(['investor_user_rereview_audit'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -47,7 +47,7 @@ const userstateEnum = useEnum('investorOpenStatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.InvestorReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InvestorRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InvestorRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/marketrun/monitor/user/index.vue

@@ -6,12 +6,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['marketrun_monitor_user_alloffline'])"
+                <app-operation :data-list="getActionButtons(['marketrun_monitor_user_alloffline'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['marketrun_monitor_user_offline'])"
+                <app-operation size="small" :data-list="getActionButtons(['marketrun_monitor_user_offline'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -42,7 +42,7 @@ const { global: { t } } = i18n
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.MarketRunUserLoginReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.MarketRunUserLoginRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.MarketRunUserLoginRsp>({
     onClose: () => onSearch()
 })
 

+ 4 - 4
src/packages/pc/views/member/institution/open/index.vue

@@ -6,7 +6,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['member_institution_open_add'])"
+                <app-operation :data-list="getActionButtons(['member_institution_open_add'])"
                     @click="openComponent" />
             </template>
             <!-- 开户方式 -->
@@ -60,7 +60,7 @@ const userstateEnum = useEnum('investorOpenStatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.WskhUserinfoReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.MemberDetail>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.MemberDetail>({
     onClose: () => onSearch()
 })
 
@@ -96,9 +96,9 @@ const handleOperateButtons = (row: Model.MemberDetail) => {
     switch (row.userstate) {
         case 1:
         case 3:
-            return getFilteredButtons(['member_institution_open_modify', 'member_institution_open_delete'])
+            return getActionButtons(['member_institution_open_modify', 'member_institution_open_delete'])
         case 2:
-            return getFilteredButtons(['member_institution_open_audit', 'member_institution_open_cancel'])
+            return getActionButtons(['member_institution_open_audit', 'member_institution_open_cancel'])
         default:
             return []
     }

+ 2 - 2
src/packages/pc/views/member/institution/role/index.vue

@@ -8,7 +8,7 @@
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons()"
+                <app-operation size="small" :data-list="getActionButtons()"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -32,7 +32,7 @@ import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppOperation from '@pc/components/base/operation/index.vue'
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.RoleRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.RoleRsp>({
     onClose: () => onRefresh()
 })
 

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

@@ -55,7 +55,7 @@ const usertype2Enum = useEnum('usertype2')
 const treeRef = shallowRef()
 const selectedParent = shallowRef<Model.AreaAndAllChildsRsp>() // 已选中的树节点
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.OrganSonRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.OrganSonRsp>({
     onClose: () => getNodeList()
 })
 
@@ -128,7 +128,7 @@ const handleHeaderButtons = () => {
         }
     }
 
-    return getFilteredButtons(buttons)
+    return getActionButtons(buttons)
 }
 
 // 处理操作按钮
@@ -153,7 +153,7 @@ const handleOperateButtons = (row: Model.OrganSonRsp) => {
         default:
             buttons.push('member_subinstitution_manage_modify')
     }
-    return getFilteredButtons(buttons)
+    return getActionButtons(buttons)
 }
 
 const onSearch = (clear = false) => {

+ 4 - 4
src/packages/pc/views/member/subinstitution/user/index.vue

@@ -6,7 +6,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['member_subinstitution_user_add'])"
+                <app-operation :data-list="getActionButtons(['member_subinstitution_user_add'])"
                     @click="openComponent" />
             </template>
             <!-- 开户方式 -->
@@ -60,7 +60,7 @@ const userstateEnum = useEnum('investorOpenStatus')
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.WskhUserinfoReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.MemberDetail>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.MemberDetail>({
     onClose: () => onSearch()
 })
 
@@ -105,9 +105,9 @@ const handleOperateButtons = (row: Model.MemberDetail) => {
     switch (row.userstate) {
         case 1:
         case 3:
-            return getFilteredButtons(['member_subinstitution_user_modify', 'member_subinstitution_user_delete'])
+            return getActionButtons(['member_subinstitution_user_modify', 'member_subinstitution_user_delete'])
         case 2:
-            return getFilteredButtons(['member_subinstitution_user_audit', 'member_subinstitution_user_cancel'])
+            return getActionButtons(['member_subinstitution_user_audit', 'member_subinstitution_user_cancel'])
         default:
             return []
     }

+ 3 - 3
src/packages/pc/views/profitshare/institution/config/index.vue

@@ -6,13 +6,13 @@
                 <legend>{{ item.feeName + (item.marketId && ` [${item.marketName}]`) }}</legend>
                 <app-table :data="item.configs" :columns="tableColumns">
                     <template #headerLeft>
-                        <app-operation :data-list="getFilteredButtons(['profitshare_institution_config_add'])"
+                        <app-operation :data-list="getActionButtons(['profitshare_institution_config_add'])"
                             @click="(code: string) => showComponent(code, item)" />
                     </template>
                     <!-- 操作 -->
                     <template #operate="{ row }">
                         <app-operation size="small"
-                            :data-list="getFilteredButtons(['profitshare_institution_config_modify', 'profitshare_institution_config_delete'])"
+                            :data-list="getActionButtons(['profitshare_institution_config_modify', 'profitshare_institution_config_delete'])"
                             @click="(code: string) => showComponent(code, item, row)" circle />
                     </template>
                 </app-table>
@@ -51,7 +51,7 @@ const areadividemodeEnum = useEnum('areadividemode')
 const config = ref<Data>()
 const dataList = ref<Data[]>([])
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InitProfitShareConfig>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InitProfitShareConfig>({
     onClose: () => run()
 })
 

+ 3 - 3
src/packages/pc/views/profitshare/institution/group/index.vue

@@ -6,13 +6,13 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['profitshare_institution_group_add'])"
+                <app-operation :data-list="getActionButtons(['profitshare_institution_group_add'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-operation size="small"
-                    :data-list="getFilteredButtons(['profitshare_institution_group_modify', 'profitshare_institution_group_member', 'profitshare_institution_group_delete'])"
+                    :data-list="getActionButtons(['profitshare_institution_group_modify', 'profitshare_institution_group_member', 'profitshare_institution_group_delete'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -44,7 +44,7 @@ const { global: { t } } = i18n
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.ProfitShareQueryPageReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.ProfitShareQueryPageRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.ProfitShareQueryPageRsp>({
     onClose: () => onSearch()
 })
 

+ 2 - 2
src/packages/pc/views/query/order/accountsumm/index.vue

@@ -40,7 +40,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_accountsumm_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_accountsumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -75,7 +75,7 @@ const queryParams = ref<Partial<Model.AccountTransactionsReq>>({
     summode: 1
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.AccountTransactionsReq>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.AccountTransactionsReq>({
     onClose: () => onSearch()
 })
 

+ 149 - 1
src/packages/pc/views/query/order/deliveryorder/index.vue

@@ -1,7 +1,155 @@
 <!-- 查询管理-内部订单查询-交收委托查询 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption" :rules="filterRules">
+                <template #ishis="{ item }">
+                    <el-form-item :label="item.label" prop="ishis">
+                        <el-switch v-model="item.value" :active-value="1" :inactive-value="0" />
+                    </el-form-item>
+                    <el-form-item label="日期" prop="date" v-if="item.value === 1">
+                        <el-date-picker type="daterange" v-model="dateValue" value-format="YYYYMMDD"
+                            start-placeholder="开始时间" end-placeholder="结束时间" />
+                    </el-form-item>
+                </template>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['query_order_deliveryorder_export'])"
+                    @click="openComponentOnClick" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['query_order_deliveryorder_details'])"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="onSearch" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record, queryParams }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { ElMessage, FormRules } from 'element-plus'
+import { formatDate } from '@/filters'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { useOperation } from '@/hooks/operation'
+import { queryDeliveryOrder } from '@/services/api/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+
+const deliveryorderstatus1Enum = useEnum('deliveryorderstatus1') // 状态
+
+const dateValue = shallowRef<string[] | null>([])
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.DeliveryOrderRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryDeliveryOrder, {
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        ishis: 0
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'deliveryticket', label: '申报流水' },
+    { field: 'deliveryorderid', label: '申报单号' },
+    { field: 'accountidname', label: '申报人' },
+    { field: 'xgoodsname', label: '主商品' },
+    { field: 'xdeliveryqty', label: '主商品手数' },
+    { field: 'deliverygoodsname', label: '现货商品' },
+    { field: 'deliveryqty', label: '现货数量' },
+    { field: 'deliveryorderstatus', label: '状态', formatValue: (val) => deliveryorderstatus1Enum.getEnumTypeName(val) },
+    { field: 'ordertime', label: '申报时间', formatValue: (val) => formatDate(val) },
+    { field: 'operate', label: '操作', fixed: 'right' }
+])
+
+// 表单验证规则
+const filterRules: FormRules = {
+    date: [{
+        required: true,
+        validator: () => {
+            return !!dateValue.value && dateValue.value.length === 2
+        }
+    }]
+}
+
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.DeliveryOrderReq>({
+    filters: [
+        {
+            field: 'deliveryorderid',
+            label: '申报单号',
+        },
+        {
+            field: 'accountname',
+            label: '申报人',
+        },
+        {
+            field: 'xgoodsid',
+            label: '主商品',
+        },
+        {
+            field: 'wrstandardid',
+            label: '现货商品',
+        },
+        {
+            field: 'deliveryorderstatus',
+            label: '状态',
+            options: () => deliveryorderstatus1Enum.getEnumOptions()
+        },
+        {
+            field: 'ishis',
+            label: '历史查询',
+            value: 0,
+            options: () => [
+                { label: '当前', value: 0 },
+                { label: '历史', value: 1 }
+            ]
+        },
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: '重置', className: 'el-button--primary', onClick: () => onReset() }
+    ]
+})
+
+// 处理请求参数
+const processRequiredParams = () => {
+    const qs = getQueryParams()
+    const [startDate, endDate] = dateValue.value || []
+    qs.startdate = startDate
+    qs.enddate = endDate
+    return qs
+}
+
+const onSearch = () => {
+    const qs = processRequiredParams()
+    run(qs)
+}
+
+const onReset = () => {
+    dateValue.value = []
+    resetFilters()
+}
+
+const openComponentOnClick = (code: string) => {
+    queryParams.value = processRequiredParams()
+    openComponent(code)
+}
 </script>

+ 2 - 2
src/packages/pc/views/query/order/goodssumm/index.vue

@@ -33,7 +33,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_goodssumm_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_goodssumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -70,7 +70,7 @@ const queryParams = reactive<Model.GoodsTradeReq>({
     summode: 1
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.GoodsTradeRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.GoodsTradeRsp>({
     onClose: () => onSearch()
 })
 

+ 2 - 2
src/packages/pc/views/query/order/institutionsumm/index.vue

@@ -27,7 +27,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_institutionsumm_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_institutionsumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -65,7 +65,7 @@ const queryParams = reactive<Model.InvestorOrderReq>({
     pageSize: 20
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InvestorOrderRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InvestorOrderRsp>({
     onClose: () => onSearch()
 })
 

+ 115 - 1
src/packages/pc/views/query/order/liquidation/index.vue

@@ -1,7 +1,121 @@
 <!-- 查询管理-内部订单查询-斩仓记录查询 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption" />
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['query_order_liquidation_export'])"
+                    @click="openComponentOnClick" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['query_order_liquidation_details'])"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="onSearch" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record, queryParams }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getBuyOrSellList } from '@/constants/order'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useRequest } from '@/hooks/request'
+import { useMarket } from '@/hooks/market'
+import { useOperation } from '@/hooks/operation'
+import { queryCommissionSheet } from '@/services/api/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+
+const { getMarketOptions } = useMarket()
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.CommissionSheetRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryCommissionSheet, {
+    manual: true,
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        isHis: 0
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = ref<Model.TableColumn[]>([
+    { field: 'orderId', label: '委托单号' },
+    { field: 'accountNameId', label: '账户' },
+    { field: 'goodsCodeName', label: '商品代码/名称' },
+    { field: 'buyOrSell', label: '方向' },
+    { field: 'orderPrice', label: '斩仓委托价' },
+    { field: 'orderQty', label: '斩仓数量' },
+    { field: 'orderAccount', label: '斩仓金额' },
+    { field: 'orderTime', label: '斩仓时间' },
+    { field: 'operate', label: '操作', fixed: 'right' }
+])
+
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.CommissionSheetReq>({
+    filters: [
+        {
+            field: 'marketId',
+            label: '市场',
+            required: true,
+            options: () => getMarketOptions()
+        },
+        {
+            field: 'goodsId',
+            label: '商品',
+            placeholder: '请输入商品ID'
+        },
+        {
+            field: 'buyOrSell',
+            label: '方向',
+            options: () => getBuyOrSellList()
+        },
+        {
+            field: 'accountId',
+            label: '账户',
+        },
+        {
+            field: 'orderId',
+            label: '单号',
+        },
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: '重置', className: 'el-button--primary', onClick: () => resetFilters() }
+    ]
+})
+
+// 处理请求参数
+const processRequiredParams = () => {
+    const qs = getQueryParams()
+    const marketId = (qs.marketId ?? 0).toString()
+    qs.tradeMode = +marketId.slice(0, 2)
+    return qs
+}
+
+const onSearch = () => {
+    const qs = processRequiredParams()
+    run(qs)
+}
+
+const openComponentOnClick = (code: string) => {
+    queryParams.value = processRequiredParams()
+    openComponent(code)
+}
 </script>

+ 3 - 3
src/packages/pc/views/query/order/order/index.vue

@@ -56,12 +56,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_order_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_order_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['query_order_order_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_order_order_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -103,7 +103,7 @@ const queryParams = ref<Partial<Model.CommissionSheetReq>>({
     isHis: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.CommissionSheetRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.CommissionSheetRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/query/order/position/index.vue

@@ -55,12 +55,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_position_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_position_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['query_order_position_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_order_position_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -102,7 +102,7 @@ const queryParams = ref<Partial<Model.PositionSheetReq>>({
     validHolderQty: '1'
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.PositionSheetRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.PositionSheetRsp>({
     onClose: () => onSearch()
 })
 

+ 2 - 2
src/packages/pc/views/query/order/positionsumm/index.vue

@@ -32,7 +32,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_positionsumm_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_positionsumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -66,7 +66,7 @@ const formRef = ref<FormInstance>()
 
 const queryParams = ref<Partial<Model.PositionSumSheetReq>>({})
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.PositionSumSheetRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.PositionSumSheetRsp>({
     onClose: () => onSearch()
 })
 

+ 4 - 4
src/packages/pc/views/query/order/trade/index.vue

@@ -43,7 +43,7 @@
                         <el-option :label="t('query.order.trade.tradeTypes4')" value="7,9,11" />
                         <el-option :label="t('query.order.trade.tradeTypes5')" value="29" />
                         <el-option :label="t('query.order.trade.tradeTypes6')" value="12" />
-                        <el-option :label="t('query.order.trade.tradeTypes7')" value="5,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29" />
+                        <el-option :label="t('query.order.trade.tradeTypes7')" value="5,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28" />
                     </el-select>
                 </el-form-item>
                 <el-form-item :label="t('query.order.trade.feeSearchType')" prop="feeSearchType">
@@ -72,12 +72,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_trade_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_trade_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['query_order_trade_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_order_trade_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -118,7 +118,7 @@ const queryParams = ref<Partial<Model.ContractSheetReq>>({
     isHis: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.ContractSheetRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.ContractSheetRsp>({
     onClose: () => onSearch()
 })
 

+ 111 - 0
src/packages/pc/views/query/order/tradesumm/index.vue

@@ -1,8 +1,119 @@
 <!-- 查询管理-内部订单查询-成交汇总查询 -->
 <template>
     <app-view>
+        <template #header>
+            <app-filter :option="filterOption">
+                <template #cycletime="{ item }">
+                    <el-form-item :label="item.label" prop="cycletime">
+                        <el-date-picker v-model="item.value" value-format="YYYYMMDD" placeholder="请选择" />
+                    </el-form-item>
+                </template>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['query_order_tradesumm_export'])"
+                    @click="openComponentOnClick" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="onSearch" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record, queryParams }" @closed="closeComponent"
+            v-if="componentId" />
     </app-view>
 </template>
 
 <script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getBuyOrSellList } from '@/constants/order'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useRequest } from '@/hooks/request'
+import { useOperation } from '@/hooks/operation'
+import { queryTradeSum } from '@/services/api/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.TradeSumRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryTradeSum, {
+    manual: true,
+    params: {
+        pageNum: 1,
+        pageSize: 20
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = ref<Model.TableColumn[]>([
+    { field: 'tradeDate', label: '交易日' },
+    { field: 'loginid', label: '登录账号' },
+    { field: 'currentname', label: '用户名称' },
+    { field: 'parentusername', label: '所属机构' },
+    { field: 'goodscode', label: '商品代码' },
+    { field: 'goodsname', label: '商品名称' },
+    { field: 'buyorselldisplay', label: '方向' },
+    { field: 'tradeqty', label: '成交数量' },
+    { field: 'tradepriceavg', label: '成交价格' },
+    { field: 'tradeamount', label: '成交金额' },
+    { field: 'totalcharge', label: '手续费' }
+])
+
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.TradeSumReq>({
+    filters: [
+        {
+            field: 'cycletime',
+            label: '日期',
+        },
+        {
+            field: 'goodsid',
+            label: '商品',
+            placeholder: '请输入商品ID'
+        },
+        {
+            field: 'buyorsell',
+            label: '方向',
+            options: () => getBuyOrSellList()
+        },
+        {
+            field: 'loginid',
+            label: '登录账号',
+        },
+        {
+            field: 'tradetypes',
+            label: '成交类别',
+            options: () => [
+                { label: '交易成交', value: '1,2,10' },
+                { label: '交收成交', value: '3,4' },
+                { label: '风控斩仓', value: '6' },
+                { label: '协议成交', value: '7,9,11' },
+                { label: '持仓过户', value: '29' },
+                { label: '系统强平', value: '12' },
+                { label: '其它成交', value: '5,8,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28' }
+            ]
+        },
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: '重置', className: 'el-button--primary', onClick: () => resetFilters() }
+    ]
+})
+
+const onSearch = () => {
+    const qs = getQueryParams()
+    run(qs)
+}
+
+const openComponentOnClick = (code: string) => {
+    queryParams.value = getQueryParams()
+    openComponent(code)
+}
 </script>

+ 47 - 48
src/packages/pc/views/query/other/bank_inout/index.vue

@@ -6,7 +6,7 @@
                 <template #after>
                     <el-form-item :label="t('query.other.bank_inout.date')" prop="date">
                         <el-date-picker type="daterange" v-model="dateValue" value-format="YYYYMMDD"
-                        :start-placeholder="t('common.start')" :end-placeholder="t('common.end')" />
+                            :start-placeholder="t('common.start')" :end-placeholder="t('common.end')" />
                     </el-form-item>
                 </template>
             </app-filter>
@@ -14,7 +14,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['query_other_bankinout_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_other_bankinout_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -51,9 +51,7 @@ const usertype2Enum = useEnum('usertype2') // 账户类型
 
 const dateValue = shallowRef<string[] | null>([])
 
-const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.PutOrInReq>()
-
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.PutOrInRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.PutOrInRsp>({
     onClose: () => onSearch()
 })
 
@@ -86,49 +84,50 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { field: 'operate', label: 'common.operate', fixed: 'right' }
 ])
 
-filterOption.items = [
-    {
-        key: 'executetype',
-        label: t('query.other.bank_inout.executetype'),
-        options: () => executetypeEnum.getEnumOptions()
-    },
-    {
-        key: 'applystatus',
-        label: t('query.other.bank_inout.applystatus'),
-        options: () => applystatusEnum.getEnumOptions()
-    },
-    {
-        key: 'cusbankid',
-        label: t('query.other.bank_inout.cusbankname'),
-        options: () => bankList.value.map((e) => ({
-            label: e.cusbankname,
-            value: e.cusbankid
-        }))
-    },
-    {
-        key: 'usertype',
-        label: t('query.other.bank_inout.usertype'),
-        options: () => usertype2Enum.getEnumOptions()
-    },
-    {
-        label: t('query.other.bank_inout.loginid'),
-        key: 'loginid'
-    },
-    {
-        label: t('query.other.bank_inout.accountcode'),
-        key: 'accountcode'
-    },
-    {
-        label: t('query.other.bank_inout.accountname1'),
-        key: 'accountname',
-        placeholder: t('query.other.bank_inout.tips1'),
-    }
-]
-
-filterOption.buttons = [
-    { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
-    { label: t('operation.reset'), className: 'el-button--primary', onClick: () => onReset() }
-]
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.PutOrInReq>({
+    filters: [
+        {
+            field: 'executetype',
+            label: t('query.other.bank_inout.executetype'),
+            options: () => executetypeEnum.getEnumOptions()
+        },
+        {
+            field: 'applystatus',
+            label: t('query.other.bank_inout.applystatus'),
+            options: () => applystatusEnum.getEnumOptions()
+        },
+        {
+            field: 'cusbankid',
+            label: t('query.other.bank_inout.cusbankname'),
+            options: () => bankList.value.map((e) => ({
+                label: e.cusbankname,
+                value: e.cusbankid
+            }))
+        },
+        {
+            field: 'usertype',
+            label: t('query.other.bank_inout.usertype'),
+            options: () => usertype2Enum.getEnumOptions()
+        },
+        {
+            label: t('query.other.bank_inout.loginid'),
+            field: 'loginid'
+        },
+        {
+            label: t('query.other.bank_inout.accountcode'),
+            field: 'accountcode'
+        },
+        {
+            label: t('query.other.bank_inout.accountname1'),
+            field: 'accountname',
+            placeholder: t('query.other.bank_inout.tips1'),
+        }
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', onClick: () => onReset() }
+    ]
+})
 
 const onSearch = () => {
     const qs = getQueryParams()

+ 35 - 41
src/packages/pc/views/query/other/bank_statement/index.vue

@@ -12,14 +12,14 @@
                     </el-form-item>
                     <el-form-item :label="t('query.other.bank_statement.date')" prop="date" v-if="item.value === 2">
                         <el-date-picker type="daterange" v-model="dateValue" value-format="YYYYMMDD"
-                        :start-placeholder="t('common.start')" :end-placeholder="t('common.end')" />
+                            :start-placeholder="t('common.start')" :end-placeholder="t('common.end')" />
                     </el-form-item>
                 </template>
             </app-filter>
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_other_bankstatement_export'])"
+                <app-operation :data-list="getActionButtons(['query_other_bankstatement_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -52,9 +52,7 @@ const { getEnumOptions } = useEnum('operatetypesearch') // 业务类型
 
 const dateValue = shallowRef<string[] | null>([])
 
-const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.AmountStreamReq>()
-
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.AmountStreamRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.AmountStreamRsp>({
     onClose: () => onSearch()
 })
 
@@ -84,44 +82,40 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
 const filterRules: FormRules = {
     date: [{
         required: true,
-        validator: (rule, value, callback) => {
-            if (dateValue.value && dateValue.value.length === 2) {
-                callback()
-            } else {
-                callback(new Error(t('common.pleasechoicedate')))
-            }
-        },
-    }],
+        validator: () => {
+            return !!dateValue.value && dateValue.value.length === 2
+        }
+    }]
 }
 
-filterOption.items = [
-    {
-        key: 'logType',
-        label: t('query.other.bank_statement.logType'),
-        value: 1,
-        locked: true,
-        options: () => [
-            { label: t('common.current'), value: 1 },
-            { label: t('common.history'), value: 2 },
-        ]
-    },
-    {
-        key: 'operatetype',
-        label: t('query.other.bank_statement.operatetype'),
-        options: () => getEnumOptions()
-    },
-    {
-        label: t('query.other.bank_statement.accountId'),
-        key: 'accountId',
-        placeholder: t('query.other.bank_statement.tips1'),
-        required: true
-    }
-]
-
-filterOption.buttons = [
-    { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
-    { label: t('operation.reset'), className: 'el-button--primary', onClick: () => onReset() }
-]
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.AmountStreamReq>({
+    filters: [
+        {
+            field: 'logType',
+            label: t('query.other.bank_statement.logType'),
+            value: 1,
+            options: () => [
+                { label: t('common.current'), value: 1 },
+                { label: t('common.history'), value: 2 },
+            ]
+        },
+        {
+            field: 'operatetype',
+            label: t('query.other.bank_statement.operatetype'),
+            options: () => getEnumOptions()
+        },
+        {
+            label: t('query.other.bank_statement.accountId'),
+            field: 'accountId',
+            placeholder: t('query.other.bank_statement.tips1'),
+            required: true
+        }
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', validateEvent: true, onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', onClick: () => onReset() }
+    ]
+})
 
 // 处理请求参数
 const processRequiredParams = () => {

+ 2 - 2
src/packages/pc/views/query/warehouse_receipt/wrsumm/index.vue

@@ -36,7 +36,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons()"
+                <app-operation size="small" :data-list="getActionButtons()"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -69,7 +69,7 @@ const queryParams = ref<Partial<Model.SummaryQueryReq>>({
     ishis: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.SummaryQueryRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.SummaryQueryRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/query/warehouse_receipt_order/order/index.vue

@@ -6,12 +6,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_wrorder_order_export'])"
+                <app-operation :data-list="getActionButtons(['query_wrorder_order_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['query_wrorder_order_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_wrorder_order_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -53,7 +53,7 @@ const queryParams = shallowRef<Model.WarehouseQueryReq>()
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.WarehouseQueryReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.WarehouseQueryRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.WarehouseQueryRsp>({
     onClose: () => onSearch()
 })
 

+ 3 - 3
src/packages/pc/views/query/warehouse_receipt_order/trade/index.vue

@@ -6,12 +6,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_wrorder_trade_export'])"
+                <app-operation :data-list="getActionButtons(['query_wrorder_trade_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['query_wrorder_trade_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_wrorder_trade_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -47,7 +47,7 @@ const queryParams = shallowRef<Model.TradeOrderReq>()
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.TradeOrderReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.TradeOrderRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.TradeOrderRsp>({
     onClose: () => onSearch()
 })
 

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

@@ -35,7 +35,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_report_broker_export'])"
+                <app-operation :data-list="getActionButtons(['query_report_broker_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -70,7 +70,7 @@ const queryParams = ref<Partial<Model.OrgReportQueryReq>>({
     type: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.OrgReportQueryRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.OrgReportQueryRsp>({
     onClose: () => onSearch()
 })
 

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

@@ -49,7 +49,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_report_investor_export'])"
+                <app-operation :data-list="getActionButtons(['query_report_investor_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -82,7 +82,7 @@ const queryParams = ref<Partial<Model.InvestorReportReq>>({
     cycletype: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.InvestorReportRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.InvestorReportRsp>({
     onClose: () => onSearch()
 })
 

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

@@ -31,7 +31,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_order_institutionsumm_export'])"
+                <app-operation :data-list="getActionButtons(['query_order_institutionsumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -68,7 +68,7 @@ const queryParams = ref<Partial<Model.ShareAmountQueryReq>>({
     isson: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.ShareAmountQueryRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.ShareAmountQueryRsp>({
     onClose: () => onSearch()
 })
 

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

@@ -31,7 +31,7 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['query_report_trade_export'])"
+                <app-operation :data-list="getActionButtons(['query_report_trade_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -64,7 +64,7 @@ const queryParams = ref<Partial<Model.TradeReq>>({
     cycletype: 0
 })
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.TradeRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.TradeRsp>({
     onClose: () => onSearch()
 })
 

+ 17 - 18
src/packages/pc/views/settlement/profitsharepay/components/details/index.vue

@@ -72,8 +72,6 @@ const selectedItems = shallowRef<Model.ViewTradingDayRsp[]>([])
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => onSearch())
 
-const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.ViewTradingDayReq>()
-
 const { dataList, total, pageSize, pageIndex, run } = useRequest(viewTradingDay, {
     params: {
         pageNum: 1,
@@ -96,22 +94,23 @@ const tableColumns = shallowRef<Model.TableColumn[]>([
     { field: 'operate', label: 'common.operate', fixed: 'right' }
 ])
 
-filterOption.items = [
-    {
-        key: 'paystatus',
-        label: t('settlement.profitsharepay.details.paystatus'),
-        options: () => ePayFlagEnum.getEnumOptions()
-    },
-    {
-        key: 'shareorgname',
-        label: t('settlement.profitsharepay.details.shareorgname'),
-    }
-]
-
-filterOption.buttons = [
-    { label: t('operation.search'), className: 'el-button--primary', onClick: () => onSearch() },
-    { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
-]
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.ViewTradingDayReq>({
+    filters: [
+        {
+            field: 'paystatus',
+            label: t('settlement.profitsharepay.details.paystatus'),
+            options: () => ePayFlagEnum.getEnumOptions()
+        },
+        {
+            field: 'shareorgname',
+            label: t('settlement.profitsharepay.details.shareorgname'),
+        }
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', onClick: () => resetFilters() }
+    ]
+})
 
 const showComponent = (code: string, row?: Model.ViewTradingDayRsp) => {
     selectedItem.value = row

+ 3 - 3
src/packages/pc/views/settlement/profitsharepay/index.vue

@@ -14,12 +14,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['settlement_profitsharepay_export'])"
+                <app-operation :data-list="getActionButtons(['settlement_profitsharepay_export'])"
                     @click="openComponent" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getFilteredButtons(['settlement_profitsharepay_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['settlement_profitsharepay_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -46,7 +46,7 @@ import { i18n } from '@/stores'
 const { global: { t } } = i18n
 const queryParams = ref<Model.ShareDayQueryReq>({})
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.ShareDayQueryReq>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.ShareDayQueryReq>({
     onClose: () => onSearch()
 })
 

+ 2 - 2
src/packages/pc/views/system/login_failed/index.vue

@@ -6,7 +6,7 @@
         </template>
         <app-table :data="dataList" showIndex :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getFilteredButtons(['system_loginfailed_export'])"
+                <app-operation :data-list="getActionButtons(['system_loginfailed_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -38,7 +38,7 @@ const { global: { t } } = i18n
 const queryParams = shallowRef<Model.SystemErrorReq>()
 const { filterOptons, getQueryParams } = useDataFilter<Model.SystemErrorReq>()
 
-const { componentMap, componentId, record, openComponent, closeComponent, getFilteredButtons } = useOperation<Model.SystemErrorRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.SystemErrorRsp>({
     onClose: () => onSearch()
 })
 

+ 6 - 8
src/packages/pc/views/system/menu/components/delete/index.vue

@@ -1,10 +1,10 @@
 <!-- 系统管理-菜单管理-删除 -->
 <template>
-    <app-drawer :title="t('common.alert')" v-model:show="show" :loading="loading" :refresh="refresh">
-        <div class="g-text-message">{{ t('system.menu.delete.tips') }}</div>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div class="g-text-message">是否删除该菜单?</div>
         <template #footer>
-            <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
-            <el-button type="primary" @click="onSubmit">{{ t('operation.confirm') }}</el-button>
+            <el-button @click="onCancel(false)">取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
         </template>
     </app-drawer>
 </template>
@@ -14,7 +14,6 @@ import { shallowRef, PropType } from 'vue'
 import { ElMessage } from 'element-plus'
 import { deleteMenus } from '@/services/api/user'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
-import { i18n } from '@/stores'
 
 const props = defineProps({
     record: {
@@ -23,7 +22,6 @@ const props = defineProps({
     }
 })
 
-const { global: { t } } = i18n
 const show = shallowRef(true)
 const refresh = shallowRef(false)
 const loading = shallowRef(false)
@@ -40,10 +38,10 @@ const onSubmit = () => {
             resourceCode: props.record.resourceCode
         }
     }).then(() => {
-        ElMessage.success(t('common.tips5'))
+        ElMessage.success('删除成功')
         onCancel(true)
     }).catch((err) => {
-        ElMessage.error(t('common.tips6') + err)
+        ElMessage.error('删除失败:' + err)
         onCancel()
     }).finally(() => {
         loading.value = false

+ 32 - 33
src/packages/pc/views/system/menu/components/edit/index.vue

@@ -1,37 +1,37 @@
 <template>
-    <app-drawer :title="t('system.menu.edit.title')" width="600" v-model:show="show" :refresh="refresh">
+    <app-drawer title="编辑" width="600" v-model:show="show" :refresh="refresh">
         <el-form ref="formRef" class="el-form--vertical" label-width="90px" :model="formData" :rules="formRules"
             :show-message="false">
-            <el-form-item :label="t('system.menu.edit.authType')" prop="authType">
+            <el-form-item label="权限类型" prop="authType">
                 <el-radio-group v-model="formData.authType">
                     <template v-for="(item, index) in getAuthTypeList()" :key="index">
                         <el-radio :label="item.label" :value="item.value" />
                     </template>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.resourceLevel')">
+            <el-form-item label="所属层级">
                 <el-tree-select v-model="formData.parentCode" :data="menus" :empty-values="[null, undefined]"
                     value-key="resourceCode" default-expand-all>
                     <template #default="{ data }">
-                        <el-option :label="data.title || t('system.menu.edit.invalidTitle')" :value="data.resourceCode" />
+                        <el-option :label="data.title || '[无效的标题]'" :value="data.resourceCode" />
                     </template>
                 </el-tree-select>
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.resourceTitle')" prop="title">
-                <el-input v-model="formData.title" :placeholder="t('common.pleaseenter')" />
+            <el-form-item label="权限标题" prop="title">
+                <el-input v-model="formData.title" placeholder="请输入" />
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.resourceCode')" prop="resourceCode">
-                <el-input v-model="formData.resourceCode" :placeholder="t('common.pleaseenter')" :disabled="!!record?.resourceCode" />
+            <el-form-item label="权限代码" prop="resourceCode">
+                <el-input v-model="formData.resourceCode" placeholder="请输入" :disabled="!!record?.resourceCode" />
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.buttontype')" v-if="formData.authType === AuthType.Operate">
+            <el-form-item label="按钮样式" v-if="formData.authType === AuthType.Operate">
                 <div class="el-form-item--col">
                     <el-select v-model="formData.className" clearable>
-                        <el-option :label="t('system.menu.edit.default')" value="default" />
-                        <el-option :label="t('system.menu.edit.primary')" value="primary" />
-                        <el-option :label="t('system.menu.edit.success')" value="success" />
-                        <el-option :label="t('system.menu.edit.info')" value="info" />
-                        <el-option :label="t('system.menu.edit.warning')" value="warning" />
-                        <el-option :label="t('system.menu.edit.danger')" value="danger" />
+                        <el-option label="默认" value="default" />
+                        <el-option label="主要" value="primary" />
+                        <el-option label="成功" value="success" />
+                        <el-option label="信息" value="info" />
+                        <el-option label="警告" value="warning" />
+                        <el-option label="危险" value="danger" />
                     </el-select>
                     <el-button :type="formData.className">
                         <component :is="components.appIcon" :icon="formData.icon" />
@@ -39,11 +39,11 @@
                     </el-button>
                 </div>
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.icon')">
+            <el-form-item label="图标">
                 <component :is="components.appIconSelect" v-model="formData.icon" />
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.url')" prop="url" v-if="formData.authType === AuthType.Menu">
-                <el-input v-model="formData.url" :placeholder="t('common.pleaseenter')">
+            <el-form-item label="链接地址" prop="url" v-if="formData.authType === AuthType.Menu">
+                <el-input v-model="formData.url" placeholder="请输入">
                     <template #prepend>
                         <el-select v-model="formData.urlType" style="width: 120px">
                             <el-option :label="item.label" :value="item.value" v-for="(item, index) in getUrlTypeList()"
@@ -52,23 +52,23 @@
                     </template>
                 </el-input>
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.component')" prop="component"
+            <el-form-item label="组件地址" prop="component"
                 v-if="formData.authType !== AuthType.Menu || formData.urlType === UrlType.Path">
-                <el-input v-model="formData.component" :placeholder="t('common.pleaseenter')" />
+                <el-input v-model="formData.component" placeholder="请输入" />
             </el-form-item>
-            <!-- <el-form-item :label="t('system.menu.edit.remark')" prop="remark">
-                    <el-input type="textarea" :rows="2" v-model="formData.remark" :placeholder="t('common.pleaseenter')" />
+            <!-- <el-form-item label="备注" prop="remark">
+                    <el-input type="textarea" :rows="2" v-model="formData.remark" placeholder="请输入" />
                 </el-form-item> -->
-            <el-form-item :label="t('system.menu.edit.sort')" prop="sort">
-                <el-input-number v-model="formData.sort" :placeholder="t('common.pleaseenter')" />
+            <el-form-item label="排序" prop="sort">
+                <el-input-number v-model="formData.sort" placeholder="请输入" />
             </el-form-item>
-            <el-form-item :label="t('system.menu.edit.show')">
+            <el-form-item label="是否显示">
                 <el-switch v-model="formData.show" :active-value="1" :inactive-value="0" />
             </el-form-item>
         </el-form>
         <template #footer>
-            <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
-            <el-button type="primary" @click="onSubmit">{{ t('operation.submit') }}</el-button>
+            <el-button @click="onCancel(false)">取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
         </template>
     </app-drawer>
 </template>
@@ -79,7 +79,7 @@ import { ElMessage, FormInstance, FormRules } from 'element-plus'
 import { hasValueInTree } from '@/filters'
 import { AuthType, UrlType, getAuthTypeList, getUrlTypeList } from '@/constants/menu'
 import { dealMenus } from '@/services/api/user'
-import { i18n, useRouterStore } from '@/stores'
+import { useRouterStore } from '@/stores'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const components = {
@@ -93,7 +93,6 @@ const props = defineProps({
     }
 })
 
-const { global: { t } } = i18n
 const routerStore = useRouterStore()
 const formRef = shallowRef<FormInstance>()
 const show = shallowRef(true)
@@ -104,7 +103,7 @@ const menus = computed(() => {
         resourceCode: '',
         parentCode: '',
         authType: AuthType.Menu,
-        title: t('system.menu.edit.parentitle'),
+        title: '一级菜单',
         urlType: UrlType.Path,
         url: '',
         component: '',
@@ -181,13 +180,13 @@ const onSubmit = () => {
                 dealMenus({
                     data: rawData
                 }).then(() => {
-                    ElMessage.success(t('common.tips3'))
+                    ElMessage.success('保存成功')
                     onCancel(true)
                 }).catch((err) => {
-                    ElMessage.error(t('common.tips4') + err)
+                    ElMessage.error('保存失败:' + err)
                 })
             } else {
-                ElMessage.warning(t('system.menu.edit.code') + rawData.resourceCode + t('system.menu.edit.exist'))
+                ElMessage.warning('代码 ' + rawData.resourceCode + ' 已存在')
             }
         }
     })

+ 9 - 10
src/packages/pc/views/system/menu/index.vue

@@ -3,11 +3,11 @@
         <app-table ref="tableRef" :data="routerStore.userRoutes" v-model:columns="columns" row-key="resourceCode">
             <template #headerLeft>
                 <div>
-                    <el-button icon="Plus" @click="showComponent('edit')">{{ t('operation.add') }}</el-button>
+                    <el-button icon="Plus" @click="showComponent('edit')">新增</el-button>
                 </div>
                 <el-button type="primary" :icon="isRowExpansion ? 'FolderOpened' : 'Folder'" @click="tableExpandAll">
-                    <span v-if="isRowExpansion">{{ t('common.closeall') }}</span>
-                    <span v-else>{{ t('common.expandall') }}</span>
+                    <span v-if="isRowExpansion">全部收起</span>
+                    <span v-else>全部展开</span>
                 </el-button>
             </template>
             <template #operate="{ row }">
@@ -23,7 +23,7 @@
 <script lang="ts" setup>
 import { shallowRef, defineAsyncComponent } from 'vue'
 import { useComponent } from '@/hooks/component'
-import { i18n, useRouterStore } from '@/stores'
+import { useRouterStore } from '@/stores'
 import AppTable from '@pc/components/base/table/index.vue'
 
 const componentMap = new Map<string, unknown>([
@@ -31,7 +31,6 @@ const componentMap = new Map<string, unknown>([
     ['delete', defineAsyncComponent(() => import('./components/delete/index.vue'))], // 删除
 ])
 
-const { global: { t } } = i18n 
 const routerStore = useRouterStore()
 const record = shallowRef<Model.MenusRsp>()
 const tableRef = shallowRef()
@@ -42,11 +41,11 @@ const { componentRef, componentId, openComponent, closeComponent } = useComponen
 })
 
 const columns = shallowRef([
-    { field: 'title', label: 'system.menu.title', align: 'left' },
-    { field: 'resourceCode', label: 'system.menu.resourceCode', },
-    { field: 'url', label: 'system.menu.url', },
-    { field: 'icon', label: 'system.menu.icon', },
-    { field: 'operate', label: 'common.operate', fixed: 'right' }
+    { field: 'title', label: '菜单', align: 'left' },
+    { field: 'resourceCode', label: '代码', },
+    { field: 'url', label: '路径', },
+    { field: 'icon', label: '图标', },
+    { field: 'operate', label: '操作', fixed: 'right' }
 ])
 
 const showComponent = (componentName: string, row?: Model.MenusRsp) => {

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

@@ -193,4 +193,25 @@ export function warehouseExport(options: CommonFetchOptions<{ request: Model.War
  */
 export function warehouseQuery(options: CommonFetchOptions<{ request: Model.WarehouseQueryReq; response: Model.WarehouseQueryRsp[]; }>) {
     return httpClient.commonRequest('/query/warehouseQuery', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 成交汇总查询 --> 获取列表
+ */
+export function queryTradeSum(options: CommonFetchOptions<{ request: Model.TradeSumReq; response: Model.TradeSumRsp[]; }>) {
+    return httpClient.commonRequest('/query/queryTradeSum', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 成交汇总查询 --> 导出列表
+ */
+export function exportTradeSum(options: CommonFetchOptions<{ request: Model.TradeSumReq; response: string; }>) {
+    return httpClient.commonRequest('/query/exportTradeSum', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 交收委托查询 --> 获取列表
+ */
+export function queryDeliveryOrder(options: CommonFetchOptions<{ request: Model.DeliveryOrderReq; response: Model.DeliveryOrderRsp[]; }>) {
+    return httpClient.commonRequest('/query/queryDeliveryOrder', 'get', options)
 }

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

@@ -1251,4 +1251,59 @@ declare namespace Model {
         // 委托类型
         wrtradetype: string
     }
+
+    /** 内部订单查询--> 成交汇总查询 --> 获取列表 请求 */
+    interface TradeSumReq {
+        buyorsell?: number; // 方向
+        cycletime?: string; // 日 期 yyyyMMdd
+        goodsid?: number; // 商品
+        loginid?: number; // 登录账号
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        tradetypes?: string; // 成交类别
+    }
+
+    /** 内部订单查询--> 成交汇总查询 --> 获取列表 响应 */
+    interface TradeSumRsp {
+        buyorselldisplay: number; // 方向
+        currentname: string; // 用户名称
+        goodscode: string; // 商品代码
+        goodsname: string; // 商品名称
+        loginid: number; // 登录账号
+        parentusername: string; // 所属机构
+        totalcharge: number; // 手续费
+        tradeDate: string; // 交易日
+        tradeamount: number; // 成交金额
+        tradepriceavg: number; // 成交价格
+        tradeqty: number; // 成交数量
+    }
+
+    /** 内部订单查询--> 交收委托查询 --> 获取列表 请求 */
+    interface DeliveryOrderReq {
+        accountname?: string; // 申 报 人
+        deliveryorderid?: string; // 申报单号
+        deliveryorderstatus?: number; // 状 态
+        enddate?: string; // 结束日期
+        ishis?: number; // 0 当前 ,1 历史
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        startdate?: string; // 开始日期
+        wrstandardid?: number; // 现货商品
+        xgoodsid?: number; // 主 商 品
+    }
+
+    /** 内部订单查询--> 交收委托查询 --> 获取列表 响应 */
+    interface DeliveryOrderRsp {
+        accountidname: string; // 申报人
+        deliverygoodsname: string; // 现货商品
+        deliveryorderid: string; // 申报单号
+        deliveryorderstatus: number; // 状态
+        deliveryqty: string; // 现货数量
+        deliveryticket: string; // 申报流水
+        histradedate: string; // 历史交易日
+        ordertime: string; // 申报时间
+        unitname: string;
+        xdeliveryqty: string; // 主商品手数
+        xgoodsname: string; // 主商品
+    }
 }

+ 0 - 51
src/utils/object/index.ts

@@ -1,51 +0,0 @@
-/**
- * 对象浅拷贝
- * @param target 目标对象
- * @param source 源对象
- * @returns
- */
-export function merge<T>(target: T, ...source: T[]): T {
-    source.forEach((e) => {
-        for (const key in e) {
-            if (Object.prototype.hasOwnProperty.call(target, key)) {
-                target[key] = e[key];
-            }
-        }
-    })
-    return target;
-}
-
-/**
- * 对象深拷贝
- * @param target 目标对象
- * @param source 源对象
- * @returns
- */
-export function deepMerge<T>(target: T, source: T): T {
-    for (const key in source) {
-        // 判断属性是否存在
-        if (Object.prototype.hasOwnProperty.call(target, key)) {
-            const t = target[key];
-            const s = source[key];
-
-            // 对象属性类型检查
-            switch (Object.prototype.toString.call(t)) {
-                case '[object Object]':
-                    target[key] = deepMerge(t, s);
-                    break;
-                case '[object Array]':
-                    if (Array.isArray(t) && Array.isArray(s)) {
-                        target[key] = t.reduce((prev, cur, i) => {
-                            const value = deepMerge(cur, s[i]);
-                            prev.push(value);
-                            return prev;
-                        }, [])
-                    }
-                    break;
-                default:
-                    target[key] = s;
-            }
-        }
-    }
-    return target;
-}

+ 177 - 0
src/utils/worker/websocket.ts

@@ -0,0 +1,177 @@
+export default class {
+    private ws: WebSocket | null = null; // WebSocket 对象
+    private connectionId = 0;
+    private url = '';
+    private protocols?: string | string[];
+    private isReconnecting = false; // 是否正在重连
+    private messageTimer = 0; // 消息超时定时器
+    private messageTimeout = 1000 * 15; // 消息超时时间
+    private heartbeatTimer = 0; // 心跳定时器
+    private heartbeatInterval = 1000 * 30; // 心跳间隔时间
+    private reconnectTimer = 0; // 重连定时器
+    private reconnectCount = 0; // 本次已重连次数
+    private reconnectLimit = 10; // 限制重连次数,0 = 无限制
+
+    private heartbeatMessage?: () => string | ArrayBufferLike | Blob | ArrayBufferView; // 心跳消息
+    private onOpen?: () => void; // 连接成功的回调
+    private onMessage: (data: unknown) => void; // 消息回调
+    private onClose?: () => void; // 连接断开的回调
+    private onError?: (err: Event) => void; // 连接发生错误的回调
+    private onBeforeReconnect?: (count: number) => void; // 重连之前的回调
+    private onReconnect?: () => void; // 重连成功之后的回调
+
+    constructor(options: {
+        heartbeatMessage?: () => string | ArrayBufferLike | Blob | ArrayBufferView;
+        onOpen?: () => void;
+        onMessage: (data: unknown) => void;
+        onClose?: () => void;
+        onError?: (err: Event) => void;
+        onBeforeReconnect?: (count: number) => void;
+        onReconnect?: () => void;
+    }) {
+        this.heartbeatMessage = options.heartbeatMessage
+        this.onOpen = options.onOpen
+        this.onMessage = options.onMessage
+        this.onClose = options.onClose
+        this.onError = options.onError
+        this.onBeforeReconnect = options.onBeforeReconnect
+        this.onReconnect = options.onReconnect
+    }
+
+    // 创建 WebSocket 连接
+    connection(url: string, protocols?: string | string[]) {
+        clearTimeout(this.reconnectTimer)
+        this.stopHeartbeat()
+
+        const currentConnectionId = this.connectionId + 1
+        this.connectionId = currentConnectionId
+        this.url = url
+        this.protocols = protocols
+
+        this.ws?.close()
+        this.ws = this.protocols ? new WebSocket(this.url, this.protocols) : new WebSocket(this.url)
+        console.log(this.url, '正在连接')
+
+        // 连接成功
+        this.ws.onopen = () => {
+            if (this.connectionId === currentConnectionId) {
+                if (this.reconnectCount) {
+                    this.onReconnect?.()
+                } else {
+                    this.onOpen?.()
+                }
+
+                console.log(this.url, '连接成功')
+                this.reconnectCount = 0
+                this.startHeartbeat()
+            } else {
+                this.ws?.close()
+            }
+        }
+
+        // 接收消息
+        this.ws.onmessage = (event) => {
+            this.stopHeartbeat()
+
+            if (this.connectionId === currentConnectionId) {
+                this.startHeartbeat()
+                this.onMessage?.(event.data)
+            }
+        }
+
+        // 连接断开
+        this.ws.onclose = () => {
+            this.stopHeartbeat()
+            this.ws = null
+            this.isReconnecting = false
+
+            // 判断是否当前实例,重连时不处理旧 WebSocket 事件
+            if (this.connectionId === currentConnectionId) {
+                if (this.reconnectCount) {
+                    console.warn(this.url, `第${this.reconnectCount}次重连失败`)
+                } else {
+                    console.warn(this.url, '连接已断开')
+                }
+                this.reconnect() // 重连失败会不断尝试,直到成功为止
+            }
+        }
+
+        // 连接发生错误
+        this.ws.onerror = (error) => {
+            if (this.connectionId === currentConnectionId) {
+                console.error(this.url, '连接发生错误')
+                this.onError?.(error)
+            }
+        }
+    }
+
+    // 主动断开连接,断开后不会自动重连
+    disconnect(forced = false) {
+        return new Promise<void>((resolve) => {
+            clearTimeout(this.reconnectTimer)
+            this.reconnectCount = 0
+            this.connectionId++
+
+            if (!forced && this.ws) {
+                const listener = () => {
+                    console.warn(this.url, '主动断开')
+                    this.ws?.removeEventListener('close', listener)
+                    this.onClose?.()
+                    resolve()
+                }
+                this.ws.addEventListener('close', listener)
+                this.ws.close()
+            } else {
+                if (this.ws) {
+                    console.warn(this.url, '主动断开')
+                    this.ws.close()
+                }
+                this.onClose?.()
+                resolve()
+            }
+        })
+    }
+
+    // 发送消息
+    send(data: string | ArrayBufferLike | Blob | ArrayBufferView) {
+        this.ws?.send(data)
+    }
+
+    // 断开重连
+    private reconnect() {
+        if (!this.isReconnecting && this.reconnectCount < this.reconnectLimit) {
+            this.isReconnecting = true
+            this.reconnectCount++
+            this.onBeforeReconnect?.(this.reconnectCount)
+
+            // 自动计算每次重试的延时,重试次数越多,延时越大
+            const delay = this.reconnectCount * 3000
+            console.log(this.url, `${delay / 1000}秒后将进行第${this.reconnectCount}次重连`)
+
+            this.reconnectTimer = setTimeout(() => {
+                this.connection(this.url, this.protocols)
+            }, delay)
+        }
+    }
+
+    // 发送心跳检测
+    private startHeartbeat() {
+        const message = this.heartbeatMessage?.()
+        if (message) {
+            this.heartbeatTimer = setTimeout(() => {
+                this.send(message)
+                // 如果已经超过或心跳超时时长没有收到心跳回复,则认为网络已经异常,进行断网重连
+                this.messageTimer = setTimeout(() => {
+                    console.warn(this.url, '心跳超时')
+                    this.reconnect()
+                }, this.messageTimeout)
+            }, this.heartbeatInterval)
+        }
+    }
+
+    // 停止心跳检测
+    private stopHeartbeat() {
+        clearTimeout(this.messageTimer)
+        clearTimeout(this.heartbeatTimer)
+    }
+}

+ 3 - 0
vue.config.js

@@ -82,5 +82,8 @@ module.exports = defineConfig({
           memoryLimit: 4096,
         },
       }))
+  },
+  configureWebpack: (config) => {
+    config.devtool = 'source-map'
   }
 })