li.shaoyi hace 10 meses
padre
commit
b56247550b
Se han modificado 24 ficheros con 1254 adiciones y 41 borrados
  1. 0 0
      src/packages/pc/assets/themes/base/iconfont.less
  2. 1 1
      src/packages/pc/components/base/remote-select/index.vue
  3. 2 2
      src/packages/pc/views/admin/user/components/status/index.vue
  4. 1 1
      src/packages/pc/views/admin/user/index.vue
  5. 1 1
      src/packages/pc/views/investor/manage/modification/components/audit/operate/index.vue
  6. 186 0
      src/packages/pc/views/investor/manage/transfer/components/edit/index.vue
  7. 100 1
      src/packages/pc/views/investor/manage/transfer/index.vue
  8. 1 1
      src/packages/pc/views/member/subinstitution/addition/index.vue
  9. 93 0
      src/packages/pc/views/member/subinstitution/manage/components/details/audit/index.vue
  10. 24 10
      src/packages/pc/views/member/subinstitution/manage/components/details/index.vue
  11. 19 3
      src/packages/pc/views/member/subinstitution/manage/components/edit/index.vue
  12. 87 2
      src/packages/pc/views/member/subinstitution/modification/index.vue
  13. 52 0
      src/packages/pc/views/member/subinstitution/transfer/components/cancel/index.vue
  14. 181 0
      src/packages/pc/views/member/subinstitution/transfer/components/edit/index.vue
  15. 62 0
      src/packages/pc/views/member/subinstitution/transfer/components/edit/select-level/index.vue
  16. 41 0
      src/packages/pc/views/member/subinstitution/transfer/components/run/index.vue
  17. 101 1
      src/packages/pc/views/member/subinstitution/transfer/index.vue
  18. 13 16
      src/packages/pc/views/member/subinstitution/user/index.vue
  19. 7 0
      src/services/api/common/index.ts
  20. 14 0
      src/services/api/investor/index.ts
  21. 57 1
      src/services/api/member/index.ts
  22. 74 0
      src/types/model/common.d.ts
  23. 45 1
      src/types/model/investor.d.ts
  24. 92 0
      src/types/model/member.d.ts

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
src/packages/pc/assets/themes/base/iconfont.less


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

@@ -30,7 +30,7 @@ const props = defineProps({
     },
     placeholder: {
         type: String,
-        default: '请输入'
+        default: '请选择或输入'
     }
 })
 

+ 2 - 2
src/packages/pc/views/admin/user/components/status/index.vue

