li.shaoyi il y a 6 mois
Parent
commit
778593ebd7
33 fichiers modifiés avec 1025 ajouts et 48 suppressions
  1. 1 1
      public/config/appconfig.json
  2. 9 5
      src/hooks/countdown/index.ts
  3. 25 13
      src/hooks/market/index.ts
  4. 10 3
      src/packages/pc/components/base/table-filter-v2/index.vue
  5. 72 0
      src/packages/pc/components/modules/select-account2/index.vue
  6. 72 0
      src/packages/pc/components/modules/select-account3/index.vue
  7. 94 0
      src/packages/pc/components/modules/select-goods2/index.vue
  8. 1 1
      src/packages/pc/views/marketrun/monitor/account/index.vue
  9. 1 1
      src/packages/pc/views/marketrun/monitor/liquidation/index.vue
  10. 1 1
      src/packages/pc/views/marketrun/monitor/marketer/components/positionsumm/index.vue
  11. 1 1
      src/packages/pc/views/marketrun/monitor/marketer/index.vue
  12. 9 0
      src/packages/pc/views/marketrun/monitor/position/buy.vue
  13. 135 0
      src/packages/pc/views/marketrun/monitor/position/index.vue
  14. 9 0
      src/packages/pc/views/marketrun/monitor/position/sell.vue
  15. 123 1
      src/packages/pc/views/marketrun/monitor/positionsumm/index.vue
  16. 50 0
      src/packages/pc/views/notice/sms/components/send/index.vue
  17. 1 1
      src/packages/pc/views/notice/sms/index.vue
  18. 6 2
      src/packages/pc/views/query/internal/institutionsumm/index.vue
  19. 7 3
      src/packages/pc/views/query/internal/order/index.vue
  20. 5 3
      src/packages/pc/views/query/internal/position/index.vue
  21. 6 3
      src/packages/pc/views/query/internal/positionsumm/index.vue
  22. 7 3
      src/packages/pc/views/query/internal/trade/index.vue
  23. 138 0
      src/packages/pc/views/query/operation/holdtransfer/index.vue
  24. 6 0
      src/packages/pc/views/query/operation/index.vue
  25. 1 1
      src/packages/pc/views/query/order/monitor/index.vue
  26. 6 4
      src/packages/pc/views/system/menu/components/edit/index.vue
  27. 14 0
      src/services/api/common/index.ts
  28. 14 0
      src/services/api/market/index.ts
  29. 7 0
      src/services/api/order/index.ts
  30. 86 0
      src/types/model/common.d.ts
  31. 77 0
      src/types/model/market.d.ts
  32. 1 1
      src/types/model/notice.d.ts
  33. 30 0
      src/types/model/order.d.ts

+ 1 - 1
public/config/appconfig.json

@@ -5,5 +5,5 @@
   "versionCode": "10000",
   "apiUrl": "http://192.168.30.188:8080",
   "tokenStore": "session",
-  "loginVerifyCodeEnabled": true
+  "loginVerifyCodeEnabled": false
 }

+ 9 - 5
src/hooks/countdown/index.ts

@@ -1,18 +1,22 @@
 import { reactive, toRefs, onUnmounted } from 'vue'
 
