关注人功能,专项时间功能

This commit is contained in:
weibl
2026-01-29 20:29:39 +08:00
parent 623534b9aa
commit c19e4703da
9 changed files with 244 additions and 58 deletions

View File

@@ -195,6 +195,7 @@ import { ElMessage } from 'element-plus';
import { generateFakeId } from '@/utils/node';
import { useI18n } from 'vue-i18n';
import { TABLE_NAME } from '@/utils/enum/tableName';
import { disposeTaskMembers } from '@/utils/task';
const { t } = useI18n();
const loadcaseTableRef = ref();
@@ -328,8 +329,10 @@ const editRowFun = (row: any) => {
modalDetail.value = {
...row,
planTime: [row.beginTime, row.endTime],
eMemberListArr: row.eMemberList,
pMemberListArr: row.pMemberList,
...disposeTaskMembers('setListToArr', row),
// eMemberListArr: row.eMemberList,
// pMemberListArr: row.pMemberList,
// payAttentionMemberListArr: row.payAttentionMemberList,
};
modalVisible.value = true;
};
@@ -357,7 +360,7 @@ const onNodeDetailConfirmFun = (formData: any) => {
const { visibleData } = getVxeRef()?.getTableData();
const checkRowData = getVxeRef()?.getCheckboxRecords(true);
if (operationType.value === 'add') {
const addRow = {
let addRow = {
parentId: checkRowData[0]?.fakeId,
fakeId: generateFakeId(),
discipline: checkRowData[0]?.discipline,
@@ -371,8 +374,10 @@ const onNodeDetailConfirmFun = (formData: any) => {
if (addRow.nodeType === NODE_TYPE.TASK) {
addRow.exeStatus = TASK_PROCESS_STATUS.NO_STARTED;
addRow.achieveStatus = TASK_CALCULATE_STATUS.NO_CALCULATE;
addRow.eMemberList = addRow.eMemberListArr;
addRow.pMemberList = addRow.pMemberListArr;
// addRow.eMemberList = addRow.eMemberListArr;
// addRow.pMemberList = addRow.pMemberListArr;
// addRow.payAttentionMemberList = addRow.payAttentionMemberListArr;
addRow = { ...addRow, ...disposeTaskMembers('setArrToList', addRow) };
}
// 给新增节点赋值tagKeyMapList
// const tagKeyList = disposeTagKey(addRow, checkRowData[0]?.tagKeyList || [], tagKeyMapList.value);
@@ -421,8 +426,10 @@ const onNodeDetailConfirmFun = (formData: any) => {
const row = visibleData.find((item: any) => item.fakeId === formData.fakeId);
const rowInfo = {
...formData,
eMemberList: formData.eMemberListArr,
pMemberList: formData.pMemberListArr,
// eMemberList: formData.eMemberListArr,
// pMemberList: formData.pMemberListArr,
// payAttentionMemberList: formData.payAttentionMemberListArr,
...disposeTaskMembers('setArrToList', formData),
beginTime: formData.planTime ? formData.planTime[0] : '',
endTime: formData.planTime ? formData.planTime[1] : '',
};

View File

@@ -55,7 +55,7 @@ import { ref, computed, nextTick, watch, onMounted } from 'vue';
import Dialog from '@/components/common/dialog/index.vue';
import TableForm from '@/components/common/table/tableForm.vue';
import { getTagKeyMap, NODE_TYPE } from '@/utils/enum/node';
import { getMemberListIds } from '@/utils/task';
import { disposeTaskMembers } from '@/utils/task';
import { disposeTagKey } from '@/views/task/projectDetail/components/project';
import { isCategoryType, isCategoryNodeType, validateCategoryLevel } from '@/utils/node';
import flowTemplateSelect from './flowTemplateSelect.vue';
@@ -154,11 +154,18 @@ const onFormChangeFun = (data: any) => {
formData.value.nodeCode = null;
formData.value.englishName = null;
}
if (data.key === 'eMemberList') {
formData.value.eMemberListArr = data.val;
}
if (data.key === 'pMemberList') {
formData.value.pMemberListArr = data.val;
// if (data.key === 'eMemberList') {
// formData.value.eMemberListArr = data.val;
// }
// if (data.key === 'pMemberList') {
// formData.value.pMemberListArr = data.val;
// }
// if (data.key === 'payAttentionMemberList') {
// formData.value.payAttentionMemberListArr = data.val;
// }
const memberKeys = disposeTaskMembers('tableFormChangeFun', data);
for (const key in memberKeys) {
formData.value[key] = memberKeys[key];
}
};
const onCancelFun = () => {
@@ -183,14 +190,19 @@ const onConfirmFun = async () => {
submitData.beginTime = submitData.planTime[0];
submitData.endTime = submitData.planTime[1];
}
submitData.pMemberIds = '';
if (submitData.pMemberList?.length > 0) {
submitData.pMemberIds = submitData.pMemberList;
}
submitData.eMemberIds = '';
if (submitData.eMemberList?.length > 0) {
submitData.eMemberIds = submitData.eMemberList;
}
// submitData.pMemberIds = '';
// if (submitData.pMemberList?.length > 0) {
// submitData.pMemberIds = submitData.pMemberList;
// }
// submitData.eMemberIds = '';
// if (submitData.eMemberList?.length > 0) {
// submitData.eMemberIds = submitData.eMemberList;
// }
// submitData.payAttentionMemberIds = '';
// if (submitData.payAttentionMemberList?.length > 0) {
// submitData.payAttentionMemberIds = submitData.payAttentionMemberList;
// }
disposeTaskMembers('setListToIdsNoTranslate', submitData);
emits('confirm', submitData);
}
};
@@ -247,8 +259,10 @@ const prepareFromProps = () => {
formData.value = detail
? {
...detail,
eMemberList: getMemberListIds(detail.eMemberList),
pMemberList: getMemberListIds(detail.pMemberList),
...disposeTaskMembers('getIds', detail),
// eMemberList: getMemberListIds(detail.eMemberList),
// pMemberList: getMemberListIds(detail.pMemberList),
// payAttentionMemberList: getMemberListIds(detail.payAttentionMemberList),
}
: {};
}

View File

@@ -153,6 +153,30 @@
v-model="row.eMemberIds"
></userSelect>
</template>
<!-- EP关注人 -->
<template #payAttentionMemberIds="{ row, icon }">
<TreeEditItem
v-if="[NODE_TYPE.TASK].includes(row.nodeType)"
:data="row.payAttentionMemberList"
:editMode="editMode"
:icon="icon"
hideTitle
:title="row.hoverTitle"
>
<span :title="row.hoverTitle">
{{ disposeMemberList(row['payAttentionMemberList'], 'payAttentionMemberList') }}
</span>
</TreeEditItem>
</template>
<template #payAttentionMemberIds-edit="{ row }">
<userSelect
@change="
(data) => changeUserFun(row, data, 'payAttentionMemberList', 'payAttentionMemberList')
"
:multiple="true"
v-model="row.payAttentionMemberList"
></userSelect>
</template>
<!-- 计划开始时间 -->
<template #beginTime="{ row, icon }">
<TreeEditItem
@@ -200,6 +224,27 @@
{{ row.commitmentDeadline }}
</span>
</template>
<!-- LYRIC EP 清单下发时间 -->
<template #listReleaseTime="{ row }">
<span v-if="row.nodeType === NODE_TYPE.TASK && row.listReleaseTime">
<el-icon><Calendar /></el-icon>
{{ row.listReleaseTime }}
</span>
</template>
<!-- LYRIC EP 工位升级时间 -->
<template #stationUpgradeTime="{ row }">
<span v-if="row.nodeType === NODE_TYPE.TASK && row.stationUpgradeTime">
<el-icon><Calendar /></el-icon>
{{ row.stationUpgradeTime }}
</span>
</template>
<!-- LYRIC EP 结构细化完成时间结构细化完成时间 -->
<template #structureRefinementCompletionTime="{ row }">
<span v-if="row.nodeType === NODE_TYPE.TASK && row.structureRefinementCompletionTime">
<el-icon><Calendar /></el-icon>
{{ row.structureRefinementCompletionTime }}
</span>
</template>
<!-- 达标方式 -->
<template #method="{ row, icon }">
<TreeEditItem

View File

@@ -21,7 +21,7 @@
import { ref, onMounted, watch, nextTick } from 'vue';
import TableForm from '@/components/common/table/tableForm.vue';
import { getTagKeyMap, NODE_TYPE } from '@/utils/enum/node';
import { getMemberListIds } from '@/utils/task';
import { disposeTaskMembers, getMemberListIds } from '@/utils/task';
import flowTemplateSelect from '@/components/common/treeCaseTable/flowTemplateSelect.vue';
import knowledgeSelect from '@/components/common/treeCaseTable/knowledgeSelect.vue';
import { disposeTagKey } from '@/views/task/projectDetail/components/project';
@@ -118,15 +118,19 @@ const getFormData = async () => {
formData.beginTime = formData.planTime[0];
formData.endTime = formData.planTime[1];
}
formData.pMemberIds = '';
if (formData.pMemberList?.length > 0) {
formData.pMemberIds = formData.pMemberList;
}
formData.eMemberIds = '';
if (formData.eMemberList?.length > 0) {
formData.eMemberIds = formData.eMemberList;
}
// formData.pMemberIds = '';
// if (formData.pMemberList?.length > 0) {
// formData.pMemberIds = formData.pMemberList;
// }
// formData.eMemberIds = '';
// if (formData.eMemberList?.length > 0) {
// formData.eMemberIds = formData.eMemberList;
// }
// formData.payAttentionMemberIds = '';
// if (formData.payAttentionMemberList?.length > 0) {
// formData.payAttentionMemberIds = formData.payAttentionMemberList;
// }
disposeTaskMembers('setListToIdsNoTranslate', formData);
return formData;
} else {
return null;

View File

@@ -20,6 +20,11 @@ export enum TENANT_ENUM {
*/
export const CURRENT_TENANT = env.VITE_API_TENANT_NAME || TENANT_ENUM.BASE;
/**
* 当前租户是否有这个配置
* @param tenants
* @returns
*/
export const enableConfigByTenant = (tenants: string[]) => {
return tenants.includes(CURRENT_TENANT);
};

View File

@@ -7,7 +7,7 @@ import {
poolNodeExtraPropPickMap,
} from '@/utils/enum/node';
import type { TreeNode } from '@/utils/enum/node';
import { getMemberListIds } from './task';
import { disposeTaskMembers } from './task';
import { CommonStore } from '@/stores/common';
const commonStore = CommonStore();
@@ -231,14 +231,19 @@ export const transformTreeToPoolNodes = (tree: TreeNode[]) => {
export const translateLoadcaseTree = (list: any[]) => {
const arr = list.map((item) => {
item.fakeId = item.uuid;
item.pMemberIds = '';
if (item.pMemberList?.length > 0) {
item.pMemberIds = getMemberListIds(item.pMemberList);
}
item.eMemberIds = '';
if (item.eMemberList?.length > 0) {
item.eMemberIds = getMemberListIds(item.eMemberList);
}
// item.pMemberIds = '';
// if (item.pMemberList?.length > 0) {
// item.pMemberIds = getMemberListIds(item.pMemberList);
// }
// item.eMemberIds = '';
// if (item.eMemberList?.length > 0) {
// item.eMemberIds = getMemberListIds(item.eMemberList);
// }
// item.payAttentionMemberIds = '';
// if (item.payAttentionMemberList?.length > 0) {
// item.payAttentionMemberIds = getMemberListIds(item.payAttentionMemberList);
// }
disposeTaskMembers('setListToIds', item);
if (Array.isArray(item.children)) {
item.children = translateLoadcaseTree(item.children);
}

View File

@@ -72,3 +72,86 @@ export const getTaskAchieveStyleClass = (status: number) => {
return 'dot dot-no-calculate';
}
};
/**
* 专门处理任务的人员,防止后续任务再加人
* @param disposeKey
* @param row
* @returns
*/
export const disposeTaskMembers = (disposeKey: string, row: any) => {
if (disposeKey === 'tableFormChangeFun') {
const obj: any = {};
if (row.key === 'eMemberIds' || row.key === 'eMemberList') {
obj.eMemberListArr = row.val;
}
if (row.key === 'pMemberIds' || row.key === 'pMemberList') {
obj.pMemberListArr = row.val;
}
if (row.key === 'payAttentionMemberIds' || row.key === 'payAttentionMemberList') {
obj.payAttentionMemberListArr = row.val;
}
return obj;
}
if (disposeKey === 'getListAndIds') {
return {
pMemberList: row.pMemberListArr,
pMemberIds: getMemberListIds(row.pMemberListArr),
eMemberList: row.eMemberListArr,
eMemberIds: getMemberListIds(row.eMemberListArr),
// EP的关注人
payAttentionMemberList: row.payAttentionMemberListArr,
// EP的关注人
payAttentionMemberIds: getMemberListIds(row.payAttentionMemberListArr),
};
}
if (disposeKey === 'getIds') {
return {
eMemberList: getMemberListIds(row.eMemberList),
pMemberList: getMemberListIds(row.pMemberList),
payAttentionMemberList: getMemberListIds(row.payAttentionMemberList),
};
}
if (disposeKey === 'setListToArr') {
return {
eMemberListArr: row.eMemberList,
pMemberListArr: row.pMemberList,
payAttentionMemberListArr: row.payAttentionMemberList,
};
}
if (disposeKey === 'setArrToList') {
return {
eMemberList: row.eMemberListArr,
pMemberList: row.pMemberListArr,
payAttentionMemberList: row.payAttentionMemberListArr,
};
}
if (disposeKey === 'setListToIds') {
row.pMemberIds = '';
if (row.pMemberList?.length > 0) {
row.pMemberIds = getMemberListIds(row.pMemberList);
}
row.eMemberIds = '';
if (row.eMemberList?.length > 0) {
row.eMemberIds = getMemberListIds(row.eMemberList);
}
row.payAttentionMemberIds = '';
if (row.payAttentionMemberList?.length > 0) {
row.payAttentionMemberIds = getMemberListIds(row.payAttentionMemberList);
}
}
if (disposeKey === 'setListToIdsNoTranslate') {
row.pMemberIds = '';
if (row.pMemberList?.length > 0) {
row.pMemberIds = row.pMemberList;
}
row.eMemberIds = '';
if (row.eMemberList?.length > 0) {
row.eMemberIds = row.eMemberList;
}
row.payAttentionMemberIds = '';
if (row.payAttentionMemberList?.length > 0) {
row.payAttentionMemberIds = row.payAttentionMemberList;
}
}
};

View File

@@ -296,12 +296,12 @@ import { NODE_TYPE, getTagKeyMap, tagSortList } from '@/utils/enum/node';
import nodeLevel2Select from '@/components/project/nodeLevel2Select.vue';
import { getTaskTreeFun } from '../../projectDetail/components/projectApi';
import { disposeTagKey } from '../../projectDetail/components/project';
import { getTagMapList } from '@/utils/task';
import { disposeTaskMembers, getTagMapList } from '@/utils/task';
import { modifyNodeTaskPerformanceApi } from '@/api/project/node';
import { TASK_CALCULATE_STATUS, TASK_PROCESS_STATUS } from '@/utils/enum/task';
import dayjs from 'dayjs';
import loadCaseTable from '@/components/common/treeCaseTable/loadCaseTable.vue';
import { getMemberListIds } from '@/utils/task';
// import { getMemberListIds } from '@/utils/task';
import { getUserTenantId } from '@/utils/user';
import ProjectSelect from '@/components/common/projectSelect/index.vue';
import { TABLE_NAME } from '@/utils/enum/tableName';
@@ -750,8 +750,10 @@ const addOrEditTaskFun = async () => {
// beginTime: item.planTime?.length > 0 ? item.planTime[0] : '',
// endTime: item.planTime?.length > 0 ? item.planTime[1] : '',
tenantId: getUserTenantId(),
eMemberList: getMemberListIds(item.eMemberList),
pMemberList: getMemberListIds(item.pMemberList),
...disposeTaskMembers('getIds', item),
// eMemberList: getMemberListIds(item.eMemberList),
// pMemberList: getMemberListIds(item.pMemberList),
// payAttentionMemberList: getMemberListIds(item.payAttentionMemberList),
analyseSoftware: Array.isArray(item.analyseSoftware)
? item.analyseSoftware?.join()
: item.analyseSoftware,
@@ -764,8 +766,10 @@ const addOrEditTaskFun = async () => {
// beginTime: item.planTime?.length > 0 ? item.planTime[0] : '',
// endTime: item.planTime?.length > 0 ? item.planTime[1] : '',
tenantId: getUserTenantId(),
eMemberList: getMemberListIds(item.eMemberList),
pMemberList: getMemberListIds(item.pMemberList),
...disposeTaskMembers('getIds', item),
// eMemberList: getMemberListIds(item.eMemberList),
// pMemberList: getMemberListIds(item.pMemberList),
// payAttentionMemberList: getMemberListIds(item.payAttentionMemberList),
analyseSoftware: Array.isArray(item.analyseSoftware)
? item.analyseSoftware?.join()
: item.analyseSoftware,
@@ -796,7 +800,7 @@ const updateTreeDataApi = async (insertList: any[], deleteList: any[], updateLis
return { ...item, children: [] };
})
);
const addList = disposeTreeTagKey(insertList);
disposeTreeTagKey(insertList);
if (insertList.length === 0 && updateList.length === 0 && deleteNodeList.length === 0) {
closeFun();
@@ -1089,13 +1093,20 @@ const tableFormRef = ref();
const batchUpdateTaskConfirmFun = async () => {
const updateData = tableFormRef.value.getFormDataFun();
const selectTasks = getRightVxeRef().getCheckboxRecords();
debugger;
for (let index = 0; index < selectTasks.length; index++) {
// console.log('getListAndIds', disposeTaskMembers('getListAndIds', updateData));
const newObj = {
...selectTasks[index],
pMemberList: updateData.pMemberListArr,
pMemberIds: getMemberListIds(updateData.pMemberListArr),
eMemberList: updateData.eMemberListArr,
eMemberIds: getMemberListIds(updateData.eMemberListArr),
...disposeTaskMembers('getListAndIds', updateData),
// pMemberList: updateData.pMemberListArr,
// pMemberIds: getMemberListIds(updateData.pMemberListArr),
// eMemberList: updateData.eMemberListArr,
// eMemberIds: getMemberListIds(updateData.eMemberListArr),
// // EP的关注人
// payAttentionMemberList: updateData.payAttentionMemberListArr,
// // EP的关注人
// payAttentionMemberIds: getMemberListIds(updateData.payAttentionMemberListArr),
beginTime: updateData.planTime ? updateData.planTime[0] : '',
endTime: updateData.planTime ? updateData.planTime[1] : '',
};
@@ -1109,11 +1120,20 @@ const closeBatchUpdateDialogFun = () => {
};
const tableFormChangeFun = (data: any) => {
if (data.key === 'eMemberIds') {
data.data.eMemberListArr = data.val;
}
if (data.key === 'pMemberIds') {
data.data.pMemberListArr = data.val;
// if (data.key === 'eMemberIds') {
// data.data.eMemberListArr = data.val;
// }
// if (data.key === 'pMemberIds') {
// data.data.pMemberListArr = data.val;
// }
// if (data.key === 'payAttentionMemberIds') {
// data.data.payAttentionMemberListArr = data.val;
// }
// data.data = { ...data.data, ...disposeTaskMembers('tableFormChangeFun', data) };
// disposeTaskMembers('tableFormChangeFun', data);
const memberKeys = disposeTaskMembers('tableFormChangeFun', data);
for (const key in memberKeys) {
data.data[key] = memberKeys[key];
}
};

View File

@@ -155,6 +155,9 @@
<template #eMemberIds="{ row }">
{{ disposeMemberList(row, 'eMemberList') }}
</template>
<template #payAttentionMemberIds="{ row }">
{{ disposeMemberList(row, 'payAttentionMemberList') }}
</template>
<!-- <template #eMemberIds-edit="{ row }">
<userSelect
@change="(data) => changeUserFun(row, data, 'eMemberList', 'eMemberIds')"