@@ -17,7 +17,7 @@ import AppDrawer from '@pc/components/base/drawer/index.vue'
 import { i18n } from '@/stores'
 
 const props = defineProps({
-    code: String,
+    componentId: String,
     record: {
         type: Object as PropType<Model.SystemmanagerRsp>,
         required: true
@@ -30,7 +30,7 @@ const refresh = shallowRef(false)
 const loading = shallowRef(false)
 
 const status = computed(() => {
-    switch (props.code) {
+    switch (props.componentId) {
         case 'admin_user_reset':
             return {
                 message: t('admin.user.status1.tips1'),

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

@@ -27,7 +27,7 @@
                     @change="onSearch" />
             </template>
         </app-table>
-        <component :is="componentMap.get(componentId)" v-bind="{ code: componentId, record }" @closed="closeComponent"
+        <component :is="componentMap.get(componentId)" v-bind="{ componentId, record }" @closed="closeComponent"
             v-if="componentId" />
     </app-view>
 </template>

+ 1 - 1
src/packages/pc/views/investor/manage/modification/components/audit/operate/index.vue

@@ -43,7 +43,7 @@ const loading = ref(false)
 
 const formData = ref<Model.ModifyAuditReq>({
     auditflag: 1,
-    auditid: props.record.userid,
+    userid: props.record.userid,
 })
 
 // 表单验证规则

+ 186 - 0
src/packages/pc/views/investor/manage/transfer/components/edit/index.vue

@@ -0,0 +1,186 @@
+<!-- 交易商管理-交易商管理-交易商批量转移-新增 -->
+<template>
+    <app-drawer :title="t('account.tradeacct.sign.edit.title')" width="960" v-model:show="show" :refresh="refresh"
+        :loading="loading">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="140px" :model="formData" :rules="formRules"
+            :show-message="false">
+            <fieldset class="g-fieldset el-form--horizontal">
+                <legend class="g-fieldset__legend">转出</legend>
+                <el-form-item label="转移类型" prop="diversiontype">
+                    <el-radio-group v-model="formData.diversiontype" @change="switchOutType">
+                        <template v-for="item in investortransfertypeEnum.getEnumOptions()" :key="item.value">
+                            <el-radio :label="item.label" :value="item.value" />
+                        </template>
+                    </el-radio-group>
+                </el-form-item>
+                <template v-if="formData.diversiontype === 1">
+                    <el-form-item label="转出交易商" prop="outinvestor">
+                        <app-select-member v-model="formData.outinvestor" :params="{ usertype: '5' }"
+                            @change="selectOutUser" />
+                    </el-form-item>
+                    <el-form-item label="所属会员">
+                        {{ handleNoneValue(accountInfo?.memberUserName) }}
+                    </el-form-item>
+                    <el-form-item label="所属机构">
+                        {{ handleNoneValue(accountInfo?.parentUserName) }}
+                    </el-form-item>
+                    <el-form-item label="证件类型">
+                        {{ outUserInfo ? certificatetypeEnum.getEnumTypeName(outUserInfo.cardtypeid) :
+                            handleNoneValue() }}
+                    </el-form-item>
+                    <el-form-item label="证件号码">
+                        {{ outUserInfo ? decryptAES(outUserInfo.cardnum) : handleNoneValue() }}
+                    </el-form-item>
+                </template>
+                <template v-else>
+                    <el-form-item label="转出所属会员" prop="outmemberuserid">
+                        <app-select-member v-model="formData.outmemberuserid" :params="{ usertype: '2', roles: '7' }" />
+                    </el-form-item>
+                    <el-form-item label="转出所属机构" prop="outparentuserid">
+                        <app-select-member v-model="formData.outparentuserid"
+                            :params="{ usertype: '3', parentuserid: formData.outmemberuserid }"
+                            :disabled="!formData.outmemberuserid" />
+                    </el-form-item>
+                </template>
+            </fieldset>
+            <fieldset class="g-fieldset el-form--horizontal">
+                <legend class="g-fieldset__legend">转入</legend>
+                <el-form-item label="转入所属会员" prop="inmemberuserid">
+                    <app-select-member v-model="formData.inmemberuserid" :params="{ usertype: '2', roles: '7' }"
+                        @change="selectInUser" />
+                </el-form-item>
+                <el-form-item label="转入所属机构" prop="inuserid">
+                    <app-select-member v-model="formData.inuserid"
+                        :params="{ usertype: '3', parentuserid: formData.inmemberuserid }"
+                        :disabled="!formData.inmemberuserid" @change="selectInUser" />
+                </el-form-item>
+                <el-form-item label="机构证件类型">
+                    {{ inUserInfo ? certificatetypeEnum.getEnumTypeName(inUserInfo.cardtypeid) : handleNoneValue() }}
+                </el-form-item>
+                <el-form-item label="机构证件号码">
+                    {{ inUserInfo ? decryptAES(inUserInfo.cardnum) : handleNoneValue() }}
+                </el-form-item>
+                <el-form-item class="el-form-item--row">
+                    <span class="red">*交易商转移将会在系统结算时处理</span>
+                </el-form-item>
+            </fieldset>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.close') }}</el-button>
+            <el-button type="primary" @click="onSubmit">保存</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, toRaw } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { decryptAES } from '@/services/crypto'
+import { handleNoneValue } from '@/filters'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { queryUserinfoByUserId } from '@/services/api/common'
+import { investorTransferAdd, getUserAccountDetail } from '@/services/api/investor'
+import { i18n } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppSelectMember from '@pc/components/modules/select-member/index.vue'
+
+// 证件类型
+const certificatetypeEnum = useEnum('certificatetype')
+// 转移类型
+const investortransfertypeEnum = useEnum('investortransfertype')
+
+const { global: { t } } = i18n
+const formRef = shallowRef<FormInstance>()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+const accountInfo = shallowRef<Model.UserAccountDetailRsp>()
+const outUserInfo = shallowRef<Model.UserinfoByUserIdRsp>()
+const inUserInfo = shallowRef<Model.UserinfoByUserIdRsp>()
+
+const formData = reactive<Partial<Model.InvestorTransferAddReq>>({
+    diversiontype: 1,
+})
+
+const { runAsync: getUserInfoByUserId } = useRequest(queryUserinfoByUserId, {
+    manual: true
+})
+
+const { runAsync: getAccountInfoByUserId } = useRequest(getUserAccountDetail, {
+    manual: true
+})
+
+// 表单验证规则
+const formRules: FormRules = {
+    outinvestor: [{ required: true }],
+    inmemberuserid: [{ required: true }],
+    diversiontype: [{ required: true }],
+    outmemberuserid: [{ required: true }]
+}
+
+// 切换转移类型
+const switchOutType = () => {
+    formData.outinvestor = undefined
+    formData.outmemberuserid = undefined
+    formData.outparentuserid = undefined
+    accountInfo.value = undefined
+    outUserInfo.value = undefined
+}
+
+// 选择转出交易商
+const selectOutUser = (item?: Model.OrganSelectRsp) => {
+    if (item) {
+        const userid = item.userid
+        getAccountInfoByUserId({ userid }).then((res) => {
+            accountInfo.value = res.data
+        })
+        getUserInfoByUserId({ userid }).then((res) => {
+            outUserInfo.value = res.data
+        })
+    } else {
+        accountInfo.value = undefined
+        outUserInfo.value = undefined
+    }
+}
+
+// 选择转入机构
+const selectInUser = (item?: Model.OrganSelectRsp) => {
+    if (item || formData.inmemberuserid) {
+        const userid = item?.userid || formData.inmemberuserid
+        if (item?.usertype === '2') {
+            formData.inuserid = undefined
+        }
+        getUserInfoByUserId({ userid }).then((res) => {
+            inUserInfo.value = res.data
+        })
+    } else {
+        inUserInfo.value = undefined
+    }
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            const rawData = toRaw(formData)
+            loading.value = true
+            investorTransferAdd({
+                data: rawData
+            }).then(() => {
+                ElMessage.success(t('common.tips3'))
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error(t('common.tips4') + err)
+            }).finally(() => {
+                loading.value = false
+            })
+        }
+    })
+}
+</script>

+ 100 - 1
src/packages/pc/views/investor/manage/transfer/index.vue

@@ -1,7 +1,106 @@
 <!-- 交易商管理-交易商管理-交易商批量转移 -->
 <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(['investor_manage_transfer_add'])" @click="openComponent" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['investor_manage_transfer_cancel'])"
+                    @click="(code: string) => openComponent(code, row)" circle v-if="row.transferstatus === 1" />
+                <span v-else>{{ handleNoneValue() }}</span>
+            </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 { shallowRef } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate, handleNoneValue } from '@/filters'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useOperation } from '@/hooks/operation'
+import { queryOrganSonTransfer } from '@/services/api/member'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import { i18n } from '@/stores'
+
+const { global: { t } } = i18n
+
+// 转移状态
+const transferstatusEnum = useEnum('transferstatus')
+// 转移类型
+const investortransfertypeEnum = useEnum('investortransfertype')
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.OrganSonRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryOrganSonTransfer, {
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        transferusertype: 1
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'transfertype', label: '转移类型', formatValue: (val) => investortransfertypeEnum.getEnumTypeName(val) },
+    { field: 'outmemberusername', label: '转出所属会员' },
+    { field: 'outparentusername', label: '转出所属机构' },
+    { field: 'outinvestorname', label: '转出交易商' },
+    { field: 'inmemberusername', label: '转入所属会员' },
+    { field: 'inuseridname', label: '转入所属机构'},
+    { field: 'transferstatus', label: '转移状态', formatValue: (val) => transferstatusEnum.getEnumTypeName(val) },
+    { field: 'createtime', label: '申请时间', formatValue: (val) => formatDate(val) },
+    { field: 'operate', label: 'common.operate', width: 200, fixed: 'right' }
+])
+
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.OrganSonTransferReq>({
+    filters: [
+        {
+            field: 'outinvestor',
+            label: '转出交易商'
+        },
+        {
+            field: 'outmemberuserid',
+            label: '转出方'
+        },
+        {
+            field: 'inuserid',
+            label: '转入方'
+        },
+        {
+            field: 'transferstatus',
+            label: '转移状态',
+            options: () => transferstatusEnum.getEnumOptions()
+        },
+    ],
+    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>

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

@@ -15,7 +15,7 @@
                     @change="onSearch" />
             </template>
         </app-table>
-        <component :is="componentMap.get(componentId)" v-bind="{ record }" @closed="closeComponent"
+        <component :is="componentMap.get(componentId)" v-bind="{ record, audit: true }" @closed="closeComponent"
             v-if="componentId" />
     </app-view>
 </template>

+ 93 - 0
src/packages/pc/views/member/subinstitution/manage/components/details/audit/index.vue

@@ -0,0 +1,93 @@
+<!-- 会员机构管理-子机构管理-子机构变更审核-审核 -->
+<template>
+    <app-drawer title="修改" width="480" v-model:show="show" :refresh="refresh" :loading="loading">
+        <el-form ref="formRef" class="el-form--vertical" label-width="100px" :model="formData" :rules="formRules"
+            :show-message="false">
+            <el-form-item label="审核状态" prop="auditflag">
+                <el-radio-group v-model="formData.auditflag">
+                    <el-radio label="通过" :value="1" />
+                    <el-radio label="不通过" :value="0" />
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="不通过原因" prop="msg">
+                <el-input type="textarea" v-model="formData.msg" maxlength="200" :rows="3" placeholder="请输入" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.close') }}</el-button>
+            <el-button type="primary" @click="onSubmit">{{ t('operation.submit') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, PropType, toRaw, computed } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { auditOrganSon, modifyAuditOrganSon } from '@/services/api/member'
+import { i18n } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.OrganSonRsp>,
+        required: true
+    }
+})
+
+const { global: { t } } = i18n
+const formRef = shallowRef<FormInstance>()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+const formData = reactive<Model.AuditOrganSonReq>({
+    auditflag: 1,
+    userid: props.record.userid
+})
+
+// 表单验证规则
+const formRules = computed<FormRules>(() => ({
+    auditflag: [{ required: true }],
+    msg: [{ required: !formData.auditflag }]
+}))
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            const rawData = toRaw(formData)
+            loading.value = true
+
+            if (props.record.modifystatus === 4) {
+                modifyAuditOrganSon({
+                    data: rawData
+                }).then(() => {
+                    ElMessage.success('审核成功')
+                    onCancel(true)
+                }).catch((err) => {
+                    ElMessage.error('审核失败:' + err)
+                    onCancel()
+                }).finally(() => {
+                    loading.value = false
+                })
+            } else {
+                auditOrganSon({
+                    data: rawData
+                }).then(() => {
+                    ElMessage.success('审核成功')
+                    onCancel(true)
+                }).catch((err) => {
+                    ElMessage.error('审核失败:' + err)
+                    onCancel()
+                }).finally(() => {
+                    loading.value = false
+                })
+            }
+        }
+    })
+}
+</script>