-export function useCountDown(defaultTime: number) {
+export function useCountDown() {
     let intervalId = 0
 
     const state = reactive({
-        time: defaultTime, // 倒计时秒数
+        time: 10, // 倒计时秒数
         status: 0 // 倒计时状态
     })
 
-    const start = (callback: () => void) => {
+    const start = (callback: () => void, defaultTime = 10) => {
+        clearInterval(intervalId)
+
+        state.time = defaultTime
         state.status = 1
+
         intervalId = window.setInterval(() => {
             state.time--
-            if (state.time < 0) {
+            if (state.time <= 0) {
                 stop()
                 callback()
             }
@@ -21,7 +25,7 @@ export function useCountDown(defaultTime: number) {
 
     const stop = () => {
         clearInterval(intervalId)
-        state.time = defaultTime
+        state.time = 0
         state.status = 0
     }
 

+ 25 - 13
src/hooks/market/index.ts

@@ -1,18 +1,16 @@
 import { reactive, toRefs, onUnmounted } from 'vue'
-import { orderListAll } from '@/services/api/common'
+import { orderListAll, queryOperateMarkets } from '@/services/api/common'
 
-export function useMarket() {
+export function useMarket(dataSource: 'all' | 'operation' = 'all') {
     const state = reactive({
         loading: true,
-        markets: <Model.OrderListAllRsp[]>[]
+        markets: <(Model.OrderListAllRsp | Model.OperateMarketsRsp)[]>[]
     })
 
     const controller = new AbortController()
     const readyCallbackMap = new Map<symbol, () => void>()
 
-    const getMarketById = (marketId?: number) => {
-        return state.markets.find((e) => e.marketid === marketId)
-    }
+    const getMarketById = (marketId?: number) => state.markets.find((e) => e.marketid === marketId)
 
     // 获取市场列表
     const getMarketOptions = (filtered: number | number[] = [], reverse = false) => {
@@ -49,13 +47,27 @@ export function useMarket() {
     }
 
     // 获取市场列表
-    orderListAll({ controller }).then((res) => {
-        state.markets = res.data
-        readyCallbackMap.forEach((callback) => callback())
-        readyCallbackMap.clear()
-    }).finally(() => {
-        state.loading = false
-    })
+    switch (dataSource) {
+        case 'operation':
+            // 运营市场
+            queryOperateMarkets({ controller }).then((res) => {
+                state.markets = res.data
+                readyCallbackMap.forEach((callback) => callback())
+                readyCallbackMap.clear()
+            }).finally(() => {
+                state.loading = false
+            })
+            break
+        default:
+            // 所有市场
+            orderListAll({ controller }).then((res) => {
+                state.markets = res.data
+                readyCallbackMap.forEach((callback) => callback())
+                readyCallbackMap.clear()
+            }).finally(() => {
+                state.loading = false
+            })
+    }
 
     onUnmounted(() => {
         controller.abort()

+ 10 - 3
src/packages/pc/components/base/table-filter-v2/index.vue

@@ -19,9 +19,11 @@
     </template>
     <slot name="after"></slot>
     <el-form-item v-if="option.filters.length && option.buttons">
-      <el-button :class="item.className" v-for="(item, index) in option.buttons" :key="index" :disabled="loading"
-        @click="handleButtonClick(item)">{{ item.label }}
-      </el-button>
+      <template v-for="(item, index) in option.buttons" :key="index">
+        <el-button :class="item.className" :disabled="loading" @click="handleButtonClick(item)">
+          {{ item.label }}
+        </el-button>
+      </template>
     </el-form-item>
     <slot></slot>
   </el-form>
@@ -85,4 +87,9 @@ const handleButtonClick = ({ validateEvent = true, onClick }: ActionButton) => {
     setTimeout(() => formRef.value?.resetFields(), 0)
   }
 }
+
+// 导出表单实例
+defineExpose({
+  formInstance: formRef
+})
 </script>

+ 72 - 0
src/packages/pc/components/modules/select-account2/index.vue

@@ -0,0 +1,72 @@
+<!-- 资金账户下拉列表 -->
+<template>
+    <app-remote-select v-model="selectedValue" :options="dataList"
+        :option-props="{ label: 'relatedName', value: 'accountId' }" :remote-method="remoteMethod" @change="onChange"
+        @reset="onReset">
+        <template #default="{ option }">
+            <div style="display: flex;justify-content: space-between;">
+                <span>{{ option.accountId }}</span>
+                <span>{{ option.relatedName }}</span>
+            </div>
+        </template>
+    </app-remote-select>
+</template>
+
+<script lang="ts" setup>
+import { computed, toRaw ,PropType} from 'vue'
+import { useRequest } from '@/hooks/request'
+import { queryTAAccountChildren } from '@/services/api/common'
+import AppRemoteSelect from '@pc/components/base/remote-select/index.vue'
+
+const props = defineProps({
+    modelValue: [Number, String],
+    params: {
+        type: Object as PropType<Model.TAAccountChildrenReq>
+    },
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+const selectedValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const { dataList, loading, run } = useRequest(queryTAAccountChildren, {
+    manual: true,
+    params: props.params,
+    onSuccess: (res) => {
+        if (!res.data.some((e) => e.accountId.toString() === selectedValue.value?.toString())) {
+            selectedValue.value = undefined
+            onChange()
+        }
+    }
+})
+
+const onReset = () => {
+    if (!loading.value) {
+        run()
+    }
+}
+
+const remoteMethod = (query: string) => {
+    if (!loading.value) {
+        if (query) {
+            run({
+                searchCode: query
+            })
+        } else if (!dataList.value.length) {
+            onReset()
+        }
+    }
+}
+
+const onChange = (value?: string) => {
+    const item = dataList.value.find((e) => e.accountId === value)
+    emit('change', item && toRaw(item))
+}
+
+defineExpose({
+    onReset
+})
+</script>

+ 72 - 0
src/packages/pc/components/modules/select-account3/index.vue

@@ -0,0 +1,72 @@
+<!-- 资金账户下拉列表 -->
+<template>
+    <app-remote-select v-model="selectedValue" :options="dataList"
+        :option-props="{ label: 'accountName', value: 'accountId' }" :remote-method="remoteMethod" @change="onChange"
+        @reset="onReset">
+        <template #default="{ option }">
+            <div style="display: flex;justify-content: space-between;">
+                <span>{{ option.accountId }}</span>
+                <span>{{ option.accountName }}</span>
+            </div>
+        </template>
+    </app-remote-select>
+</template>
+
+<script lang="ts" setup>
+import { computed, toRaw ,PropType} from 'vue'
+import { useRequest } from '@/hooks/request'
+import { queryTAAccountList } from '@/services/api/common'
+import AppRemoteSelect from '@pc/components/base/remote-select/index.vue'
+
+const props = defineProps({
+    modelValue: [Number, String],
+    params: {
+        type: Object as PropType<Model.TAAccountListReq>
+    },
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+const selectedValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const { dataList, loading, run } = useRequest(queryTAAccountList, {
+    manual: true,
+    params: props.params,
+    onSuccess: (res) => {
+        if (!res.data.some((e) => e.accountId.toString() === selectedValue.value?.toString())) {
+            selectedValue.value = undefined
+            onChange()
+        }
+    }
+})
+
+const onReset = () => {
+    if (!loading.value) {
+        run()
+    }
+}
+
+const remoteMethod = (query: string) => {
+    if (!loading.value) {
+        if (query) {
+            run({
+                accountName: query
+            })
+        } else if (!dataList.value.length) {
+            onReset()
+        }
+    }
+}
+
+const onChange = (value?: number) => {
+    const item = dataList.value.find((e) => e.accountId === value)
+    emit('change', item && toRaw(item))
+}
+
+defineExpose({
+    onReset
+})
+</script>

+ 94 - 0
src/packages/pc/components/modules/select-goods2/index.vue

@@ -0,0 +1,94 @@
+<template>
+    <app-remote-select v-model="selectedValue" :options="dataList"
+        :option-props="{ label: getLocalizedKey(), value: 'goodsId' }" :remote-method="remoteMethod" @change="onChange"
+        @reset="onReset">
+        <template #default="{ option }">
+            <div style="display: flex;justify-content: space-between;">
+                <span>{{ option.goodsCode }}</span>
+                <span>{{ option[getLocalizedKey()] || option.goodsId }}</span>
+            </div>
+        </template>
+    </app-remote-select>
+</template>
+
+<script lang="ts" setup>
+import { computed, toRaw, PropType, nextTick } from 'vue'
+import { Language } from '@/constants/language'
+import { useRequest } from '@/hooks/request'
+import { queryGoodsSelectYYJG } from '@/services/api/common'
+import { i18n } from '@/stores'
+import AppRemoteSelect from '@pc/components/base/remote-select/index.vue'
+
+const props = defineProps({
+    modelValue: [Number, String],
+    params: {
+        type: Object as PropType<Model.GoodsSelectYYJGReq>
+    },
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+const selectedValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+// 获取本地化属性键
+const getLocalizedKey: () => keyof Model.GoodsSelectYYJGRsp = () => {
+    switch (i18n.global.locale) {
+        case Language.Simplified:
+            return 'goodsName'
+        case Language.Thai:
+            return 'goodsnameth'
+        case Language.Traditional:
+            return 'goodsnametw'
+        case Language.Vietnamese:
+            return 'goodsnamevi'
+        default:
+            return 'goodsnameen'
+    }
+}
+
+const { dataList, loading, run } = useRequest(queryGoodsSelectYYJG, {
+    manual: true,
+    params: props.params,
+    onSuccess: (res) => {
+        if (!res.data.some((e) => e.goodsId.toString() === selectedValue.value?.toString())) {
+            selectedValue.value = undefined
+            onChange()
+        }
+    }
+})
+
+const onReset = () => {
+    nextTick(() => {
+        if (!loading.value) {
+            run(props.params)
+        }
+    })
+}
+
+const remoteMethod = (query: string) => {
+    nextTick(() => {
+        if (!loading.value) {
+            if (query) {
+                run({
+                    ...props.params,
+                    searchCode: query
+                })
+            } else if (!dataList.value.length) {
+                onReset()
+            }
+        }
+    })
+}
+
+const onChange = (value?: number) => {
+    const item = dataList.value.find((e) => e.goodsId === value)
+    emit('change', item && toRaw(item))
+}
+
+defineExpose({
+    onReset
+})
+</script>

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

@@ -56,7 +56,7 @@ import AppSelectMember from '@pc/components/modules/select-member/index.vue'
 const { global: { t } } = i18n
 const userStore = useUserStore()
 const formRef = ref<FormInstance>()
-const countDown = useCountDown(10)
+const countDown = useCountDown()
 
 const queryParams = ref<Model.MarketRunInvestorReq>({
     orderbytype: 0,

+ 1 - 1
src/packages/pc/views/marketrun/monitor/liquidation/index.vue

@@ -34,7 +34,7 @@ import { i18n } from '@/stores'
 const buyOrSellEnum = useEnum('buyOrSell') // 方向
 
 const { global: { t } } = i18n
-const countDown = useCountDown(10)
+const countDown = useCountDown()
 
 const { dataList, total, loading, pageSize, pageIndex, run } = useRequest(marketRunCutposition, {
     params: {

+ 1 - 1
src/packages/pc/views/marketrun/monitor/marketer/components/positionsumm/index.vue

@@ -44,7 +44,7 @@ const { global: { t } } = i18n
 
 const show = shallowRef(true)
 const selectedItem = shallowRef<Model.MarketRunAccpageRsp>()
-const countDown = useCountDown(10)
+const countDown = useCountDown()
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 

+ 1 - 1
src/packages/pc/views/marketrun/monitor/marketer/index.vue

@@ -44,7 +44,7 @@ import AppOperation from '@pc/components/base/operation/index.vue'
 import { i18n } from '@/stores'
 
 const formRef = ref<FormInstance>()
-const countDown = useCountDown(10)
+const countDown = useCountDown()
 
 const { global: { t} } = i18n
 

+ 9 - 0
src/packages/pc/views/marketrun/monitor/position/buy.vue

@@ -0,0 +1,9 @@
+<!-- 市场运行管理-监控管理-持仓买监控 -->
+<template>
+    <ListView :params="{ buyorsell: BuyOrSell.Buy }" />
+</template>
+
+<script lang="ts" setup>
+import { BuyOrSell } from '@/constants/order'
+import ListView from './index.vue'
+</script>

+ 135 - 0
src/packages/pc/views/marketrun/monitor/position/index.vue

@@ -0,0 +1,135 @@
+<!-- 市场运行管理-监控管理-持仓监控 -->
+<template>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption" :loading="loading">
+                <!-- 商品 -->
+                <template #goodsid="{ item }">
+                    <el-form-item :label="item.label" prop="goodsid">
+                        <app-select-goods2 v-model="item.value"
+                            :params="{ trademodels: '40,41,48,51', goodsStatusIds: '3' }" />
+                    </el-form-item>
+                </template>
+                <!-- 交易商 -->
+                <template #accountid="{ item }">
+                    <el-form-item :label="item.label">
+                        <app-select-account2 v-model="item.value" :params="{ usertype: 5 }" />
+                    </el-form-item>
+                </template>
+                <!-- 下次刷新 -->
+                <template #refTimeInput="{ item }">
+                    <el-form-item :label="item.label">
+                        <el-input-number v-model="item.value" :min="10" placeholder="请输入" />
+                    </el-form-item>
+                </template>
+                <el-form-item>
+                    <el-button type="primary" @click="countDown.stop" v-if="countDown.status.value">
+                        停止监控({{ countDown.time }})
+                    </el-button>
+                    <el-button type="primary" @click="startCountDown" :disabled="loading" v-else>
+                        开始监控
+                    </el-button>
+                </el-form-item>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns">
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons()"
+                    @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 }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { onUnmounted, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate } from '@/filters'
+import { useCountDown } from '@/hooks/countdown'
+import { useOperation } from '@/hooks/operation'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { positionForBuyOrSell } from '@/services/api/market'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppSelectGoods2 from '@pc/components/modules/select-goods2/index.vue'
+import AppSelectAccount2 from '@pc/components/modules/select-account2/index.vue'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Partial<Model.PositionForBuyOrSellReq>>
+    }
+})
+
+const buyOrSellEnum = useEnum('buyOrSell') // 方向
+
+const countDown = useCountDown()
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.PositionForBuyOrSellRsp>()
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(positionForBuyOrSell, {
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        ...props.params
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    },
+    onSuccess: () => {
+        startCountDown()
+    }
+})
+
+const tableColumns: Model.TableColumn[] = [
+    { field: 'tradeid', label: '单号' },
+    { field: 'tradedate1', label: '交易日' },
+    { field: 'accountid', label: '资金账户/账号/名称', width: 200 },
+    { field: 'marketname', label: '市场' },
+    { field: 'goodscode', label: '商品' },
+    { field: 'buyorsell', label: '方向', formatValue: (val) => buyOrSellEnum.getEnumTypeName(val) },
+    { field: 'holderqty', label: '持仓数量' },
+    { field: 'holderprice', label: '持仓价格' },
+    { field: 'holderamount', label: '持仓金额' },
+    { field: 'actuallYplS', label: '浮动损益' },
+    { field: 'tradetime', label: '交易时间', formatValue: (val) => formatDate(val) }
+]
+
+const { filterOption, getQueryParams } = useDataFilter<Model.PositionForBuyOrSellReq>({
+    filters: [
+        { label: '商品', field: 'goodsid' },
+        { label: '交易商', field: 'accountid' },
+        { label: '下次刷新', field: 'refTimeInput', value: 10 },
+        { label: '排除交易商', field: 'excludeaccountids', placeholder: '请输入完整资金账户,多个逗号分隔', width: 260 },
+        { label: '指定交易商', field: 'includeaccountids', placeholder: '请输入完整资金账户,多个逗号分隔', width: 260 }
+    ]
+})
+
+const onSearch = () => {
+    countDown.stop()
+    const qs = getQueryParams()
+    run(qs)
+}
+
+const startCountDown = () => {
+    const { refTimeInput } = getQueryParams()
+    countDown.start(() => {
+        const qs = getQueryParams()
+        run(qs)
+    }, refTimeInput)
+}
+
+onUnmounted(() => {
+    countDown.stop()
+})
+</script>

+ 9 - 0
src/packages/pc/views/marketrun/monitor/position/sell.vue

@@ -0,0 +1,9 @@
+<!-- 市场运行管理-监控管理-持仓卖监控 -->
+<template>
+    <ListView :params="{ buyorsell: BuyOrSell.Sell }" />
+</template>
+
+<script lang="ts" setup>
+import { BuyOrSell } from '@/constants/order'
+import ListView from './index.vue'
+</script>

+ 123 - 1
src/packages/pc/views/marketrun/monitor/positionsumm/index.vue

@@ -1,7 +1,129 @@
 <!-- 市场运行管理-监控管理-持仓汇总监控 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <template #header>
+            <app-filter ref="filterRef" :option="filterOption" :loading="loading">
+                <!-- 商品 -->
+                <template #goodsid="{ item }">
+                    <el-form-item :label="item.label" prop="goodsid">
+                        <app-select-goods2 v-model="item.value"
+                            :params="{ trademodels: '40,41,48,51', goodsStatusIds: '3' }" />
+                    </el-form-item>
+                </template>
+                <!-- 交易商 -->
+                <template #accountid="{ item }">
+                    <el-form-item :label="item.label">
+                        <app-select-account2 v-model="item.value" :params="{ usertype: 5 }" />
+                    </el-form-item>
+                </template>
+                <!-- 下次刷新 -->
+                <template #refTimeInput="{ item }">
+                    <el-form-item :label="item.label">
+                        <el-input-number v-model="item.value" :min="10" placeholder="请输入" />
+                    </el-form-item>
+                </template>
+                <el-form-item>
+                    <el-button type="primary" @click="countDown.stop" v-if="countDown.status.value">
+                        停止监控({{ countDown.time }})
+                    </el-button>
+                    <el-button type="primary" @click="onSearch" :disabled="loading" v-else>
+                        开始监控
+                    </el-button>
+                </el-form-item>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns">
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons()"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { shallowRef, onUnmounted } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useCountDown } from '@/hooks/countdown'
+import { useOperation } from '@/hooks/operation'
+import { useRequest } from '@/hooks/request'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { positionCount } from '@/services/api/market'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppSelectGoods2 from '@pc/components/modules/select-goods2/index.vue'
+import AppSelectAccount2 from '@pc/components/modules/select-account2/index.vue'
+
+const filterRef = shallowRef()
+
+const countDown = useCountDown()
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.PositionCountRsp>()
+
+const { dataList, loading, run } = useRequest(positionCount, {
+    manual: true,
+    params: {
+        pageNum: 1,
+        pageSize: 20
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    },
+    onSuccess: () => {
+        startCountDown()
+    }
+})
+
+const tableColumns: Model.TableColumn[] = [
+    { field: 'accountid', label: '资金账户/账号/名称', width: 200 },
+    { field: 'parentname', label: '所属' },
+    { field: 'goodsid', label: '商品' },
+    { field: 'buy_hold_qty', label: '持仓数量(买)' },
+    { field: 'buy_hold_value', label: '持仓金额(买)' },
+    { field: 'buy_avg_price', label: '持仓均价(买)' },
+    { field: 'buy_float_pl', label: '持仓损益(买)' },
+    { field: 'sell_hold_qty', label: '持仓数量(卖)' },
+    { field: 'sell_hold_value', label: '持仓金额(卖)' },
+    { field: 'sell_avg_price', label: '持仓均价(卖)' },
+    { field: 'sell_float_pl', label: '持仓损益(卖)' },
+    { field: 'total_float_pl', label: '持仓损益(总)' },
+    { field: 'quote_price_last', label: '最新价' },
+    { field: 'operate', label: 'common.operate', fixed: 'right' }
+]
+
+const { filterOption, getQueryParams } = useDataFilter<Model.PositionCountReq>({
+    filters: [
+        { label: '商品', field: 'goodsid', required: true },
+        { label: '交易商', field: 'accountid' },
+        { label: '下次刷新', field: 'refTimeInput', value: 10 },
+        { label: '排除交易商', field: 'excludeaccountids', placeholder: '请输入完整资金账户,多个逗号分隔', width: 260 },
+        { label: '指定交易商', field: 'includeaccountids', placeholder: '请输入完整资金账户,多个逗号分隔', width: 260 }
+    ]
+})
+
+const onSearch = () => {
+    const formInstance = filterRef.value?.formInstance
+    formInstance?.validate((isValid: boolean) => {
+        if (isValid) {
+            const qs = getQueryParams()
+            run(qs)
+        }
+    })
+}
+
+const startCountDown = () => {
+    const { refTimeInput } = getQueryParams()
+    countDown.start(() => {
+        const qs = getQueryParams()
+        run(qs)
+    }, refTimeInput)
+}
+
+onUnmounted(() => {
+    countDown.stop()
+})
 </script>

+ 50 - 0
src/packages/pc/views/notice/sms/components/send/index.vue

@@ -0,0 +1,50 @@
+<!-- 通知公告-短信查询-重新发送 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div class="g-text-message">确认重新发送该短信吗?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)">取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { resend } from '@/services/api/notice'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Notice.SmsQueryRsp>,
+        required: true
+    }
+})
+
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    loading.value = true
+    resend({
+        data: {
+            msgid: props.record.msgid
+        }
+    }).then(() => {
+        ElMessage.success('发送成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('发送失败:' + err)
+        onCancel()
+    }).finally(() => {
+        loading.value = false
+    })
+}
+</script>

+ 1 - 1
src/packages/pc/views/notice/sms/index.vue

@@ -36,7 +36,7 @@ import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
 
 const { global: { t } } = i18n
 
-const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Notice.InformManqueryRsp>({
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Notice.SmsQueryRsp>({
     onClose: () => onSearch()
 })
 

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

@@ -33,7 +33,8 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getActionButtons(['query_internal_institutionsumm_export'])"
+                <app-operation
+                    :data-list="getActionButtons(['query_internal_institutionsumm_export', 'query_operation_institutionsumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -48,6 +49,7 @@
 
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
+import { useRoute } from 'vue-router'
 import { ElMessage, FormRules } from 'element-plus'
 import { useMarket } from '@/hooks/market'
 import { useRequest } from '@/hooks/request'
@@ -62,7 +64,9 @@ import AppSelectGoods from '@pc/components/modules/select-goods/index.vue'
 import AppSelectMember2 from '@pc/components/modules/select-member2/index.vue'
 import { i18n } from '@/stores'
 
-const { getMarketOptions } = useMarket()
+const route = useRoute()
+const { getMarketOptions } = useMarket(route.name === 'query_operation_institutionsumm' ? 'operation' : 'all')
+
 const { global: { t } } = i18n
 const goodsRef = shallowRef() // 商品组件实例
 

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

@@ -33,12 +33,14 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getActionButtons(['query_internal_order_export'])"
+                <app-operation
+                    :data-list="getActionButtons(['query_internal_order_export', 'query_operation_order_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getActionButtons(['query_internal_order_details'])"
+                <app-operation size="small"
+                    :data-list="getActionButtons(['query_internal_order_details', 'query_operation_order_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -53,6 +55,7 @@
 
 <script lang="ts" setup>
 import { ref } from 'vue'
+import { useRoute } from 'vue-router'
 import { ElMessage, FormRules } from 'element-plus'
 import { formatDate } from '@/filters'
 import { useEnum } from '@/hooks/enum'
@@ -69,7 +72,8 @@ import AppSelectGoods from '@pc/components/modules/select-goods/index.vue'
 import AppSelectAccount from '@pc/components/modules/select-account/index.vue'
 import { i18n } from '@/stores'
 
-const { getMarketOptions, getMarketById } = useMarket()
+const route = useRoute()
+const { getMarketOptions, getMarketById } = useMarket(route.name === 'query_operation_order' ? 'operation' : 'all')
 
 const buyOrSellEnum = useEnum('buyOrSell') // 方向
 const buildtypeEnum = useEnum('buildtype') // 委托类型

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

@@ -39,12 +39,12 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getActionButtons(['query_internal_position_export'])"
+                <app-operation :data-list="getActionButtons(['query_internal_position_export','query_operation_position_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getActionButtons(['query_internal_position_details'])"
+                <app-operation size="small" :data-list="getActionButtons(['query_internal_position_details','query_operation_position_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -59,6 +59,7 @@
 
 <script lang="ts" setup>
 import { ref } from 'vue'
+import { useRoute } from 'vue-router'
 import { ElMessage, FormRules } from 'element-plus'
 import { formatDate } from '@/filters'
 import { useEnum } from '@/hooks/enum'
@@ -75,7 +76,8 @@ import AppSelectGoods from '@pc/components/modules/select-goods/index.vue'
 import AppSelectMember2 from '@pc/components/modules/select-member2/index.vue'
 import { i18n } from '@/stores'
 
-const { getMarketOptions } = useMarket()
+const route = useRoute()
+const { getMarketOptions } = useMarket(route.name === 'query_operation_position' ? 'operation' : 'all')
 
 const buyOrSellEnum = useEnum('buyOrSell') // 方向
 const usertype2Enum = useEnum('usertype2') // 机构类型

+ 6 - 3
src/packages/pc/views/query/internal/positionsumm/index.vue

@@ -20,7 +20,8 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getActionButtons(['query_internal_positionsumm_export'])"
+                <app-operation
+                    :data-list="getActionButtons(['query_internal_positionsumm_export', 'query_operation_positionsumm_export'])"
                     @click="openComponentOnClick" />
             </template>
             <template #footer>
@@ -35,6 +36,7 @@
 
 <script lang="ts" setup>
 import { ref } from 'vue'
+import { useRoute } from 'vue-router'
 import { ElMessage } from 'element-plus'
 import { useEnum } from '@/hooks/enum'
 import { useMarket } from '@/hooks/market'
@@ -50,9 +52,10 @@ import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
 import AppSelectGoods from '@pc/components/modules/select-goods/index.vue'
 import AppSelectMember from '@pc/components/modules/select-member/index.vue'
 
-const buyOrSellEnum = useEnum('buyOrSell') // 方向
+const route = useRoute()
+const { getMarketOptions } = useMarket(route.name === 'query_operation_positionsumm' ? 'operation' : 'all')
 
-const { getMarketOptions } = useMarket()
+const buyOrSellEnum = useEnum('buyOrSell') // 方向
 
 const userStore = useUserStore()
 const { global: { t } } = i18n

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

@@ -39,12 +39,14 @@
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getActionButtons(['query_internal_trade_export'])"
+                <app-operation
+                    :data-list="getActionButtons(['query_internal_trade_export', 'query_operation_trade_export'])"
                     @click="openComponentOnClick" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
-                <app-operation size="small" :data-list="getActionButtons(['query_internal_trade_details'])"
+                <app-operation size="small"
+                    :data-list="getActionButtons(['query_internal_trade_details', 'query_operation_trade_details'])"
                     @click="(code: string) => openComponent(code, row)" circle />
             </template>
             <template #footer>
@@ -59,6 +61,7 @@
 
 <script lang="ts" setup>
 import { ref } from 'vue'
+import { useRoute } from 'vue-router'
 import { ElMessage, FormRules } from 'element-plus'
 import { formatDate } from '@/filters'
 import { useEnum } from '@/hooks/enum'
@@ -76,7 +79,8 @@ import AppSelectAccount from '@pc/components/modules/select-account/index.vue'
 import AppSelectMember2 from '@pc/components/modules/select-member2/index.vue'
 import { i18n } from '@/stores'
 
-const { getMarketOptions } = useMarket()
+const route = useRoute()
+const { getMarketOptions } = useMarket(route.name === 'query_operation_trade' ? 'operation' : 'all')
 
 const buyOrSellEnum = useEnum('buyOrSell') // 方向
 const buildtypeEnum = useEnum('buildtype') // 单据类型

+ 138 - 0
src/packages/pc/views/query/operation/holdtransfer/index.vue

@@ -0,0 +1,138 @@
+<!-- 查询管理-运营查询-协议转让 -->
+<template>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption">
+                <!-- 申请日期 -->
+                <template #applydate="{ item }">
+                    <el-form-item :label="item.label">
+                        <el-date-picker v-model="item.value" value-format="YYYYMMDD"
+                            :placeholder="t('common.pleasechoice')" />
+                    </el-form-item>
+                </template>
+                <!-- 商品 -->
+                <template #goodsid="{ item }">
+                    <el-form-item :label="item.label">
+                        <app-select-goods2 v-model="item.value" :params="{ goodsStatusIds: '3,4,6,7' }" />
+                    </el-form-item>
+                </template>
+                <!-- 转出方 -->
+                <template #outaccountid="{ item }">
+                    <el-form-item :label="item.label">
+                        <app-select-account3 v-model="item.value" :params="{ userType: '2,5' }" />
+                    </el-form-item>
+                </template>
+                <!-- 转入方 -->
+                <template #inaccountid="{ item }">
+                    <el-form-item :label="item.label">
+                        <app-select-account3 v-model="item.value" :params="{ userType: '2,5' }" />
+                    </el-form-item>
+                </template>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['query_operation_holdtransfer_add'])"
+                    @click="(code: string) => openComponent(code)" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons([])"
+                    @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 { formatDate } from '@/filters'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useOperation } from '@/hooks/operation'
+import { holdtransferquery } 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'
+import AppSelectGoods2 from '@pc/components/modules/select-goods2/index.vue'
+import AppSelectAccount3 from '@pc/components/modules/select-account3/index.vue'
+import { i18n } from '@/stores'
+
+const applystatus = useEnum('applystatus') // 状态
+const transfertype = useEnum('transfertype') // 转让类型
+
+const { t } = i18n.global
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.HoldTransferQueryRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(holdtransferquery, {
+    params: {
+        pageNum: 1,
+        pageSize: 20
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = ref<Model.TableColumn[]>([
+    { field: 'tradedate', label: '交易日' },
+    { field: 'marketfullname', label: '市场' },
+    { field: 'goodsfullname', label: '商品' },
+    { field: 'outname', label: '转出方' },
+    { field: 'inname', label: '转入方' },
+    { field: 'qty', label: '转让数量' },
+    { field: 'transferprice', label: '转让价格' },
+    { field: 'freezedays', label: '冻结天数' },
+    { field: 'transfertype', label: '转让类型', formatValue: (val) => transfertype.getEnumTypeName(val) },
+    { field: 'applystatus', label: '状态', formatValue: (val) => applystatus.getEnumTypeName(val) },
+    { field: 'applytime', label: '申请时间', formatValue: (val) => formatDate(val) },
+    { field: 'operate', label: 'common.operate', fixed: 'right' }
+])
+
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.HoldTransferQueryReq>({
+    filters: [
+        {
+            field: 'applystatus',
+            label: '申请状态',
+            options: () => applystatus.getEnumOptions(),
+        },
+        {
+            field: 'goodsid',
+            label: '商品'
+        },
+        {
+            field: 'outaccountid',
+            label: '转出方'
+        },
+        {
+            field: 'inaccountid',
+            label: '转入方'
+        },
+        {
+            field: 'applydate',
+            label: '申请日期'
+        }
+    ],
+    buttons: [
+        { label: t('operation.search'), className: 'el-button--primary', onClick: () => onSearch() },
+        { label: t('operation.reset'), className: 'el-button--primary', validateEvent: false, onClick: () => resetFilters() }
+    ]
+})
+
+const onSearch = (clear = false) => {
+    const qs = getQueryParams(clear)
+    run(qs)
+}
+</script>

+ 6 - 0
src/packages/pc/views/query/operation/index.vue

@@ -0,0 +1,6 @@
+<template>
+    <router-view />
+</template>
+
+<script lang="ts" setup>
+</script>

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

@@ -66,7 +66,7 @@ import { i18n } from '@/stores'
 
 const buyOrSellEnum = useEnum('buyOrSell') // 方向
 
-const countDown = useCountDown(10)
+const countDown = useCountDown()
 const { global: { t } } = i18n
 
 const tableColumns = shallowRef<Model.TableColumn[]>([

+ 6 - 4
src/packages/pc/views/system/menu/components/edit/index.vue

@@ -78,8 +78,9 @@ import { shallowRef, reactive, PropType, defineAsyncComponent, onMounted, toRaw,
 import { ElMessage, FormInstance, FormRules } from 'element-plus'
 import { hasValueInTree } from '@/filters'
 import { AuthType, UrlType, getAuthTypeList, getUrlTypeList } from '@/constants/menu'
+import { useRequest } from '@/hooks/request'
+import { getAllMenus } from '@/services/api/user'
 import { dealMenus } from '@/services/api/user'
-import { useRouterStore } from '@/stores'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const components = {
@@ -93,11 +94,12 @@ const props = defineProps({
     }
 })
 
-const routerStore = useRouterStore()
 const formRef = shallowRef<FormInstance>()
 const show = shallowRef(true)
 const refresh = shallowRef(false)
 
+const { dataList } = useRequest(getAllMenus)
+
 const menus = computed(() => {
     const data: Model.MenusRsp[] = [{
         resourceCode: '',
@@ -112,7 +114,7 @@ const menus = computed(() => {
         sort: 0,
         show: 1,
         remark: ''
-    }, ...toRaw(routerStore.userRoutes)]
+    }, ...toRaw(dataList.value)]
 
     // 移除指定的节点
     const removeNodesByCode = (arr: Model.MenusRsp[], code?: string) => {
@@ -166,7 +168,7 @@ const onSubmit = () => {
     formRef.value?.validate((valid) => {
         if (valid) {
             const rawData = toRaw(formData)
-            const hasNode = hasValueInTree(routerStore.userRoutes, rawData.resourceCode, { id: 'resourceCode' })
+            const hasNode = hasValueInTree(dataList.value, rawData.resourceCode, { id: 'resourceCode' })
 
             if (props.record?.resourceCode === rawData.resourceCode || !hasNode) {
                 if (rawData.authType === AuthType.Menu) {

+ 14 - 0
src/services/api/common/index.ts

@@ -68,6 +68,13 @@ export function queryGoodsSelect(options: CommonFetchOptions<{ request: Model.Go
 }
 
 /**
+ * 下拉查询商品: 平台+运营机构同时有权限的菜单中过滤商品时使用
+ */
+export function queryGoodsSelectYYJG(options: CommonFetchOptions<{ request: Model.GoodsSelectYYJGReq; response: Model.GoodsSelectYYJGRsp[]; }>) {
+    return httpClient.commonRequest('/common/queryGoodsSelectYYJG', 'get', options)
+}
+
+/**
  * 资金账户下拉框 平台查所有,经纪会员/子机构查自己及下级,其它角色查自己
  */
 export function queryTAAccountChildren(options: CommonFetchOptions<{ request: Model.TAAccountChildrenReq; response: Model.TAAccountChildrenRsp[]; }>) {
@@ -118,4 +125,11 @@ export function queryAccountIdForMarket(options: CommonFetchOptions<{ request: M
  */
 export function queryParam(options: CommonFetchOptions<{ request: Model.ParamReq; response: string; }>) {
     return httpClient.commonRequest('/common/queryParam', 'get', options)
+}
+
+/**
+ * 运营查询-->获取市场下拉列表
+ */
+export function queryOperateMarkets(options: CommonFetchOptions<{ response: Model.OperateMarketsRsp[]; }> = {}) {
+    return httpClient.commonRequest('/common/queryoperatemarkets', 'get', options)
 }

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

@@ -62,4 +62,18 @@ export function marketRunAccpage(options: CommonFetchOptions<{ request: Model.Ma
  */
 export function queryHolderDetailMonitor(options: CommonFetchOptions<{ request: Model.HolderDetailMonitorReq; response: Model.HolderDetailMonitorRsp[]; }>) {
     return httpClient.commonRequest('/marketRun/queryHolderDetailMonitor', 'get', options)
+}
+
+/**
+ * 市场运行管理-->监控管理-->持仓汇总监控-->获取列表
+ */
+export function positionCount(options: CommonFetchOptions<{ request: Partial<Model.PositionCountReq>; response: Model.PositionCountRsp[]; }>) {
+    return httpClient.commonRequest('/marketRun/positionCount', 'get', options)
+}
+
+/**
+ * 市场运行管理-->监控管理-->持仓汇总监控-->买、卖持仓监控
+ */
+export function positionForBuyOrSell(options: CommonFetchOptions<{ request: Partial<Model.PositionForBuyOrSellReq>; response: Model.PositionForBuyOrSellRsp[]; }>) {
+    return httpClient.commonRequest('/marketRun/positionForBuyOrSell', 'get', options)
 }

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

@@ -389,4 +389,11 @@ export function orderDateExport(options: CommonFetchOptions<{ request: Model.Ord
  */
 export function queryinvestor(options: CommonFetchOptions<{ request: Model.InvestorReq; response: Model.InvestorRsp[]; }>) {
     return httpClient.commonRequest('/query/queryinvestor', 'get', options)
+}
+
+/**
+ * 运营查询--> 协议转让--> 获取列表
+ */
+export function holdtransferquery(options: CommonFetchOptions<{ request: Model.HoldTransferQueryReq; response: Model.HoldTransferQueryRsp[]; }>) {
+    return httpClient.commonRequest('/query/holdtransferquery', 'get', options)
 }

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

@@ -194,11 +194,37 @@ declare namespace Model {
         goodsnameth: string;
         goodsnametw: string;
         goodsnamevi: string;
+        goodunitid: number;
+    }
+
+    /** 下拉查询商品: 平台+运营机构同时有权限的菜单中过滤商品时使用 请求 */
+    interface GoodsSelectYYJGReq {
+        areauserid?: number;
+        deliveryflag?: string;
+        goodsStatusIds?: string;
+        marketId?: number;
+        orgztypes?: string; // 管理员所属机构角色类型
+        searchCode?: string;
+        trademodels?: string;
+        yyareauserid?: number;
+    }
+
+    /** 下拉查询商品: 平台+运营机构同时有权限的菜单中过滤商品时使用 响应 */
+    interface GoodsSelectYYJGRsp {
+        goodsCode: string; // 商品代码
+        goodsId: number; // id
+        goodsName: string; // 商品名称
+        goodsnameen: string;
+        goodsnameth: string;
+        goodsnametw: string;
+        goodsnamevi: string;
+        goodunitid: number;
     }
 
     /** 资金账户下拉框 平台查所有,经纪会员/子机构查自己及下级,其它角色查自己 请求 */
     interface TAAccountChildrenReq {
         searchCode?: string;
+        usertype?: number;
     }
 
     /** 资金账户下拉框 平台查所有,经纪会员/子机构查自己及下级,其它角色查自己 响应 */
@@ -448,4 +474,64 @@ declare namespace Model {
     interface ParamReq {
         paramid: string
     }
+
+    /** 运营查询-->获取市场下拉列表 响应 */
+    interface OperateMarketsRsp {
+        auctionwrtype: number; // 仓单类型(现货交易) - 1:无仓单 2:有仓单 3;有无仓单均可
+        buyspotrighttype: number;
+        canacceptquote: number; // 确认行权是否接收行情 - 0:不接受 1:接受 [可确认权的挂牌期权市场可配置]
+        cangoodsexercise: number; // [期权]是否可现货行权- 0:否 1:是 是否交收
+        cangoodsexercisetype: number; // 可现货行权期权类型 - 1:认购 2认沽 3:认购认沽 [CanGoodsExercise = 1时可设置]
+        canmanualquotestrike: number; // 是否可手动报行权价- 0:否 1:是 [期权]
+        canmutistage: number; // 是否可多段运行 – 0:不可 1:可 [挂牌期权]
+        canpreexercise: number; // [期权]是否可预申报- 0:否 1:是
+        clearinterval: number; // 待开市间隔(交易市场开盘前多久发市场待开市信号(单位分钟))
+        contracttmp: string; // 合同模板[荷兰式][竞价式][仓单贸易]
+        deliverymode: number; // 交收方式(50模式) 1:配对交收 2:强平日交收
+        exchareaid: number; // 所属交易所,可以没有
+        financemarketid: number; // 融资回购市场ID [仓单贸易]
+        forceclosemode: number; // 定期强平方式 - 1:到期结 2:日结 3:周结 4:月结 [收益权] 枚举-forceCloseMode
+        forceclosevalue: number; // 定期强平参数 [收益权](周结、月结)
+        goodstype: number; // 商品类型 - 1:交易商品 2:仓单商品
+        hasrebate: number; // 是否返利[竞价式] 0:不返,1:返利 – 根据系统参数088显示或隐藏
+        hastradecredit: number; // 是否交易授信[做市收益权] - 0:不授信 1:授信
+        haswr: number; // [竞拍]是否需要仓单 - 0:不需要 1:需要- 作废
+        isdeductmargin: number; // 竞拍违约是否扣除保证金[竞拍-降价式] - 0:不扣 1:扣除
+        isdeliverybuyerpayonline: number; // 交收买方是否线上支付(50模式) - 0:否 1:是
+        isdeliverysellercanapply: number; // 卖方是否可申请交收(50模式 - DeliveryMode = 2时) - 0:否 1:是
+        isrecordsource: number; // 是否记录成交源 - 0:不记录 1:记录 [所有权]
+        isreleasemargin: number; // 成交参与保证金是否释放[竞价式] - 0:不释放 1释放
+        isupdatereckonprice: number; // 输入结算价标识 - 0:系统生成 1:手工输入(自动) 2:手工输入(手动)
+        marginformula: number; // 持仓保证金公式 - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权)
+        marginformula2: number; // 持仓保证金公式(仅受托竞价) - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权)
+        marketid: number; // 市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务
+        marketname: string; // 市场名称
+        marketserviceid: number; // 市场服务ID
+        marketstatus: number; // 生效状态(ValidStatus枚举): 1:待生效 2:正常 3:注销
+        markettype: number; // 市场类型- 1:非交易服务 2:交易服务
+        matchermode: number; // 指定对手模式[仓单贸易模式专用] - 1:任意对手 - 作废
+        openmethod: number; // 开盘模式 - 0 自动 1手动
+        otcuserid: number; // 场外期权做市商[场外期权]
+        outersynctime: string; // 外部同步时间点(h24:mi:ss)[场外期权]
+        paylaterflag: number; // 是否支持后付 - 0:不支持 1;支持 - [挂牌点选 所有权、预售挂牌支持]
+        pendingflag: number; // 待开市时间标识[通道交易-对冲] - 0:当日 1:上日
+        pendingtime: string; // 待开市时间通道交易-对冲
+        performancetempid: number; // 履约计划模板ID - 作废
+        premiumquotemode: number; // 权利金报价方式 - 1:自动 2:手动
+        rebateratio: number; // 返利比率[竞价式]
+        reckonorder: number; // 结算顺序
+        reckonpricealgorithm: number; // 结算价算法: 1:最后多少笔成交价加权平均 2:最后多少秒成交价加权平均 3:全天加权平均 4:最后一口价 5.买一价 6.卖一价 7.买一卖一均价 8.外部结算价
+        reckonpriceparam: number; // 结算价参数
+        reckontime: string; // 结算时间通道交易-对冲
+        riskcontrolmode: number; // 风控方式(52模式) 1:按单风控 2:按账户风控
+        roleprioritytype: number; // 角色优先类型 - 1:无 2:报价商优先 3:非报价商优先 [16:挂牌点选]
+        roletype: number;
+        selllistingauditflag: number; // 卖挂牌是否需要审核(仓单贸易) - 0:不需要 1:需要
+        spotrighttype: number;
+        trademarkettype: number; // 交易市场类型 - 1:合约市场 2:外部市场 3:仓单市场
+        trademode: number; // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
+        tradeproperty: number; // 交易属性 - 1:收益权(可做空) 2:所有权(不可做空) 3:期权 4:现货 5:参考行情 6:通道交易 7:币交易 8:场外期权
+        tradetype: number; // 下单方式[通道交易] - 1:直接转单 2:净头寸下单
+        updatereckonpriceinterval: number; // 输入结算价时长(分钟) [1:手工输入(自动)]
+    }
 }

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

@@ -180,4 +180,81 @@ declare namespace Model {
         tradetime: string; // 交易时间
         usertype: number; // 账户类型
     }
+
+    /** 市场运行管理-->监控管理-->持仓汇总监控-->获取列表 请求 */
+    interface PositionCountReq {
+        accountid: number; // 交易商
+        buyorsell: number;
+        excludeaccountidarray: string[];
+        excludeaccountids: string; // 排除交易商
+        goodsid: number; // 商品
+        includeaccountidarray: string[];
+        includeaccountids: string; // 指定交易商
+        orderby: number; // 排序
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        refTimeInput: number; // 下次刷新
+    }
+
+    /** 市场运行管理-->监控管理-->持仓汇总监控-->获取列表 响应 */
+    interface PositionCountRsp {
+        accountid: number; // 账户ID 查询条件 --查询条件
+        buy_avg_price: number; // 持仓均价(买)
+        buy_float_pl: number; // 浮动盈亏(买)
+        buy_hold_qty: number; // 持仓头寸(买)
+        buy_hold_value: number; // 持仓金额(买)
+        decimalplace: number; // 报价小数位
+        excludeaccountids: string; // 排除账户ID --查询条件
+        goodsid: number; // 商品ID
+        goodsname: string;
+        margin: number; // 占用保证金
+        orderby: number; // 排序方式: 1-总损益顺序 2-总损益倒序 --查询条件
+        pageNo: number;
+        pageSize: number;
+        parentname: string; // 上级机构 --查询条件
+        quote_price_buy: number; // 实时行情(买)
+        quote_price_last: number; // 实时行情
+        quote_price_sell: number; // 实时行情(卖)
+        sell_avg_price: number; // 持仓均价(卖)
+        sell_float_pl: number; // 浮动盈亏(卖)
+        sell_hold_qty: number; // 持仓头寸(卖)
+        sell_hold_value: number; // 持仓金额(卖)
+        total_float_pl: number; // 浮动盈亏(总)
+        trademode: number; // 交易模式
+        username: string; // 用户名称 --查询条件
+    }
+
+    /** 市场运行管理-->监控管理-->持仓汇总监控-->买、卖持仓监控 请求 */
+    interface PositionForBuyOrSellReq {
+        accountid: number; // 交易商
+        buyorsell: number;
+        excludeaccountidarray: string[];
+        excludeaccountids: string; // 排除交易商
+        goodsid: number; // 商品
+        includeaccountidarray: string[];
+        includeaccountids: string; // 指定交易商
+        orderby: number; // 排序
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        refTimeInput: number; // 下次刷新
+    }
+
+    /** 市场运行管理-->监控管理-->持仓汇总监控-->买、卖持仓监控 响应 */
+    interface PositionForBuyOrSellRsp {
+        accountid: string; // 资金账户/账号/名称
+        accountname: string;
+        actuallYplS: number; // 浮动损益
+        agreeUnit: number;
+        buyorsell: number; // 方向
+        goodscode: string;
+        goodsname: string; // 商品
+        holderamount: number; // 持仓金额
+        holderprice: number; // 持仓价格
+        holderqty: number; // 持仓数量
+        loginids: string;
+        marketname: string; // 市场
+        tradedate1: string; // 交易日
+        tradeid: string; // 单号
+        tradetime: string; // 交易时间
+    }
 }

+ 1 - 1
src/types/model/notice.d.ts

@@ -345,6 +345,6 @@ declare namespace Notice {
 
     /** 通知公告-->短信查询-->重新发送 请求 */
     interface ResendReq {
-        id: msgid;
+        msgid: number;
     }
 }

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

@@ -1971,4 +1971,34 @@ declare namespace Model {
         // 占用保证金
         usedmargin: number
     }
+
+    /** 运营查询--> 协议转让--> 获取列表 请求 */
+    interface HoldTransferQueryReq {
+        applydate?: string; // 申请日期
+        applystatus?: number; // 申请状态
+        goodsid?: number; // 商品
+        inaccountid?: number; // 转入方
+        ishis?: number; // 
+        outaccountid?: number; // 转出方
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        transfertypestr?: string;
+        yyareauserid?: number;
+    }
+
+    /** 运营查询--> 协议转让--> 获取列表 响应 */
+    interface HoldTransferQueryRsp {
+        applyid: number;
+        applystatus: number; // 状态
+        applytime: string; // 申请时间
+        freezedays: number; // 冻结天数
+        goodsfullname: string; // 商品
+        inname: string; // 转入方
+        marketfullname: string; // 市场
+        outname: string; // 转出方
+        qty: number; // 转让数量
+        tradedate: string; // 交易日
+        transferprice: number; // 转让价格
+        transfertype: number; // 转让类型
+    }
 }