Commit 82f66ddb authored by baiyinhao's avatar baiyinhao

新增检查范围页面

parent 443f105e
...@@ -119,6 +119,7 @@ ...@@ -119,6 +119,7 @@
columns: storageManagementColumns, columns: storageManagementColumns,
// useSearchForm: true, // useSearchForm: true,
showTableSetting: false, showTableSetting: false,
maxHeight: 800, // 设置表格最大高度为 800px
formConfig: { formConfig: {
labelWidth: 120, labelWidth: 120,
schemas: storageManagementFormSchema, schemas: storageManagementFormSchema,
......
<template>
<div class="m-4 mr-0 overflow-hidden bg-white">
<BasicTree
title="质量主体"
ref="treeRef"
toolbar
search
treeWrapperClassName="h-[calc(100%-35px)] overflow-auto"
:clickRowToExpand="false"
:defaultExpandAll="true"
:treeData="treeData"
:fieldNames="{ key: 'businessId', title: 'fileName' }"
@select="handleSelect"
:beforeRightClick="getRightMenuList"
:actionList="actionList"
/>
</div>
</template>
<script lang="ts" setup>
import { h, nextTick, onMounted, ref, unref } from 'vue';
import { BasicTree, ContextMenuItem, TreeActionType, TreeItem } from '@/components/Tree';
import { getDeptList } from '@/api/system/dept/dept';
import { Nullable } from '@vben/types';
import { TreeData } from '@/views/dataQuality/agentClass/mainBody/dataQualityMainBodyData';
import { EventDataNode } from 'ant-design-vue/es/vc-tree/interface';
import { PlusOutlined, EllipsisOutlined } from '@ant-design/icons-vue';
import { useMessage } from '@/hooks/web/useMessage';
import { Modal } from 'ant-design-vue';
import { useModal } from '@/components/Modal';
import { router } from '@/router';
defineOptions({ name: 'DeptTree' });
const { createMessage } = useMessage();
const emit = defineEmits(['select']);
const treeData = ref<TreeItem[]>([]);
const treeRef = ref<Nullable<TreeActionType>>(null);
function getTree() {
const tree = unref(treeRef);
if (!tree) {
throw new Error('tree is null!');
}
return tree;
}
async function fetch() {
const data = TreeData;
treeData.value = handleTree(data, 'businessId', undefined, undefined, undefined);
await nextTick(() => {
getTree().expandAll(true);
});
}
function handleTree(data, id, parentId, children, rootId) {
id = id || 'id';
parentId = parentId || 'parentId';
children = children || 'children';
rootId =
rootId ||
Math.min.apply(
Math,
data.map((item) => {
return item[parentId];
}),
) ||
0;
// 对源数据深度克隆
const cloneData = JSON.parse(JSON.stringify(data));
// 循环所有项
const treeData = cloneData.filter((father) => {
const branchArr = cloneData.filter((child) => {
// 返回每一项的子级数组
return father[id] === child[parentId];
});
branchArr.length > 0 ? (father.children = branchArr) : '';
// 返回第一层
return father[parentId] === rootId;
});
return treeData !== '' ? treeData : data;
}
function handleSelect(keys) {
emit('select', keys[0]);
}
onMounted(() => {
fetch();
});
// 树的操作列表
const actionList = [
{
//全部操作按钮
render: (node) => {
return h(EllipsisOutlined, {
class: 'ml-2',
onClick: () => {
getRightMenuList(node);
},
});
},
},
];
function getRightMenuList(node: EventDataNode): Promise<ContextMenuItem[]> {
const menu = [
{
label: '打开',
handler: () => {
handleOpen(node);
},
icon: 'ant-design:eye-outlined',
},
{
label: '重命名',
handler: () => {
handleResetName(node);
},
icon: 'ant-design:edit-outlined',
},
{
label: '复制',
handler: () => {
copyButton();
},
icon: 'ant-design:snippets-outlined',
},
{
label: '粘贴',
handler: () => {
stickButton();
},
icon: 'ant-design:snippets-twotone',
},
{
label: '删除',
handler: () => {
deleteButton();
},
icon: 'ant-design:rest-outlined',
},
{
label: '移动',
handler: () => {
handleMove(node);
},
icon: 'bx:bxs-folder-open',
},
];
return new Promise((resolve) => {
resolve(menu);
});
}
/**打开*/
function handleOpen(data) {
router.push({
path: '/commonFile/fileDetail',
query: {
fileName: data.anotherName,
},
});
}
/**复制按钮*/
function copyButton() {
createMessage.success('复制成功!');
}
/**粘贴按钮*/
function stickButton() {
createMessage.success('粘贴成功!');
}
/**删除按钮*/
function deleteButton() {
Modal.confirm({
title: '确认删除',
content: '确定要删除此节点吗?',
okText: '确认',
cancelText: '取消',
onOk() {
// 执行删除逻辑
createMessage.success('删除成功!');
},
onCancel() {
console.log('取消删除');
createMessage.info('取消删除');
},
});
}
/** 重命名按钮*/
function handleResetName(record: Recordable) {
record.fileName = record.anotherName;
openResetNameModal(true, {
record,
isReset: true,
});
}
/** 成功回调*/
function handleSuccess() {}
</script>
import { getAllRoleList } from '@/api/system/role/role';
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { Switch } from 'ant-design-vue';
import { useMessage } from '@/hooks/web/useMessage';
import { changeFlagApi } from '@/api/system/user/user'; // 引入开关组件
type CheckedType = boolean | string | number;
export const columns: BasicColumn[] = [
{
title: '质量主体名称',
dataIndex: 'fileName',
width: 150,
slots: { customRender: 'fileName' },
},
{
title: '描述',
dataIndex: 'descripe',
width: 150,
},
{
title: '创建者',
dataIndex: 'holder',
width: 150,
},
{
title: '创建时间',
dataIndex: 'createDate',
width: 150,
},
{
title: '更新时间',
dataIndex: 'updateDate',
width: 150,
},
{
title: '原始主体',
dataIndex: 'originalPrincipal',
slots: { customRender: 'originalPrincipal' },
width: 150,
},
];
export const searchFormSchema: FormSchema[] = [
{
field: 'name',
label: '名称',
component: 'Input',
componentProps: {
placeholder: '请输入名称',
},
colProps: { span: 7 },
},
];
export const accountFormSchema: any[] = [
{
field: 'fileName',
label: '文件名称',
component: 'Input',
colProps: { lg: 24, md: 24 },
componentProps: {
disabled: true,
},
},
{
field: 'location',
label: '保存位置',
component: 'Input',
colProps: { lg: 24, md: 24 },
componentProps: {
disabled: true,
},
},
{
field: 'createDate',
label: '创建时间',
component: 'Input',
colProps: { lg: 24, md: 24 },
componentProps: {
disabled: true,
},
},
{
field: 'updateDate',
label: '最近修改',
component: 'Input',
colProps: { lg: 24, md: 24 },
componentProps: {
disabled: true,
},
},
];
/**移动*/
export const MoveFormSchema: any[] = [
{
field: 'taskId',
label: '路径',
component: 'TreeSelect',
colProps: { lg: 24, md: 24 },
componentProps: {
fieldNames: {
label: 'fileName',
value: 'businessId',
},
getPopupContainer: () => document.body,
},
required: true,
},
];
/**存储管理*/
export const StorageSchema: FormSchema[] = [
{
field: 'isStorage',
label: '存储主体问题数据明细',
component: 'Checkbox',
colProps: { lg: 12, md: 24 },
componentProps: ({ formModel, formActionType }) => ({
onChange: () => {
formActionType.updateSchema([{ field: 'isStorageInHDFS', ifShow: formModel.isStorage }]);
formActionType.updateSchema([{ field: 'handle', ifShow: formModel.isStorage }]);
formActionType.updateSchema([{ field: 'isAutoClear', ifShow: formModel.isStorage }]);
formActionType.updateSchema([{ field: 'clear', ifShow: formModel.isStorage }]);
formActionType.updateSchema([{ field: 'divider', ifShow: formModel.isStorage }]);
},
}),
},
{
field: 'isStorageInHDFS',
label: '存储到HDFS',
labelWidth: 85,
component: 'Checkbox',
colProps: { lg: 12, md: 24 },
ifShow: false,
},
{
field: 'handle',
label: '手动清理',
component: 'BasicTitle',
ifShow: false,
colProps: { lg: 24, md: 24 },
},
{
field: 'clear',
label: '清理',
component: 'Input',
labelWidth: 30,
colProps: { lg: 24, md: 24 },
ifShow: false,
slot: 'clear',
},
{
field: 'divider',
component: 'Divider',
ifShow: false,
colProps: { lg: 24, md: 24 },
},
{
field: 'isAutoClear',
label: '自动清理',
labelWidth: 70,
component: 'Checkbox',
colProps: { lg: 12, md: 24 },
ifShow: false,
componentProps: ({ formModel, formActionType }) => ({
onChange: () => {
formActionType.updateSchema([{ field: 'maxRetentionTime', ifShow: formModel.isAutoClear }]);
formActionType.updateSchema([{ field: 'inspectionCycle', ifShow: formModel.isAutoClear }]);
formActionType.updateSchema([{ field: 'inspectionTime', ifShow: formModel.isAutoClear }]);
},
}),
},
{
field: 'maxRetentionTime',
label: '最长保留时间',
component: 'Input',
colProps: { lg: 24, md: 24 },
componentProps: {
addonAfter: '天',
},
ifShow: false,
},
{
field: 'inspectionCycle',
label: '检查周期',
component: 'Select',
colProps: { lg: 24, md: 24 },
componentProps: {
options: [
{ label: '每天', value: '每天' },
{ label: '每周', value: '每周' },
{ label: '每月', value: '每月' },
{ label: '每年', value: '每年' },
],
},
ifShow: false,
},
{
field: 'inspectionTime',
label: '检查时间',
component: 'Input',
colProps: { lg: 24, md: 24 },
ifShow: false,
slot: 'isStorageInHDFS',
},
];
export const resetNameFormSchema: FormSchema[] = [
{
field: 'fileName',
label: '文件名称',
component: 'Input',
rules: [
{
required: true,
message: '请输入文件名称',
},
],
componentProps: {
placeholder: '请输入文件名称',
},
colProps: { span: 8 },
},
];
export const createFileFormSchema: FormSchema[] = [
{
field: 'taskId',
label: '路径',
component: 'TreeSelect',
colProps: { lg: 24, md: 24 },
componentProps: {
fieldNames: {
label: 'fileName',
value: 'businessId',
},
getPopupContainer: () => document.body,
},
required: true,
},
{
field: 'fileName',
label: '文件名称',
component: 'Input',
colProps: { lg: 24, md: 24 },
rules: [
{
required: true,
message: '请输入文件名称',
},
],
componentProps: {
placeholder: '请输入文件名称',
},
},
];
export const createTaskFormSchema: FormSchema[] = [
{
field: 'taskId',
label: '路径',
component: 'TreeSelect',
colProps: { lg: 24, md: 24 },
componentProps: {
fieldNames: {
label: 'fileName',
value: 'businessId',
},
getPopupContainer: () => document.body,
},
required: true,
},
{
field: 'name',
label: '质量主体名称',
component: 'Input',
rules: [
{
required: true,
message: '请输入质量主体名称',
},
],
componentProps: {
placeholder: '请输入质量主体名称',
},
colProps: { lg: 24, md: 24 },
},
{
field: 'fileType',
label: '文件类型',
component: 'Input',
defaultValue: '质量主体',
componentProps: {
readonly: true,
style: {
border: 'none',
backgroundColor: 'transparent',
},
},
colProps: { lg: 24, md: 24 },
},
];
<template>
<BasicModal
width="80%"
v-bind="$attrs"
@register="registerModal"
:title="getTitle"
@ok="handleSubmit"
>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<DeptTree class="w-1/4 xl:w-1/5" @select="handleSelect" />
<BasicTable @register="registerTable" class="w-3/4 xl:w-4/5" :searchInfo="searchInfo">
<template #toolbar>
<a-button type="primary" @click="handleSaveManage">存储管理</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
// icon: 'clarity:note-edit-line',
label: '复制',
onClick: copyButton.bind(null, record),
},
{
label: '属性',
onClick: handleEdit.bind(null, record),
},
{
color: 'error',
label: '删除',
popConfirm: {
title: '是否确认删除',
placement: 'left',
confirm: handleDelete.bind(null, record),
},
},
]"
/>
</template>
</template>
<template #fileName="{ text, record }">
<a @click="handleMainBodyEdit(record)"> {{ text }}</a>
</template>
<template #originalPrincipal="{ text, record }">
<a @click="handleMainBodyEdit(record)"> {{ text }}</a>
</template>
</BasicTable>
<StorageManageModal @register="registerStorageManageModal" />
</PageWrapper>
</BasicModal>
</template>
<script lang="ts" setup>
import { BasicModal, useModalInner, useModal } from '@/components/Modal';
import { reactive, unref, onDeactivated, onMounted, ref, computed } from 'vue';
import { useMessage } from '@/hooks/web/useMessage';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import { fileData, TreeData } from './dataQualityMainBodyData';
import StorageManageModal from './storageManageModal.vue';
import DeptTree from './FileTree.vue';
import { columns, searchFormSchema } from './account.data';
defineOptions({ name: 'KnowledgeModal' });
const emit = defineEmits(['success', 'register']);
const { createMessage, createConfirm } = useMessage();
const title = ref();
const isRunning = ref(false);
const [registerStorageManageModal, { openModal: openStorageManageModal }] = useModal(); // 存储管理弹窗
const searchInfo = reactive<Recordable>({});
const tableData = ref([]);
const getTitle = computed(() => (!unref(isRunning) ? '配置质量文件' : '配置质量文件'));
//初始化表单
const [registerTable, { reload }] = useTable({
api: async () => {
const response = {
pageNum: '1',
pageSize: '10',
pages: '1',
total: tableData.value.length,
code: '',
message: '',
data: [],
};
//过滤data中的数据,取出等于params.deptId的数据
var data = [];
data = tableData.value;
return { ...response, data: data };
},
pagination: false,
columns: columns,
useSearchForm: true,
showTableSetting: false,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
autoSubmitOnEnter: true,
},
rowKey: 'id',
// rowSelection: true,
bordered: true,
showIndexColumn: false,
// actionColumn: {
// width: 150,
// title: '操作',
// dataIndex: 'action',
// },
});
//初始化弹框
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
await reload();
setModalProps({ confirmLoading: false });
title.value = data.title;
});
// const [
// registerTable,
// { reload, updateTableDataRecord, getSearchInfo, getForm, getRowSelection },
// ] = useTable({
// title: '',
// api: async (params) => {
// //过滤掉tableData.value中,businessId等于100的
// var data = [];
// if (params.taskId == undefined || params.taskId == '') {
// data = tableData.value.filter((item) => item.businessId >= 200);
// } else if (params.taskId >= 200) {
// data = tableData.value.filter((item) => item.businessId == params.taskId);
// } else {
// data = tableData.value.filter((item) => item.parentId == params.taskId);
// }
// const response = {
// pageNu: '1',
// pageSize: '10',
// pages: '1',
// total: data.length,
// code: '',
// message: '',
// data: [],
// };
// //过滤data中的数据,取出等于params.deptId的数据
// return { ...response, data: data };
// },
// rowKey: 'businessId',
// columns,
// rowSelection: true,
// formConfig: {
// labelWidth: 120,
// schemas: searchFormSchema,
// autoSubmitOnEnter: true,
// },
// useSearchForm: true,
// showTableSetting: false,
// showIndexColumn: false,
// bordered: true,
// handleSearchInfoFn(info) {
// return info;
// },
// actionColumn: {
// width: 280,
// title: '操作',
// dataIndex: 'action',
// },
// });
/**复制按钮*/
function copyButton() {
createMessage.success('复制成功!');
}
/**粘贴按钮*/
function stickButton() {
createMessage.success('粘贴成功!');
}
/**删除按钮*/
function deleteButton() {
createConfirm({
iconType: 'warning',
title: '确认删除',
content: '确认批量删除选中数据吗?',
onOk() {
createMessage.success('删除成功!');
reload();
},
});
}
/** 部门树的select*/
function handleSelect(taskId = '') {
searchInfo.taskId = taskId;
reload();
}
function handleSaveManage(record: Recordable) {
openStorageManageModal(true, {
record,
});
}
/**确定按钮*/
function handleSubmit() {
closeModal();
}
onMounted(() => {
tableData.value = TreeData;
console.log('tableData.value :', tableData.value);
});
</script>
<template>
<BasicModal
v-bind="$attrs"
@register="registerModal"
title="存储管理"
@ok="handleSubmit"
minHeight="50"
>
<BasicForm @register="registerForm">
<template #clear="{ model, field }">
<DatePicker style="width: 55%" />之前所有的执行记录
<a-button v-model="model.clear" @click="handleClear" style="margin-left: 5px" type="error"
>清理</a-button
>
</template>
<template #isStorageInHDFS="{ model, field }">
<a-input style="width: 60px; margin-right: 5px" /><a-input
style="width: 60px; margin-right: 5px"
/>
</template>
</BasicForm>
</BasicModal>
</template>
<script lang="ts" setup>
import { ref, computed, unref, reactive } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
import { StorageSchema } from './account.data';
import { useMessage } from '@/hooks/web/useMessage';
import { DatePicker } from 'ant-design-vue';
const emit = defineEmits(['success', 'register']);
const { createMessage } = useMessage();
//获取接口数据并放在下拉框里(这里是打开了一个弹框)
//初始化表单
const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({
labelWidth: 160,
labelAlign: 'left',
baseColProps: { span: 24 },
schemas: StorageSchema,
showActionButtonGroup: false,
actionColOptions: {
span: 23,
},
});
//初始化弹框
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields();
setModalProps({ confirmLoading: false });
});
/**确定按钮*/
function handleSubmit() {
createMessage.success('保存成功!');
closeModal();
}
/**确定按钮*/
function handleClear() {
createMessage.success('清理成功!');
closeModal();
}
</script>
...@@ -48,6 +48,8 @@ ...@@ -48,6 +48,8 @@
:disabled="getRowSelection().selectedRowKeys <= 0" :disabled="getRowSelection().selectedRowKeys <= 0"
>查看报告</a-button >查看报告</a-button
> >
<a-button type="primary" @click="handleAddCheckRangePlus">添加检查范围-增量添加</a-button>
<!-- <a-button type="primary" @click="handleAddCheckRangeAll">添加检查范围-全量添加</a-button> -->
<a-button <a-button
type="primary" type="primary"
@click="handleQualityTaskOnline" @click="handleQualityTaskOnline"
...@@ -113,6 +115,7 @@ ...@@ -113,6 +115,7 @@
<quality-setting-modal @register="registerSettingModal" /> <quality-setting-modal @register="registerSettingModal" />
<new-rule-modal @register="registerNewRule" /> <new-rule-modal @register="registerNewRule" />
<alarm-setting-modal @register="registerAlarmSettingModal" /> <alarm-setting-modal @register="registerAlarmSettingModal" />
<quality-check-range-plus-modal @register="registerCheckRangePlusModal" />
</PageWrapper> </PageWrapper>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
...@@ -138,6 +141,7 @@ ...@@ -138,6 +141,7 @@
import QualitySettingModal from './QualityTaskSetting.vue'; import QualitySettingModal from './QualityTaskSetting.vue';
import NewRuleModal from './QualityTaskNewRule.vue'; import NewRuleModal from './QualityTaskNewRule.vue';
import AlarmSettingModal from './QualityTaskAlarmSetting.vue'; import AlarmSettingModal from './QualityTaskAlarmSetting.vue';
import QualityCheckRangePlusModal from '@/views/dataQuality/dataSheet/task/checkRange/index.vue';
import { Modal } from 'ant-design-vue'; import { Modal } from 'ant-design-vue';
defineOptions({ name: 'AccountManagement' }); defineOptions({ name: 'AccountManagement' });
...@@ -147,6 +151,7 @@ ...@@ -147,6 +151,7 @@
const go = useGo(); const go = useGo();
const isOnline = ref(true); const isOnline = ref(true);
const isOffline = ref(false); const isOffline = ref(false);
// const isRunning = ref(false);
const [register, { openModal }] = useModal(); const [register, { openModal }] = useModal();
const [registerImport, { openModal: openImportModal }] = useModal(); const [registerImport, { openModal: openImportModal }] = useModal();
const [registerRemove, { openModal: openRemoveModal }] = useModal(); const [registerRemove, { openModal: openRemoveModal }] = useModal();
...@@ -155,6 +160,7 @@ ...@@ -155,6 +160,7 @@
const [registerRunSetting, { openModal: openRunSettingModal }] = useModal(); const [registerRunSetting, { openModal: openRunSettingModal }] = useModal();
const [registerSettingModal, { openModal: openSettingModal }] = useModal(); const [registerSettingModal, { openModal: openSettingModal }] = useModal();
const [registerAlarmSettingModal, { openModal: openAlarmSettingModal }] = useModal(); const [registerAlarmSettingModal, { openModal: openAlarmSettingModal }] = useModal();
const [registerCheckRangePlusModal, { openModal: openCheckRangePlusModal }] = useModal();
const searchInfo = reactive<Recordable>({}); const searchInfo = reactive<Recordable>({});
const [ const [
registerTable, registerTable,
...@@ -257,6 +263,10 @@ ...@@ -257,6 +263,10 @@
function handleQualityTaskRunLog() { function handleQualityTaskRunLog() {
go('/dataQuality/task'); go('/dataQuality/task');
} }
/** 添加检查范围*/
function handleAddCheckRangePlus() {
openCheckRangePlusModal(true, {});
}
/** 上线 未完成 应为弹窗*/ /** 上线 未完成 应为弹窗*/
function handleQualityTaskOnline() { function handleQualityTaskOnline() {
go('/dataQuality/dataSheet/task'); go('/dataQuality/dataSheet/task');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment