Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/views/bg/xispeak/components/BgXiSpeakBPMForm.vue
This commit is contained in:
ye1023
2026-07-03 16:06:58 +08:00
8 changed files with 185 additions and 31 deletions
+18
View File
@@ -18,6 +18,8 @@ enum Api {
startProcessSchedules = '/tasktask/taskTask/flow-schedules',
queryByBusinessId = '/tasktask/taskTask/queryByBusinessId',
deleteSingleProcess = '/tasktask/taskTask/deleteSingleProcess',
deletePendingTask = '/tasktask/taskTask/deletePendingTask',
updateTitleAndDeadline = '/tasktask/taskTask/updateTitleAndDeadline',
}
/**
@@ -184,6 +186,22 @@ export const deleteSingleProcess = (params) => {
return defHttp.post({ url: Api.deleteSingleProcess, params }, { joinParamsToUrl: true, isTransformResponse: false });
};
/**
* 删除未发起的待处理任务(无流程实例ID的周期性任务记录)
* @param params { taskId: string }
*/
export const deletePendingTask = (params) => {
return defHttp.post({ url: Api.deletePendingTask, params }, { joinParamsToUrl: true, isTransformResponse: false });
};
/**
* 修改流程标题和截止时间
* @param params { taskId: string, title: string, requireFinishDate: string }
*/
export const updateTitleAndDeadline = (params) => {
return defHttp.post({ url: Api.updateTitleAndDeadline, params }, { joinParamsToUrl: true, isTransformResponse: false });
};
/**
* 【用于评论功能】自定义文件上传-方法
*/
@@ -8,6 +8,33 @@
</BasicTable>
</div>
<BpmPictureModal @register="registerBpmModal" />
<j-modal
title="修改流程信息"
:width="460"
:visible="editModalVisible"
:confirmLoading="editLoading"
wrapClassName="edit-process-modal"
@ok="handleEditConfirm"
@cancel="handleEditCancel"
cancelText="取消"
>
<div style="padding: 8px 16px 0;">
<a-form :model="editForm" :label-col="{ style: { width: '100px' } }" :wrapper-col="{ span: 24 }">
<a-form-item label="流程标题" style="margin-bottom: 14px;">
<a-input v-model:value="editForm.title" placeholder="请输入流程标题" allow-clear />
</a-form-item>
<a-form-item label="要求完成日期" style="margin-bottom: 0;">
<a-date-picker
v-model:value="editForm.requireFinishDate"
valueFormat="YYYY-MM-DD"
placeholder="请选择要求完成日期"
style="width: 100%"
:getPopupContainer="(node) => node?.parentNode"
/>
</a-form-item>
</a-form>
</div>
</j-modal>
<j-modal
title="审批历史"
:width="approvalHistoryModalWidth"
@@ -22,12 +49,12 @@
</template>
<script lang="ts" setup>
import { nextTick, ref } from 'vue';
import { nextTick, reactive, ref } from 'vue';
import { BasicColumn, BasicTable, TableAction, useTable } from '/@/components/Table';
import JModal from '/@/components/Modal/src/JModal/JModal.vue';
import { useModal } from '/@/components/Modal';
import { columns } from './QueryProcessList.data';
import { deleteSingleProcess, queryByBusinessId } from '/@/api/common/api';
import { deleteSingleProcess, deletePendingTask, updateTitleAndDeadline, queryByBusinessId } from '/@/api/common/api';
import { useMessage } from '/@/hooks/web/useMessage';
import TaskApprovalHistoryContent from '/@/views/super/bpm/process/personalOffice/myHandleTask/content/TaskApprovalHistoryContent.vue';
@@ -51,6 +78,13 @@
const approvalHistoryVisible = ref(false);
const approvalHistoryFormData = ref<Recordable>({});
const approvalHistoryRef = ref();
const editModalVisible = ref(false);
const editLoading = ref(false);
const currentEditRecord = ref<Recordable>({});
const editForm = reactive({
title: '',
requireFinishDate: undefined as string | undefined,
});
const [registerBpmModal, { openModal: bpmPicModal }] = useModal();
const [registerTable, { setColumns, setTableData, reload, clearSelectedRowKeys }] = useTable({
@@ -76,12 +110,12 @@
actionColumn: {
title: '操作',
dataIndex: 'action',
width: 240,
width: 320,
fixed: 'right',
slots: { customRender: 'action' },
},
scroll: {
x: tableScrollX,
x: tableScrollX + 80,
y: tableBodyHeight,
},
});
@@ -110,6 +144,7 @@
setColumns(defaultColumns);
setTableData([]);
handleApprovalHistoryCancel();
handleEditCancel();
clearSelectedRowKeys();
}
@@ -141,10 +176,73 @@
approvalHistoryFormData.value = {};
}
function handleEditProcess(record) {
currentEditRecord.value = record;
editForm.title = record?.title || '';
editForm.requireFinishDate = record?.requireFinishDate
? record.requireFinishDate.length > 10
? record.requireFinishDate.substring(0, 10)
: record.requireFinishDate
: undefined;
editModalVisible.value = true;
}
async function handleEditConfirm() {
if (!editForm.title?.trim()) {
createMessage.error('标题不能为空');
return;
}
if (!editForm.requireFinishDate) {
createMessage.error('要求完成日期不能为空');
return;
}
const taskId = currentEditRecord.value?.id;
if (!taskId) {
createMessage.error('任务数据异常');
return;
}
editLoading.value = true;
try {
const res = await updateTitleAndDeadline({ taskId, title: editForm.title, requireFinishDate: editForm.requireFinishDate });
if (res?.success) {
createMessage.success(res.message || '修改成功');
editModalVisible.value = false;
await reload();
} else {
createMessage.error(res?.message || '修改失败');
}
} catch (error) {
createMessage.error('修改失败');
} finally {
editLoading.value = false;
}
}
function handleEditCancel() {
editModalVisible.value = false;
editLoading.value = false;
}
async function handleDeleteProcess(record) {
const processInstId = record?.processInstId;
const taskId = record?.id;
if (!processInstId) {
createMessage.error('流程未发起,请等待流程自动发起');
if (!taskId) {
createMessage.error('任务数据异常,无法删除');
return;
}
try {
const res = await deletePendingTask({ taskId });
if (res?.success) {
createMessage.success(res.message || '删除成功');
await reload();
} else {
createMessage.error(res?.message || '删除失败');
}
} catch (error) {
createMessage.error('删除失败');
}
return;
}
@@ -171,6 +269,10 @@
label: '审批历史',
onClick: handlePreviewApprovalHistory.bind(null, record),
},
{
label: '修改信息',
onClick: handleEditProcess.bind(null, record),
},
{
label: '删除流程',
popConfirm: {
@@ -239,3 +341,13 @@
}
}
</style>
<style lang="less">
.edit-process-modal {
.ant-modal-body {
height: auto !important;
min-height: 160px;
overflow: visible !important;
}
}
</style>
@@ -49,14 +49,6 @@
<SearchOutlined @click="openSdwLeaderModal" />
</template>
</a-input>
<SzUserSelectByDeptRoleSecurityModal
v-model:open="sdwLeaderModalOpen"
title="请选择所党委领导"
:deptId="sdwLeaderDeptId"
:roleId="sdwLeaderRoleId"
:securityValue="sdwLeaderSecurityValue"
@confirm="handleSdwLeaderConfirm"
/>
</a-form-item>
</template>
@@ -77,8 +69,7 @@
<a-form-item label="重复开始日期">
<a-date-picker
v-model:value="formData.intervalStartTime"
show-time
valueFormat="YYYY-MM-DD HH:mm:ss"
valueFormat="YYYY-MM-DD"
placeholder="重复开始日期"
style="width: 100%"
:getPopupContainer="(node) => node?.parentNode"
@@ -87,6 +78,15 @@
</template>
</a-form>
<SzUserSelectByDeptRoleSecurityModal
v-model:open="sdwLeaderModalOpen"
title="请选择所党委领导"
:deptId="sdwLeaderDeptId"
:roleId="sdwLeaderRoleId"
:securityValue="sdwLeaderSecurityValue"
@confirm="handleSdwLeaderConfirm"
/>
<template #footer>
<a-button @click="handleCancel">取消</a-button>
<a-button type="primary" @click="handleOk">提交</a-button>
@@ -279,7 +279,7 @@ import { PARTY_COMMITTEE_DEPT_ID, SDW_LEADER_ROLE_ID } from '/@/constant/supervi
triggerType: formData.triggerMode === 'recurring' ? 2 : 1,
intervalType: formData.triggerMode === 'recurring' ? Number(formData.intervalType) : undefined,
startCount: formData.triggerMode === 'recurring' ? Number(formData.startCount) : undefined,
intervalStartTime: formData.triggerMode === 'recurring' ? formData.intervalStartTime : undefined,
intervalStartTime: formData.triggerMode === 'recurring' && formData.intervalStartTime ? formData.intervalStartTime + ' 02:00:00' : undefined,
deptId: formData.deptIds.join(','),
deptIds: [...formData.deptIds],
isNeedAppro: showSuoleaderFields.value ? formData.isNeedAppro : undefined,
@@ -76,8 +76,7 @@
<a-form-item label="重复开始日期">
<a-date-picker
v-model:value="formData.intervalStartTime"
show-time
valueFormat="YYYY-MM-DD HH:mm:ss"
valueFormat="YYYY-MM-DD"
placeholder="重复开始日期"
style="width: 100%"
:getPopupContainer="(node) => node?.parentNode"
@@ -251,7 +250,7 @@ import { SUOBAN_DEPT_ID, MEASURE_RES_LEADER_ROLE_ID } from '/@/constant/supervis
triggerType: formData.triggerMode === 'recurring' ? 2 : 1,
intervalType: formData.triggerMode === 'recurring' ? Number(formData.intervalType) : undefined,
startCount: formData.triggerMode === 'recurring' ? Number(formData.startCount) : undefined,
intervalStartTime: formData.triggerMode === 'recurring' ? formData.intervalStartTime : undefined,
intervalStartTime: formData.triggerMode === 'recurring' && formData.intervalStartTime ? formData.intervalStartTime + ' 02:00:00' : undefined,
title: taskTitle,
deptId: formData.deptIds.join(','),
deptIds: [...formData.deptIds],
@@ -238,7 +238,7 @@
},
},
exportConfig: {
name: props.ledgerTitle,
name: props.meetingType === 'office' ? '所务会' : '党委会',
url: getExportUrl,
params: getLedgerQueryParams,
},
@@ -638,7 +638,7 @@
const blob = new Blob([data]);
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = '党建议题-导入模板.xls';
link.download = props.meetingType === 'office' ? '所务会-导入模板.xls' : '党委会-导入模板.xls';
link.click();
URL.revokeObjectURL(link.href);
}
+14 -1
View File
@@ -19,6 +19,17 @@
<JDictSelectTag v-model:value="queryParam.completionStatus" dictCode="db_status" placeholder="请选择完成状态" allow-clear @change="searchQuery" />
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item name="completedStage" label="流程阶段">
<a-select v-model:value="queryParam.completedStage" placeholder="请选择" allow-clear @change="searchQuery">
<a-select-option :value="0">未发起流程</a-select-option>
<a-select-option :value="1">正在落实措施收集流程</a-select-option>
<a-select-option :value="2">落实措施收集流程结束</a-select-option>
<a-select-option :value="3">正在经办人执行反馈流程</a-select-option>
<a-select-option :value="4">经办人执行反馈流程结束</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :lg="4" :md="8" :sm="12">
<span class="table-page-search-submitButtons">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
@@ -96,7 +107,7 @@
</template>
<script lang="ts" name="bg.xispeak-bgXiSpeak" setup>
import { ref, reactive, unref, computed, provide } from 'vue';
import { ref, reactive, unref, computed, provide, nextTick } from 'vue';
import { BasicTable, useTable } from '/@/components/Table';
import { Dropdown } from '/@/components/Dropdown';
import { useListPage } from '/@/hooks/system/useListPage';
@@ -619,6 +630,7 @@ import { defHttp } from '/@/utils/http/axios';
function handleFeedbackRightNowConfirm({ record, feedbackRightNow }) {
pendingFeedbackRightNow.value = feedbackRightNow;
nextTick(() => {
flowScheduleModalRef.value?.open({
title: '发起落实措施收集流程',
payload: { record },
@@ -628,6 +640,7 @@ import { defHttp } from '/@/utils/http/axios';
supDeptleaderid: record?.sdwLeaderList,
supDeptleaderName: record?.sdwLeaderList_dictText,
});
});
}
function handleProcessJbr(record) {
@@ -213,7 +213,7 @@
<span v-else>-</span>
</template>
<template v-if="column.key === 'feedbackAction'">
<a-button type="link" size="small" @click="handleEditFeedback(record)">编辑</a-button>
<a-button type="link" size="small" @click="handleEditFeedback(record)">{{ showJiJianFields && nonJiJianFieldsReadonly ? '督察' : '编辑' }}</a-button>
<a-popconfirm title="确定删除该反馈吗?" @confirm="handleDeleteFeedback(record)">
<a-button type="link" size="small" danger>删除</a-button>
</a-popconfirm>
@@ -107,6 +107,17 @@
<a-input-number v-model:value="formData.supervisionCount" placeholder="每次发起督办流程自动加1" style="width: 100%" disabled />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="流程阶段" name="completedStage">
<a-select v-model:value="formData.completedStage" placeholder="请选择流程阶段" allow-clear>
<a-select-option :value="0">未发起流程</a-select-option>
<a-select-option :value="1">正在落实措施收集流程</a-select-option>
<a-select-option :value="2">落实措施收集流程结束</a-select-option>
<a-select-option :value="3">正在经办人执行反馈流程</a-select-option>
<a-select-option :value="4">经办人执行反馈流程结束</a-select-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-col v-if="showFlowSubmitButton" :span="24" style="width: 100%; text-align: center; margin-top: 16px;">
@@ -172,6 +183,7 @@ import { PARTY_COMMITTEE_DEPT_ID, SDW_LEADER_ROLE_ID } from '/@/constant/supervi
delFlag: undefined,
bpmStatus: undefined,
supervisionCount: undefined,
completedStage: undefined,
};
}