提交 aa04eea3 authored 作者: kxjia's avatar kxjia

问题管理

上级 df2abfb6
...@@ -141,7 +141,9 @@ export const batchDelete = (params, handleSuccess) => { ...@@ -141,7 +141,9 @@ export const batchDelete = (params, handleSuccess) => {
return defHttp.delete( return defHttp.delete(
{ {
url: "/flowable/definition/batchDelete", url: "/flowable/definition/batchDelete",
data: params} params: params
},
{joinParamsToUrl: true}
).then(() => { ).then(() => {
handleSuccess(); handleSuccess();
}); });
...@@ -188,3 +190,11 @@ export function definitionStartByDeployId(deployId, data) { ...@@ -188,3 +190,11 @@ export function definitionStartByDeployId(deployId, data) {
}) })
} }
//根据部署ID查询流程定义信息
export function getNodesByTableName(tableName) {
return defHttp.get({
url: '/flowable/form/getNodesByTableName',
params: {tableName:tableName}
})
}
<template> <template>
<div style="margin:10px;height: 100%;"> <div style="height: 80vh;overflow: hidden;padding: 10px;">
<vxe-grid ref="tableRef" v-bind="gridOptions"> <vxe-grid ref="tableRef" v-bind="gridOptions">
<template #toolbarButtons> <template #toolbarButtons>
<vxe-button status="primary" icon="vxe-icon-add" @click="handleAdd" :loading="loading.add">新增</vxe-button> <vxe-button status="primary" icon="vxe-icon-add" @click="handleAdd" :loading="loading.add">新增</vxe-button>
...@@ -107,7 +107,6 @@ const srhParams = ref<SrhParam>({ ...@@ -107,7 +107,6 @@ const srhParams = ref<SrhParam>({
const gridOptions = reactive<VxeGridProps<RowVO>>({ const gridOptions = reactive<VxeGridProps<RowVO>>({
border: true, border: true,
height: "100%",
rowConfig: { rowConfig: {
keyField: 'id' keyField: 'id'
}, },
...@@ -119,7 +118,18 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -119,7 +118,18 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
}, },
pagerConfig: { pagerConfig: {
enabled: true, enabled: true,
pageSize: 10 pageSize: 10,
currentPage: 1,
pageSizes: [
{ label: '10 条', value: 10 },
{ label: '20 条', value: 20 },
{ label: '50 条', value: 50 },
{ label: '100 条', value: 100 }
],
layouts: ['Total', 'PrevJump', 'PrevPage', 'Number', 'NextPage', 'NextJump', 'Sizes', 'FullJump'],
perfect: false,
autoHidden: false,
align: 'right'
}, },
toolbarConfig: { toolbarConfig: {
refresh: false, refresh: false,
...@@ -137,7 +147,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -137,7 +147,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
{ title: '流程编号', field: 'deploymentId', align: 'left', minWidth: '18%' }, { title: '流程编号', field: 'deploymentId', align: 'left', minWidth: '18%' },
{ title: '业务表单', field: 'formName', align: 'center', width: '10%', visible: false }, { title: '业务表单', field: 'formName', align: 'center', width: '10%', visible: false },
{ title: '流程版本', field: 'version', align: 'center', width: '10%' }, { title: '流程版本', field: 'version', align: 'center', width: '10%' },
{ title: '最新版本', field: 'isLastVersion', align: 'center', width: '10%' }, { title: '最新版本', field: 'isLastVersion', align: 'center', width: '10%', visible: false },
{ {
title: '状态', field: 'suspensionState', align: 'center', width: '10%', title: '状态', field: 'suspensionState', align: 'center', width: '10%',
formatter: ({ cellValue }) => { formatter: ({ cellValue }) => {
...@@ -149,7 +159,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -149,7 +159,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
} }
}, },
{ {
title: '部署时间', field: 'deploymentTime', align: 'center', width: '10%', title: '部署时间', field: 'deploymentTime', align: 'center', width: '14%',
formatter: ({ cellValue }) => { formatter: ({ cellValue }) => {
if (!cellValue) return '-' if (!cellValue) return '-'
return new Date(cellValue).toLocaleString() return new Date(cellValue).toLocaleString()
...@@ -158,7 +168,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -158,7 +168,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',
width: '16%', width: '20%',
fixed: 'right', fixed: 'right',
slots: { default: 'operate' } slots: { default: 'operate' }
} }
...@@ -167,7 +177,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -167,7 +177,7 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
seq: true, seq: true,
props: { props: {
result: 'result', result: 'result',
total: 'page.total' total: 'total'
}, },
ajax: { ajax: {
query: ({ page }) => { query: ({ page }) => {
...@@ -202,9 +212,7 @@ const findPageList = async (currentPage: number, pageSize: number) => { ...@@ -202,9 +212,7 @@ const findPageList = async (currentPage: number, pageSize: number) => {
srhParams.value.pageSize = pageSize; srhParams.value.pageSize = pageSize;
const retData = await setData(); const retData = await setData();
return { return {
page: { total: retData.total,
total: retData.total
},
result: retData.records result: retData.records
}; };
}; };
...@@ -341,20 +349,13 @@ async function handleBatchDelete(ids?: string[]) { ...@@ -341,20 +349,13 @@ async function handleBatchDelete(ids?: string[]) {
if (isOperationInProgress('batchDelete')) return; if (isOperationInProgress('batchDelete')) return;
const selectedIds = ids || await getSelectIds(); const selectedIds = ids || await getSelectIds();
if (selectedIds.length === 0) { if (selectedIds.length === 0) {
// 可以添加提示
// message.warning('请选择要删除的流程');
return; return;
} }
setOperationState('batchDelete', null, true); setOperationState('batchDelete', null, true);
try { try {
await batchDelete({ ids: selectedIds.join(",") }, handleSuccess) await batchDelete({ ids: selectedIds.join(",") }, handleSuccess)
// 可以在这里添加成功提示
// message.success(`成功删除 ${selectedIds.length} 个流程`);
} catch (error) { } catch (error) {
console.error('批量删除失败:', error); console.error('批量删除失败:', error);
// 可以在这里添加错误提示
// message.error('批量删除失败');
} finally { } finally {
setOperationState('batchDelete', null, false); setOperationState('batchDelete', null, false);
} }
......
...@@ -249,7 +249,7 @@ const submitForm = async () => { ...@@ -249,7 +249,7 @@ const submitForm = async () => {
const submitFn = formState.formId ? updateForm : addForm const submitFn = formState.formId ? updateForm : addForm
await submitFn(formState) await submitFn(formState)
message.success(formState.formId ? '修改成功' : '新增成功') //message.success(formState.formId ? '修改成功' : '新增成功')
formOpen.value = false formOpen.value = false
resetForm() resetForm()
......
...@@ -110,12 +110,12 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -110,12 +110,12 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
}, },
columns: [ columns: [
{ type: 'checkbox', visible: true, width: '40', showOverflow: false }, { type: 'checkbox', visible: true, width: '40', showOverflow: false },
{ title: '表单主键', field: 'formId', align: 'center', width: '200' }, { title: '表单编号', field: 'formId', align: 'center', width: '100' },
{ {
title: '表单类别', title: '表单类别',
field: 'formTp', field: 'formTp',
align: 'center', align: 'center',
width: '200', width: '100',
filters: tpOptions, filters: tpOptions,
filterMultiple: false, filterMultiple: false,
formatter ({ cellValue }) { formatter ({ cellValue }) {
...@@ -123,13 +123,14 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({ ...@@ -123,13 +123,14 @@ const gridOptions = reactive<VxeGridProps<RowVO>>({
return item ? item.label : '' return item ? item.label : ''
} }
}, },
{ title: '表单名称', field: 'formName', align: 'left', minWidth: '200' }, { title: '表单名称', field: 'formName', align: 'left', width: '300' },
{ title: '表单地址', field: 'formUrl', align: 'left', minWidth: '200' }, { title: '表单地址', field: 'formUrl', align: 'left', minWidth: '220' },
{ title: '备注', field: 'remark', align: 'left', minWidth: '200'}, { title: '列表地址', field: 'formListurl', align: 'left', minWidth: '220' },
{ title: '备注', field: 'remark', align: 'left', minWidth: '100'},
{ {
title: '操作', title: '操作',
align: 'center', align: 'center',
width: '200', width: '130',
fixed: 'right', fixed: 'right',
slots: { default: 'operate' } slots: { default: 'operate' }
} }
......
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
</BasicTable>
<!-- 整改执行 -->
<StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" />
</div>
</template>
<script lang="ts" name="problem-stProblemCheck" setup>
import { ref } from 'vue';
import { BasicTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns, searchFormSchema } from './StProblemCheck.data';
import { list} from './StProblemCheck.api';
import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue';
import { useRoute } from 'vue-router';
const route = useRoute();
//注册model
const [registerExecuteModal, { openModal: openExecuteModal }] = useModal();
//注册table数据
const { prefixCls, tableContext } = useListPage({
tableProps: {
title: '问题归档',
api: list,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
beforeFetch(params) {
params['id'] = route.query.id
},
actionColumn: {
width: 200,
fixed: 'right',
},
},
});
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
function handleArchive(record: Recordable) {
openExecuteModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
function getTableAction(record) {
return [
{
label: '问题归档',
onClick: handleArchive.bind(null, record),
},
];
}
</script>
<style scoped></style>
<template> <template>
<div> <div>
<!--Tab页导航-->
<a-tabs v-model:activeKey="activeTab" @change="handleTabChange" style="margin-left: 16px">
<a-tab-pane key="1" tab="待计划" />
<a-tab-pane key="2" tab="待执行" />
<a-tab-pane key="3" tab="待审核" />
<a-tab-pane key="4" tab="已完成" />
</a-tabs>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection"> <BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle> <template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button> <a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button> <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button> <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0"> <a-dropdown v-if="selectedRowKeys.length > 0">
...@@ -35,49 +27,23 @@ ...@@ -35,49 +27,23 @@
</template> </template>
</BasicTable> </BasicTable>
<!-- 表单区域 --> <!-- 表单区域 -->
<StProblemCheckModal @register="registerModal" @success="handleSuccess" /> <StProblemCheckModal @register="registerModal" @success="handleSuccess" :bmpNodeId="1" />
<!-- 整改计划 -->
<StProblemCheckPlanModal @register="registerPlanModal" @success="handleSuccess" />
<!-- 整改执行 -->
<StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" />
<!-- 整改审核 -->
<StProblemCheckReviewModal @register="registerReviewModal" @success="handleSuccess" />
<!-- <StProblemCheckFlowModal ref="refStProblemCheckFlow" /> -->
</div> </div>
</template> </template>
<script lang="ts" name="problem-stProblemCheck" setup> <script lang="ts" name="problem-stProblemCheck" setup>
import { ref, computed, unref } from 'vue'; import { ref } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table'; import { BasicTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal'; import { useModal } from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'; import { useListPage } from '/@/hooks/system/useListPage';
import StProblemCheckModal from './components/StProblemCheckModal.vue'; import StProblemCheckModal from './components/StProblemCheckModal.vue';
import { columns, searchFormSchema } from './StProblemCheck.data'; import { columns, searchFormSchema } from './StProblemCheck.data';
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './StProblemCheck.api'; import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './StProblemCheck.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import StProblemCheckPlanModal from './components/StProblemCheckPlanModal.vue';
import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue';
import StProblemCheckReviewModal from './components/StProblemCheckReviewModal.vue';
import StProblemCheckFlowModal from './components/StProblemCheckFlowModal.vue';
import { store } from '/@/store';
import { definitionStartByDeployId } from '/@/components/Process/api/definition';
import { useRoute } from 'vue-router';
const route = useRoute();
const checkedKeys = ref<Array<string | number>>([]);
//Tab页状态
const activeTab = ref('1');
//Tab页切换事件
function handleTabChange(key) {
activeTab.value = key;
reload();
}
//注册model //注册model
const [registerModal, { openModal }] = useModal(); const [registerModal, { openModal }] = useModal();
const [registerPlanModal, { openModal: openPlanModal }] = useModal(); const [registerPlanModal, { openModal: openPlanModal }] = useModal();
const [registerExecuteModal, { openModal: openExecuteModal }] = useModal();
const [registerReviewModal, { openModal: openReviewModal }] = useModal();
//注册table数据 //注册table数据
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({ const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: { tableProps: {
...@@ -94,17 +60,10 @@ ...@@ -94,17 +60,10 @@
fieldMapToTime: [], fieldMapToTime: [],
}, },
beforeFetch(params) { beforeFetch(params) {
//根据Tab页筛选状态 params['id'] ="" //route.query.id
const tabStatusMap = {
'1': '1', //待计划
'2': '2', //待执行
'3': '3', //待审核
'4': '4', //已完成
};
params['bpmStatus'] = tabStatusMap[activeTab.value];
}, },
actionColumn: { actionColumn: {
width: 200, width: 400,
fixed: 'right', fixed: 'right',
}, },
}, },
...@@ -127,7 +86,7 @@ ...@@ -127,7 +86,7 @@
openModal(true, { openModal(true, {
isUpdate: false, isUpdate: false,
showFooter: true, showFooter: true,
bpmStatus: activeTab.value, bmpNodeId: route.query.bmpNodeId
}); });
} }
/** /**
...@@ -138,7 +97,6 @@ ...@@ -138,7 +97,6 @@
record, record,
isUpdate: true, isUpdate: true,
showFooter: true, showFooter: true,
bpmStatus: activeTab.value,
}); });
} }
function handlePlan(record: Recordable) { function handlePlan(record: Recordable) {
...@@ -148,20 +106,7 @@ ...@@ -148,20 +106,7 @@
showFooter: true, showFooter: true,
}); });
} }
function handleExecute(record: Recordable) {
openExecuteModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handleReview(record: Recordable) {
openReviewModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/** /**
* 详情 * 详情
*/ */
...@@ -194,50 +139,27 @@ ...@@ -194,50 +139,27 @@
* 操作栏 * 操作栏
*/ */
function getTableAction(record) { function getTableAction(record) {
const actions = [ return [
{ {
label: '编辑', label: '编辑',
onClick: handleEdit.bind(null, record), onClick: handleEdit.bind(null, record),
}, },
{ {
label: '启动流程', label: '启动流程',
// onClick: handleFlow.bind(null, record), onClick: handleFlow.bind(null, record),
ifShow: () => { // ifShow: ()=> {
if (record['bpmStatus'] == null || record['bpmStatus'] == '') return true; // if(record['bpmStatus']==null||record['bpmStatus']=='')
else return false; // return true
}, // else return false
// }
}, },
];
//根据当前Tab页显示不同的操作按钮 // {
switch (activeTab.value) { // label: '整改计划',
case '1': //待计划 // onClick: handlePlan.bind(null, record),
actions.push({ // },
label: '去计划',
onClick: handlePlan.bind(null, record),
});
break;
case '2': //待执行
actions.push({
label: '去执行',
onClick: handleExecute.bind(null, record),
});
break;
case '3': //待审核
actions.push({
label: '去审核',
onClick: handleReview.bind(null, record),
});
break;
case '4': //已完成
actions.push({
label: '查看详情',
onClick: handleDetail.bind(null, record),
});
break;
}
return actions; ];
} }
/** /**
* 下拉操作栏 * 下拉操作栏
...@@ -258,16 +180,18 @@ ...@@ -258,16 +180,18 @@
]; ];
} }
const formData = ref<any>({}); // 填写的表单数据 const formData = ref<any>({}) // 填写的表单数据
// const refStProblemCheckFlow = ref(); const refStProblemCheckFlow = ref();
// function handleFlow(record: Recordable) { function handleFlow(record: Recordable) {
// formData.dataId = record.id; formData.dataId=record.id;
// formData.dataName = 'id'; formData.dataName='id';
// definitionStartByDeployId(record.deployId, formData).then((res) => { definitionStartByDeployId(record.deployId, formData).then(res => {
// console.log('计划启动----------- res', res); handleSuccess();
// handle.valueSuccess(); })
// });
// } }
</script> </script>
<style scoped></style> <style scoped></style>
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
</BasicTable>
<!-- 整改执行 -->
<StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" />
</div>
</template>
<script lang="ts" name="problem-stProblemCheck" setup>
import { ref } from 'vue';
import { BasicTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns, searchFormSchema } from './StProblemCheck.data';
import { list} from './StProblemCheck.api';
import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue';
import { useRoute } from 'vue-router';
const route = useRoute();
//注册model
const [registerExecuteModal, { openModal: openExecuteModal }] = useModal();
//注册table数据
const { prefixCls, tableContext } = useListPage({
tableProps: {
title: '计划执行审批',
api: list,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
beforeFetch(params) {
params['id'] = route.query.id
},
actionColumn: {
width: 200,
fixed: 'right',
},
},
});
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
function handleExecuteApproval(record: Recordable) {
openExecuteModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
function getTableAction(record) {
return [
{
label: '整改审核',
onClick: handleExecuteApproval.bind(null, record),
},
];
}
</script>
<style scoped></style>
...@@ -4,70 +4,36 @@ ...@@ -4,70 +4,36 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection"> <BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题--> <!--插槽:table标题-->
<template #tableTitle> <template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined" />
删除
</a-menu-item>
</a-menu>
</template>
<a-button
>批量操作
<Icon icon="mdi:chevron-down" />
</a-button>
</a-dropdown>
</template> </template>
<!--操作栏--> <!--操作栏-->
<template #action="{ record }"> <template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" /> <TableAction :actions="getTableAction(record)"/>
</template> </template>
</BasicTable> </BasicTable>
<!-- 表单区域 -->
<StProblemCheckModal @register="registerModal" @success="handleSuccess" />
<!-- 整改计划 -->
<StProblemCheckPlanModal @register="registerPlanModal" @success="handleSuccess" />
<!-- 整改执行 --> <!-- 整改执行 -->
<StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" /> <StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" />
<!-- 整改审核 -->
<StProblemCheckReviewModal @register="registerReviewModal" @success="handleSuccess" />
<!-- <StProblemCheckFlowModal ref="refStProblemCheckFlow" /> -->
</div> </div>
</template> </template>
<script lang="ts" name="problem-stProblemCheck" setup> <script lang="ts" name="problem-stProblemCheck" setup>
import { ref, computed, unref } from 'vue'; import { ref } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table'; import { BasicTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal'; import { useModal } from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'; import { useListPage } from '/@/hooks/system/useListPage';
import StProblemCheckModal from './components/StProblemCheckModal.vue';
import { columns, searchFormSchema } from './StProblemCheck.data'; import { columns, searchFormSchema } from './StProblemCheck.data';
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './StProblemCheck.api'; import { list} from './StProblemCheck.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import StProblemCheckPlanModal from './components/StProblemCheckPlanModal.vue';
import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue'; import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue';
import StProblemCheckReviewModal from './components/StProblemCheckReviewModal.vue';
import StProblemCheckFlowModal from './components/StProblemCheckFlowModal.vue';
import { store } from '/@/store';
import { definitionStartByDeployId } from "/@/components/Process/api/definition"
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
const route = useRoute(); const route = useRoute();
const checkedKeys = ref<Array<string | number>>([]);
//注册model //注册model
const [registerModal, { openModal }] = useModal();
const [registerPlanModal, { openModal: openPlanModal }] = useModal();
const [registerExecuteModal, { openModal: openExecuteModal }] = useModal(); const [registerExecuteModal, { openModal: openExecuteModal }] = useModal();
const [registerReviewModal, { openModal: openReviewModal }] = useModal();
//注册table数据 //注册table数据
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({ const { prefixCls, tableContext } = useListPage({
tableProps: { tableProps: {
title: '问题整改', title: '问题整改',
api: list, api: list,
...@@ -85,48 +51,14 @@ ...@@ -85,48 +51,14 @@
params['id'] = route.query.id params['id'] = route.query.id
}, },
actionColumn: { actionColumn: {
width: 400, width: 200,
fixed: 'right', fixed: 'right',
}, },
}, },
exportConfig: {
name: '问题整改',
url: getExportUrl,
},
importConfig: {
url: getImportUrl,
success: handleSuccess,
},
}); });
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext; const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handlePlan(record: Recordable) {
openPlanModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handleExecute(record: Recordable) { function handleExecute(record: Recordable) {
openExecuteModal(true, { openExecuteModal(true, {
record, record,
...@@ -134,103 +66,19 @@ ...@@ -134,103 +66,19 @@
showFooter: true, showFooter: true,
}); });
} }
function handleReview(record: Recordable) {
openReviewModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({ id: record.id }, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() { function handleSuccess() {
(selectedRowKeys.value = []) && reload(); (selectedRowKeys.value = []) && reload();
} }
/**
* 操作栏
*/
function getTableAction(record) { function getTableAction(record) {
return [ return [
{
label: '编辑',
onClick: handleEdit.bind(null, record),
},
{
label: '启动流程',
onClick: handleFlow.bind(null, record),
ifShow: ()=> {
if(record['bpmStatus']==null||record['bpmStatus']=='')
return true
else return false
}
},
{
label: '整改计划',
onClick: handlePlan.bind(null, record),
},
{ {
label: '整改执行', label: '整改执行',
onClick: handleExecute.bind(null, record), onClick: handleExecute.bind(null, record),
}, },
{
label: '整改审核',
onClick: handleReview.bind(null, record),
},
]; ];
} }
/**
* 下拉操作栏
*/
function getDropDownAction(record) {
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
},
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
];
}
const formData = ref<any>({}) // 填写的表单数据
const refStProblemCheckFlow = ref();
function handleFlow(record: Recordable) {
formData.dataId=record.id;
formData.dataName='id';
definitionStartByDeployId(record.deployId, formData).then(res => {
handleSuccess();
})
}
</script> </script>
......
<template>
<div>
<a-tabs v-model:activeKey="activeTab" @change="handleTabChange" style="margin-left: 16px">
<a-tab-pane v-for="(node, index) in workflowNodes" :key="index + 1" :tab="node.name">
<div v-if="node.formListUrl" class="tab-content">
<component :is="loadComponent(node.formListUrl)" />
</div>
<div v-else class="no-form">
该节点未配置表单
</div>
</a-tab-pane>
</a-tabs>
</div>
</template>
<script lang="ts" name="problem-stProblemCheck" setup>
import { ref, nextTick, onMounted, defineAsyncComponent, h } from 'vue';
import { useRoute } from 'vue-router';
import { getNodesByTableName } from '/@/components/Process/api/definition';
const route = useRoute();
const workflowNodes = ref<any[]>([]);
const activeTab = ref(1);
// 组件缓存,避免重复加载
const componentCache = new Map();
function handleTabChange(key) {
activeTab.value = key;
}
// 将formListurl转换为正确的导入路径并动态加载组件
function loadComponent(formListurl: string) {
console.log('开始加载组件,formListurl:', formListurl);
if (componentCache.has(formListurl)) {
console.log('从缓存加载组件:', formListurl);
return componentCache.get(formListurl);
}
// 解析formListurl,提取组件路径
// formListurl格式:/project/problemCheck/StProblemCheckList
// 转换为:./StProblemCheckList.vue
const pathParts = formListurl.split('/');
console.log('路径分割结果:', pathParts);
// 获取最后一个部分作为组件名
const componentName = pathParts[pathParts.length - 1];
console.log('提取的组件名:', componentName);
// 构建导入路径
const importPath = `./${componentName}.vue`;
console.log('生成的导入路径:', importPath);
const AsyncComponent = defineAsyncComponent({
loader: async () => {
try {
const module = await import(importPath);
return module.default || module;
} catch (error) {
console.error(`加载组件失败 (${formListurl}):`, error);
return { render: () => h('div', '组件加载失败') };
}
},
loadingComponent: { render: () => h('div', '加载中...') },
errorComponent: { render: () => h('div', '组件加载失败') },
// 延迟显示加载组件的时间(毫秒)
delay: 200,
// 超时时间(毫秒)
timeout: 3000
});
componentCache.set(formListurl, AsyncComponent);
return AsyncComponent;
}
onMounted(async () => {
await nextTick();
try {
const nodes = await getNodesByTableName("st_problem_check");
const nodeData = nodes?.data?.records || nodes?.records || nodes || [];
workflowNodes.value = nodeData;
} catch (error) {
console.error('获取工作流节点失败:', error);
}
});
</script>
<style scoped>
.tab-content {
padding: 0px;
}
.no-form {
padding: 40px;
text-align: center;
color: #999;
}
</style>
<template>
<div>
<!--引用表格-->
<BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题-->
<template #tableTitle>
</template>
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)"/>
</template>
</BasicTable>
<!-- 整改执行 -->
<StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" />
</div>
</template>
<script lang="ts" name="problem-stProblemCheck" setup>
import { ref } from 'vue';
import { BasicTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage';
import { columns, searchFormSchema } from './StProblemCheck.data';
import { list} from './StProblemCheck.api';
import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue';
import { useRoute } from 'vue-router';
const route = useRoute();
//注册model
const [registerExecuteModal, { openModal: openExecuteModal }] = useModal();
//注册table数据
const { prefixCls, tableContext } = useListPage({
tableProps: {
title: '问题整改',
api: list,
columns,
canResize: false,
formConfig: {
//labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
showAdvancedButton: true,
fieldMapToNumber: [],
fieldMapToTime: [],
},
beforeFetch(params) {
params['id'] = route.query.id
},
actionColumn: {
width: 200,
fixed: 'right',
},
},
});
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
function handlePlanApproval(record: Recordable) {
openExecuteModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
function getTableAction(record) {
return [
{
label: '计划审核',
onClick: handlePlanApproval.bind(null, record),
},
];
}
</script>
<style scoped></style>
...@@ -4,72 +4,35 @@ ...@@ -4,72 +4,35 @@
<BasicTable @register="registerTable" :rowSelection="rowSelection"> <BasicTable @register="registerTable" :rowSelection="rowSelection">
<!--插槽:table标题--> <!--插槽:table标题-->
<template #tableTitle> <template #tableTitle>
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
<a-dropdown v-if="selectedRowKeys.length > 0">
<template #overlay>
<a-menu>
<a-menu-item key="1" @click="batchHandleDelete">
<Icon icon="ant-design:delete-outlined" />
删除
</a-menu-item>
</a-menu>
</template>
<a-button
>批量操作
<Icon icon="mdi:chevron-down" />
</a-button>
</a-dropdown>
</template> </template>
<!--操作栏--> <!--操作栏-->
<template #action="{ record }"> <template #action="{ record }">
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" /> <TableAction :actions="getTableAction(record)"/>
</template> </template>
</BasicTable> </BasicTable>
<!-- 表单区域 -->
<StProblemCheckModal @register="registerModal" @success="handleSuccess" />
<!-- 整改计划 -->
<StProblemCheckPlanModal @register="registerPlanModal" @success="handleSuccess" />
<!-- 整改执行 --> <!-- 整改执行 -->
<StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" /> <StProblemCheckExecuteModal @register="registerExecuteModal" @success="handleSuccess" />
<!-- 整改审核 -->
<StProblemCheckReviewModal @register="registerReviewModal" @success="handleSuccess" />
<!-- <StProblemCheckFlowModal ref="refStProblemCheckFlow" /> -->
</div> </div>
</template> </template>
<script lang="ts" name="problem-stProblemCheck" setup> <script lang="ts" name="problem-stProblemCheck" setup>
import { ref, computed, unref } from 'vue'; import { ref } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table'; import { BasicTable, TableAction } from '/@/components/Table';
import { useModal } from '/@/components/Modal'; import { useModal } from '/@/components/Modal';
import { useListPage } from '/@/hooks/system/useListPage'; import { useListPage } from '/@/hooks/system/useListPage';
import StProblemCheckModal from './components/StProblemCheckModal.vue';
import { columns, searchFormSchema } from './StProblemCheck.data'; import { columns, searchFormSchema } from './StProblemCheck.data';
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './StProblemCheck.api'; import { list} from './StProblemCheck.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import StProblemCheckPlanModal from './components/StProblemCheckPlanModal.vue';
import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue'; import StProblemCheckExecuteModal from './components/StProblemCheckExecuteModal.vue';
import StProblemCheckReviewModal from './components/StProblemCheckReviewModal.vue';
import StProblemCheckFlowModal from './components/StProblemCheckFlowModal.vue';
import { store } from '/@/store';
import { definitionStartByDeployId } from "/@/components/Process/api/definition"
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
const route = useRoute(); const route = useRoute();
const checkedKeys = ref<Array<string | number>>([]);
//注册model
const [registerModal, { openModal }] = useModal();
const [registerPlanModal, { openModal: openPlanModal }] = useModal();
const [registerExecuteModal, { openModal: openExecuteModal }] = useModal(); const [registerExecuteModal, { openModal: openExecuteModal }] = useModal();
const [registerReviewModal, { openModal: openReviewModal }] = useModal();
//注册table数据 const { prefixCls, tableContext } = useListPage({
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: { tableProps: {
title: '问题整改', title: '问题整改计划',
api: list, api: list,
columns, columns,
canResize: false, canResize: false,
...@@ -85,152 +48,34 @@ ...@@ -85,152 +48,34 @@
params['id'] = route.query.id params['id'] = route.query.id
}, },
actionColumn: { actionColumn: {
width: 400, width: 200,
fixed: 'right', fixed: 'right',
}, },
}, },
exportConfig: {
name: '问题整改',
url: getExportUrl,
},
importConfig: {
url: getImportUrl,
success: handleSuccess,
},
}); });
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext; const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
/**
* 新增事件
*/
function handleAdd() {
openModal(true, {
isUpdate: false,
showFooter: true,
});
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handlePlan(record: Recordable) { function handlePlan(record: Recordable) {
openPlanModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
function handleExecute(record: Recordable) {
openExecuteModal(true, { openExecuteModal(true, {
record, record,
isUpdate: true, isUpdate: true,
showFooter: true, showFooter: true,
}); });
} }
function handleReview(record: Recordable) {
openReviewModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: false,
});
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({ id: record.id }, handleSuccess);
}
/**
* 批量删除事件
*/
async function batchHandleDelete() {
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
}
/**
* 成功回调
*/
function handleSuccess() { function handleSuccess() {
(selectedRowKeys.value = []) && reload(); (selectedRowKeys.value = []) && reload();
} }
/**
* 操作栏
*/
function getTableAction(record) { function getTableAction(record) {
return [ return [
{ {
label: '编辑', label: '制定整改计划',
onClick: handleEdit.bind(null, record),
},
{
label: '启动流程',
onClick: handleFlow.bind(null, record),
ifShow: ()=> {
if(record['bpmStatus']==null||record['bpmStatus']=='')
return true
else return false
}
},
{
label: '整改计划',
onClick: handlePlan.bind(null, record), onClick: handlePlan.bind(null, record),
}, },
{
label: '整改执行',
onClick: handleExecute.bind(null, record),
},
{
label: '整改审核',
onClick: handleReview.bind(null, record),
},
]; ];
} }
/**
* 下拉操作栏
*/
function getDropDownAction(record) {
return [
{
label: '详情',
onClick: handleDetail.bind(null, record),
},
{
label: '删除',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),
},
},
];
}
const formData = ref<any>({}) // 填写的表单数据
const refStProblemCheckFlow = ref();
function handleFlow(record: Recordable) {
formData.dataId=record.id;
formData.dataName='id';
definitionStartByDeployId(record.deployId, formData).then(res => {
handleSuccess();
})
}
</script> </script>
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
let formData = {}; let formData = {};
const queryByIdUrl = '/problem/stProblemCheck/queryById/'; const queryByIdUrl = '/problem/stProblemCheck/queryById/';
alert(props.formData.dataId)
async function initFormData() { async function initFormData() {
let params = { id: props.formData.dataId }; let params = { id: props.formData.dataId };
const data = await defHttp.get({ url: queryByIdUrl, params }); const data = await defHttp.get({ url: queryByIdUrl, params });
......
<template> <template>
<BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="800" @ok="handleSubmit"> <BasicModal v-bind="$attrs" @register="registerModal" destroyOnClose :title="title" :width="800" @ok="handleSubmit">
<!-- <st-problem-check-form /> --> <st-problem-check-form />
<BasicForm @register="registerForm"></BasicForm> <!-- <BasicForm @register="registerForm"></BasicForm> -->
</BasicModal> </BasicModal>
</template> </template>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论