diff --git a/src/api/platform/common/controller/pushConcernFan.ts b/src/api/platform/common/controller/pushConcernFan.ts index f95ca97..0bf3f76 100644 --- a/src/api/platform/common/controller/pushConcernFan.ts +++ b/src/api/platform/common/controller/pushConcernFan.ts @@ -1,5 +1,6 @@ import type { PushConcernFan, PushConcernFanParams, PushConcernFanResult } from '/@/api/platform/common/entity/pushConcernFan'; import { defHttp } from '/@/utils/http/axios'; +import { PushChatMessage } from '/@/api/platform/common/entity/pushChatMessage'; enum Api { list = '/common_proxy/common/pushConcernFan/list', @@ -11,6 +12,7 @@ enum Api { updateAuditStatus = '/common_proxy/common/pushConcernFan/updateAuditStatus', rejectAuth = '/common_proxy/common/pushConcernFan/rejectAuth', getByConcernUserIdAndFanUserId = '/common_proxy/common/pushConcernFan/getByConcernUserIdAndFanUserId', + concernFanMessageSend = '/common_proxy/common/pushConcernFan/concernFanSend', } export const listPushConcernFan = (params?: Partial) => defHttp.get({ url: Api.list, params }, { isReturnResultResponse: true }); @@ -29,4 +31,6 @@ export const updateAuditStatus = (id: string, status: number) => defHttp.put({ u export const rejectAuthPushConcernFan = (ids: string) => defHttp.put({ url: `${Api.rejectAuth}/${ids}` }); -export const getByConcernUserIdAndFanUserId = (concernUserId: string, fanUserId: string) => defHttp.get({ url: Api.get, params: { concernUserId, fanUserId } }); +export const getByConcernUserIdAndFanUserId = (concernUserId: string, fanUserId: string) => defHttp.get({ url: Api.getByConcernUserIdAndFanUserId, params: { concernUserId, fanUserId } }); + +export const concernFanMessageSend = (params: Partial) => defHttp.post({ url: Api.concernFanMessageSend, data: params }); diff --git a/src/views/common/push/pushApplication/EnterpriseSendModal.vue b/src/views/common/push/pushApplication/EnterpriseSendModal.vue index 873ce14..319e8b0 100644 --- a/src/views/common/push/pushApplication/EnterpriseSendModal.vue +++ b/src/views/common/push/pushApplication/EnterpriseSendModal.vue @@ -34,7 +34,7 @@ await clearValidate(); messageSecret.value = data.record?.messageSecret; const props: Partial = { confirmLoading: false }; - props.title = '企业发送消息'; + props.title = '推送企业消息'; // 尾部:设置处理后的最终配置数据 setModalProps(props); }); @@ -51,7 +51,7 @@ await sendMessage(formData); // 处理提交完成之后逻辑 closeModal(); - createMessage.success('发送成功!'); + createMessage.success('推送成功!'); emit('success'); } finally { setModalProps({ confirmLoading: false }); diff --git a/src/views/common/push/pushApplication/index.vue b/src/views/common/push/pushApplication/index.vue index ca8b49c..876b5d4 100644 --- a/src/views/common/push/pushApplication/index.vue +++ b/src/views/common/push/pushApplication/index.vue @@ -25,7 +25,7 @@ + + + + diff --git a/src/views/common/push/pushConcern/concern.data.ts b/src/views/common/push/pushConcern/concern.data.ts index f610d44..e8d1b18 100644 --- a/src/views/common/push/pushConcern/concern.data.ts +++ b/src/views/common/push/pushConcern/concern.data.ts @@ -4,7 +4,12 @@ import { h } from 'vue'; import { Tag, Switch } from 'ant-design-vue'; import { setDefaultType } from '/@/api/platform/common/controller/pushConcernFanType'; import { useMessage } from '/@/hooks/web/useMessage'; +import { listPushConcernFanType } from '/@/api/platform/common/controller/pushConcernFanType'; +import { useUserStore } from '/@/store/modules/user'; + const { createConfirm, createMessage } = useMessage(); +const userStore = useUserStore(); +const userInfoStore = userStore.getUserInfo; /** 表格列配置 */ export const columns: BasicColumn[] = [ @@ -221,3 +226,67 @@ export const pushTypeColumns = (refreshPushType: Function) => [ width: 200 } ] as BasicColumn[]; + + +/** 关注用户发送消息表单 */ +export const concernSendFormSchema: FormSchema[] = [ + { + field: 'userId', + label: '推送方用户id', + component: 'Input', + defaultValue: userInfoStore.id, + show: false + }, + { + field: 'alias', + label: '推送用户', + component: 'Input', + show: false + }, + { + field: 'concernFanStatus', + label: '关注粉丝状态', + component: 'Input', + defaultValue: '1', + show: false + }, + { + field: 'remarks', + label: '任务描述', + component: 'Input', + required: true, + componentProps: { + showCount: true, + maxlength: 20, + } + }, + { + field: 'title', + label: '通知标题', + component: 'Input', + required: true, + }, + { + label: '通知内容', + field: 'text', + component: 'InputTextArea', + required: true, + componentProps: { + rows: 6 + }, + }, + { + field: 'pushTypeId', + label: '推送类型', + component: 'ApiSelect', + componentProps: { + api: listPushConcernFanType, + params: { + size: 999 + }, + labelField: 'name', + valueField: 'typeId', + resultField: 'data' + }, + } +]; diff --git a/src/views/common/push/pushConcern/index.vue b/src/views/common/push/pushConcern/index.vue index 3a76bf8..511308d 100644 --- a/src/views/common/push/pushConcern/index.vue +++ b/src/views/common/push/pushConcern/index.vue @@ -34,6 +34,11 @@ label: '查看', icon: 'fa6-regular:pen-to-square', onClick: handleViewEdit.bind(null, record) + }, + { + label: '推送消息', + icon: 'fa6-regular:message', + onClick: handleSend.bind(null, record) }]" :dropDownActions="[ { @@ -49,6 +54,7 @@ + @@ -64,6 +70,7 @@ import { listPushConcernFanType } from '/@/api/platform/common/controller/pushConcernFanType'; import { searchFormSchema as pushTypeSearchFormSchema } from '/@/views/common/push/pushType/type.data'; import TypeModal from '../pushType/TypeModal.vue'; + import ConcernSendModal from './ConcernSendModal.vue'; import { PushConcernType, PushAuditStatus, PushConcernDynamicJoinType } from '/@/enums/pushEnum'; const userStore = useUserStore(); @@ -83,6 +90,7 @@ const { createConfirm, createMessage } = useMessage(); const [registerModal, { openModal }] = useModal(); const [pushTypeRegisterModal, { openModal: pushTypeOpenModal }] = useModal(); + const [concernSendRegisterModal, { openModal: concernSendTypeOpenModal }] = useModal(); const [registerTable, { reload, clearSelectedRowKeys, getSelectRowKeys }] = useTable({ title: '关注列表', api: listPushConcernFan, @@ -175,6 +183,10 @@ }); } + function handleSend(record?: Recordable) { + concernSendTypeOpenModal(true, { record }); + } + /** 处理表格刷新 */ function handleRefreshTable() { clearSelectedRowKeys(); diff --git a/src/views/common/push/pushFan/FanSendModal.vue b/src/views/common/push/pushFan/FanSendModal.vue new file mode 100644 index 0000000..fef4841 --- /dev/null +++ b/src/views/common/push/pushFan/FanSendModal.vue @@ -0,0 +1,70 @@ + + diff --git a/src/views/common/push/pushFan/fan.data.ts b/src/views/common/push/pushFan/fan.data.ts new file mode 100644 index 0000000..f3a31d1 --- /dev/null +++ b/src/views/common/push/pushFan/fan.data.ts @@ -0,0 +1,77 @@ +import {FormSchema} from '/@/components/Form'; +import {listPushType} from '/@/api/platform/common/controller/pushType'; +import {listPushConcernFan} from '/@/api/platform/common/controller/pushConcernFan'; +import {PushAuditStatus} from '/@/enums/pushEnum'; +import {useUserStore} from '/@/store/modules/user'; + +const userStore = useUserStore(); +const userInfoStore = userStore.getUserInfo; + +/** 粉丝用户发送消息表单 */ +export const fanSendFormSchema: FormSchema[] = [ + { + field: 'userId', + label: '推送方用户id', + component: 'Input', + defaultValue: userInfoStore.id, + show: false + }, + { + field: 'remarks', + label: '任务描述', + component: 'Input', + required: true, + componentProps: { + showCount: true, + maxlength: 20, + } + }, + { + field: 'title', + label: '通知标题', + component: 'Input', + required: true, + }, + { + label: '通知内容', + field: 'text', + component: 'InputTextArea', + required: true, + componentProps: { + rows: 6 + }, + }, + { + field: 'pushTypeId', + label: '推送类型', + component: 'ApiSelect', + componentProps: { + api: listPushType, + params: { + size: 999 + }, + labelField: 'name', + valueField: 'id', + resultField: 'data' + }, + }, + { + field: 'alias', + label: '推送用户', + component: 'ApiTreeSelect', + componentProps: { + api: listPushConcernFan, + params: { + status: PushAuditStatus.APPROVED, + concernUserId: userInfoStore.id + }, + resultField: 'data', + treeCheckable: true, + showCheckedStrategy: 'SHOW_PARENT', + treeDefaultExpandAll: true, + maxTagCount: 10, + fieldNames: { label: 'nickName', key: 'fanUserId', value: 'fanUserId' }, + allowClear: true, + }, + }, +]; diff --git a/src/views/common/push/pushFan/index.vue b/src/views/common/push/pushFan/index.vue index d47d19c..dbe6f93 100644 --- a/src/views/common/push/pushFan/index.vue +++ b/src/views/common/push/pushFan/index.vue @@ -10,6 +10,10 @@ :disabled="state.multiple" @click="handleDel()" >移除粉丝 + 推送消息 @@ -51,6 +61,7 @@ import { useMessage } from '/@/hooks/web/useMessage'; import { useUserStore } from '/@/store/modules/user'; import { PushConcernType, PushAuditStatus } from '/@/enums/pushEnum'; + import FanSendModal from './FanSendModal.vue'; const userStore = useUserStore(); const userInfoStore = userStore.getUserInfo; @@ -68,6 +79,7 @@ }); const { createConfirm, createMessage } = useMessage(); const [registerModal, { openModal }] = useModal(); + const [fanSendRegisterModal, { openModal: fanSendTypeOpenModal }] = useModal(); const [registerTable, { reload, clearSelectedRowKeys, getSelectRowKeys }] = useTable({ title: '粉丝列表', api: listPushConcernFan, @@ -128,6 +140,10 @@ }); } + function handleSend(record?: Recordable, tag?: string) { + fanSendTypeOpenModal(true, { _tag: tag || 'all', record }); + } + /** 处理表格刷新 */ function handleRefreshTable() { clearSelectedRowKeys();