Files
JeecgBoot/jeecgboot-vue3/src/views/system/message/components/useSysMessage.ts
2025-09-14 10:39:48 +08:00

567 lines
16 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ref, reactive, nextTick } from 'vue';
import { defHttp } from '/@/utils/http/axios';
import { getDictItemsByCode } from '/@/utils/dict/index';
import { useRouter, useRoute } from 'vue-router'
import { useAppStore } from '/@/store/modules/app';
import { useTabs } from '/@/hooks/web/useTabs';
import { useModal } from '/@/components/Modal';
import {useMessage} from "/@/hooks/web/useMessage";
/**
* 列表接口
* @param params
*/
const queryMessageList = (params) => {
const url = '/sys/annountCement/vue3List';
return defHttp.get({ url, params });
};
/**
* 获取消息列表数据
*
* setLocaleText 设置未读消息
*/
export function useSysMessage(setLocaleText) {
const { createMessage } = useMessage();
const rangeDateArray = getDictItemsByCode('rangeDate');
console.log('+++++++++++++++++++++');
console.log('rangeDateArray', rangeDateArray);
console.log('+++++++++++++++++++++');
const messageList = ref<any[]>([]);
const pageNo = ref(1)
let pageSize = 10;
const searchParams = reactive({
fromUser: '',
rangeDateKey: '',
rangeDate: [],
starFlag: '',
noticeType: ''
});
function getQueryParams() {
let { fromUser, rangeDateKey, rangeDate, starFlag, noticeType } = searchParams;
let params = {
fromUser,
starFlag,
rangeDateKey,
beginDate: '',
endDate: '',
pageNo: pageNo.value,
pageSize,
noticeType
};
if (rangeDateKey == 'zdy') {
params.beginDate = rangeDate[0]+' 00:00:00';
params.endDate = rangeDate[1]+' 23:59:59';
}
return params;
}
// 数据是否加载完了
const loadEndStatus = ref(false);
//请求数据
async function loadData() {
if(loadEndStatus.value === true){
return;
}
let params = getQueryParams();
const data = await queryMessageList(params);
console.log('获取结果', data);
if(!data || data.length<=0){
loadEndStatus.value = true;
setLocaleText();
return;
}
if(data.length<pageSize){
loadEndStatus.value = true;
}
pageNo.value = pageNo.value+1
let temp:any[] = messageList.value;
temp.push(...data);
messageList.value = temp;
setLocaleText();
}
//重置
function reset(){
messageList.value = []
pageNo.value = 1;
loadEndStatus.value = false;
}
//标星
async function updateStarMessage(item){
const url = '/sys/sysAnnouncementSend/edit';
let starFlag = '1';
if(item.starFlag==starFlag){
starFlag = '0'
}
const params = {
starFlag,
id: item.sendId
}
//update-begin-author:taoyan date:2023-3-6 for: QQYUN-4491应用一些小问题 4标星不需要提示吧
const data:any = await defHttp.put({url, params}, {isTransformResponse: false});
if(data.success === true){
}else{
createMessage.warning(data.message)
}
//update-end-author:taoyan date:2023-3-6 for: QQYUN-4491应用一些小问题 4标星不需要提示吧
}
const loadingMoreStatus = ref(false);
async function onLoadMore() {
loadingMoreStatus.value = true;
await loadData();
loadingMoreStatus.value = false;
}
function noRead(item) {
if (item.readFlag === '1') {
return false;
}
return true;
}
// 消息类型
function getMsgCategory(item) {
if(item.busType=='email'){
return '邮件提醒:';
} else if(item.busType=='bpm'){
return '流程催办:';
} else if(item.busType=='bpm_cc'){
return '流程抄送:';
}else if(item.busType=='bpm_task'){
return '流程任务:';
} else if (item.msgCategory == '2') {
return '系统消息:';
} else if (item.msgCategory == '1') {
return '通知公告:';
}
return '';
}
// QQYUN-4472 来消息了没有提醒--查看详情改为去处理
function getHrefText(item) {
if(item.busType === 'bpm'|| item.busType === 'bpm_task' || item.busType === 'tenant_invite'){
//判断是否是查看详情
if (item.msgAbstract) {
try {
const json = JSON.parse(item.msgAbstract);
if (json.taskDetail) {
return '查看详情';
}
} catch (e) {
console.error('getHrefText:msgAbstract参数不是JSON格式', item.msgAbstract);
}
}
return '去处理'
} else {
return '查看详情'
}
}
return {
messageList,
reset,
loadData,
loadEndStatus,
searchParams,
updateStarMessage,
onLoadMore,
noRead,
getMsgCategory,
getHrefText
};
}
/**
* 用于消息跳转
*/
export function useMessageHref(emit, props){
//const [registerHistoryModal, { openModal: openHistoryModal }] = useModal();
//const [registerTaskModal, { openModal: openTaskModal }] = useModal();
// 注册表单弹窗
//const [registerDesignFormModal, { openModal: openDesignFormModal }] = useModal();
const messageHrefArray: any[] = getDictItemsByCode('messageHref');
const router = useRouter();
const appStore = useAppStore();
const rt = useRoute();
const { close: closeTab, closeSameRoute } = useTabs();
//*********************************[QQYUN-6713]系统通知打开弹窗修改动态设置弹窗begin******************************************
//当前表单弹窗
const currentModal = ref<string | null>(null);
//当前表单参数
const modalParams = ref<Recordable>({});
//表单注册缓存
const modalRegCache = ref<Recordable>({});
//组件绑定参数
const bindParams = ref<Recordable>({});
/**
* 根据类型打开不同弹窗
* @param type
* @param params
*/
async function handleOpenType(type, params) {
currentModal.value = null;
modalParams.value = { ...params };
switch (type) {
case 'task':
//流程办理
bindParams.value = { actionType: 'todo' };
currentModal.value = 'ProcessTaskHandleModal';
break;
case 'history':
bindParams.value = {};
//历史流程
currentModal.value = 'MyTaskHandleModal';
break;
case 'design':
//表单设计
currentModal.value = 'DesformViewModal';
bindParams.value = {
showRecordCopy: false,
showRecordShare: false,
showRecordSysPrint: false,
showDesignFormBtn: false,
};
break;
case 'cgform':
//Online表单
currentModal.value = 'OnlineAutoModal';
bindParams.value = {
id: params.formId,
}
break;
default:
currentModal.value = null;
break;
}
//注册表单弹窗
initModalRegister();
await nextTick(() => {
if (modalRegCache.value[currentModal.value!]?.isRegister) {
console.log('已注冊,走缓存');
modalRegCache.value[currentModal.value!].modalMethods.openModal(true, modalParams.value);
}
});
}
/**
* 初始化弹窗注册
*/
function initModalRegister() {
//如果当前选择表单为null就不处理
if (!currentModal.value) {
return;
}
//判断缓存中是否存在,不存在就走缓存逻辑
if (!modalRegCache.value[currentModal.value]) {
const [registerModal, modalMethods] = useModal();
modalRegCache.value[currentModal.value] = {
isRegister: false,
register: bindRegisterModal(registerModal, modalMethods),
modalMethods,
};
}
}
/**
* 绑定注册弹窗
* @param regFn
* @param modalMethod
*/
function bindRegisterModal(regFn, modalMethod) {
return async (...args) => {
console.log('开始注册:', currentModal.value);
await regFn(...args);
console.log('注册完成:', currentModal.value);
//打开弹窗
modalMethod.openModal(true, modalParams.value);
//设置缓存标识
modalRegCache.value[currentModal.value!].isRegister = true;
};
}
//*************************************[QQYUN-6713]系统通知打开弹窗修改动态设置弹窗end*********************************************
// const defaultPath = '/monitor/mynews';
//const bpmPath = '/task/handle/'
async function goPage(record, openModalFun?){
if(!record.busType || record.busType == 'msg_node'){
if(!openModalFun){
// 从首页的消息通知跳转
await goPageFromOuter(record);
}else{
// 从消息页面列表点击详情查看 直接打开modal
openModalFun()
}
// update-begin-author:taoyan date:2023-5-10 for: QQYUN-4744【系统通知】6、系统通知@人后,对方看不到是哪个表单@的,没有超链接
}else if(record.busType == 'comment'){
// de
let msgAbstract = record.msgAbstract;
if(msgAbstract){
try {
let data = JSON.parse(msgAbstract.toString());
if(data.type == 'designForm'){
showDesignFormModal(data);
} else {
showOnlineCgformModal(data);
}
}catch (e) {
console.error('打开评论表单但是msgAbstract参数不是JSON格式', msgAbstract)
if(openModalFun){
openModalFun();
}
}
}
// update-end-author:taoyan date:2023-5-10 for: QQYUN-4744【系统通知】6、系统通知@人后,对方看不到是哪个表单@的,没有超链接
}else if(record.busType == 'tenant_invite'){
if(props.isLowApp===true){
router.push({ name:"myapps-settings-user", query:{ page:'tenantSetting' }})
}else{
router.push({ name:"system-usersetting", query:{ page:'tenantSetting' }})
}
}else{
if(props && props.isLowApp===true){
openLowAppFlowModal(record)
}else{
await goPageWithBusType(record)
}
}
/* busId: "1562035005173587970"
busType: "email"
openPage: "modules/eoa/email/modals/EoaEmailInForm"
openType: "component"*/
}
/**
* 打开表单设计器 表单弹窗
* @param data
*/
function showDesignFormModal(data) {
handleOpenType('design', {
mode: 'detail',
desformCode: data.code,
dataId: data.dataId,
isOnline: false,
});
}
/**
* 打开Online表单 弹窗
* @param data
*/
function showOnlineCgformModal(data) {
handleOpenType('cgform', {
formId: data.formId,
isUpdate: true,
disableSubmit: true,
record: {
id: data.dataId,
},
});
}
/**
* 判断是不是表单的评论消息
* @param record
*/
function isFormComment(record) {
if(record.busType == 'comment'){
let msgAbstract = record.msgAbstract;
if(msgAbstract){
try {
let data = JSON.parse(msgAbstract);
if(['cgform', 'designForm'].includes(data.type)){
return true
}
}catch (e) {
console.error('打开评论表单但是msgAbstract参数不是JSON格式', msgAbstract)
}
}
}
return false
}
/**
* 如果是工作流任务 在lowApp中 直接打开modal
*/
function openLowAppFlowModal(record){
const { busType, busId, msgAbstract } = record;
let temp = messageHrefArray.filter(item=>item.value === busType);
if(!temp || temp.length==0){
console.error('当前业务类型不识别', busType);
return;
}
if(busType.indexOf('bpm')<0){
console.error('low-app不支持跳转邮箱', busType);
return;
}
//固定参数 detailId 用于查询表单数据
let query:any = {
detailId: busId
};
// 额外参数处理
if(msgAbstract){
try {
let json = JSON.parse(msgAbstract);
Object.keys(json).map(k=>{
query[k] = json[k]
});
}catch (e) {
console.error('msgAbstract参数不是JSON格式', msgAbstract)
}
}
console.log("busType = ", busType)
handleOpenType('task', {
record: {
id: busId,
procInsId: query.procInsId,
processDefinitionId: query.processDefinitionId,
isDetail: query.taskDetail || 'bpm_cc' == busType
}
})
}
/**
* 根据busType不同跳转不同页面
* @param record
*/
async function goPageWithBusType(record){
const { busType, busId, msgAbstract } = record;
let temp = messageHrefArray.filter(item=>item.value === busType);
if(!temp || temp.length==0){
console.error('当前业务类型不识别', busType);
return;
}
let path = temp[0].text;
path = path.replace('{DETAIL_ID}', busId)
//固定参数 detailId 用于查询表单数据
let query:any = {
detailId: busId
};
// 额外参数处理
if(msgAbstract){
try {
let json = JSON.parse(msgAbstract);
Object.keys(json).map(k=>{
query[k] = json[k]
});
}catch (e) {
console.error('msgAbstract参数不是JSON格式', msgAbstract)
}
}
if(query.taskDetail){
// 查看任务详情的弹窗
await showHistory(query.procInsId)
}else{
// 跳转路由
appStore.setMessageHrefParams(query);
if(rt.path.indexOf(path)>=0){
await closeTab();
await router.replace({ path: path, query:{ time: new Date().getTime() } });
}else{
closeSameRoute(path)
await router.push({ path: path });
}
}
}
/**
* 从首页的消息通知跳转消息列表打开modal
* @param record
*/
async function goPageFromOuter(record){
//没有定义业务类型 直接跳转我的消息页面
emit('detail', record)
}
//===============================================================================================================
//update-begin-author:taoyan date:2022-12-31 for: QQYUN-3485 【查看流程】做一个查看页面,非办理页面,只通过流程实例参数即可
async function showHistory(processInstanceId) {
let { formData, formUrl } = await getTaskInfoForHistory({ processInstanceId });
formData['PROCESS_TAB_TYPE'] = 'history';
handleOpenType('history', {
formData,
formUrl,
title: '流程历史',
});
}
const nodeInfoUrl = '/act/process/extActProcessNode/getHisProcessNodeInfo'
const taskNodeInfo = (params) => defHttp.get({ url: nodeInfoUrl, params });
async function getTaskInfoForHistory(record) {
//查询条件
let params = { procInstId: record.processInstanceId };
const result = await taskNodeInfo(params);
console.log('获取历史任务信息', result);
let formData: any = {
dataId: result.dataId,
taskId: record.id,
taskDefKey: record.taskId,
procInsId: record.processInstanceId,
tableName: result.tableName,
vars: result.records,
};
let tempFormUrl = result.formUrl;
console.log('获取流程节点表单URL', tempFormUrl);
//节点配置表单URLVUE组件类型对应的拓展参数
if (tempFormUrl && tempFormUrl.indexOf('?') != -1 && !isURL(tempFormUrl) && tempFormUrl.indexOf('{{DOMAIN_URL}}') == -1) {
tempFormUrl = result.formUrl.split('?')[0];
console.log('获取流程节点表单URL去掉参数', tempFormUrl);
formData.extendUrlParams = getQueryVariable(result.formUrl);
}
return {
formData,
formUrl: tempFormUrl,
};
}
/**
* 获取URL上参数
* @param url
*/
function getQueryVariable(url) {
if (!url) return;
let t,
n,
r,
i = url.split('?')[1],
s = {};
(t = i.split('&')), (r = null), (n = null);
for (let o in t) {
let u = t[o].indexOf('=');
u !== -1 && ((r = t[o].substr(0, u)), (n = t[o].substr(u + 1)), (s[r] = n));
}
return s;
}
/**
* URL地址
* @param {*} s
*/
function isURL(s) {
return /^http[s]?:\/\/.*/.test(s);
}
//update-end-author:taoyan date:2022-12-31 for: QQYUN-3485 【查看流程】做一个查看页面,非办理页面,只通过流程实例参数即可
//===============================================================================================================
return {
goPage,
isFormComment,
modalRegCache,
currentModal,
bindParams,
}
}