+ 24 - 10
src/packages/pc/views/member/subinstitution/manage/components/details/index.vue

@@ -1,6 +1,7 @@
 <!-- 会员机构管理-子机构管理-子机构管理-详情 -->
 <template>
-    <app-drawer :title="t('member.subinstitution.manage.details.title')" width="900" v-model:show="show" :loading="loading" :refresh="refresh">
+    <app-drawer :title="t('member.subinstitution.manage.details.title')" width="900" v-model:show="show"
+        :loading="loading" :refresh="refresh">
         <app-table-details :title="t('common.baseinfo')" :data="oldData?.userAccountDetailVo" :label-width="160"
             :cell-props="detailProps1" :column="2">
             <!-- 机构名称 -->
@@ -11,7 +12,8 @@
                 </p>
             </template>
         </app-table-details>
-        <app-table-details :title="oldData?.userinfoDetailVo.userinfoType === UserInfoType.Personal ? t('member.subinstitution.manage.details.subtitle1') : t('member.subinstitution.manage.details.subtitle2')"
+        <app-table-details
+            :title="oldData?.userinfoDetailVo.userinfoType === UserInfoType.Personal ? t('member.subinstitution.manage.details.subtitle1') : t('member.subinstitution.manage.details.subtitle2')"
             :data="oldData?.userinfoDetailVo" :label-width="160" :cell-props="detailProps2" :column="2"
             v-if="detailProps2.length">
             <!-- 名称 -->
@@ -149,8 +151,9 @@
                 </template>
             </template>
         </app-table-details>
-        <app-table-details :title="t('member.subinstitution.manage.details.subtitle3')" :data="oldData?.userinfoDetailVo" :label-width="160" :cell-props="detailProps3"
-            :column="2" v-if="detailProps3.length">
+        <app-table-details :title="t('member.subinstitution.manage.details.subtitle3')"
+            :data="oldData?.userinfoDetailVo" :label-width="160" :cell-props="detailProps3" :column="2"
+            v-if="detailProps3.length">
             <!-- 银行名称 -->
             <template #bankName="{ value }">
                 <p>{{ handleNoneValue(value) }}</p>
@@ -174,21 +177,25 @@
                 </template>
             </template>
         </app-table-details>
-        <app-table-details :title="t('common.annex')" :data="oldData?.userinfoDetailVo" :label-width="160" :cell-props="detailProps4"
-            :column="2" v-if="detailProps4.length" />
-        <app-table-details :title="t('member.subinstitution.manage.details.subtitle4')" :data="data" :label-width="160" :cell-props="detailProps5" :column="2"
-            v-if="detailProps5.length" />
+        <app-table-details :title="t('common.annex')" :data="oldData?.userinfoDetailVo" :label-width="160"
+            :cell-props="detailProps4" :column="2" v-if="detailProps4.length" />
+        <app-table-details :title="t('member.subinstitution.manage.details.subtitle4')" :data="data" :label-width="160"
+            :cell-props="detailProps5" :column="2" v-if="detailProps5.length" />
         <template #footer>
             <el-button @click="onCancel(false)">{{ t('operation.close') }}</el-button>
+            <el-button @click="openComponent('Audit')" type="primary" v-if="audit">审核</el-button>
         </template>
+        <component ref="componentRef" :is="componentMap.get(componentId)" v-bind="{ record }" @closed="closeComponent"
+            v-if="componentId" />
     </app-drawer>
 </template>
 
 <script lang="ts" setup>
-import { ref, PropType, computed } from 'vue'
+import { ref, PropType, computed, defineAsyncComponent } from 'vue'
 import { handleNoneValue } from '@/filters'
 import { decryptAES } from '@/services/crypto'
 import { useEnum } from '@/hooks/enum'
+import { useComponent } from '@/hooks/component'
 import { UserInfoType, getGenderName } from '@/constants/member'
 import { useRequest } from '@/hooks/request'
 import { organSonViewson } from '@/services/api/member'
@@ -204,9 +211,14 @@ const props = defineProps({
     },
     record: {
         type: Object as PropType<Model.OrganSonRsp>
-    }
+    },
+    audit: Boolean
 })
 
+const componentMap = new Map<string, unknown>([
+    ['Audit', defineAsyncComponent(() => import('./audit/index.vue'))], // 审核
+])
+
 const { global: { t } } = i18n
 const show = ref(true)
 const refresh = ref(false)
