li.shaoyi 8 mēneši atpakaļ
vecāks
revīzija
c0aff6420b
24 mainītis faili ar 555 papildinājumiem un 38 dzēšanām
  1. 11 3
      src/packages/pc/components/base/editor/index.vue
  2. 34 3
      src/packages/pc/components/modules/region/index.vue
  3. 5 2
      src/packages/pc/components/modules/select-member/index.vue
  4. 84 0
      src/packages/pc/components/modules/select-member2/index.vue
  5. 1 0
      src/packages/pc/views/admin/user/index.vue
  6. 1 0
      src/packages/pc/views/investor/custom/group/components/edit/index.vue
  7. 1 1
      src/packages/pc/views/investor/manage/user/components/edit/index.vue
  8. 9 6
      src/packages/pc/views/investor/user/open/components/edit/index.vue
  9. 1 1
      src/packages/pc/views/member/institution/open/components/edit/index.vue
  10. 1 1
      src/packages/pc/views/member/institution/user/components/edit/index.vue
  11. 6 4
      src/packages/pc/views/member/subinstitution/manage/components/edit/index.vue
  12. 66 0
      src/packages/pc/views/notice/manage/components/details/index.vue
  13. 146 0
      src/packages/pc/views/notice/manage/components/edit/index.vue
  14. 51 0
      src/packages/pc/views/notice/manage/components/edit/select-member.vue
  15. 28 10
      src/packages/pc/views/notice/manage/index.vue
  16. 1 1
      src/packages/pc/views/query/internal/goodssumm/index.vue
  17. 2 2
      src/packages/pc/views/query/internal/institutionsumm/index.vue
  18. 1 1
      src/packages/pc/views/query/internal/position/components/details/index.vue
  19. 7 0
      src/services/api/common/index.ts
  20. 14 0
      src/services/api/notice/index.ts
  21. 35 0
      src/types/model/common.d.ts
  22. 1 0
      src/types/model/investor.d.ts
  23. 3 0
      src/types/model/member.d.ts
  24. 46 3
      src/types/model/notice.d.ts

+ 11 - 3
src/packages/pc/components/base/editor/index.vue

@@ -1,19 +1,27 @@
 <!-- 富文本编辑器 -->
 <template>
-    <Editor :init="init" />
+    <Editor v-model="editorValue" :init="config" />
 </template>
 
 <script lang="ts" setup>
+import { computed } from 'vue'
 import Editor from '@tinymce/tinymce-vue'
 
