diff --git a/src/components/semri/process/FlowScheduleStartModal.vue b/src/components/semri/process/FlowScheduleStartModal.vue index e061914..6ffc007 100644 --- a/src/components/semri/process/FlowScheduleStartModal.vue +++ b/src/components/semri/process/FlowScheduleStartModal.vue @@ -20,6 +20,16 @@ /> + + + + @@ -79,6 +89,8 @@ showSuoleaderFields?: boolean; isNeedAppro?: string | number; supDeptleaderid?: string | string[]; + showDeadlineField?: boolean; + deadline?: string | Date; } interface DeptOption { @@ -94,6 +106,7 @@ const contextData = ref>({}); const deptOptions = ref([]); const showSuoleaderFields = ref(false); + const showDeadlineField = ref(false); const formData = reactive({ triggerMode: 'immediate', intervalType: undefined as number | string | undefined, @@ -102,6 +115,7 @@ deptIds: [] as string[], isNeedAppro: '0', supDeptleaderid: '' as string | string[], + deadline: undefined as string | undefined, }); function resetForm() { @@ -112,8 +126,10 @@ formData.deptIds = []; formData.isNeedAppro = '0'; formData.supDeptleaderid = ''; + formData.deadline = undefined; deptOptions.value = []; showSuoleaderFields.value = false; + showDeadlineField.value = false; } function normalizeDeptOptions(options: DeptOption[] = []) { @@ -131,6 +147,19 @@ return Array.from(optionMap.values()); } + function normalizeDeadlineValue(value?: string | Date) { + if (!value) { + return undefined; + } + if (typeof value === 'string') { + return value.length >= 10 ? value.substring(0, 10) : value; + } + const year = value.getFullYear(); + const month = String(value.getMonth() + 1).padStart(2, '0'); + const day = String(value.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; + } + function open(data: ModalPayload = {}) { resetForm(); title.value = data.title || '发起流程'; @@ -140,6 +169,8 @@ showSuoleaderFields.value = !!data.showSuoleaderFields; formData.isNeedAppro = String(data.isNeedAppro ?? '0'); formData.supDeptleaderid = data.supDeptleaderid || ''; + showDeadlineField.value = !!data.showDeadlineField; + formData.deadline = normalizeDeadlineValue(data.deadline); if (String(formData.isNeedAppro) !== '1') { formData.supDeptleaderid = ''; } @@ -170,6 +201,11 @@ return; } + if (showDeadlineField.value && !formData.deadline) { + createMessage.warning('请选择事项截止时间'); + return; + } + emit('confirm', { payload: contextData.value, options: { @@ -181,6 +217,7 @@ deptIds: [...formData.deptIds], isNeedAppro: showSuoleaderFields.value ? formData.isNeedAppro : undefined, supDeptleaderid: showSuoleaderFields.value ? (String(formData.isNeedAppro) === '1' ? formData.supDeptleaderid : '') : undefined, + deadline: showDeadlineField.value ? formData.deadline : undefined, }, }); handleCancel(); diff --git a/src/router/routes/modules/dashboard.ts b/src/router/routes/modules/dashboard.ts index d09e816..c83a596 100644 --- a/src/router/routes/modules/dashboard.ts +++ b/src/router/routes/modules/dashboard.ts @@ -31,6 +31,14 @@ const dashboard: AppRouteModule = { title: t('routes.dashboard.workbench'), }, }, + { + path: 'processPortal', + name: 'ProcessPortal', + component: () => import('/@/views/dashboard/ProcessPortal/index.vue'), + meta: { + title: '流程门户', + }, + }, ], }; diff --git a/src/utils/http/axios/index.ts b/src/utils/http/axios/index.ts index 2052948..a2316c5 100644 --- a/src/utils/http/axios/index.ts +++ b/src/utils/http/axios/index.ts @@ -276,7 +276,7 @@ function createAxios(opt?: Partial) { // authenticationScheme: 'Bearer', authenticationScheme: '', //接口超时设置 - timeout: 10 * 1000, + timeout: 20 * 1000, // 基础接口地址 // baseURL: globSetting.apiUrl, headers: { 'Content-Type': ContentTypeEnum.JSON }, diff --git a/src/views/bg/bgpartymatter/BgPartymatter.data.ts b/src/views/bg/bgpartymatter/BgPartymatter.data.ts index 6cd7768..04ec9ff 100644 --- a/src/views/bg/bgpartymatter/BgPartymatter.data.ts +++ b/src/views/bg/bgpartymatter/BgPartymatter.data.ts @@ -6,16 +6,10 @@ import { getWeekMonthQuarterYear } from '/@/utils'; //列表数据 export const columns: BasicColumn[] = [ { - title: '序号', + title: '年份', align:"center", - dataIndex: 'number', - sorter: true, - }, - { - title: '督办次数', - align:"center", - dataIndex: 'superviseCount', - width: '100px', + dataIndex: 'year', + width: '60px', }, { title: '事项名称', @@ -23,20 +17,9 @@ export const columns: BasicColumn[] = [ dataIndex: 'title' }, { - title: '年份', + title: '序号', align:"center", - dataIndex: 'year', - width: '60px', - }, - - { - title: '会议时间', - align:"center", - dataIndex: 'matterTime', - customRender:({text}) =>{ - text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); - return text; - }, + dataIndex: 'number', sorter: true, }, { @@ -50,10 +33,50 @@ export const columns: BasicColumn[] = [ dataIndex: 'matterCode' }, { - title: '责任部门', + title: '督办次数', + align:"center", + dataIndex: 'superviseCount', + width: '100px', + }, + + { + title: '会议时间', + align:"center", + dataIndex: 'matterTime', + customRender:({text}) =>{ + text = !text ? "" : (text.length > 10 ? text.substr(0,10) : text); + return text; + }, + sorter: true, + }, + { + title: '议题序号', + align:"center", + dataIndex: 'itemNumber', + sorter: true, + width: '100px', + }, + + { + title: '抄告单编号', + align:"center", + dataIndex: 'noticeNumber' + }, + { + title: '是否为三重一大决策', + align:"center", + dataIndex: 'isImportant_dictText' + }, + { + title: '主办部门', align:"center", dataIndex: 'responDeptid_dictText' }, + { + title: '协办部门', + align:"center", + dataIndex: 'assistDeptid_dictText' + }, { title: '实际执行情况', align:"center", @@ -69,7 +92,7 @@ export const columns: BasicColumn[] = [ }, }, { - title: '紧急程度', + title: '是否急件', align:"center", dataIndex: 'urgencyLevel_dictText', }, @@ -146,7 +169,8 @@ export const bgPartymatterFeedbackColumns: BasicColumn[] = [ { title: '完成状态', align:"center", - dataIndex: 'bpmStatus' + dataIndex: 'bpmStatus', + customRender: ({ record }) => record?.bpmStatus_dictText || record?.bpmStatus }, // { // title: '外键', @@ -159,18 +183,21 @@ export const bgPartymatterFeedbackColumns: BasicColumn[] = [ export const superQuerySchema = { year: {title: '年份',order: 0,view: 'text', type: 'string',}, number: {title: '序号',order: 1,view: 'text', type: 'string',}, - matterTime: {title: '会议时间',order: 2,view: 'date', type: 'string',}, - title: {title: '事项名称',order: 3,view: 'text', type: 'string',}, - content: {title: '会议决议',order: 4,view: 'textarea', type: 'string',}, - matterCode: {title: '事项目录编码',order: 5,view: 'text', type: 'string',}, - responDeptid: {title: '责任部门',order: 6,view: 'sel_depart', type: 'string',}, - actualExect: {title: '实际执行情况',order: 7,view: 'text', type: 'string',}, - bpmStatus: {title: '完成状态',order: 8,view: 'text', type: 'string',}, - superviseCount: {title: '督办次数',order: 9,view: 'text', type: 'string',}, - deadline: {title: '要求完成日期',order: 10,view: 'date', type: 'string',}, - urgencyLevel: {title: '紧急程度',order: 11,view: 'text', type: 'string',}, - isNeedAppro: {title: '是否需要所办领导审批',order: 12,view: 'switch', type: 'string',}, - supDeptleaderid: {title: '所办领导',order: 13,view: 'sel_user', type: 'string',}, - isNeedSuoleader: {title: '是否抄送所领导',order: 14,view: 'switch', type: 'string',}, - suoleaderid: {title: '抄送所领导',order: 15,view: 'sel_user', type: 'string',}, + itemNumber: {title: '议题序号',order: 2,view: 'number', type: 'number',}, + matterTime: {title: '会议时间',order: 3,view: 'date', type: 'string',}, + title: {title: '事项名称',order: 4,view: 'text', type: 'string',}, + content: {title: '会议决议',order: 5,view: 'textarea', type: 'string',}, + matterCode: {title: '事项目录编码',order: 6,view: 'text', type: 'string',}, + noticeNumber: {title: '抄告单编号',order: 7,view: 'text', type: 'string',}, + isImportant: {title: '是否为三重一大决策',order: 8,view: 'list', type: 'string', dictCode: 'yn',}, + responDeptid: {title: '责任部门',order: 9,view: 'sel_depart', type: 'string',}, + actualExect: {title: '实际执行情况',order: 10,view: 'text', type: 'string',}, + bpmStatus: {title: '完成状态',order: 11,view: 'text', type: 'string',}, + superviseCount: {title: '督办次数',order: 12,view: 'text', type: 'string',}, + deadline: {title: '要求完成日期',order: 13,view: 'date', type: 'string',}, + urgencyLevel: {title: '是否急件',order: 14,view: 'list', type: 'string', dictCode: 'yn',}, + isNeedAppro: {title: '是否需要所办领导审批',order: 15,view: 'switch', type: 'string',}, + supDeptleaderid: {title: '所办领导',order: 16,view: 'sel_user', type: 'string',}, + isNeedSuoleader: {title: '是否抄送所领导',order: 17,view: 'switch', type: 'string',}, + suoleaderid: {title: '抄送所领导',order: 18,view: 'sel_user', type: 'string',}, }; diff --git a/src/views/bg/bgpartymatter/BgPartymatterList.vue b/src/views/bg/bgpartymatter/BgPartymatterList.vue index 309bcfa..f2cb572 100644 --- a/src/views/bg/bgpartymatter/BgPartymatterList.vue +++ b/src/views/bg/bgpartymatter/BgPartymatterList.vue @@ -9,9 +9,9 @@ - - - + + + @@ -19,9 +19,14 @@ - - - + + + + + + + + @@ -139,7 +144,7 @@ import { list, deleteOne, batchDelete, getImportUrl, getExportUrl, bgPartymatterFeedbackList, saveOrUpdate } from './BgPartymatter.api'; const FLOW_CODE = 'dev_task_task_001'; - const FLOW_NAME = '党委会决议事项'; + const FLOW_NAME = '党委会决议事项督办'; const BUSINESS_TABLE_NAME = 'bg_partymatter'; const FORM_URL = 'bg/bgpartymatter/components/BgPartymatterBPMForm'; @@ -433,6 +438,8 @@ showSuoleaderFields: true, isNeedAppro: record?.isNeedAppro, supDeptleaderid: record?.supDeptleaderid, + showDeadlineField: true, + deadline: record?.deadline, }); } @@ -447,12 +454,34 @@ } function getResponsibleDeptOptions(record): DeptOption[] { - const deptIds = splitDeptValue(record?.responDeptid); - const deptNames = splitDeptValue(record?.responDeptid_dictText || record?.responDeptname); - return deptIds.map((deptId, index) => ({ - value: deptId, - label: deptNames[index] || deptId, - })); + const optionMap = new Map(); + [ + { + ids: splitDeptValue(record?.responDeptid), + names: splitDeptValue(record?.responDeptid_dictText || record?.responDeptname), + }, + { + ids: splitDeptValue(record?.assistDeptid), + names: splitDeptValue(record?.assistDeptid_dictText || record?.assistDeptname), + }, + ].forEach(({ ids, names }) => { + ids.forEach((deptId, index) => { + if (optionMap.has(deptId)) { + return; + } + optionMap.set(deptId, { + value: deptId, + label: names[index] || deptId, + }); + }); + }); + return Array.from(optionMap.values()); + } + + function getResponsibleDeptIds(record) { + return getResponsibleDeptOptions(record) + .map((item) => item.value) + .join(','); } function getNextSuperviseCount(value) { @@ -474,12 +503,19 @@ const formatDate = (value, format) => { return value ? dateUtil(value).format(format) : undefined; }; + const formatDeadlineDateTime = (value) => { + const deadlineDate = formatDate(value, 'YYYY-MM-DD'); + return deadlineDate ? `${deadlineDate} 00:00:00` : undefined; + }; const nextSuperviseCount = getNextSuperviseCount(record.superviseCount); + const selectedDeadline = options.deadline || record.deadline; + const defaultDeptIds = getResponsibleDeptIds(record); const flowJsonData = { ...record, isNeedAppro: options.isNeedAppro ?? record.isNeedAppro ?? '', supDeptleaderid: options.supDeptleaderid ?? record.supDeptleaderid ?? '', superviseCount: nextSuperviseCount, + deadline: selectedDeadline, }; const params = { @@ -500,10 +536,10 @@ title: record.title, content: record.content, urgencyLevel: record.urgencyLevel, - deptId: options.deptId || record.responDeptid, + deptId: options.deptId || defaultDeptIds, deptLeaderId: record.responDeptid, - requireFinishDate: formatDate(record.deadline, 'YYYY-MM-DD'), - deadline: formatDate(record.deadline, 'YYYY-MM-DD HH:mm:ss'), + requireFinishDate: formatDate(selectedDeadline, 'YYYY-MM-DD'), + deadline: formatDeadlineDateTime(selectedDeadline), }, }; diff --git a/src/views/bg/bgpartymatter/components/BgPartymatterBPMFeedbackModal.vue b/src/views/bg/bgpartymatter/components/BgPartymatterBPMFeedbackModal.vue index 74e892d..46cffd8 100644 --- a/src/views/bg/bgpartymatter/components/BgPartymatterBPMFeedbackModal.vue +++ b/src/views/bg/bgpartymatter/components/BgPartymatterBPMFeedbackModal.vue @@ -1,6 +1,6 @@ --> - + @@ -78,6 +78,7 @@ import { useUserStore } from '/@/store/modules/user'; import { buildUUID } from '/@/utils/uuid'; import SUploadFile from '/@/components/semri/fileComponent/SUploadFile.vue'; + import JDictSelectTag from '/@/components/Form/src/jeecg/components/JDictSelectTag.vue'; const emit = defineEmits(['success']); const { createMessage } = useMessage(); @@ -85,6 +86,7 @@ const visible = ref(false); const saving = ref(false); + const modalTitle = ref('新增反馈'); const formRef = ref(); const uploadFileRef = ref | null>(null); const uploadSecretLevel = ref(1); @@ -121,10 +123,22 @@ nextTick(() => formRef.value?.clearValidate?.()); } - function open(mainId: string, secretLevel?: string | number, bpmProcessId = '') { + function open(mainId: string, secretLevel?: string | number, bpmProcessId = '', record?: Record) { resetForm(mainId, bpmProcessId); uploadSecretLevel.value = normalizeSecretLevel(secretLevel); - void applyCurrentUserFeedbackInfo(); + if (record?.id) { + modalTitle.value = '编辑反馈'; + Object.keys(formData).forEach((key) => { + if (Object.prototype.hasOwnProperty.call(record, key)) { + formData[key] = record[key] ?? ''; + } + }); + formData.mainId = formData.mainId || mainId; + formData.bpmProcessId = formData.bpmProcessId || bpmProcessId; + } else { + modalTitle.value = '新增反馈'; + void applyCurrentUserFeedbackInfo(); + } visible.value = true; } @@ -186,11 +200,14 @@ } saving.value = true; try { - await applyCurrentUserFeedbackInfo(); - if (!formData.id && uploadFileRef.value?.hasPendingFiles?.()) { + const isUpdate = !!formData.id; + if (!isUpdate) { + await applyCurrentUserFeedbackInfo(); + } + if (!isUpdate && uploadFileRef.value?.hasPendingFiles?.()) { formData.id = buildUUID(); } - const res = await bgPartymatterFeedbackSaveOrUpdate({ ...formData }, false); + const res = await bgPartymatterFeedbackSaveOrUpdate({ ...formData }, isUpdate); if (res.success) { if (formData.id && uploadFileRef.value?.hasPendingFiles?.()) { await uploadFileRef.value.bindBussinessId(formData.id); diff --git a/src/views/bg/bgpartymatter/components/BgPartymatterBPMForm.vue b/src/views/bg/bgpartymatter/components/BgPartymatterBPMForm.vue index ac23975..a8d06e0 100644 --- a/src/views/bg/bgpartymatter/components/BgPartymatterBPMForm.vue +++ b/src/views/bg/bgpartymatter/components/BgPartymatterBPMForm.vue @@ -40,7 +40,12 @@ - + + + + + + @@ -54,19 +59,34 @@ + + + + + + + + + + + + + + + - - + + @@ -104,12 +124,13 @@ :columns="feedbackColumns" :data-source="feedbackList" :pagination="false" - :scroll="{ x: 1220 }" + :scroll="{ x: feedbackTableScrollX }" > - + + + 编辑 + + 删除 + + + @@ -173,7 +202,7 @@ import { useMessage } from '/@/hooks/web/useMessage'; import JSelectDept from '/@/components/Form/src/jeecg/components/JSelectDept.vue'; import Icon from '/@/components/Icon/index'; - import { bgPartymatterFeedbackList, saveBpmForm, setProcessVariable } from '../BgPartymatter.api'; + import { bgPartymatterFeedbackDelete, bgPartymatterFeedbackList, saveBpmForm, setProcessVariable } from '../BgPartymatter.api'; import { usePermission } from '/@/hooks/web/usePermission'; import TaskHandleInnerContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskHandleInnerContent.vue'; import JDictSelectTag from "../../../../components/Form/src/jeecg/components/JDictSelectTag.vue"; @@ -211,19 +240,25 @@ const savingSubApproveUser = ref(false); const showBaseInfoDetail = ref(false); const feedbackList = ref([]); + const feedbackAttachmentRefreshKey = ref(0); const subApproveUser = ref(''); const isEnd = ref(0); + const lastGeneratedNumber = ref(''); const mainForm = reactive>({ id: '', year: '', secretLevel: '', number: '', + itemNumber: undefined, matterTime: '', title: '', content: '', matterCode: '', + noticeNumber: '', + isImportant: '', responDeptid: '', + assistDeptid: '', actualExect: '', bpmStatus: '', superviseCount: '', @@ -239,14 +274,21 @@ intervalStartTime: '', }); - const feedbackColumns = [ + const feedbackBaseColumns = [ { title: '责任部门名称', dataIndex: 'responDeptname', align: 'center', width: 160 }, { title: '反馈人姓名', dataIndex: 'responPersonname', align: 'center', width: 140 }, { title: '实际执行情况', dataIndex: 'actualExect', align: 'left', width: 280 }, { title: '实际完成时间', dataIndex: 'actualTime', align: 'center', width: 180 }, - { title: '完成状态', dataIndex: 'bpmStatus', align: 'center', width: 120 }, + { title: '完成状态', dataIndex: 'bpmStatus', align: 'center', width: 120, customRender: ({ record }) => record?.bpmStatus_dictText || record?.bpmStatus }, { title: '附件', dataIndex: 'id', key: 'attachments', align: 'left', width: 340 }, ]; + const feedbackActionColumn = { title: '操作', dataIndex: 'action', key: 'action', align: 'center', width: 120, fixed: 'right' }; + const feedbackColumns = computed(() => { + return canManageFeedback.value ? [...feedbackBaseColumns, feedbackActionColumn] : feedbackBaseColumns; + }); + const feedbackTableScrollX = computed(() => { + return canManageFeedback.value ? 1340 : 1220; + }); const mainDisabled = computed(() => { if (props.formBpm) { @@ -254,7 +296,9 @@ } return props.formDisabled; }); - const showProcessHandle = computed(() => props.formBpm && !!props.formData?.taskId); + // 只有待办办理入口展示流程办理区,历史/抄送查看即使有 taskId 也只展示业务表单。 + const showProcessHandle = computed(() => props.formBpm && props.formData?.PROCESS_TAB_TYPE === 'run' && !!props.formData?.taskId); + const canManageFeedback = computed(() => props.formBpm && props.formData?.PROCESS_TAB_TYPE === 'run' && !!props.formData?.taskId); const showAddFeedback = computed(() => String(props.formData?.extendUrlParams?.addfeedback ?? '') === '1'); const showSubApproveUser = computed(() => String(props.formData?.extendUrlParams?.selectuser ?? '') === '1'); const showSubApproveUserSelector = computed(() => showSubApproveUser.value && String(isEnd.value) !== '1'); @@ -291,6 +335,14 @@ { immediate: true } ); + // 根据会议时间和议题序号自动生成业务序号,例如:2026-05-20 + 2 => 20260520-2。 + watch( + () => [mainForm.matterTime, mainForm.itemNumber], + () => { + syncGeneratedNumber(); + } + ); + async function initFormData() { const dataId = props.formData?.dataId; if (!dataId) { @@ -313,14 +365,62 @@ }); } + function syncGeneratedNumber() { + const generatedNumber = buildGeneratedNumber(mainForm.matterTime, mainForm.itemNumber); + if (generatedNumber) { + mainForm.number = generatedNumber; + lastGeneratedNumber.value = generatedNumber; + return; + } + if (lastGeneratedNumber.value && mainForm.number === lastGeneratedNumber.value) { + mainForm.number = ''; + lastGeneratedNumber.value = ''; + } + } + + // 只在两个必要字段都填写后生成,避免用户未填完整时写入半截序号。 + function buildGeneratedNumber(matterTime, itemNumber) { + const dateText = formatMatterTime(matterTime); + if (!dateText || itemNumber === undefined || itemNumber === null || itemNumber === '') { + return ''; + } + return `${dateText}-${itemNumber}`; + } + + // 兼容日期选择器返回的字符串、Date、dayjs/moment 对象。 + function formatMatterTime(value) { + if (!value) { + return ''; + } + if (typeof value === 'string') { + return value.slice(0, 10).replace(/-/g, ''); + } + if (value instanceof Date) { + const year = value.getFullYear(); + const month = String(value.getMonth() + 1).padStart(2, '0'); + const day = String(value.getDate()).padStart(2, '0'); + return `${year}${month}${day}`; + } + if (typeof value.format === 'function') { + return value.format('YYYYMMDD'); + } + return ''; + } + async function loadFeedbackList() { const bpmProcessId = processInfo.value.processInstanceId; if (!mainForm.id || !bpmProcessId) { feedbackList.value = []; + feedbackAttachmentRefreshKey.value += 1; return; } const res = await bgPartymatterFeedbackList({ mainId: mainForm.id, bpmProcessId, pageNo: 1, pageSize: 999 }); feedbackList.value = res?.records || res?.result?.records || []; + feedbackAttachmentRefreshKey.value += 1; + } + + function getFeedbackAttachmentKey(record: Recordable) { + return `${record?.id || ''}-${feedbackAttachmentRefreshKey.value}`; } async function submitForm() { @@ -383,6 +483,36 @@ feedbackModalRef.value?.open(mainForm.id, mainForm.secretLevel, processInstanceId); } + function openFeedbackEditModal(record: Recordable) { + if (!canManageFeedback.value) { + createMessage.warning('当前流程状态不允许编辑反馈'); + return; + } + if (!record?.id) { + createMessage.warning('反馈记录不存在,无法编辑'); + return; + } + feedbackModalRef.value?.open(mainForm.id, mainForm.secretLevel, processInfo.value.processInstanceId, record); + } + + async function handleFeedbackDelete(record: Recordable) { + if (!canManageFeedback.value) { + createMessage.warning('当前流程状态不允许删除反馈'); + return; + } + if (!record?.id) { + createMessage.warning('反馈记录不存在,无法删除'); + return; + } + try { + await bgPartymatterFeedbackDelete({ id: record.id }, () => undefined); + createMessage.success('删除成功'); + await loadFeedbackList(); + } catch (error) { + createMessage.warning('删除失败'); + } + } + async function saveSubApproveUserVariable(options: { showSuccessMessage?: boolean } = {}) { const { showSuccessMessage = true } = options; const processInstanceId = processInfo.value.processInstanceId; @@ -556,6 +686,7 @@ } :deep(.ant-input), + :deep(.ant-input-number), :deep(.ant-picker), :deep(.ant-select-selector) { min-height: 30px; @@ -572,6 +703,9 @@ :deep(.ant-input-affix-wrapper-disabled-focused), :deep(.ant-input-outlined[disabled]), :deep(.ant-input-outlined.ant-input-disabled), + :deep(.ant-input-number-disabled), + :deep(.ant-input-number-disabled:hover), + :deep(.ant-input-number-disabled:focus), :deep(textarea.ant-input[disabled]), :deep(.ant-picker-disabled), :deep(.ant-select-disabled .ant-select-selector) { @@ -585,6 +719,7 @@ :deep(.ant-input[disabled]), :deep(.ant-input-disabled), + :deep(.ant-input-number-disabled), :deep(.ant-input-affix-wrapper-disabled), :deep(textarea.ant-input[disabled]) { padding-left: 0 !important; @@ -597,6 +732,13 @@ cursor: default !important; } + :deep(.ant-input-number-disabled .ant-input-number-input) { + background: transparent !important; + color: #1f2937 !important; + -webkit-text-fill-color: #1f2937 !important; + cursor: default !important; + } + :deep(.ant-input[disabled]::placeholder), :deep(.ant-input-disabled::placeholder), :deep(.ant-input-affix-wrapper-disabled .ant-input::placeholder) { @@ -631,6 +773,7 @@ :deep(.ant-picker-disabled .ant-picker-suffix), :deep(.ant-input-disabled .ant-input-clear-icon), :deep(.ant-input-affix-wrapper-disabled .ant-input-clear-icon), + :deep(.ant-input-number-disabled .ant-input-number-handler-wrap), :deep(.ant-select-disabled .ant-select-clear) { display: none; } diff --git a/src/views/bg/bgpartymatter/components/BgPartymatterForm.vue b/src/views/bg/bgpartymatter/components/BgPartymatterForm.vue index a6ad225..cb51c04 100644 --- a/src/views/bg/bgpartymatter/components/BgPartymatterForm.vue +++ b/src/views/bg/bgpartymatter/components/BgPartymatterForm.vue @@ -9,21 +9,26 @@ + + + + + + + + + + + + + + + - - - - - - - - - - @@ -40,10 +45,25 @@ - + + + + + + + + + + + + + + + + @@ -65,8 +85,8 @@ - - + + @@ -144,16 +164,20 @@ year: '', secretLevel: '', number: '', + itemNumber: undefined, matterTime: '', title: '', content: '', matterCode: '', + noticeNumber: '', + isImportant: '', responDeptid: '', + assistDeptid: '', actualExect: '', bpmStatus: '1', superviseCount: '0', deadline: '', - urgencyLevel: '1', + urgencyLevel: '0', isNeedAppro: '', supDeptleaderid: '', isNeedSuoleader: '', @@ -214,6 +238,58 @@ } ); + const lastGeneratedNumber = ref(''); + + // 根据会议时间和议题序号自动生成业务序号,例如:2026-05-20 + 2 => 20260520-2。 + watch( + () => [formData.matterTime, formData.itemNumber], + () => { + syncGeneratedNumber(); + } + ); + + function syncGeneratedNumber() { + const generatedNumber = buildGeneratedNumber(formData.matterTime, formData.itemNumber); + if (generatedNumber) { + formData.number = generatedNumber; + lastGeneratedNumber.value = generatedNumber; + return; + } + if (lastGeneratedNumber.value && formData.number === lastGeneratedNumber.value) { + formData.number = ''; + lastGeneratedNumber.value = ''; + } + } + + // 只在两个必要字段都填写后生成,避免用户未填完整时写入半截序号。 + function buildGeneratedNumber(matterTime, itemNumber) { + const dateText = formatMatterTime(matterTime); + if (!dateText || itemNumber === undefined || itemNumber === null || itemNumber === '') { + return ''; + } + return `${dateText}-${itemNumber}`; + } + + // 兼容日期选择器返回的字符串、Date、dayjs/moment 对象。 + function formatMatterTime(value) { + if (!value) { + return ''; + } + if (typeof value === 'string') { + return value.slice(0, 10).replace(/-/g, ''); + } + if (value instanceof Date) { + const year = value.getFullYear(); + const month = String(value.getMonth() + 1).padStart(2, '0'); + const day = String(value.getDate()).padStart(2, '0'); + return `${year}${month}${day}`; + } + if (typeof value.format === 'function') { + return value.format('YYYYMMDD'); + } + return ''; + } + onMounted(()=>{ initFormData(); }); diff --git a/src/views/dashboard/ProcessPortal/components/MyWork.vue b/src/views/dashboard/ProcessPortal/components/MyWork.vue new file mode 100644 index 0000000..67cb19c --- /dev/null +++ b/src/views/dashboard/ProcessPortal/components/MyWork.vue @@ -0,0 +1,342 @@ + + + + 我的工作 + + + + 待办 + {{ todoTotal }} + + 我的抄送 + + + 更多 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/dashboard/ProcessPortal/components/StatCards.vue b/src/views/dashboard/ProcessPortal/components/StatCards.vue new file mode 100644 index 0000000..bf72c96 --- /dev/null +++ b/src/views/dashboard/ProcessPortal/components/StatCards.vue @@ -0,0 +1,195 @@ + + + + + + {{ item.title }} + + + + + + + + + + + + + diff --git a/src/views/dashboard/ProcessPortal/components/WelcomeBanner.vue b/src/views/dashboard/ProcessPortal/components/WelcomeBanner.vue new file mode 100644 index 0000000..fd0582c --- /dev/null +++ b/src/views/dashboard/ProcessPortal/components/WelcomeBanner.vue @@ -0,0 +1,180 @@ + + + + + + + {{ greeting }},{{ userinfo.realname }}👋 + + 今天有 8 项待办、 + 2 项即将超时 + + + + + + {{ formattedDate }} + + + + {{ formattedTime }} + + + + + + + + + diff --git a/src/views/dashboard/ProcessPortal/data/cc.data.ts b/src/views/dashboard/ProcessPortal/data/cc.data.ts new file mode 100644 index 0000000..5ab5e60 --- /dev/null +++ b/src/views/dashboard/ProcessPortal/data/cc.data.ts @@ -0,0 +1,28 @@ +import { BasicColumn } from '/@/components/Table'; + +export const ccColumns: BasicColumn[] = [ + { + title: '业务标题', + align: 'center', + dataIndex: 'bpmBizTitle', + ellipsis: true, + }, + { + title: '任务名称', + align: 'center', + width: 260, + dataIndex: 'taskName', + }, + { + title: '发起人', + align: 'center', + width: 160, + dataIndex: 'processApplyUserName', + }, + { + title: '办理人', + align: 'center', + width: 160, + dataIndex: 'taskAssigneeName', + }, +]; diff --git a/src/views/dashboard/ProcessPortal/data/todo.data.ts b/src/views/dashboard/ProcessPortal/data/todo.data.ts new file mode 100644 index 0000000..f617042 --- /dev/null +++ b/src/views/dashboard/ProcessPortal/data/todo.data.ts @@ -0,0 +1,43 @@ +import { BasicColumn } from '/@/components/Table'; +import { Tag } from 'ant-design-vue'; +import { h } from 'vue'; + +export const todoColumns: BasicColumn[] = [ + { + title: '业务标题', + align: 'center', + dataIndex: 'bpmBizTitle', + ellipsis: true, + }, + { + title: '当前环节', + align: 'center', + width: 200, + dataIndex: 'taskName', + }, + { + title: '转入时间', + align: 'center', + width: 160, + dataIndex: 'taskBeginTime', + }, + { + title: '事项截止时间', + align: 'center', + width: 160, + dataIndex: 'deadline', + customRender: ({ text, record }) => { + const value = !text ? '' : text.length > 10 ? text.substr(0, 10) : text; + if (!value) { + return ''; + } + if (record.deadlineOverdue) { + return h(Tag, { color: 'error' }, () => (record.deadlineWarnText ? `${value} ${record.deadlineWarnText}` : value)); + } + if (record.deadlineSoon) { + return h(Tag, { color: 'warning' }, () => (record.deadlineWarnText ? `${value} ${record.deadlineWarnText}` : value)); + } + return value; + }, + }, +]; diff --git a/src/views/dashboard/ProcessPortal/index.vue b/src/views/dashboard/ProcessPortal/index.vue new file mode 100644 index 0000000..d6ff21e --- /dev/null +++ b/src/views/dashboard/ProcessPortal/index.vue @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/src/views/super/bpm/process/personalOffice/myHandleTask/TaskRunningList.vue b/src/views/super/bpm/process/personalOffice/myHandleTask/TaskRunningList.vue index de98a1d..6641707 100644 --- a/src/views/super/bpm/process/personalOffice/myHandleTask/TaskRunningList.vue +++ b/src/views/super/bpm/process/personalOffice/myHandleTask/TaskRunningList.vue @@ -64,7 +64,7 @@ //办理 const [registerHandleModal, { openModal: openHandleModal }] = useModal(); async function handleProcess(record) { - debugger + //debugger let { formData, formUrl } = await getTaskNodeInfo(record); formData['PROCESS_TAB_TYPE'] = 'run'; openHandleModal(true, { diff --git a/src/views/super/bpm/process/personalOffice/myHandleTask/useTaskList.ts b/src/views/super/bpm/process/personalOffice/myHandleTask/useTaskList.ts index c9e333f..69eb958 100644 --- a/src/views/super/bpm/process/personalOffice/myHandleTask/useTaskList.ts +++ b/src/views/super/bpm/process/personalOffice/myHandleTask/useTaskList.ts @@ -64,7 +64,7 @@ export function useTaskList(type) { */ async function getTaskNodeInfo(record) { //查询条件 - debugger; + // debugger; let params = { taskId: record.id }; const result = await taskNodeInfo(type, params); console.log('获取流程节点信息', result); diff --git a/src/views/super/bpm/process/processDesign/processNode/process.node.data.ts b/src/views/super/bpm/process/processDesign/processNode/process.node.data.ts index cff1520..cb1e4b5 100644 --- a/src/views/super/bpm/process/processDesign/processNode/process.node.data.ts +++ b/src/views/super/bpm/process/processDesign/processNode/process.node.data.ts @@ -8,7 +8,7 @@ export const columns: BasicColumn[] = [ title: '#', dataIndex: '', key: 'rowIndex', - width: 60, + width: 30, align: 'center', customRender: function ({ index }) { return parseInt(index) + 1; @@ -17,7 +17,7 @@ export const columns: BasicColumn[] = [ { title: '节点名称', align: 'center', - width: 120, + width: 140, dataIndex: 'processNodeName', }, { @@ -30,14 +30,14 @@ export const columns: BasicColumn[] = [ title: 'PC表单地址', align: 'center', dataIndex: 'modelAndView', - width: 240, + width: 400, ellipsis: true, }, { title: '移动表单地址', align: 'center', dataIndex: 'modelAndViewMobile', - width: 240, + width: 30, ellipsis: true, }, { diff --git a/src/views/taskApprovalOpinion/TaskApprovalOpinion.api.ts b/src/views/taskApprovalOpinion/TaskApprovalOpinion.api.ts new file mode 100644 index 0000000..680195b --- /dev/null +++ b/src/views/taskApprovalOpinion/TaskApprovalOpinion.api.ts @@ -0,0 +1,72 @@ +import { defHttp } from '/@/utils/http/axios'; +import { useMessage } from "/@/hooks/web/useMessage"; + +const { createConfirm } = useMessage(); + +enum Api { + list = '/taskapprovalopinion/taskApprovalOpinion/list', + save='/taskapprovalopinion/taskApprovalOpinion/add', + edit='/taskapprovalopinion/taskApprovalOpinion/edit', + deleteOne = '/taskapprovalopinion/taskApprovalOpinion/delete', + deleteBatch = '/taskapprovalopinion/taskApprovalOpinion/deleteBatch', + importExcel = '/taskapprovalopinion/taskApprovalOpinion/importExcel', + exportXls = '/taskapprovalopinion/taskApprovalOpinion/exportXls', +} + +/** + * 导出api + * @param params + */ +export const getExportUrl = Api.exportXls; + +/** + * 导入api + */ +export const getImportUrl = Api.importExcel; + +/** + * 列表接口 + * @param params + */ +export const list = (params) => defHttp.get({ url: Api.list, params }); + +/** + * 删除单个 + * @param params + * @param handleSuccess + */ +export const deleteOne = (params,handleSuccess) => { + return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); +} + +/** + * 批量删除 + * @param params + * @param handleSuccess + */ +export const batchDelete = (params, handleSuccess) => { + createConfirm({ + iconType: 'warning', + title: '确认删除', + content: '是否删除选中数据', + okText: '确认', + cancelText: '取消', + onOk: () => { + return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => { + handleSuccess(); + }); + } + }); +} + +/** + * 保存或者更新 + * @param params + * @param isUpdate + */ +export const saveOrUpdate = (params, isUpdate) => { + let url = isUpdate ? Api.edit : Api.save; + return defHttp.post({ url: url, params }, { isTransformResponse: false }); +} diff --git a/src/views/taskApprovalOpinion/TaskApprovalOpinion.data.ts b/src/views/taskApprovalOpinion/TaskApprovalOpinion.data.ts new file mode 100644 index 0000000..6fc5eec --- /dev/null +++ b/src/views/taskApprovalOpinion/TaskApprovalOpinion.data.ts @@ -0,0 +1,114 @@ +import {BasicColumn} from '/@/components/Table'; +import {FormSchema} from '/@/components/Table'; +import { rules} from '/@/utils/helper/validator'; +import { render } from '/@/utils/common/renderUtils'; +import { getWeekMonthQuarterYear } from '/@/utils'; +//列表数据 +export const columns: BasicColumn[] = [ + { + title: '记录类型:PROCESS流程意见、SUPPLEMENT补充反馈、SYSTEM系统记录', + align: "center", + dataIndex: 'recordType' + }, + { + title: '事项任务ID,对应task_task.id', + align: "center", + dataIndex: 'taskTaskId' + }, + { + title: '关联业务ID', + align: "center", + dataIndex: 'businessId' + }, + { + title: '流程编码', + align: "center", + dataIndex: 'flowCode' + }, + { + title: '流程实例ID', + align: "center", + dataIndex: 'processInstId' + }, + { + title: 'Flowable任务ID', + align: "center", + dataIndex: 'flowTaskId' + }, + { + title: '流程节点Key', + align: "center", + dataIndex: 'taskDefKey' + }, + { + title: '流程节点名称', + align: "center", + dataIndex: 'taskName' + }, + { + title: '操作类型:START发起、APPROVE办理、REJECT驳回、CALLBACK取回、INVALID作废、FEEDBACK反馈', + align: "center", + dataIndex: 'actionType' + }, + { + title: '操作结果,如同意、不同意、驳回、发起流程、补充反馈', + align: "center", + dataIndex: 'actionResult' + }, + { + title: '审批意见或反馈内容', + align: "center", + dataIndex: 'opinion' + }, + { + title: '办理人账号', + align: "center", + dataIndex: 'opUserId' + }, + { + title: '办理人姓名', + align: "center", + dataIndex: 'opUserName' + }, + { + title: '办理人部门ID', + align: "center", + dataIndex: 'opDeptId' + }, + { + title: '办理人部门名称', + align: "center", + dataIndex: 'opDeptName' + }, + { + title: '办理人部门编码', + align: "center", + dataIndex: 'opDeptCode' + }, + { + title: '办理时间', + align: "center", + dataIndex: 'opTime' + }, +]; + +// 高级查询数据 +export const superQuerySchema = { + recordType: {title: '记录类型:PROCESS流程意见、SUPPLEMENT补充反馈、SYSTEM系统记录',order: 0,view: 'text', type: 'string',}, + taskTaskId: {title: '事项任务ID,对应task_task.id',order: 1,view: 'text', type: 'string',}, + businessId: {title: '关联业务ID',order: 2,view: 'text', type: 'string',}, + flowCode: {title: '流程编码',order: 3,view: 'text', type: 'string',}, + processInstId: {title: '流程实例ID',order: 4,view: 'text', type: 'string',}, + flowTaskId: {title: 'Flowable任务ID',order: 5,view: 'text', type: 'string',}, + taskDefKey: {title: '流程节点Key',order: 6,view: 'text', type: 'string',}, + taskName: {title: '流程节点名称',order: 7,view: 'text', type: 'string',}, + actionType: {title: '操作类型:START发起、APPROVE办理、REJECT驳回、CALLBACK取回、INVALID作废、FEEDBACK反馈',order: 8,view: 'text', type: 'string',}, + actionResult: {title: '操作结果,如同意、不同意、驳回、发起流程、补充反馈',order: 9,view: 'text', type: 'string',}, + opinion: {title: '审批意见或反馈内容',order: 10,view: 'textarea', type: 'string',}, + opUserId: {title: '办理人账号',order: 11,view: 'text', type: 'string',}, + opUserName: {title: '办理人姓名',order: 12,view: 'text', type: 'string',}, + opDeptId: {title: '办理人部门ID',order: 13,view: 'text', type: 'string',}, + opDeptName: {title: '办理人部门名称',order: 14,view: 'text', type: 'string',}, + opDeptCode: {title: '办理人部门编码',order: 15,view: 'text', type: 'string',}, + opTime: {title: '办理时间',order: 16,view: 'datetime', type: 'string',}, +}; diff --git a/src/views/taskApprovalOpinion/TaskApprovalOpinionList.vue b/src/views/taskApprovalOpinion/TaskApprovalOpinionList.vue new file mode 100644 index 0000000..6c1a8de --- /dev/null +++ b/src/views/taskApprovalOpinion/TaskApprovalOpinionList.vue @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + 新增 + 导出 + 导入 + + + + + + 删除 + + + + 批量操作 + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/taskApprovalOpinion/components/TaskApprovalOpinionForm.vue b/src/views/taskApprovalOpinion/components/TaskApprovalOpinionForm.vue new file mode 100644 index 0000000..da63314 --- /dev/null +++ b/src/views/taskApprovalOpinion/components/TaskApprovalOpinionForm.vue @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/taskApprovalOpinion/components/TaskApprovalOpinionModal.vue b/src/views/taskApprovalOpinion/components/TaskApprovalOpinionModal.vue new file mode 100644 index 0000000..86ba484 --- /dev/null +++ b/src/views/taskApprovalOpinion/components/TaskApprovalOpinionModal.vue @@ -0,0 +1,81 @@ + + + + + 取消 + 确认 + + + + + + + + diff --git a/src/views/tasklist/TaskList.api.ts b/src/views/tasklist/TaskList.api.ts index 9d0648e..c7a2339 100644 --- a/src/views/tasklist/TaskList.api.ts +++ b/src/views/tasklist/TaskList.api.ts @@ -124,15 +124,15 @@ export const deleteTask = (params, handleSuccess) => { export const toggleTaskStatus = (params) => defHttp.post({ url: Api.toggleTaskStatus, params }); -export const getCollaborators = (params) => defHttp.get({ url: Api.getCollaborators, params }); +export const getCollaborators = (params, options?: Record) => defHttp.get({ url: Api.getCollaborators, params }, options); -export const addCollaborator = (params) => defHttp.post({ url: Api.addCollaborator, params }); +export const addCollaborator = (params, options?) => defHttp.post({ url: Api.addCollaborator, params }, options); -export const removeCollaborator = (params) => defHttp.post({ url: Api.removeCollaborator, params }); +export const removeCollaborator = (params, options?) => defHttp.post({ url: Api.removeCollaborator, params }, options); -export const updateCollaboratorPermission = (params) => defHttp.post({ url: Api.updateCollaboratorPermission, params }); +export const updateCollaboratorPermission = (params, options?) => defHttp.post({ url: Api.updateCollaboratorPermission, params }, options); -export const getMyPermission = (params) => defHttp.get({ url: Api.getMyPermission, params }); +export const getMyPermission = (params, options?) => defHttp.get({ url: Api.getMyPermission, params }, options); export const moveTask = (params) => defHttp.post({ url: Api.moveTask, params }); diff --git a/src/views/tasklist/TaskList.data.ts b/src/views/tasklist/TaskList.data.ts index 40c50d6..1975405 100644 --- a/src/views/tasklist/TaskList.data.ts +++ b/src/views/tasklist/TaskList.data.ts @@ -6,7 +6,7 @@ import { getAvailableSecretLevels } from './types'; export const columns: BasicColumn[] = [ { - title: '任务清单名称', + title: '计划名称', align: 'center', dataIndex: 'tasklistName', }, @@ -35,7 +35,7 @@ export const searchFormSchema: FormSchema[] = []; export const formSchema: FormSchema[] = [ { - label: '任务清单名称', + label: '计划名称', field: 'tasklistName', component: 'Input', }, @@ -93,7 +93,7 @@ export const taskListDetialColumns: JVxeColumn[] = [ defaultValue: '', }, { - title: '任务名称', + title: '事项名称', key: 'taskName', type: JVxeTypes.input, width: '200px', @@ -101,7 +101,7 @@ export const taskListDetialColumns: JVxeColumn[] = [ defaultValue: '', }, { - title: '任务描述', + title: '事项描述', key: 'taskDesc', type: JVxeTypes.input, width: '200px', @@ -183,7 +183,7 @@ export const taskListDetialColumns: JVxeColumn[] = [ defaultValue: '', }, { - title: '子任务数', + title: '子事项数', key: 'subTaskCount', type: JVxeTypes.inputNumber, width: '200px', @@ -191,7 +191,7 @@ export const taskListDetialColumns: JVxeColumn[] = [ defaultValue: '', }, { - title: '子任务完成数', + title: '子事项完成数', key: 'completedSubTaskCount', type: JVxeTypes.inputNumber, width: '200px', @@ -201,21 +201,21 @@ export const taskListDetialColumns: JVxeColumn[] = [ ]; export const superQuerySchema = { - tasklistName: { title: '任务清单名称', order: 0, view: 'text', type: 'string' }, + tasklistName: { title: '计划名称', order: 0, view: 'text', type: 'string' }, pid: { title: '父级节点', order: 1, view: 'text', type: 'string' }, hasChild: { title: '是否有子节点', order: 2, view: 'text', type: 'string' }, sortOrder: { title: '排序号', order: 3, view: 'number', type: 'number' }, type: { title: '类型', order: 4, view: 'text', type: 'string' }, taskListDetial: { - title: '工作任务清单详情', + title: '计划详情', view: 'table', fields: { mainId: { title: '外键', order: 0, view: 'text', type: 'string' }, pid: { title: '父节点ID', order: 1, view: 'text', type: 'string' }, hasChild: { title: '是否有子节点', order: 2, view: 'text', type: 'string' }, sortOrder: { title: '排序号', order: 3, view: 'number', type: 'number' }, - taskName: { title: '任务名称', order: 4, view: 'text', type: 'string' }, - taskDesc: { title: '任务描述', order: 5, view: 'text', type: 'string' }, + taskName: { title: '事项名称', order: 4, view: 'text', type: 'string' }, + taskDesc: { title: '事项描述', order: 5, view: 'text', type: 'string' }, priority: { title: '优先级', order: 6, view: 'list', type: 'string', dictCode: 'task_priority' }, taskStatus: { title: '完成状态', order: 7, view: 'number', type: 'number' }, assigneeId: { title: '负责人ID', order: 8, view: 'text', type: 'string' }, @@ -225,8 +225,8 @@ export const superQuerySchema = { endTime: { title: '结束时间', order: 12, view: 'datetime', type: 'string' }, completeTime: { title: '完成时间', order: 13, view: 'datetime', type: 'string' }, type: { title: '类型', order: 14, view: 'text', type: 'string' }, - subTaskCount: { title: '子任务数', order: 15, view: 'number', type: 'number' }, - completedSubTaskCount: { title: '子任务完成数', order: 16, view: 'number', type: 'number' }, + subTaskCount: { title: '子事项数', order: 15, view: 'number', type: 'number' }, + completedSubTaskCount: { title: '子事项完成数', order: 16, view: 'number', type: 'number' }, }, }, }; @@ -237,13 +237,13 @@ export function getBpmFormSchema(_formData): FormSchema[] { export const createTaskFormSchema: FormSchema[] = [ { - label: '任务标题', + label: '事项标题', field: 'taskName', component: 'Input', required: true, }, { - label: '任务描述', + label: '事项描述', field: 'taskDesc', component: 'InputTextArea', componentProps: { rows: 3 }, @@ -305,12 +305,12 @@ export function getCreateListFormSchema(userSecurityLevel: number): FormSchema[] if (!userSecurityLevel) userSecurityLevel = 3; return [ { - label: '清单名称', + label: '计划名称', field: 'tasklistName', component: 'Input', required: true, componentProps: { - placeholder: '请输入清单名称', + placeholder: '请输入计划名称', }, }, { @@ -331,7 +331,7 @@ export function getCreateListFormSchema(userSecurityLevel: number): FormSchema[] export const mockTaskListGroups: TaskListGroup[] = [ { id: 'tlg-1', - name: '任务清单', + name: '计划管理', pid: '0', hasChild: '1', type: 0, diff --git a/src/views/tasklist/components/CollaboratorModal.vue b/src/views/tasklist/components/CollaboratorModal.vue index a3f536b..d68a85b 100644 --- a/src/views/tasklist/components/CollaboratorModal.vue +++ b/src/views/tasklist/components/CollaboratorModal.vue @@ -103,7 +103,7 @@
+ 今天有 8 项待办、 + 2 项即将超时 +