@@ -225,6 +237,8 @@ const certificatetypeEnum = useEnum('certificatetype')
 // 用户状态
 const userstatusEnum = useEnum('userstatus')
 
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => onCancel(true))
+
 const { data } = useRequest(organSonViewson, {
     params: {
         areaid: props.record?.userid || props.selectedParent?.userid || 0,

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

@@ -155,8 +155,16 @@
         <template #footer>
             <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
             <el-button type="primary" @click="onSubmit(2)">{{ t('operation.save') }}</el-button>
-            <el-button type="primary" @click="onSubmit(4)" v-if="record?.accountstatus === 4">{{
-                t('operation.submitaduit') }}</el-button>
+            <template v-if="record && [3, 4].includes(record.usertype)">
+                <!-- 变更提交审核 -->
+                <el-button type="primary" @click="onSubmit(4)" v-if="record.accountstatus === 4">
+                    {{ t('operation.submitaduit') }}
+                </el-button>
+                <!-- 新增提交审核 -->
+                <el-button type="primary" @click="onSubmit(record.modifystatus, 2)" v-if="record.accountstatus === 5">
+                    {{ t('operation.submitaduit') }}
+                </el-button>
+            </template>
         </template>
     </app-drawer>
 </template>
@@ -243,6 +251,7 @@ const { loading, run } = useRequest(organSonViewson, {
         const { logincode, username, oldResult: { userAccountDetailVo, userinfoDetailVo } } = res.data
         formData.value = {
             accountname: userAccountDetailVo.accountName,
+            accountstatus: userAccountDetailVo.accountStatus,
             address: userinfoDetailVo.address,
             biznature: userinfoDetailVo.bizNature,
             cardnum: decryptAES(userinfoDetailVo.cardNum),
@@ -308,7 +317,7 @@ const updateUploadFiles = (uploadFiles: UploadUserFile[]) => {
     }).join(',')
 }
 
-const onSubmit = (modifystatus?: number) => {
+const onSubmit = (modifystatus: number, accountstatus?: number) => {
     const rawData = { ...formData.value }
     rawData.cardfrontphotourl = updateUploadFiles(uploadFiles.cardfrontphotourl)
     rawData.cardbackphotourl = updateUploadFiles(uploadFiles.cardbackphotourl)
@@ -323,6 +332,7 @@ const onSubmit = (modifystatus?: number) => {
             if (props.record) {
                 rawData.modifystatus = modifystatus
                 if (rawData.modifystatus === 4) {
+                    // 修改审核
                     organSonEdit({
                         data: rawData
                     }).then(() => {
@@ -334,6 +344,11 @@ const onSubmit = (modifystatus?: number) => {
                         loading.value = false
                     })
                 } else {
+                    if (accountstatus) {
+                        // 新增审核
+                        rawData.accountstatus = accountstatus
+                    }
+                    // 保存
                     organSonSave({
                         data: rawData
                     }).then(() => {
@@ -346,6 +361,7 @@ const onSubmit = (modifystatus?: number) => {
                     })
                 }
             } else {
+                // 新增
                 organSonAdd({
                     data: rawData
                 }).then(() => {

+ 87 - 2
src/packages/pc/views/member/subinstitution/modification/index.vue

@@ -1,7 +1,92 @@
-<!-- 会员机构管理-子机构管理-新增子机构审核 -->
+<!-- 会员机构管理-子机构管理-子机构变更审核 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption" />
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <!-- 操作 -->
+            <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, audit: true }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { shallowRef } 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 { queryOrganSonModify } from '@/services/api/member'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import { i18n } from '@/stores'
+
+const { global: { t } } = i18n
+
+// 变更状态
+const modifystatusEnum = useEnum('modifystatus')
+// 类型
+const subarealevelEnum = useEnum('subarealevel')
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.OrganSonRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryOrganSonModify, {
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        usertype: 3
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'userid', label: '机构代码' },
+    { field: 'accountname', label: '机构名称' },
+    { field: 'memberusername', label: '所属会员' },
+    { field: 'parentname', label: '所属机构' },
+    { field: 'modifystatus', label: '变更状态', formatValue: (val) => modifystatusEnum.getEnumTypeName(val) },
+    { field: 'modifytime', label: '最后更新时间', formatValue: (val) => formatDate(val) },
+    { field: 'operate', label: 'common.operate', fixed: 'right' }
+])
+
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.OrganSonModifyReq>({
+    filters: [
+        {
+            field: 'accountname',
+            label: '机构'
+        },
+        {
+            field: 'subarealevel',
+            label: '类型',
+            options: () => subarealevelEnum.getEnumOptions()
+        }
+    ],
+    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>

+ 52 - 0
src/packages/pc/views/member/subinstitution/transfer/components/cancel/index.vue

@@ -0,0 +1,52 @@
+<!-- 会员机构管理-子机构管理-子机构转移-撤回 -->
+<template>
+    <app-drawer :title="t('common.alert')" 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>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { organSonBackTranfor } from '@/services/api/member'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { i18n } from '@/stores'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.OrganSonTransferRsp>,
+        required: true
+    }
+})
+
+const { global: { t } } = i18n
+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
+    organSonBackTranfor({
+        data: {
+            autoid: props.record.autoid
+        }
+    }).then(() => {
+        ElMessage.success(t('common.tips15'))
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error(t('common.tips16') + err)
+        onCancel()
+    }).finally(() => {
+        loading.value = false
+    })
+}
+</script>

+ 181 - 0
src/packages/pc/views/member/subinstitution/transfer/components/edit/index.vue

@@ -0,0 +1,181 @@
+<!-- 会员机构管理-子机构管理-子机构转移-新增 -->
+<template>
+    <app-drawer :title="t('account.tradeacct.sign.edit.title')" width="960" v-model:show="show" :refresh="refresh"
+        :loading="loading">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="140px" :model="formData" :rules="formRules"
+            :show-message="false">
+            <fieldset class="g-fieldset el-form--horizontal">
+                <legend class="g-fieldset__legend">转出</legend>
+                <el-form-item label="转出类型" prop="diversionoutlevel">
+                    <el-radio-group v-model="formData.diversionoutlevel" @change="switchOutType">
+                        <template v-for="item in transferouttypeEnum.getEnumOptions()" :key="item.value">
+                            <el-radio :label="item.label" :value="item.value" />
+                        </template>
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item label="转出一级子机构" prop="outparentuserid" v-if="formData.diversionoutlevel === 1">
+                    <select-level v-model="formData.outparentuserid" :params="{ subarealevel: 1 }"
+                        @change="selectOutUser" />
+                </el-form-item>
+                <el-form-item label="转出二级子机构" prop="outparentuserid" v-else>
+                    <select-level v-model="formData.outparentuserid" :params="{ subarealevel: 2 }"
+                        @change="selectOutUser" />
+                </el-form-item>
+                <el-form-item label="证件类型">
+                    {{ outUserInfo ? certificatetypeEnum.getEnumTypeName(outUserInfo.cardtypeid) : handleNoneValue() }}
+                </el-form-item>
+                <el-form-item label="证件号码">
+                    {{ outUserInfo ? decryptAES(outUserInfo.cardnum) : handleNoneValue() }}
+                </el-form-item>
+            </fieldset>
+            <fieldset class="g-fieldset el-form--horizontal">
+                <legend class="g-fieldset__legend">转入</legend>
+                <el-form-item label="转入方式" prop="transfermode">
+                    <el-select v-model="formData.transfermode">
+                        <template v-for="item in transfermodeEnum.getEnumOptions()" :key="item.value">
+                            <el-option :label="item.label" :value="item.value" />
+                        </template>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="转入类型" prop="diversioninlevel">
+                    <el-select v-model="formData.diversioninlevel" @change="switchInType">
+                        <template v-for="item in transferintypeEnum.getEnumOptions()" :key="item.value">
+                            <el-option :label="item.label" :value="item.value" />
+                        </template>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="转入经纪会员" prop="inuserid" v-if="formData.diversioninlevel === 1">
+                    <app-select-member v-model="formData.inuserid" :params="{ usertype: '2', roles: '7' }"
+                        @change="selectInUser" />
+                </el-form-item>
+                <el-form-item label="转入一级子机构" prop="inuserid" v-else>
+                    <select-level v-model="formData.inuserid" :params="{ subarealevel: 1 }" @change="selectInUser" />
+                </el-form-item>
+                <el-form-item label="证件类型">
+                    {{ inUserInfo ? certificatetypeEnum.getEnumTypeName(inUserInfo.cardtypeid) : handleNoneValue() }}
+                </el-form-item>
+                <el-form-item label="证件号码">
+                    {{ inUserInfo ? decryptAES(inUserInfo.cardnum) : handleNoneValue() }}
+                </el-form-item>
+                <el-form-item class="el-form-item--row">
+                    <span class="red">*将转移子机构及下属交易商,会在系统结算时处理</span>
+                </el-form-item>
+            </fieldset>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.close') }}</el-button>
+            <el-button type="primary" @click="onSubmit">保存</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, toRaw } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { decryptAES } from '@/services/crypto'
+import { handleNoneValue } from '@/filters'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { queryUserinfoByUserId } from '@/services/api/common'
+import { organSonTransferAdd } from '@/services/api/member'
+import { i18n } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import SelectLevel from './select-level/index.vue'
+import AppSelectMember from '@pc/components/modules/select-member/index.vue'
+
+// 证件类型
+const certificatetypeEnum = useEnum('certificatetype')
+// 转出机构类型
+const transferouttypeEnum = useEnum('transferouttype')
+// 转入机构类型
+const transferintypeEnum = useEnum('transferintype')
+// 转移方式
+const transfermodeEnum = useEnum('transfermode')
+
+const { global: { t } } = i18n
+const formRef = shallowRef<FormInstance>()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+const outUserInfo = shallowRef<Model.UserinfoByUserIdRsp>()
+const inUserInfo = shallowRef<Model.UserinfoByUserIdRsp>()
+
+const formData = reactive<Partial<Model.OrganSonTransferAddReq>>({
+    diversionoutlevel: 1,
+    diversiontype: 2,
+    transfermode: 1,
+    diversioninlevel: 1
+})
+
+const { runAsync: getUserInfoByUserId } = useRequest(queryUserinfoByUserId, {
+    manual: true
+})
+
+// 表单验证规则
+const formRules: FormRules = {
+    diversioninlevel: [{ required: true }],
+    diversionoutlevel: [{ required: true }],
+    inuserid: [{ required: true }],
+    outparentuserid: [{ required: true }],
+    transfermode: [{ required: true }]
+}
+
+// 切换转出类型
+const switchOutType = () => {
+    formData.outparentuserid = undefined
+    outUserInfo.value = undefined
+}
+
+// 切换转入类型
+const switchInType = () => {
+    formData.inuserid = undefined
+    inUserInfo.value = undefined
+}
+
+// 选择转出机构
+const selectOutUser = (item?: Model.SonOrganPageByLevelRsp) => {
+    if (item) {
+        getUserInfoByUserId({ userid: item.userid }).then((res) => {
+            outUserInfo.value = res.data
+        })
+    } else {
+        outUserInfo.value = undefined
+    }
+}
+
+// 选择转入机构
+const selectInUser = (item?: Model.SonOrganPageByLevelRsp | Model.OrganSelectRsp) => {
+    if (item) {
+        getUserInfoByUserId({ userid: item.userid }).then((res) => {
+            inUserInfo.value = res.data
+        })
+    } else {
+        inUserInfo.value = undefined
+    }
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            const rawData = toRaw(formData)
+            loading.value = true
+            organSonTransferAdd({
+                data: rawData
+            }).then(() => {
+                ElMessage.success(t('common.tips3'))
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error(t('common.tips4') + err)
+            }).finally(() => {
+                loading.value = false
+            })
+        }
+    })
+}
+</script>

+ 62 - 0
src/packages/pc/views/member/subinstitution/transfer/components/edit/select-level/index.vue

@@ -0,0 +1,62 @@
+<!-- 选择子机构 -->
+<template>
+    <app-remote-select v-model="selectedValue" :options="dataList"
+        :option-props="{ label: 'accountname', value: 'userid' }" :remote-method="remoteMethod" @change="onChange"
+        @reset="onReset">
+        <template #default="{ option }">
+            <div style="display: flex;justify-content: space-between;">
+                <span>{{ option.userid }}</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 { querySonOrganPageByLevel } from '@/services/api/member'
+import AppRemoteSelect from '@pc/components/base/remote-select/index.vue'
+
+const props = defineProps({
+    modelValue: Number,
+    params: {
+        type: Object as PropType<Model.SonOrganPageByLevelReq>
+    },
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+const selectedValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const { dataList, loading, run } = useRequest(querySonOrganPageByLevel, {
+    params: props.params
+})
+
+const onReset = () => {
+    if (!loading.value) {
+        selectedValue.value = undefined
+        run()
+    }
+}
+
+const remoteMethod = (query: string) => {
+    if (!loading.value) {
+        if (query) {
+            run({
+                searchcode: query
+            })
+        } else if (!dataList.value.length) {
+            onReset()
+        }
+    }
+}
+
+const onChange = (value?: number) => {
+    const item = dataList.value.find((e) => e.userid === value)
+    emit('change', toRaw(item))
+}
+</script>

+ 41 - 0
src/packages/pc/views/member/subinstitution/transfer/components/run/index.vue

@@ -0,0 +1,41 @@
+<!-- 会员机构管理-子机构管理-子机构转移-执行转移 -->
+<template>
+    <app-drawer :title="t('common.alert')" 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>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { ElMessage } from 'element-plus'
+import { organSonExecuteTransfer } from '@/services/api/member'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { i18n } from '@/stores'
+
+const { global: { t } } = i18n
+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
+    organSonExecuteTransfer().then(() => {
+        ElMessage.success('转移成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('转移失败:' + err)
+        onCancel()
+    }).finally(() => {
+        loading.value = false
+    })
+}
+</script>

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

@@ -1,7 +1,107 @@
 <!-- 会员机构管理-子机构管理-子机构转移 -->
 <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(['member_subinstitution_transfer_add', 'member_subinstitution_transfer_run'])"
+                    @click="openComponent" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['member_subinstitution_transfer_cancel'])"
+                    @click="(code: string) => openComponent(code, row)" circle v-if="row.transferstatus === 1" />
+                <span v-else>{{ handleNoneValue() }}</span>
+            </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 { shallowRef } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate, handleNoneValue } from '@/filters'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useOperation } from '@/hooks/operation'
+import { queryOrganSonTransfer } from '@/services/api/member'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import { i18n } from '@/stores'
+
+const { global: { t } } = i18n
+
+// 转移状态
+const transferstatusEnum = useEnum('transferstatus')
+// 转出机构类型
+const transferouttypeEnum = useEnum('transferouttype')
+// 转入机构类型
+const transferintypeEnum = useEnum('transferintype')
+// 转移方式
+const transfermodeEnum = useEnum('transfermode')
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.OrganSonRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryOrganSonTransfer, {
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        transferusertype: 2
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'outparentusername', label: '转出机构' },
+    { field: 'outlevel', label: '转出机构类型', formatValue: (val) => transferouttypeEnum.getEnumTypeName(val) },
+    { field: 'inuseridname', label: '转入机构' },
+    { field: 'inlevel', label: '转入机构类型', formatValue: (val) => transferintypeEnum.getEnumTypeName(val) },
+    { field: 'transfermode', label: '转移方式', formatValue: (val) => transfermodeEnum.getEnumTypeName(val) },
+    { field: 'transferstatus', label: '转移状态', formatValue: (val) => transferstatusEnum.getEnumTypeName(val) },
+    { field: 'createtime', label: '申请时间', formatValue: (val) => formatDate(val) },
+    { field: 'operate', label: 'common.operate', width: 200, fixed: 'right' }
+])
+
+const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.OrganSonTransferReq>({
+    filters: [
+        {
+            field: 'outmemberuserid',
+            label: '转出机构'
+        },
+        {
+            field: 'inuserid',
+            label: '转入机构'
+        },
+        {
+            field: 'transferstatus',
+            label: '转移状态',
+            options: () => transferstatusEnum.getEnumOptions()
+        },
+    ],
+    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>

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

@@ -104,24 +104,21 @@ const { filterOption, getQueryParams, resetFilters } = useDataFilter<Model.Organ
 const handleOperateButtons = (row: Model.OrganSonRsp) => {
     const buttons = ['member_subinstitution_user_details', 'member_subinstitution_user_account', 'member_subinstitution_user_login']
 
-    switch (row.modifystatus) {
-        case 0:
-        case 1:
-            if (row.accountstatus === 6) {
-                buttons.push('member_subinstitution_user_recover')
-            } else {
-                buttons.push('member_subinstitution_user_modify')
-                if (![2, 3].includes(row.accountstatus)) {
-                    buttons.push('member_subinstitution_user_close')
-                }
-            }
-            break
-        case 3:
-        case 4:
+    if (![6, 7].includes(row.accountstatus)) {
+        if ([3, 4].includes(row.modifystatus)) {
             buttons.push('member_subinstitution_user_cancel')
-            break
-        default:
+        } else {
             buttons.push('member_subinstitution_user_modify')
+        }
+    }
+
+    if ([0, 1, 6].includes(row.modifystatus)) {
+        if (![6, 7].includes(row.accountstatus)) {
+            buttons.push('member_subinstitution_user_close')
+        }
+        if (row.accountstatus === 6) {
+            buttons.push('member_subinstitution_user_recover')
+        }
     }
 
     return getActionButtons(buttons)

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

@@ -72,4 +72,11 @@ export function queryTAAccountChildren(options: CommonFetchOptions<{ request: Mo
  */
 export function queryExchSonOrgin(options: CommonFetchOptions<{ request: Model.ExchSonOrginReq; response: Model.ExchSonOrginRsp[]; }>) {
     return httpClient.commonRequest('/common/queryExchSonOrgin', 'get', options)
+}
+
+/**
+ * 获取用户信息
+ */
+export function queryUserinfoByUserId(options: CommonFetchOptions<{ request: Model.UserinfoByUserIdReq; response: Model.UserinfoByUserIdRsp; }>) {
+    return httpClient.commonRequest('/common/queryUserinfoByUserId', 'get', options)
 }

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

@@ -300,4 +300,18 @@ export function modifyAudit(options: CommonFetchOptions<{ request: Model.ModifyA
  */
 export function getAccTradeTree(options: CommonFetchOptions<{ response: Model.AccTradeTreeRsp; }>) {
     return httpClient.commonRequest('/investor/getAccTradeTree', 'get', options)
+}
+
+/**
+ * 交易商管理-->交易商批量转移-->新增
+ */
+export function investorTransferAdd(options: CommonFetchOptions<{ request: Partial<Model.InvestorTransferAddReq>; }>) {
+    return httpClient.commonRequest('/investor/organSonTransferAdd', 'post', options)
+}
+
+/**
+ * 交易商管理-->交易商批量转移-->新增初始化
+ */
+export function getUserAccountDetail(options: CommonFetchOptions<{ request: Model.UserAccountDetailReq; response: Model.UserAccountDetailRsp; }>) {
+    return httpClient.commonRequest('/investor/getUserAccountDetail', 'get', options)
 }

+ 57 - 1
src/services/api/member/index.ts

@@ -172,7 +172,7 @@ export function addAccountRiskConfig(options: CommonFetchOptions<{ request: Mode
 /**
  * 会员机构管理-->机构管理-->风控个性化设置-->详情
  */
-export function accountRiskConfigview(options: CommonFetchOptions<{ request: Model.AccountRiskConfigViewReq; response: Model.AccountRiskConfigViewRsp;}>) {
+export function accountRiskConfigview(options: CommonFetchOptions<{ request: Model.AccountRiskConfigViewReq; response: Model.AccountRiskConfigViewRsp; }>) {
     return httpClient.commonRequest('/organDetail/accountriskconfigview', 'get', options)
 }
 
@@ -300,4 +300,60 @@ export function selfSupportLock(options: CommonFetchOptions<{ request: Model.Sel
  */
 export function queryOrganSonAudit(options: CommonFetchOptions<{ request: Model.OrganSonAuditReq; response: Model.OrganSonRsp[]; }>) {
     return httpClient.commonRequest('/organSon/queryaudit', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->新增子机构审核-->审核
+ */
+export function auditOrganSon(options: CommonFetchOptions<{ request: Model.AuditOrganSonReq; }>) {
+    return httpClient.commonRequest('/organSon/auditorganson', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构变更审核-->获取机构列表
+ */
+export function queryOrganSonModify(options: CommonFetchOptions<{ request: Model.OrganSonModifyReq; response: Model.OrganSonRsp[]; }>) {
+    return httpClient.commonRequest('/organSon/queryOrganSonModify', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构变更审核-->审核
+ */
+export function modifyAuditOrganSon(options: CommonFetchOptions<{ request: Model.AuditOrganSonReq; }>) {
+    return httpClient.commonRequest('/organSon/modifyAudit', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构转移-->获取机构列表
+ */
+export function queryOrganSonTransfer(options: CommonFetchOptions<{ request: Model.OrganSonTransferReq; response: Model.OrganSonTransferRsp[]; }>) {
+    return httpClient.commonRequest('/organSon/queryOrganSonTransfer', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构转移-->新增
+ */
+export function organSonTransferAdd(options: CommonFetchOptions<{ request: Partial<Model.OrganSonTransferAddReq>; }>) {
+    return httpClient.commonRequest('/organSon/organSonTransferAdd', 'post', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构转移-->新增-->获取转出子机构
+ */
+export function querySonOrganPageByLevel(options: CommonFetchOptions<{ request: Model.SonOrganPageByLevelReq; response: Model.SonOrganPageByLevelRsp[]; }>) {
+    return httpClient.commonRequest('/organSon/querySonOrganPageByLevel', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构转移-->撤销
+ */
+export function organSonBackTranfor(options: CommonFetchOptions<{ request: Model.OrganSonBackTranforReq; }>) {
+    return httpClient.commonRequest('/organSon/backtranfor', 'get', options)
+}
+
+/**
+ * 会员机构管理-->子机构管理-->子机构转移-->执行转移
+ */
+export function organSonExecuteTransfer(options: CommonFetchOptions = {}) {
+    return httpClient.commonRequest('/organSon/executeTransfer', 'get', options)
 }

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

@@ -3,6 +3,8 @@ declare namespace Model {
     interface OrganSelectReq {
         searchcode?: string;
         usertype?: string;
+        roles?: string;
+        parentuserid?: number;
     }
 
     /** 机构下拉查询加载 会员、经纪人 响应 */
@@ -191,4 +193,76 @@ declare namespace Model {
         userid: number; // 账户id
         usertype: string; // 账户类型 (默认 2)-- 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
     }
+
+    /** 获取用户信息 请求 */
+    interface UserinfoByUserIdReq {
+        userid: number;
+    }
+
+    /** 获取用户信息 响应 */
+    interface UserinfoByUserIdRsp {
+        address: string; // 地址
+        attachment1: string; // 附件1
+        attachment2: string; // 附件2
+        attachment3: string; // 附件3
+        attachment4: string; // 附件4
+        attachment5: string; // 附件5
+        bankaccount: string; // 银行帐号 (加密存储)
+        bankaccountname: string; // 收款人名称
+        bankcardfrontphotourl: string; // 银行卡正面照地址
+        bankid: string; // 银行编码
+        bankname: string; // 银行名称 - 无值
+        birthday: string; // 生日(个人:年月日)
+        biznature: number; // 企业性质( 企业) - 1:国有控股企业 2:集体控股企业 3:私人控股企业 4:港澳台商控股企业 5:外商控股企业 6:其它
+        bizscope: string; // 企业经营范围(企业)
+        biztype: number; // 企业类型 - 1:进口/生产 2:销售 3:零售 4:运输 5:仓储
+        cardbackphotourl: string; // 证件背面图片地址
+        cardfrontphotourl: string; // 证件正面图片地址
+        cardnum: string; // 证件号码(加密存储)
+        cardtypeid: number; // 证件类型ID
+        cityid: number; // 市
+        company: string; // 公司(个人)
+        contactcardbackphotourl: string; // 联系人证件背面图片地址
+        contactcardfrontphotourl: string; // 联系人证件正面图片地址
+        contactname: string; // 联系人
+        countryid: number; // 国家
+        createtime: string; // 创建时间
+        creatorid: number; // 创建人
+        creditquota: number;
+        customername: string; // 客户名称(企业名称)
+        districtid: number; // 地区
+        email: string; // 邮件(加密存储)
+        fax: string; // 传真(加密存储)
+        halfbodyphotourl: string; // 半身照地址
+        hasencrypt: number; // 数据是否已加密 - 0:未加密 1:已加密
+        headurl: string; // 头像地址
+        legalcardbackphotourl: string; // 法人身份证背面照地址
+        legalcardfrontphotourl: string; // 法人身份证正面照地址
+        legalpersonname: string; // 法人姓名(企业)
+        logincode: string; // 登录代码
+        mobile: string; // 手机号码(加密存储)
+        mobile2: string; // 手机号码[明文-尚志]
+        modifierid: number; // 修改人
+        modifiertime: string; // 修改时间
+        modifysrc: number; // 修改来源 - 1:管理端 2:终端
+        needinvoice: number; // 是否需要发票 - 0:不需要 1:需要
+        nickname: string; // 昵称:默认为名称脱敏(张**) 或 手机号脱敏(139****9999)
+        openmode: number; // 开户方式 - 1:管理端开户 2:网上开户注册(会员官网) 3:微信开户 4:网页交易端注册 5:安卓手机端注册 6:苹果手机端注册 7:PC交易端注册 8:微信快速开户 9:支付宝快速开户 10:手机号快速开户
+        otherurl: string; // 其它图片地址[使用分号分隔]
+        postalcode: string; // 邮政编码
+        provinceid: number; // 省
+        proxystatementurl: string; // 授权委托书
+        qq: string; // QQ(加密存储
+        remark: string; // 备注
+        sex: number; // 用户性别 0: 女 1: 男
+        signpdfurl: string; // 签约pdf文件
+        taxpayernum: string; // 纳税人识别号
+        telphone: string; // 联系电话(加密存储)
+        userid: number; // 用户ID
+        userinfotype: number; // 用户信息类型 - 1:个人 2:企业
+        userstatus: number; // 用户状态 - 1:正常 2:注销 3:停用
+        usertype: number; // 账户类型 - 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
+        wechat: string; // 微信(加密存储)
+        wskhinfo: string; // 开户申请信息(JSON)
+    }
 }

+ 45 - 1
src/types/model/investor.d.ts

@@ -926,7 +926,7 @@ declare namespace Model {
     /** 交易商管理-->交易商变更审核-->审核 请求 */
     interface ModifyAuditReq {
         auditflag: number; // 0不通过 1通过
-        auditid: number;
+        userid: number;
         msg?: string; // 不通过原因
     }
 
@@ -955,4 +955,48 @@ declare namespace Model {
         tradetype: number;
         userid: number;
     }
+
+    /** 交易商管理-->交易商批量转移-->新增 请求 */
+    interface InvestorTransferAddReq {
+        diversioninlevel: number; // 转入类型
+        diversionoutlevel: number; // 转出类型
+        diversiontype: number;
+        inborker: number;
+        inmemberuserid: number;
+        inuserid: number; // 转入机构
+        outborkerid: number;
+        outinvestor: number; // 转出交易商
+        outmemberuserid: number;
+        outparentuserid: number; // 转出机构
+        transfermode: number; // 转入方式
+    }
+
+    /** 交易商管理-->交易商批量转移-->新增初始化 请求 */
+    interface UserAccountDetailReq {
+        userid: number;
+    }
+
+    /** 交易商管理-->交易商批量转移-->新增初始化 响应 */
+    interface UserAccountDetailRsp {
+        accountName: string; // userAccount – 交易商名称/申请人()
+        accountStatus: number; // userAccount – 机构状态/modifyStatus == 2,3,4 不展示
+        auditAccountName: string; // userAccount – 审核人/modifyStatus == 2,3,4 不展示
+        auditTime: string; // userAccount – 审核人时间/modifyStatus == 2,3,4 不展示
+        auditremark: string;
+        borkerName: string; // userAccount – 经纪人/为空不展示
+        createName: string; // userAccount – 开户人/ openmode == 1 展示,openmode != 1 展示申请人accountName
+        createTime: string; // userAccount – 开户时间
+        isAuth: number; // userAccount – isAuth/固定用before
+        memberUserName: string; // userAccount – 所属会员/ 固定用before
+        modifyName: string; // userAccount – 修改人/固定用before
+        modifyRemark: string; // userAccount – 变更审核备注/固定用before
+        modifyStatus: number; // userAccount – 变更状态/固定用before
+        modifyTime: string; // userAccount – 修改时间/固定用before
+        parentUserName: string; // userAccount – 所属机构
+        parentuserid: number;
+        refereeUserName: string; // userAccount – 推荐人/为空不展示
+        refereeuserid: number;
+        userId: number; // userAccount – 交易商代码
+        usertype: number;
+    }
 }

+ 92 - 0
src/types/model/member.d.ts

@@ -175,6 +175,7 @@ declare namespace Model {
     /** 会员机构管理-->子机构管理-->新增 请求 */
     interface OrganSonUpdateReq {
         accountname: string; // 机构名称
+        accountstatus: number;
         address: string; // 地址
         attachment1: string; // 附件1
         attachment2: string; // 附件2
@@ -382,6 +383,13 @@ declare namespace Model {
         wechat: string; // userinfo – 微信
     }
 
+    /** 会员机构管理-->子机构管理-->新增子机构审核-->审核 请求 */
+    interface AuditOrganSonReq {
+        auditflag: number;
+        msg?: string;
+        userid: number;
+    }
+
     /** 会员机构管理-->机构管理-->机构资料管理-->获取机构资料列表 请求 */
     interface OrganDetailListReq {
         accountName?: string; // 机构
@@ -1725,4 +1733,88 @@ declare namespace Model {
         subarealevel?: number; // 类型
         usertype?: number;
     }
+
+    /** 会员机构管理-->子机构管理-->子机构变更审核-->获取机构列表 请求 */
+    interface OrganSonModifyReq {
+        accountname?: string; // 机构
+        accountstatus?: number; // 机构状态
+        endtime?: string; // 结束时间
+        markets?: number; // 市场权限
+        memberuserid?: number; // 一级机构代码
+        pageNum: number;
+        pageSize: number;
+        parentuserid?: number;
+        roles?: string; // 角色
+        starttime?: string; // 开始时间
+        subarealevel?: number; // 类型
+        usertype?: number;
+    }
+
+    /** 会员机构管理-->子机构管理-->子机构转移-->获取机构列表 请求 */
+    interface OrganSonTransferReq {
+        inuserid?: number; // 转入方
+        memberuserid?: number;
+        outinvestor?: number; // 转出交易商
+        outmemberuserid?: number; // 转出方
+        pageNum: number;
+        pageSize: number;
+        transferstatus?: number; // 转移状态
+        transferusertype: number;
+    }
+
+    /** 会员机构管理-->子机构管理-->子机构转移-->获取机构列表 响应 */
+    interface OrganSonTransferRsp {
+        areauserid: number;
+        autoid: number;
+        createtime: string; // 申请时间
+        inlevel: number; // 转入机构类型
+        inmemberusername: string; // 转入所属会员
+        inuseridname: string; // 转入机构
+        investoruserid: number;
+        memberuserid: number;
+        newareauserid: number;
+        newmemberuserid: number;
+        outinvestorname: string; // 转出交易商
+        outlevel: number; // 转出机构类型
+        outmemberusername: string; // 转出所属会员
+        outparentusername: string; // 转出机构
+        transfermode: number; // 转移方式
+        transferstatus: number; // 转移状态
+        transfertype: number; // 转移类型
+    }
+
+    /** 会员机构管理-->子机构管理-->子机构转移-->新增 请求 */
+    interface OrganSonTransferAddReq {
+        diversioninlevel: number; // 转入类型
+        diversionoutlevel: number; // 转出类型
+        diversiontype: number;
+        inborker: number;
+        inmemberuserid: number;
+        inuserid: number; // 转出机构
+        outborkerid: number;
+        outinvestor: number;
+        outmemberuserid: number;
+        outparentuserid: number; // 转出机构
+        transfermode: number; // 转入方式
+    }
+
+    /** 会员机构管理-->子机构管理-->子机构转移-->新增-->获取转出子机构 请求 */
+    interface SonOrganPageByLevelReq {
+        searchcode?: string;
+        subarealevel?: number;
+    }
+
+    /** 会员机构管理-->子机构管理-->子机构转移-->新增-->获取转出子机构 响应 */
+    interface SonOrganPageByLevelRsp {
+        accountname: string; // 账户名称
+        memberuserid: number; // 会员 及子机构管理员
+        parentuserid: number; // 所有子级
+        userid: number; // 账户id
+        usertype: string; // 账户类型 (默认 2)-- 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
+    }
+
+    /** 会员机构管理-->子机构管理-->子机构转移-->撤销 请求 */
+    interface OrganSonBackTranforReq {
+        autoid: number;
+    }
 }

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio