Merge remote-tracking branch 'origin/master'

This commit is contained in:
ye1023
2026-06-16 15:11:13 +08:00
13 changed files with 115 additions and 80 deletions
@@ -28,17 +28,18 @@
</a-space>
</div>
<a-row class="base-info-row" :gutter="[12, 4]">
<a-col :span="12">
<a-col :xs="24" :md="12">
<a-form-item label="重要讲话指示批示" name="speakStatus">
<a-textarea v-model:value="mainForm.speakStatus" :auto-size="{ minRows: 1, maxRows: 7 }" :disabled="mainDisabled" allow-clear />
</a-form-item>
</a-col>
<a-col :span="12">
<a-col :xs="24" :md="12">
<a-form-item label="学习传达研究部署" name="status">
<a-textarea v-model:value="mainForm.status" :auto-size="{ minRows: 1, maxRows: 7 }" :disabled="mainDisabled" allow-clear />
</a-form-item>
</a-col>
<template v-if="showBaseInfoDetail">
<a-divider />
<a-col :span="12">
<a-form-item label="时间" name="time">
<a-date-picker v-model:value="mainForm.time" value-format="YYYY-MM-DD" :disabled="mainDisabled" style="width: 100%" allow-clear />
@@ -325,7 +326,7 @@ import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserMod
const loading = ref(false);
const savingMain = ref(false);
const savingSubApproveUser = ref(false);
const showBaseInfoDetail = ref(true);
const showBaseInfoDetail = ref(false);
const showFeedbackDetail = ref(true);
const feedbackList = ref<any[]>([]);
const subApproveUser = ref('');
@@ -528,7 +529,7 @@ import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserMod
if (!dataId) {
return;
}
showBaseInfoDetail.value = true;
showBaseInfoDetail.value = false;
loading.value = true;
try {
const data = await defHttp.get({ url: queryByIdUrl, params: { id: dataId } });
@@ -28,13 +28,8 @@
</a-space>
</div>
<a-row class="base-info-row" :gutter="[12, 4]">
<a-col :span="24">
<a-form-item
label="具体问题"
name="problemId"
:labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
:wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
>
<a-col :xs="24" :md="12">
<a-form-item label="具体问题" name="problemId">
<a-tree-select
v-model:value="mainForm.problemId"
:tree-data="problemTreeData"
@@ -47,17 +42,13 @@
/>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item
label="整改措施"
name="improveMeasure"
:labelCol="{ xs: { span: 24 }, sm: { span: 4 } }"
:wrapperCol="{ xs: { span: 24 }, sm: { span: 20 } }"
>
<a-col :xs="24" :md="12">
<a-form-item label="整改措施" name="improveMeasure">
<a-textarea v-model:value="mainForm.improveMeasure" :auto-size="{ minRows: 1, maxRows: 4 }" :disabled="mainDisabled" allow-clear />
</a-form-item>
</a-col>
<template v-if="showBaseInfoDetail">
<a-divider />
<a-col :span="12">
<a-form-item label="密级" name="secretLevel">
<j-dict-select-tag
@@ -278,11 +269,13 @@ import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserMod
const wideLabelCol = { xs: { span: 24 }, sm: { span: 3 } };
const wideWrapperCol = { xs: { span: 24 }, sm: { span: 21 } };
const feedbackModalRef = ref();
const loading = ref(false);
const savingMain = ref(false);
const savingSubApproveUser = ref(false);
const showBaseInfoDetail = ref(true);
const showBaseInfoDetail = ref(false);
const showFeedbackDetail = ref(true);
const feedbackList = ref<any[]>([]);
const subApproveUser = ref('');
@@ -485,7 +478,7 @@ import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserMod
async function initFormData() {
const dataId = props.formData?.dataId;
if (!dataId) return;
showBaseInfoDetail.value = true;
showBaseInfoDetail.value = false;
loading.value = true;
try {
await loadProblemTree();
+6 -8
View File
@@ -260,21 +260,19 @@ export const createTaskFormSchema: FormSchema[] = [
{
label: '负责人',
field: 'assigneeId',
component: 'JSelectUser',
component: 'SzDeptUserSelect',
componentProps: {
labelKey: 'realname',
rowKey: 'id',
isRadioSelection: true,
valueKey: 'id',
multi: false,
},
},
{
label: '分配人',
field: 'assignId',
component: 'JSelectUser',
component: 'SzDeptUserSelect',
componentProps: {
labelKey: 'realname',
rowKey: 'id',
isRadioSelection: true,
valueKey: 'id',
multi: false,
},
},
{
@@ -68,11 +68,11 @@
</span>
</div>
<div class="add-panel-body">
<SzUserSelect
<SzDeptUserModal
v-model:value="addForm.userIds"
:labelKey="'realname'"
:rowKey="'id'"
placeholder="搜索并选择用户(支持多选)"
valueKey="id"
:role="1"
:secLevel="secretLevel"
/>
<div class="add-panel-row">
<span class="add-panel-label">权限</span>
@@ -106,7 +106,7 @@
import { ref, reactive, computed, nextTick } from 'vue';
import { message } from 'ant-design-vue';
import Icon from '/@/components/Icon/index';
import SzUserSelect from '/@/components/semri/userComponent/SzUserSelect.vue';
import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserModal.vue';
import { getCollaborators, addCollaborator, removeCollaborator, updateCollaboratorPermission } from '../TaskList.api';
import { getAvatarColor } from '../types';
import { checkUserSecLevel } from '../utils/taskUtils';
+24 -7
View File
@@ -11,6 +11,12 @@
<Icon icon="ant-design:plus-outlined" />
</a-button>
</a-tooltip>
<a-input-search
v-model:value="searchKeyword"
placeholder="搜索计划名称"
class="list-search-input"
allow-clear
/>
</div>
<a-tooltip title="使用帮助">
<a-button type="text" size="small" class="help-btn" @click="helpModalOpen = true">
@@ -813,13 +819,15 @@
</template>
</div>
<UserSelectModal
<SzDeptUserModal
ref="userSelectModalRef"
hide-trigger
:title="userSelectModalType === 'assignee' ? '选择负责人' : userSelectModalType === 'participant' ? '选择参与人' : '选择关注人'"
:user-ids="userSelectModalCurrentIds"
:user-names="userSelectModalCurrentNames"
:multiple="true"
:secret-level="currentList?.secretLevel || 1"
:value="userSelectModalCurrentIds"
value-key="id"
:multi="true"
:sec-level="currentList?.secretLevel || 1"
:role="1"
@confirm="onUserSelectConfirm"
/>
<HelpModal v-model:open="helpModalOpen" />
@@ -834,7 +842,7 @@
import Icon from '/@/components/Icon/index';
import AvatarDisplay from './AvatarDisplay.vue';
import draggable from 'vuedraggable';
import UserSelectModal from './UserSelectModal.vue';
import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserModal.vue';
import { useUserStore } from '/@/store/modules/user';
import { useMessage } from '/@/hooks/web/useMessage';
import { FIELD_CONFIG, GROUP_OPTIONS, SORT_OPTIONS, MAX_TASK_DEPTH, FILTER_FIELD_CONFIGS, FILTER_OPERATOR_LABELS, SECRET_LEVEL_COLOR } from '../types';
@@ -920,6 +928,7 @@
});
const submittingGroup = ref(false);
const submittingRename = ref(false);
const searchKeyword = ref('');
const filterVisible = ref(false);
const fieldConfigVisible = ref(false);
const collapsedGroups = ref<Set<string>>(new Set());
@@ -1118,10 +1127,13 @@
const allTaskLists = computed(() => {
const lists: TaskList[] = [];
const keyword = searchKeyword.value.trim().toLowerCase();
for (const group of props.taskListGroups) {
for (const list of group.taskLists) {
if (list.delFlag !== 1) {
lists.push(list);
if (!keyword || list.name.toLowerCase().includes(keyword)) {
lists.push(list);
}
}
}
}
@@ -1923,6 +1935,11 @@
}
}
.list-search-input {
width: 220px;
margin-left: 16px;
}
.help-btn {
color: #888;
font-size: 18px;
@@ -357,13 +357,15 @@
</div>
</template>
<UserSelectModal
<SzDeptUserModal
ref="userSelectModalRef"
hide-trigger
:title="drawerUserSelectType === 'assignee' ? '选择负责人' : drawerUserSelectType === 'participant' ? '选择参与人' : '选择关注人'"
:user-ids="drawerUserSelectCurrentIds"
:user-names="drawerUserSelectCurrentNames"
:multiple="true"
:secret-level="currentListSecretLevel || 1"
:value="drawerUserSelectCurrentIds"
value-key="id"
:multi="true"
:sec-level="currentListSecretLevel || 1"
:role="1"
@confirm="onUserSelectModalConfirm"
/>
@@ -376,6 +378,7 @@
import Icon from '/@/components/Icon/index';
import AvatarDisplay from './AvatarDisplay.vue';
import SzUserSelectBySecLevel from '/@/components/semri/userComponent/SzUserSelectBySecLevel.vue';
import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserModal.vue';
import TaskAttachmentUpload from './TaskAttachmentUpload.vue';
import TaskDateRangePicker from './TaskDateRangePicker.vue';
import draggable from 'vuedraggable';
@@ -443,7 +446,7 @@
const drawerUserSelectType = ref<'assignee' | 'followers' | 'participant'>('assignee');
const drawerUserSelectCurrentIds = ref<string>('');
const drawerUserSelectCurrentNames = ref<string>('');
const userSelectModalRef = ref<InstanceType<typeof UserSelectModal> | null>(null);
const userSelectModalRef = ref<InstanceType<typeof SzDeptUserModal> | null>(null);
const fileUploadRef = ref<InstanceType<typeof TaskAttachmentUpload> | null>(null);
const parentTask = computed(() => {
@@ -336,12 +336,14 @@
</div>
</div>
<UserSelectModal
<SzDeptUserModal
ref="userSelectModalRef"
hide-trigger
:title="userSelectModalType === 'assignee' ? '选择负责人' : userSelectModalType === 'participant' ? '选择参与人' : '选择关注人'"
:user-ids="userSelectModalCurrentIds"
:user-names="userSelectModalCurrentNames"
:multiple="true"
:value="userSelectModalCurrentIds"
value-key="id"
:multi="true"
:role="1"
@confirm="onUserSelectConfirm"
/>
</a-spin>
@@ -353,7 +355,7 @@
import dayjs from 'dayjs';
import Icon from '/@/components/Icon/index';
import AvatarDisplay from './AvatarDisplay.vue';
import UserSelectModal from './UserSelectModal.vue';
import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserModal.vue';
import { FIELD_CONFIG, SORT_OPTIONS, MAX_TASK_DEPTH } from '../types';
import { PRIORITY_OPTIONS, getPriorityBg, getPriorityLabel, isOverdue } from '../utils/taskUtils';
import type { TaskItem, StatusFilter, SortField, SortDirection, FieldKey, FlatTaskItem } from '../types';
@@ -47,11 +47,12 @@
</span>
</div>
<div class="add-panel-body">
<SzUserSelect
<SzDeptUserModal
v-model:value="addForm.userIds"
:labelKey="'realname'"
:rowKey="'id'"
placeholder="搜索并选择用户(支持多选)"
valueKey="id"
:multi="multiple"
:role="1"
:secLevel="secretLevel"
/>
</div>
<div class="add-panel-footer">
@@ -78,7 +79,7 @@
import { ref, reactive, computed } from 'vue';
import { message } from 'ant-design-vue';
import Icon from '/@/components/Icon/index';
import SzUserSelect from '/@/components/semri/userComponent/SzUserSelect.vue';
import SzDeptUserModal from '/@/components/semri/deptUserComponent/SzDeptUserModal.vue';
import { getAvatarColor } from '../types';
import { getUserList } from '/@/api/common/api';
import { checkUserSecLevel } from '../utils/taskUtils';