-defineProps({
+const props = defineProps({
     modelValue: {
         type: String,
         default: '',
     },
 })
 
-const init = {
+const emit = defineEmits(['update:modelValue'])
+
+const editorValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const config = {
     language: 'zh-Hans',
     menubar: false,
     statusbar: false,

+ 34 - 3
src/packages/pc/components/modules/region/index.vue

@@ -1,5 +1,9 @@
 <template>
     <div class="app-region">
+        <el-select v-model="countryId">
+            <el-option :label="item.divisionname" :value="item.autoid" v-for="(item, index) in countryList"
+                :key="index" />
+        </el-select>
         <el-select v-model="provinceId">
             <el-option :label="item.divisionname" :value="item.autoid" v-for="(item, index) in provinceList"
                 :key="index" />
@@ -20,12 +24,18 @@ import { useRequest } from '@/hooks/request'
 import { getProvince } from '@/services/api/common'
 
 const props = defineProps({
+    country: Number,
     province: Number,
     city: Number,
     district: Number
 })
 
-const emit = defineEmits(['update:province', 'update:city', 'update:district'])
+const emit = defineEmits(['update:country', 'update:province', 'update:city', 'update:district'])
+
+const countryId = computed({
+    get: () => props.country,
+    set: (val) => emit('update:country', val)
+})
 
 const provinceId = computed({
     get: () => props.province,
@@ -42,12 +52,24 @@ const districtId = computed({
     set: (val) => emit('update:district', val)
 })
 
-const { dataList: provinceList } = useRequest(getProvince, {
+const { dataList: countryList } = useRequest(getProvince, {
     params: {
-        divisionLevel: 'province'
+        divisionLevel: 'country'
     },
     onSuccess: () => {
         if (!provinceList.value.some((e) => e.autoid === provinceId.value)) {
+            countryId.value = undefined
+            provinceId.value = undefined
+            cityId.value = undefined
+            districtId.value = undefined
+        }
+    }
+})
+
+const { dataList: provinceList, run: getProvinceList } = useRequest(getProvince, {
+    manual: true,
+    onSuccess: () => {
+        if (!provinceList.value.some((e) => e.autoid === provinceId.value)) {
             provinceId.value = undefined
             cityId.value = undefined
             districtId.value = undefined
@@ -74,6 +96,15 @@ const { dataList: districtList, run: getDistrictList } = useRequest(getProvince,
     }
 })
 
+watch(countryId, (val) => {
+    provinceList.value = []
+    cityList.value = []
+    districtList.value = []
+    if (val) {
+        getProvinceList({ autoId: val.toString() })
+    }
+})
+
 watch(provinceId, (val) => {
     cityList.value = []
     districtList.value = []

+ 5 - 2
src/packages/pc/components/modules/select-member/index.vue

@@ -20,7 +20,7 @@ import AppRemoteSelect from '@pc/components/base/remote-select/index.vue'
 const props = defineProps({
     modelValue: [Number, String],
     params: {
-        type: Object as PropType<Model.OrganSelectReq>
+        type: Object as PropType<Partial<Model.OrganSelectReq>>
     },
     disabled: Boolean
 })
@@ -34,7 +34,10 @@ const selectedValue = computed({
 
 const { dataList, loading, run } = useRequest(queryOrganSelect, {
     manual: true,
-    params: props.params,
+    params: {
+        pageSize: 10,
+        ...props.params
+    },
     onSuccess: (res) => {
         if (!res.data.some((e) => e.userid.toString() === selectedValue.value?.toString())) {
             selectedValue.value = undefined

+ 84 - 0
src/packages/pc/components/modules/select-member2/index.vue

@@ -0,0 +1,84 @@
+<template>
+    <app-remote-select v-model="selectedValue" :options="dataList"
+        :option-props="{ label: 'accountname', value: 'userid' }" :disabled="disabled" :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, nextTick } from 'vue'
+import { useRequest } from '@/hooks/request'
+import { queryOrganSelect2And3 } 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<Partial<Model.OrganSelect2And3Req>>
+    },
+    disabled: Boolean
+})
+
+const emit = defineEmits(['update:modelValue', 'change'])
+
+const selectedValue = computed({
+    get: () => props.modelValue,
+    set: (val) => emit('update:modelValue', val)
+})
+
+const { dataList, loading, run } = useRequest(queryOrganSelect2And3, {
+    manual: true,
+    params: {
+        pageSize: 10,
+        ...props.params
+    },
+    onSuccess: (res) => {
+        if (!res.data.some((e) => e.userid.toString() === selectedValue.value?.toString())) {
+            selectedValue.value = undefined
+            onChange()
+        }
+    }
+})
+
+const onReset = (userid?: number) => {
+    nextTick(() => {
+        if (!loading.value) {
+            selectedValue.value = userid
+            run({
+                ...props.params,
+                userid
+            })
+        }
+    })
+}
+
+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.userid === value)
+    emit('change', item && toRaw(item))
+}
+
+defineExpose({
+    onReset
+})
+</script>

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

@@ -77,6 +77,7 @@ const { dataList, total, pageSize, pageIndex, loading, run: getSystemmanager } =
 
 const { dataList: selectList } = useRequest(queryOrganSelect, {
     params: {
+        pageSize: 10,
         usertype: isTreeSelect.value ? '2,3' : undefined
     }
 })

+ 1 - 0
src/packages/pc/views/investor/custom/group/components/edit/index.vue

@@ -75,6 +75,7 @@ customerTypeEnum.registerEnumReadyCallback(async () => {
     for (const item of options) {
         const res = await getRiskRatioTypeForMarketer({
             data: {
+                riskcontrolmode: 1,
                 customertype: item.value
             }
         })

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

@@ -79,7 +79,7 @@
                         :placeholder="t('common.pleaseenter')" />
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('investor.manage.user.edit.region')" prop="region">
-                    <app-region class="el-form-item--col" v-model:province="formData.userinfoDetailVo.provinceid"
+                    <app-region class="el-form-item--col" v-model:country="formData.userinfoDetailVo.countryid" v-model:province="formData.userinfoDetailVo.provinceid"
                         v-model:city="formData.userinfoDetailVo.cityid"
                         v-model:district="formData.userinfoDetailVo.districtid" />
                 </el-form-item>

+ 9 - 6
src/packages/pc/views/investor/user/open/components/edit/index.vue

@@ -6,8 +6,9 @@
             :show-message="false">
             <el-form-item :label="t('investor.user.open.edit.memberareaid')" prop="memberareaid"
                 v-if="userStore.userInfo.releType === 1">
-                <app-select-member ref="memberareaidRef" v-model="formData.memberareaid" :params="{ usertype: '2', roles: '7' }"
-                    :placeholder="t('investor.user.open.edit.tips1')" @change="selectMemberareaid" />
+                <app-select-member ref="memberareaidRef" v-model="formData.memberareaid"
+                    :params="{ usertype: '2', roles: '7' }" :placeholder="t('investor.user.open.edit.tips1')"
+                    @change="selectMemberareaid" />
             </el-form-item>
             <el-form-item :label="t('investor.user.open.edit.areaid')" prop="areaid">
                 <app-select-member ref="areaidRef" v-model="formData.areaid" :params="{ usertype: '3', parentuserid }"
@@ -18,11 +19,12 @@
                     :params="{ usertype: '4', parentuseridfirst }" :placeholder="t('investor.user.open.edit.tips1')" />
             </el-form-item>
             <el-form-item :label="t('investor.user.open.edit.referral')" prop="referral">
-                <app-select-investor ref="referralRef" v-model="formData.referral" :placeholder="t('investor.user.open.edit.tips1')" />
+                <app-select-investor ref="referralRef" v-model="formData.referral"
+                    :placeholder="t('investor.user.open.edit.tips1')" />
             </el-form-item>
             <el-form-item class="el-form-item--row" :label="t('investor.user.open.edit.userinfotype')"
                 prop="userinfotype">
-                <el-radio-group v-model="formData.userinfotype">
+                <el-radio-group v-model="formData.userinfotype" :disabled="!!record?.userId">
                     <template v-for="item in getUserInfoTypeList()" :key="item.value">
                         <el-radio :label="item.label" :value="item.value" />
                     </template>
@@ -90,8 +92,9 @@
                 <p>{{ t('investor.user.open.edit.tips3') }}</p>
             </el-form-item>
             <el-form-item class="el-form-item--row" :label="t('investor.user.open.edit.region')" prop="region">
-                <app-region class="el-form-item--col" v-model:province="formData.provinceid"
-                    v-model:city="formData.cityid" v-model:district="formData.districtid" />
+                <app-region class="el-form-item--col" v-model:country="formData.countryid"
+                    v-model:province="formData.provinceid" v-model:city="formData.cityid"
+                    v-model:district="formData.districtid" />
             </el-form-item>
             <el-form-item class="el-form-item--row" :label="t('investor.user.open.edit.cardaddress')"
                 prop="cardaddress">

+ 1 - 1
src/packages/pc/views/member/institution/open/components/edit/index.vue

@@ -74,7 +74,7 @@
                     <el-input type="number" v-model="formData.telphone" maxlength="50" :placeholder="t('common.pleaseenter')" />
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('member.institution.open.edit.provinceid')" prop="provinceid">
-                    <app-region class="el-form-item--col" v-model:province="formData.provinceid"
+                    <app-region class="el-form-item--col" v-model:country="formData.countryid" v-model:province="formData.provinceid"
                         v-model:city="formData.cityid" v-model:district="formData.districtid" />
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('member.institution.open.edit.cardaddress')" prop="cardaddress">

+ 1 - 1
src/packages/pc/views/member/institution/user/components/edit/index.vue

@@ -77,7 +77,7 @@
                     <el-input type="number" v-model="formData.telphone" maxlength="50" :placeholder="t('common.pleaseenter')" />
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('member.institution.user.edit.provinceid')" prop="provinceid">
-                    <app-region class="el-form-item--col" v-model:province="formData.provinceid"
+                    <app-region class="el-form-item--col" v-model:country="formData.countryid" v-model:province="formData.provinceid"
                         v-model:city="formData.cityid" v-model:district="formData.districtid" />
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('member.institution.user.edit.address')" prop="address">

+ 6 - 4
src/packages/pc/views/member/subinstitution/manage/components/edit/index.vue

@@ -31,8 +31,8 @@
                     <el-input v-model="formData.accountname" maxlength="50" :placeholder="t('common.pleaseenter')" />
                 </el-form-item>
                 <el-form-item :label="t('member.subinstitution.manage.edit.refereeuserid')" prop="refereeuserid">
-                    <app-select-member ref="refereeuseridRef" v-model="formData.refereeuserid" :params="{ usertype: '2,3' }"
-                        :placeholder="t('member.subinstitution.manage.edit.tips1')" />
+                    <app-select-member ref="refereeuseridRef" v-model="formData.refereeuserid"
+                        :params="{ usertype: '2,3' }" :placeholder="t('member.subinstitution.manage.edit.tips1')" />
                 </el-form-item>
             </fieldset>
             <fieldset class="g-fieldset el-form--horizontal">
@@ -104,8 +104,9 @@
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('member.subinstitution.manage.edit.provinceid')"
                     prop="provinceid">
-                    <app-region class="el-form-item--col" v-model:province="formData.provinceid"
-                        v-model:city="formData.cityid" v-model:district="formData.districtid" />
+                    <app-region class="el-form-item--col" v-model:country="formData.countryid"
+                        v-model:province="formData.provinceid" v-model:city="formData.cityid"
+                        v-model:district="formData.districtid" />
                 </el-form-item>
                 <el-form-item class="el-form-item--row" :label="t('member.subinstitution.manage.edit.address')"
                     prop="address">
@@ -264,6 +265,7 @@ const { loading, run } = useRequest(organSonViewson, {
             contactname: userinfoDetailVo.contactName,
             customername: userinfoDetailVo.customerName,
             districtid: userinfoDetailVo.districtid,
+            countryid: userinfoDetailVo.countryid,
             email: userinfoDetailVo.email,
             legalpersonname: userinfoDetailVo.legalPersonName,
             logincode: logincode,

+ 66 - 0
src/packages/pc/views/notice/manage/components/details/index.vue

@@ -0,0 +1,66 @@
+<!-- 通知公告-公告通知管理-详情 -->
+<template>
+    <app-drawer :title="t('investor.manage.cancelapply.details.title')" width="900" v-model:show="show">
+        <app-table-details :data="data" :label-width="120" :cell-props="detailProps" :column="2">
+            <template #content="{ value }">
+                <div v-html="value"></div>
+            </template>
+        </app-table-details>
+        <template #footer>
+            <el-button @click="onCancel">{{ t('operation.close') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType, computed } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate } from '@/filters'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { noticeMsgDetail } from '@/services/api/notice'
+import { CellProp } from '@pc/components/base/table-details/types'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTableDetails from '@pc/components/base/table-details/index.vue'
+import { i18n } from '@/stores'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Notice.QueryRsp>,
+        required: true
+    }
+})
+
+const { global: { t } } = i18n
+const show = shallowRef(true)
+
+const msgtypeEnum = useEnum('msgtype') // 消息类型
+const sendtypeEnum = useEnum('sendtype') // 发布类型
+
+const { data } = useRequest(noticeMsgDetail, {
+    params: {
+        auditid: props.record.autoid,
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const detailProps = computed<CellProp[]>(() => [
+    { prop: 'title', label: '标题' },
+    { prop: 'msgtype', label: '消息类型', formatValue: (val) => msgtypeEnum.getEnumTypeName(val) },
+    { prop: 'sendtype', label: '推送方式', formatValue: (val) => sendtypeEnum.getEnumTypeName(val) },
+    { prop: 'scheduletime', label: '生效时间', formatValue: (val) => formatDate(val) },
+    { prop: 'endtime', label: '结束时间', formatValue: (val) => formatDate(val) },
+    { prop: 'creatorName', label: '录入人' },
+    { prop: 'createtime', label: '录入时间', formatValue: (val) => formatDate(val) },
+    { prop: 'content', label: '内容', entireRow: true },
+    { prop: 'auditName', label: '审核人' },
+    { prop: 'audittime', label: '审核时间' },
+    { prop: 'auditremark', label: '备注' },
+])
+
+const onCancel = () => {
+    show.value = false
+}
+</script>

+ 146 - 0
src/packages/pc/views/notice/manage/components/edit/index.vue

@@ -0,0 +1,146 @@
+<!-- 通知公告-公告通知管理-编辑 -->
+<template>
+    <app-drawer :title="t('investor.user.open.edit.title')" width="900" 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="title">
+                <el-input v-model="formData.title" :placeholder="t('common.pleaseenter')" />
+            </el-form-item>
+            <el-form-item label="消息类型" prop="msgtype">
+                <el-select v-model="formData.msgtype">
+                    <el-option v-for="item in msgtypeEnum.getEnumOptions()" :key="item.value" :label="item.label"
+                        :value="item.value" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="发布类型" prop="sendtype">
+                <el-select v-model="formData.sendtype">
+                    <el-option v-for="item in sendtypeEnum.getEnumOptions()" :key="item.value" :label="item.label"
+                        :value="item.value" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="接收会员" prop="memberidlist" v-if="formData.sendtype === 2 || formData.sendtype === 4">
+                <el-input :value="selectedValues.map((e) => e.accountname)" placeholder="请选择" readonly>
+                    <template #append>
+                        <el-button @click="showSelectMember = true">选择</el-button>
+                    </template>
+                </el-input>
+            </el-form-item>
+            <el-form-item label="接收交易商" prop="invertorID" v-if="formData.sendtype === 3">
+                <app-select-investor v-model="formData.invertorID" />
+            </el-form-item>
+            <el-form-item label="开始结束" prop="date">
+                <el-date-picker v-model="dateValue" type="datetimerange"
+                    :disabled-date="(date: Date) => date.getTime() < Date.now() - 8.64e7"
+                    start-placeholder="生效时间" end-placeholder="结束时间" value-format="YYYY-MM-DD HH:mm:ss" />
+            </el-form-item>
+            <el-form-item label="内容" prop="content">
+                <app-editor v-model="formData.content" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.close') }}</el-button>
+            <el-button type="primary" @click="onSubmit">保存</el-button>
+        </template>
+        <select-member v-model:show="showSelectMember" @change="onMemberChange" />
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, PropType, onMounted } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { useEnum } from '@/hooks/enum'
+import { noticemsgadd, noticeMsgDetail } from '@/services/api/notice'
+import { i18n } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppSelectInvestor from '@pc/components/modules/select-investor/index.vue'
+import AppEditor from '@pc/components/base/editor/index.vue'
+import SelectMember from './select-member.vue'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Notice.QueryRsp>
+    }
+})
+
+const msgtypeEnum = useEnum('msgtype') // 消息类型
+const sendtypeEnum = useEnum('sendtype') // 发布类型
+
+const { global: { t } } = i18n
+const formRef = ref<FormInstance>()
+const show = ref(true)
+const refresh = ref(false)
+const showSelectMember = ref(false) // 是否弹出选择接收会员
+const selectedValues = ref<Model.OrganSelectRsp[]>([]) // 选中的会员
+const dateValue = ref<string[]>([])
+
+const formData = ref<Partial<Notice.NoticeMsgAddReq>>({})
+
+const { loading, run } = useRequest(noticeMsgDetail, {
+    manual: true,
+    onSuccess: ((res) => {
+        const { title, content } = res.data
+        formData.value = {
+            title,
+            content
+        }
+    }),
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+// 表单验证规则
+const formRules: FormRules = {
+    title: [{ required: true }],
+    msgtype: [{ required: true }],
+    sendtype: [{ required: true }],
+    memberidlist: [{ required: true, validator: () => !!selectedValues.value.length }],
+    invertorID: [{ required: true }],
+    date: [{ required: true, validator: () => dateValue.value?.length === 2 }],
+    content: [{ required: true }],
+}
+
+// 选择接收会员
+const onMemberChange = (items: Model.OrganSelectRsp[]) => {
+    selectedValues.value = items
+    formRef.value?.validateField('memberidlist')
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    const [startDate, endDate] = dateValue.value
+    const rawData = { ...formData.value }
+    rawData.scheduletime = startDate
+    rawData.endtime = endDate
+    rawData.memberidlist = selectedValues.value.map((e) => e.userid).join(',')
+
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            loading.value = true
+            noticemsgadd({
+                data: rawData
+            }).then(() => {
+                ElMessage.success(t('common.tips3'))
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error(t('common.tips4') + err)
+            }).finally(() => {
+                loading.value = false
+            })
+        }
+    })
+}
+
+onMounted(() => {
+    const auditid = props.record?.autoid
+    if (auditid) {
+        run({ auditid })
+    }
+})
+</script>

+ 51 - 0
src/packages/pc/views/notice/manage/components/edit/select-member.vue

@@ -0,0 +1,51 @@
+<!-- 通知公告-公告通知管理-编辑-接收会员 -->
+<template>
+    <app-drawer title="按会员广播" v-model:show="showDrawer" :loading="loading">
+        <el-transfer v-model="selectedValue" :data="dataList" :titles="['备选会员', '已选会员']"
+            :props="{ label: 'accountname', key: 'userid' }" filterable />
+        <template #footer>
+            <el-button @click="onCancel()">关闭</el-button>
+            <el-button type="primary" @click="onSubmit">确定</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, toRaw, computed } from 'vue'
+import { useRequest } from '@/hooks/request'
+import { queryOrganSelect } from '@/services/api/common'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    show: {
+        type: Boolean,
+        default: false
+    }
+})
+
+const emit = defineEmits(['update:show', 'change'])
+
+const showDrawer = computed({
+    get: () => props.show,
+    set: (val) => emit('update:show', val)
+})
+
+const selectedValue = shallowRef<number[]>([])
+
+const { dataList, loading } = useRequest(queryOrganSelect, {
+    params: {
+        pageSize: 0,
+        usertype: '2'
+    }
+})
+
+const onSubmit = () => {
+    const items = dataList.value.filter((e) => selectedValue.value.includes(e.userid))
+    emit('change', toRaw(items))
+    onCancel()
+}
+
+const onCancel = () => {
+    showDrawer.value = false
+}
+</script>

+ 28 - 10
src/packages/pc/views/notice/manage/index.vue

@@ -2,7 +2,13 @@
 <template>
     <app-view>
         <template #header>
-            <app-filter :option="filterOption" />
+            <app-filter :option="filterOption">
+                <template #userid="{ item }">
+                    <el-form-item :label="item.label">
+                        <app-select-investor v-model="item.value" />
+                    </el-form-item>
+                </template>
+            </app-filter>
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
@@ -28,17 +34,23 @@
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
 import { ElMessage } from 'element-plus'
+import { formatDate } from '@/filters'
 import { useDataFilter } from '@/hooks/datatable-v2'
 import { useRequest } from '@/hooks/request'
 import { useOperation } from '@/hooks/operation'
+import { useEnum } from '@/hooks/enum'
 import { query } from '@/services/api/notice'
+import { i18n } from '@/stores'
 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 { i18n } from '@/stores'
+import AppSelectInvestor from '@pc/components/modules/select-investor/index.vue'
 
 const { global: { t } } = i18n
+const msgtypeEnum = useEnum('msgtype') // 消息类型
+const sendtypeEnum = useEnum('sendtype') // 发布类型
+const sendstatusEnum = useEnum('sendstatus') // 推送状态
 
 const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Notice.QueryRsp>({
     onClose: () => onSearch()
@@ -56,11 +68,11 @@ const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(query,
 
 const tableColumns = shallowRef<Model.TableColumn[]>([
     { field: 'title', label: 'notice.manage.title' },
-    { field: 'msgtype', label: 'notice.manage.msgtype' },
-    { field: 'sendtype', label: 'notice.manage.sendtype' },
-    { field: 'sentstatus', label: 'notice.manage.sentstatus' },
-    { field: 'scheduletime', label: 'notice.manage.scheduletime' },
-    { field: 'endtime', label: 'notice.manage.endtime' },
+    { field: 'msgtype', label: 'notice.manage.msgtype', formatValue: (val) => msgtypeEnum.getEnumTypeName(val) },
+    { field: 'sendtype', label: 'notice.manage.sendtype', formatValue: (val) => sendtypeEnum.getEnumTypeName(val) },
+    { field: 'sentstatus', label: 'notice.manage.sentstatus', formatValue: (val) => sendstatusEnum.getEnumTypeName(val) },
+    { field: 'scheduletime', label: 'notice.manage.scheduletime', formatValue: (val) => formatDate(val) },
+    { field: 'endtime', label: 'notice.manage.endtime', formatValue: (val) => formatDate(val) },
     { field: 'recipient', label: 'notice.manage.recipient' },
     { field: 'operate', label: 'common.operate', fixed: 'right' }
 ])
@@ -73,7 +85,8 @@ const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilte
         },
         {
             field: 'msgtype',
-            label: t('notice.manage.msgtype')
+            label: t('notice.manage.msgtype'),
+            options: () => msgtypeEnum.getEnumOptions()
         },
         {
             field: 'content',
@@ -85,11 +98,16 @@ const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilte
         },
         {
             field: 'sendtype',
-            label: t('notice.manage.sendtype')
+            label: t('notice.manage.sendtype'),
+            options: () => sendtypeEnum.getEnumOptions()
         },
         {
             field: 'isforcedisplay',
-            label: t('notice.manage.isforcedisplay')
+            label: t('notice.manage.isforcedisplay'),
+            options: () => [
+                { label: '是', value: 1 },
+                { label: '否', value: 0 }
+            ]
         },
     ],
     buttons: [

+ 1 - 1
src/packages/pc/views/query/internal/goodssumm/index.vue

@@ -6,7 +6,7 @@
                 :show-message="false">
                 <el-form-item :label="t('query.internal.goodssumm.marketid')" prop="marketid">
                     <el-select v-model="queryParams.marketid">
-                        <el-option v-for="item in getMarketOptions()" :key="item.value" :label="item.label"
+                        <el-option v-for="item in getMarketOptions([15, 40, 41, 48, 51, 71, 97, 99], true)" :key="item.value" :label="item.label"
                             :value="item.value" />
                     </el-select>
                 </el-form-item>

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

@@ -18,7 +18,7 @@
                         :start-placeholder="t('common.startdate')" :end-placeholder="t('common.enddate')" />
                 </el-form-item>
                 <el-form-item :label="t('query.internal.institutionsumm.parentuserid')" prop="parentuserid">
-                    <app-select-member v-model="queryParams.parentuserid" :params="{ usertype: '2,3' }" />
+                    <app-select-member2 v-model="queryParams.parentuserid" />
                 </el-form-item>
                 <el-form-item>
                     <el-button type="primary" @click="onSearch">{{ t('operation.search') }}</el-button>
@@ -51,7 +51,7 @@ import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppOperation from '@pc/components/base/operation/index.vue'
 import AppSelectGoods from '@pc/components/modules/select-goods/index.vue'
-import AppSelectMember from '@pc/components/modules/select-member/index.vue'
+import AppSelectMember2 from '@pc/components/modules/select-member2/index.vue'
 import { i18n } from '@/stores'
 
 const { getMarketOptions } = useMarket()

+ 1 - 1
src/packages/pc/views/query/internal/position/components/details/index.vue

@@ -36,7 +36,7 @@ const { data } = useRequest(queryPositionSheetDetail, {
         ishis: props.record.ishis,
         tradeid: props.record.tradeid,
         buyorsell: props.record.buyorsell,
-        histradedate: props.record.tradedate
+        histradedate: props.record.histradedate
     },
     onError: (err) => {
         ElMessage.error(err)

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

@@ -19,6 +19,13 @@ export function queryOrganSelect(options: CommonFetchOptions<{ request: Model.Or
 }
 
 /**
+ * 子机构管理-->获取机构及所有子机构
+ */
+export function queryOrganSelect2And3(options: CommonFetchOptions<{ request: Partial<Model.OrganSelect2And3Req>; response: Model.OrganSelect2And3Rsp[]; }>) {
+    return httpClient.commonRequest('/common/queryOrganSelect2And3', 'get', options)
+}
+
+/**
  * 子机构开户下拉查询推荐人
  */
 export function queryInvestorSelect(options: CommonFetchOptions<{ request: Model.InvestorSelectReq; response: Model.InvestorSelectRsp[]; }> = {}) {

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

@@ -9,6 +9,20 @@ export function query(options: CommonFetchOptions<{ request: Notice.QueryReq; re
 }
 
 /**
+ * 通知公告-->公告通知管理-->详情
+ */
+export function noticeMsgDetail(options: CommonFetchOptions<{ request: Notice.NoticeMsgDetailReq; response: Notice.NoticeMsgDetailRsp; }>) {
+    return httpClient.commonRequest('/notice/noticeMsgDetail', 'get', options)
+}
+
+/**
+ * 通知公告-->发布通知公告
+ */
+export function noticemsgadd(options: CommonFetchOptions<{ request: Partial<Notice.NoticeMsgAddReq>; }>) {
+    return httpClient.commonRequest('/notice/noticemsgadd', 'post', options)
+}
+
+/**
  * 通知公告-->资讯管理-->获取列表
  */
 export function informManquery(options: CommonFetchOptions<{ request: Notice.InformManqueryReq; response: Notice.InformManqueryRsp[]; }>) {

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

@@ -1,6 +1,7 @@
 declare namespace Model {
     /** 机构下拉查询加载 会员、经纪人 请求 */
     interface OrganSelectReq {
+        pageSize: number;
         searchcode?: string;
         usertype?: string;
         roles?: string;
@@ -18,6 +19,40 @@ declare namespace Model {
         usertype: string; // 账户类型 (默认 2)-- 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
     }
 
+    /** 机构下拉查询加载 会员、经纪人 请求 */
+    interface OrganSelect2And3Req {
+        accountname: number; // 账户名称
+        allUsersButPlatform: number; // 所有用户除了平台 0 否 1 是
+        companyexists: string;
+        exists: string;
+        isusertype: number;
+        level: number;
+        memberuserid: number; // 会员 及子机构管理员
+        orgtype: number;
+        orgztypes: string; // 管理员所属机构角色类型
+        pageSize: number;
+        parentuserid: number; // 所有子级
+        parentuseridfirst: number;
+        planformanceuserid: number; // 履约时查买卖方的
+        roles: string;
+        roletypeid: number;
+        searchcode: string;
+        subarealevelpath: string;
+        userid: number;
+        usertype: string;
+        usertypeArray: string[];
+        usertypeIds: string;
+    }
+
+    /** 机构下拉查询加载 会员、经纪人 响应 */
+    interface OrganSelect2And3Rsp {
+        accountname: string; // 账户名称
+        memberuserid: number; // 会员 及子机构管理员
+        parentuserid: number; // 所有子级
+        userid: number; // 账户id
+        usertype: string; // 账户类型 (默认 2)-- 1:交易所 2:机构 3:会员子机构 4:经纪人 5:投资者 6:客户 7:企业成员(云平台)
+    }
+
     /** 子机构开户下拉查询推荐人 请求 */
     interface InvestorSelectReq {
         accountStatus?: string;

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

@@ -114,6 +114,7 @@ declare namespace Investor {
             cardNum: string; // userinfo – 证件号码
             cardTypeId: number; // userinfo – 证件类型/code-certificatetype
             cityid: number;
+            countryid: number;
             company: string; // userinfo – 所属公司
             contactName: string; // userinfo – 联系人/userinfotype ==2 展示
             customerName: string; // userinfo – 企业名称/userinfotype ==2 展示

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

@@ -185,6 +185,7 @@ declare namespace Member {
         cardnum: string; // 证件号码
         cardtypeid: number; // 证件类型
         cityid: number; // 市
+        countryid: number;
         company: string; // 公司 个人
         contactname: string; // 联系人
         customername: string; // 名称
@@ -363,6 +364,7 @@ declare namespace Member {
         contactName: string; // userinfo – 联系人/userinfotype ==2 展示
         customerName: string; // userinfo – 企业名称/userinfotype ==2 展示
         districtid: number;
+        countryid: number;
         email: string; // userinfo – 邮箱
         halfBodyPhotoUrl: string; // userinfo – 手持证件照/为空不展示
         legalCardBackPhotoUrl: string; // userinfo – 法人身份证背面照/userinfotype ==2 展示
@@ -1620,6 +1622,7 @@ declare namespace Member {
         cardfrontphotourl: string; // 证件照正面
         cardnum: string; // 证件号码
         cardtypeid: number; // 证件类型
+        countryid: number;
         cityid: number; // 市
         company: string; // 公司 个人
         contactname: string; // 联系人

+ 46 - 3
src/types/model/notice.d.ts

@@ -16,11 +16,54 @@ declare namespace Notice {
     interface QueryRsp {
         autoid: number;
         endtime: string; // 结束时间
-        msgtype: number;// 消息类型
+        isforcedisplay: number;
+        msgtype: number; // 消息类型
         recipient: string; // 接收人
         scheduletime: string; // 生效时间
-        sendtype: number;// 发布类型
-        sentstatus: number;// 推送状态
+        sendtype: number; // 发布类型
+        sentstatus: number; // 推送状态
+        title: string; // 标题
+    }
+
+    /** 通知公告-->公告通知管理-->详情 请求 */
+    interface NoticeMsgDetailReq {
+        auditid: number;
+    }
+
+    /** 通知公告-->公告通知管理-->详情 响应 */
+    interface NoticeMsgDetailRsp {
+        auditName: string;
+        auditoruserid: number; // 审核人
+        auditremark: string; // 审核备注
+        audittime: string; // 审核日期
+        autoid: number; // 自增ID
+        content: string; // 内容
+        createtime: string; // 创建时间
+        creatorName: string;
+        creatorid: number; // 建仓人
+        endtime: string; // 结束时间
+        isforcedisplay: number; // 是否强制显示 - 0:不强制 1:强制
+        istop: number; // 是否置顶 - 0:不置顶 1:置顶
+        membername: string;
+        msgiconurl: string; // 消息图标Url
+        msgtype: number; // 消息类型 - 1:公告通知 2:系统消息 3:商品到期提货通知
+        publisher: string; // 消息发布者
+        scheduletime: string; // 计划发送时间
+        sendtype: number; // 推送方式 - 1:全体广播 2:按会员广播 3:个人推送 4:按会员广播(仅会员)
+        sentstatus: number; // 推送状态 - 0:未推送 1:已推送 2:审核拒绝 3:提前失效
+        title: string; // 标题
+        userid: number; // 会员/投资者ID 推送方式 为 个人时,填写投资者ID
+    }
+
+    /** 通知公告-->发布通知公告 请求 */
+    interface NoticeMsgAddReq {
+        content: string; // 内容
+        endtime: string; // 结束时间
+        invertorID: string; // 接收交易商
+        memberidlist: string; // 会员集合
+        msgtype: number; // 发布类型
+        scheduletime: string; // 生效时间
+        sendtype: number; // 消息类型
         title: string; // 标题
     }