Merge branch 'master' into feature/20260519
This commit is contained in:
@@ -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',},
|
||||
};
|
||||
|
||||
@@ -9,9 +9,9 @@
|
||||
<JDictSelectTag v-model:value="queryParam.year" dictCode="super_year" placeholder="请选择年份" allow-clear @change="searchQuery" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="5" :md="6" :sm="8">
|
||||
<a-form-item label="完成状态" name="bpmStatus">
|
||||
<JDictSelectTag v-model:value="queryParam.bpmStatus" dictCode="super_status" placeholder="请选择完成状态" allow-clear @change="searchQuery" />
|
||||
<a-col :lg="5" :md="8" :sm="12">
|
||||
<a-form-item label="事项名称" name="title">
|
||||
<JInput v-model:value="queryParam.title" type="like" placeholder="请输入事项名称" allow-clear trim />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="5" :md="8" :sm="12">
|
||||
@@ -19,9 +19,14 @@
|
||||
<JInput v-model:value="queryParam.content" type="like" placeholder="请输入会议决议" allow-clear trim />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="6" :md="8" :sm="12">
|
||||
<a-form-item label="事项目录编码" name="matterCode">
|
||||
<JInput v-model:value="queryParam.matterCode" type="like" placeholder="请输入事项目录编码" allow-clear trim />
|
||||
<!-- <a-col :lg="6" :md="8" :sm="12">-->
|
||||
<!-- <a-form-item label="事项目录编码" name="matterCode">-->
|
||||
<!-- <JInput v-model:value="queryParam.matterCode" type="like" placeholder="请输入事项目录编码" allow-clear trim />-->
|
||||
<!-- </a-form-item>-->
|
||||
<!-- </a-col>-->
|
||||
<a-col :lg="5" :md="6" :sm="8">
|
||||
<a-form-item label="完成状态" name="bpmStatus">
|
||||
<JDictSelectTag v-model:value="queryParam.bpmStatus" dictCode="super_status" placeholder="请选择完成状态" allow-clear @change="searchQuery" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :lg="4" :md="8" :sm="12">
|
||||
@@ -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<string, DeptOption>();
|
||||
[
|
||||
{
|
||||
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),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<JModal
|
||||
title="新增反馈"
|
||||
:title="modalTitle"
|
||||
:width="820"
|
||||
:visible="visible"
|
||||
:confirmLoading="saving"
|
||||
@@ -40,7 +40,7 @@
|
||||
<!-- </a-col>-->
|
||||
<a-col :span="12">
|
||||
<a-form-item label="完成状态" name="bpmStatus">
|
||||
<a-input v-model:value="formData.bpmStatus" allow-clear />
|
||||
<JDictSelectTag v-model:value="formData.bpmStatus" dictCode="feedback_status" placeholder="请选择完成状态" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
@@ -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<InstanceType<typeof SUploadFile> | 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<string, any>) {
|
||||
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);
|
||||
|
||||
@@ -40,7 +40,12 @@
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="序号" name="number">
|
||||
<a-input v-model:value="mainForm.number" :disabled="mainDisabled" allow-clear />
|
||||
<a-input v-model:value="mainForm.number" :disabled="mainDisabled" :readonly="true" />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="议题序号" name="itemNumber">
|
||||
<a-input-number v-model:value="mainForm.itemNumber" :disabled="mainDisabled" style="width: 100%" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
@@ -54,19 +59,34 @@
|
||||
<a-input v-model:value="mainForm.matterCode" :disabled="mainDisabled" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="抄告单编号" name="noticeNumber">
|
||||
<a-input v-model:value="mainForm.noticeNumber" :disabled="mainDisabled" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="是否为三重一大决策" name="isImportant">
|
||||
<j-dict-select-tag v-model:value="mainForm.isImportant" :disabled="mainDisabled" dictCode="yn" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="责任部门" name="responDeptid">
|
||||
<j-select-dept v-model:value="mainForm.responDeptid" :disabled="mainDisabled" :multiple="true" checkStrictly allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="协办部门" name="assistDeptid">
|
||||
<j-select-dept v-model:value="mainForm.assistDeptid" :disabled="mainDisabled" :multiple="true" checkStrictly allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="要求完成日期" name="deadline">
|
||||
<a-date-picker v-model:value="mainForm.deadline" value-format="YYYY-MM-DD" :disabled="mainDisabled" style="width: 100%" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="紧急程度" name="urgencyLevel">
|
||||
<j-dict-select-tag v-model:value="mainForm.urgencyLevel" :disabled="mainDisabled" dictCode="urgency_level" placeholder="请选择紧急程度" allow-clear />
|
||||
<a-form-item label="是否急件" name="urgencyLevel">
|
||||
<j-dict-select-tag v-model:value="mainForm.urgencyLevel" :disabled="mainDisabled" dictCode="yn" placeholder="请选择是否急件" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
@@ -104,12 +124,13 @@
|
||||
:columns="feedbackColumns"
|
||||
:data-source="feedbackList"
|
||||
:pagination="false"
|
||||
:scroll="{ x: 1220 }"
|
||||
:scroll="{ x: feedbackTableScrollX }"
|
||||
>
|
||||
<template #bodyCell="{ column, record }">
|
||||
<template v-if="column.key === 'attachments'">
|
||||
<SUploadFile
|
||||
v-if="record.id"
|
||||
:key="getFeedbackAttachmentKey(record)"
|
||||
class="feedback-attachment-list"
|
||||
:bussiness-id="record.id"
|
||||
:disabled="true"
|
||||
@@ -117,6 +138,14 @@
|
||||
/>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
<template v-else-if="canManageFeedback && column.key === 'action'">
|
||||
<a-space>
|
||||
<a-button type="link" size="small" @click="openFeedbackEditModal(record)">编辑</a-button>
|
||||
<a-popconfirm title="是否确认删除" @confirm="handleFeedbackDelete(record)">
|
||||
<a-button type="link" size="small" danger>删除</a-button>
|
||||
</a-popconfirm>
|
||||
</a-space>
|
||||
</template>
|
||||
</template>
|
||||
</a-table>
|
||||
|
||||
@@ -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<any[]>([]);
|
||||
const feedbackAttachmentRefreshKey = ref(0);
|
||||
const subApproveUser = ref('');
|
||||
const isEnd = ref(0);
|
||||
const lastGeneratedNumber = ref('');
|
||||
|
||||
const mainForm = reactive<Record<string, any>>({
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -9,21 +9,26 @@
|
||||
<j-dict-select-tag v-model:value="formData.year" dictCode="super_year" placeholder="请选择年份" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="会议时间" v-bind="validateInfos.matterTime" id="BgPartymatterForm-matterTime" name="matterTime">
|
||||
<a-date-picker placeholder="请选择会议时间" v-model:value="formData.matterTime" value-format="YYYY-MM-DD" style="width: 100%" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="序号" v-bind="validateInfos.number" id="BgPartymatterForm-number" name="number">
|
||||
<a-input v-model:value="formData.number" placeholder="填写会议时间和议题序号后自动生成" :readonly="true" ></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="议题序号" v-bind="validateInfos.itemNumber" id="BgPartymatterForm-itemNumber" name="itemNumber">
|
||||
<a-input-number v-model:value="formData.itemNumber" placeholder="请输入议题序号" style="width: 100%" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="密级" v-bind="validateInfos.secretLevel" id="BgPartymatterForm-secretLevel" name="secretLevel">
|
||||
<j-dict-select-tag v-model:value="formData.secretLevel" dictCode="secret_level" placeholder="请选择密级" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="序号" v-bind="validateInfos.number" id="BgPartymatterForm-number" name="number">
|
||||
<a-input v-model:value="formData.number" placeholder="请输入序号" allow-clear ></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="会议时间" v-bind="validateInfos.matterTime" id="BgPartymatterForm-matterTime" name="matterTime">
|
||||
<a-date-picker placeholder="请选择会议时间" v-model:value="formData.matterTime" value-format="YYYY-MM-DD" style="width: 100%" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="事项名称" v-bind="validateInfos.title" id="BgPartymatterForm-title" name="title">
|
||||
<a-input v-model:value="formData.title" placeholder="请输入事项名称" allow-clear ></a-input>
|
||||
@@ -40,10 +45,25 @@
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="责任部门" v-bind="validateInfos.responDeptid" id="BgPartymatterForm-responDeptid" name="responDeptid">
|
||||
<a-form-item label="抄告单编号" v-bind="validateInfos.noticeNumber" id="BgPartymatterForm-noticeNumber" name="noticeNumber">
|
||||
<a-input v-model:value="formData.noticeNumber" placeholder="请输入抄告单编号" allow-clear ></a-input>
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="是否为三重一大决策" v-bind="validateInfos.isImportant" id="BgPartymatterForm-isImportant" name="isImportant">
|
||||
<j-dict-select-tag v-model:value="formData.isImportant" dictCode="yn" placeholder="请选择是否为三重一大决策" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="主办部门" v-bind="validateInfos.responDeptid" id="BgPartymatterForm-responDeptid" name="responDeptid">
|
||||
<j-select-dept v-model:value="formData.responDeptid" :multiple="true" checkStrictly allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="协办部门" v-bind="validateInfos.assistDeptid" id="BgPartymatterForm-assistDeptid" name="assistDeptid">
|
||||
<j-select-dept v-model:value="formData.assistDeptid" :multiple="true" checkStrictly allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="实际执行情况" v-bind="validateInfos.actualExect" id="BgPartymatterForm-actualExect" name="actualExect">
|
||||
<a-input v-model:value="formData.actualExect" placeholder="请输入实际执行情况" allow-clear ></a-input>
|
||||
@@ -65,8 +85,8 @@
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="12">
|
||||
<a-form-item label="紧急程度" v-bind="validateInfos.urgencyLevel" id="BgPartymatterForm-urgencyLevel" name="urgencyLevel">
|
||||
<j-dict-select-tag v-model:value="formData.urgencyLevel" dictCode="urgency_level" placeholder="请选择紧急程度" allow-clear />
|
||||
<a-form-item label="是否急件" v-bind="validateInfos.urgencyLevel" id="BgPartymatterForm-urgencyLevel" name="urgencyLevel">
|
||||
<j-dict-select-tag v-model:value="formData.urgencyLevel" dictCode="yn" placeholder="请选择是否急件" allow-clear />
|
||||
</a-form-item>
|
||||
</a-col>
|
||||
<a-col :span="24">
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user