报表统计、报告打印、通知详情

xjl
徐景良 2024-04-26 08:45:05 +08:00
parent 5a64936e28
commit 773f26f239
19 changed files with 2189 additions and 1 deletions

View File

@ -88,3 +88,23 @@ export type RolePageListGetResultModel = BasicFetchResult<RoleListItem>;
export type RoleListGetResultModel = RoleListItem[];
export type addDeptModel = addDept[];
export type ReportParams = BasicPageParams;
export interface ReportListItem {
id?:string
}
export interface NoticeListItem {
Id :string;
msg_title:string;
msg_content:string;
createtime:string;
createuser:string;
createusername:string;
is_delete:number;
msg_type:number;
case_no:string;
caseid:string;
is_read:number;
}

View File

@ -10,7 +10,10 @@ import {
AccountListGetResultModel,
RolePageListGetResultModel,
RoleListGetResultModel,
addDept
addDept,
ReportParams,
ReportListGetResultModel,
NoticeListGetResultModel
} from './model/systemModel';
import { defHttp } from '@/utils/http/axios';
@ -55,6 +58,8 @@ enum Api {
LoadDataBaseLinkTree = '/api/SysDatabaseLink/LoadDataBaseLinkTree',
GetPosInfo = '/api/SysPosition/Get',
UpdatePosition = '/api/SysPosition/Update',
ReportList = '/api/DroneCaseinfo/LoadCaseInfoList',
NoticeList = '/api/DroneCaseinfo/LoadMessageList',
}
export const getPositionsTree = (params?: AccountParams) =>
@ -293,4 +298,10 @@ export const getLoadDataBaseLinkTree = () =>
export const getPosInfo = (params) =>
defHttp.get({ url: Api.GetPosInfo, params });
export const getReportList = (params: ReportParams)=>
defHttp.get<ReportListGetResultModel>({ url: Api.ReportList, params });
export const getNoticeList = (params?:Object) =>
defHttp.get<NoticeListGetResultModel>({url:Api.NoticeList,params})

View File

@ -0,0 +1,76 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit">
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { ref, computed, unref } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
import { formSchema } from './dept.data';
import { getDeptList, addDept, updateDept } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
defineOptions({ name: 'DeptModal' });
const emit = defineEmits(['success', 'register']);
const isUpdate = ref(true);
const [registerForm, { resetFields, setFieldsValue, updateSchema, validate }] = useForm({
labelWidth: 100,
baseColProps: { span: 24 },
schemas: formSchema,
showActionButtonGroup: false,
});
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields();
setModalProps({ confirmLoading: false });
isUpdate.value = !!data?.isUpdate;
if (unref(isUpdate)) {
setFieldsValue({
...data.record,
});
}
const treeData = await getDeptList();
updateSchema({
field: 'parentId',
componentProps: { treeData },
});
});
const getTitle = computed(() => (!unref(isUpdate) ? '新增通知' : '编辑通知'));
async function handleSubmit() {
try {
const values = await validate();
let query = values;
//
if (!unref(isUpdate)) {
const data = await addDept(query);
if (data) {
setModalProps({ confirmLoading: true });
closeModal();
emit('success');
return createMessage.success('新增成功');
} else {
return createMessage.error('新增失败');
}
} else {
const data = await updateDept(query);
if (data) {
setModalProps({ confirmLoading: true });
closeModal();
emit('success');
return createMessage.success('编辑成功');
} else {
return createMessage.error('编辑失败');
}
}
} finally {
setModalProps({ confirmLoading: false });
}
}
</script>

View File

@ -0,0 +1,40 @@
<template>
<div class="m-4 mr-0 overflow-hidden bg-white">
<BasicTree ref="asyncExpandTreeRef" title="部门列表" toolbar search
treeWrapperClassName="h-[calc(100%-35px)] overflow-auto" loadData :actionList="actionList"
:renderIcon="createIcon" :clickRowToExpand="false" :treeData="treeData" :fieldNames="{ key: 'id', title: 'name' }"
:defaultExpandAll="true" @select="handleSelect" />
</div>
</template>
<script lang="ts" setup>
import { onMounted, ref , nextTick, unref} from 'vue';
import { BasicTree, TreeItem ,TreeActionType} from '@/components/Tree';
import { getDeptList } from '@/api/demo/system';
defineOptions({ name: 'DeptTree' });
const emit = defineEmits(['select']);
const treeData = ref < TreeItem[] > ([]);
const asyncExpandTreeRef = ref < Nullable < TreeActionType >> (null);
async function fetch() {
treeData.value = (await getDeptList()) as unknown as TreeItem[];
//
nextTick(() => {
unref(asyncExpandTreeRef)?.expandAll(true);
});
}
function handleSelect(keys) {
emit('select', keys[0]);
}
onMounted(() => {
fetch();
});
defineExpose({
fetch
})
</script>

View File

@ -0,0 +1,59 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" title="给部门分配职级组" @ok="handleSubmit">
<BasicForm @register="registerForm" :model="modelRef"/>
</BasicModal>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
import { formGroupSchema } from './dept.data';
import { orgPosGroup} from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
defineOptions({ name: 'PosGroupModal' });
const emit = defineEmits(['success', 'register']);
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
labelWidth: 100,
baseColProps: { span: 24 },
schemas: formGroupSchema,
showActionButtonGroup: false,
});
let depeId = ref()
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
resetFields();
setModalProps({ confirmLoading: false });
depeId.value = data.record.id
setFieldsValue({
...data.record,
});
});
async function handleSubmit() {
try {
const values = await validate();
let query = {
orgId:depeId.value,
posGroupId:values.posGroupId,
}
//
const data = await orgPosGroup(query);
if(data){
setModalProps({ confirmLoading: true });
// TODO custom api
closeModal();
emit('success');
return createMessage.success('成功');
}else{
return createMessage.error('失败');
}
} finally {
setModalProps({ confirmLoading: false });
}
}
</script>

View File

@ -0,0 +1,234 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { getDataBaseCodeList } from '@/api/formdesign/index';
// 数据源table
export const dbsourcesColumns: BasicColumn[] = [
{
title: 'ID',
dataIndex: 'id',
ifShow: false,
},
{
title: '编码',
dataIndex: 'code',
width: 200,
},
{
title: '名称',
dataIndex: 'name',
width: 200,
},
{
title: '数据库',
dataIndex: 'dbId',
width: 80,
},
{
title: '创建人',
dataIndex: 'createUserName',
width: 80,
},
{
title: '创建时间',
dataIndex: 'createDate',
width: 80,
},
{
title: '创建人id',
dataIndex: 'reateUserId',
ifShow: false,
},
{
title: '备注',
dataIndex: 'description',
ifShow: false,
},
{
title: 'ID',
dataIndex: 'id',
ifShow: false,
},
{
title: 'modifyDate',
dataIndex: 'modifyDate',
ifShow: false,
},
{
title: 'modifyUserId',
dataIndex: 'modifyUserId',
ifShow: false,
},
{
title: 'modifyUserName',
dataIndex: 'modifyUserName',
ifShow: false,
},
{
title: 'SQL',
dataIndex: 'sql',
ifShow: false,
},
];
// 数据源table-搜索
export const searchFormSchema: FormSchema[] = [
{
field: 'keyword',
label: '名称',
component: 'Input',
colProps: { span: 8 },
},
];
// 数据源table-新增、编辑
export const formSchema: FormSchema[] = [
{
field: 'code',
component: 'Input',
label: '编号',
colProps: {
span: 24,
},
defaultValue: '',
required: true,
componentProps: {
placeholder: '请输入',
},
},
{
field: 'name',
component: 'Input',
label: '名称',
colProps: {
span: 24,
},
defaultValue: '',
required: true,
componentProps: {
placeholder: '请输入',
},
},
{
field: 'dbId',
component: 'ApiTreeSelect',
label: '数据库',
required: true,
colProps: {
span: 24,
},
componentProps: {
api: () =>
getDataBaseCodeList({}).then((data: Recordable) => {
return new Promise((resolve) => {
resolve(data);
});
}),
labelField: 'text',
valueField: 'value',
async: true,
onChange: (e, v) => {
console.log('ApiTreeSelect====>:', e, v);
},
onLoadData: ({ treeData, resolve, treeNode }) => {
setTimeout(() => {
const children: Recordable[] = [];
treeData.value.forEach((item) => {
if (item.id == treeNode.id) {
if (item.childNodes) {
item.childNodes.forEach((val) => {
children.push({
text: val.text,
value: val.value,
});
});
}
}
});
children.forEach((item) => {
item.isLeaf = false;
item.children = [];
});
treeNode.dataRef.children = children;
treeData.value = [...treeData.value];
resolve();
return;
}, 300);
},
},
},
{
field: 'sql',
component: 'InputTextArea',
label: 'SQL语句',
colProps: {
span: 24,
},
defaultValue: '',
required: true,
componentProps: {
placeholder: '',
},
},
{
field: 'description',
component: 'InputTextArea',
label: '描述',
colProps: {
span: 24,
},
defaultValue: '',
componentProps: {
placeholder: '请输入',
},
},
{
field: 'id',
component: 'Input',
label: 'id',
ifShow: false,
},
{
field: 'createUserId',
component: 'Input',
label: '创建人',
ifShow: false,
},
{
field: 'createUserName',
component: 'Input',
label: '创建人',
ifShow: false,
},
{
field: 'createDate',
component: 'Input',
label: '创建时间',
ifShow: false,
},
{
field: 'modifyUserId',
component: 'Input',
label: '修改人',
ifShow: false,
},
{
field: 'modifyUserName',
component: 'Input',
label: '修改人',
ifShow: false,
},
{
field: 'modifyDate',
component: 'Input',
label: '修改时间',
ifShow: false,
},
{
field: 'isEdit',
component: 'Input',
ifShow: false,
},
{
field: 'tenantId',
component: 'Input',
ifShow: false,
},
];

View File

@ -0,0 +1,143 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Tag } from 'ant-design-vue';
import { getPosGroupList } from '@/api/demo/system';
export const columns: BasicColumn[] = [
{
title: '标题',
dataIndex: 'msg_title',
},
{
title: '内容',
dataIndex: 'msg_content',
},
{
title: '编辑人',
dataIndex: 'createusername',
},
{
title: '创建时间',
dataIndex: 'createtime',
},
// {
// title: '操作',
// dataIndex: 'createTime',
// width: 180,
// },
// {
// title: '备注',
// dataIndex: 'remark',
// },
];
export const searchFormSchema: FormSchema[] = [
{
field: 'key',
label: '关键字段',
component: 'Input',
colProps: { span: 6 },
},{
field: 'msg_type',
component: 'Select',
label: '通知类型',
colProps: {
span: 6,
},
componentProps: {
options: [
{
label: '政策法规',
value: '0',
key: '0',
},{
label: '消息通知',
value: '1',
key: '1',
}
],
},
}
];
export const formGroupSchema: FormSchema[] = [
{
field: 'posGroupId',
component: 'ApiSelect',
label: '职级组',
required: true,
componentProps: ({ formActionType, formModel }) => {
return {
api: getPosGroupList, // 接口
// 接口参数
resultField: 'result',
labelField: 'name',
valueField: 'id',
};
},
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: '名称',
component: 'Input',
ifShow:false
},
{
field: 'name',
label: '通知标题',
component: 'Input',
required: true,
},
{
field: 'msg_content',
label: '通知内容',
component: 'InputTextArea',
required: true,
},
{
field: 'msg_type',
label: '通知类型',
component: 'RadioButtonGroup',
defaultValue: 0,
componentProps: {
options: [
{ label: '政策法规', value: 0 },
{ label: '消息通知', value: 1 },
],
},
required: true,
},{
field: 'is_all',
label: '是否全选',
component: 'RadioButtonGroup',
defaultValue: 0,
componentProps: {
options: [
{ label: '否', value: 0 },
{ label: '是', value: 1 },
],
},
required: true,
},
{
field: 'parentId',
label: '选择部门',
component: 'TreeSelect',
componentProps: {
fieldNames: {
label: 'name',
key: 'id',
value: 'id',
},
onChange:(value)=>{
console.log(value)
},
getPopupContainer: () => document.body,
},
// required: true,
},
];

View File

@ -0,0 +1,94 @@
<template>
<BasicDrawer v-bind="$attrs" @register="registerDrawer" :title="getTitle" width="70%">
<BasicTable
class="w-4/4 xl:w-5/5"
@register="registerTable"
@fetch-success="onFetchSuccess"
:searchInfo="searchInfo"
>
<template #toolbar>
<span>关键字</span>
<a-select
:options="columnOptions"
v-model:value="field"
placeholder="请选择"
style="width: 120px"
size="mini"
/>
<a-input-search
v-model:value="searchValue"
placeholder="请输入查询关键字"
style="width: 200px"
@search="onSearch"
/>
</template>
</BasicTable>
</BasicDrawer>
</template>
<script lang="ts" setup>
import { ref, reactive } from 'vue';
import { BasicTable, useTable } from '@/components/Table';
import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
// ts
import {} from './dbsource.data';
// api
import { fun_GetDataColName } from '@/api/demo/dbsource';
const tableData = ref();
const searchValue = ref();
//
const columnOptions = ref([]);
//
let field = ref('');
//
const getTitle = ref('');
//
const [registerDrawer, { setDrawerProps }] = useDrawerInner(async (data) => {
clearSelectedRowKeys();
reload();
setDrawerProps({ confirmLoading: false });
getTitle.value = '查看数据源数据 - ' + data.name;
getColumnData(data);
});
//
const searchInfo = reactive<Recordable>({});
const [registerTable, { reload, clearSelectedRowKeys, setColumns }] = useTable({
dataSource: tableData,
rowKey: 'id',
striped: false,
useSearchForm: false,
bordered: true,
//
showIndexColumn: true,
handleSearchInfoFn(info) {
return info;
},
});
//
async function getColumnData(record) {
let data = await fun_GetDataColName({ code: record.code });
let columns: string[] = [];
data.forEach((element) => {
columns.push({
title: element,
dataIndex: element,
label: element,
value: element,
});
});
setColumns(columns);
//
columnOptions.value = columns;
}
//
async function setTableData() {
// tableData.value = columnData;
}
//
function onSearch() {
console.log(field);
}
</script>

View File

@ -0,0 +1,136 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable" :searchInfo="searchInfo">
<template #toolbar>
<PermissionBtn @btnEvent="onBtnClicked"></PermissionBtn>
</template>
</BasicTable>
<DeptModal @register="registerModal" @success="handleSuccess" />
<PosGroupModal @register="registerPosGroupModal" @success="handleSuccess"></PosGroupModal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue';
import { BasicTable, useTable } from '@/components/Table';
import { getNoticeList, deleteDept } from '@/api/demo/system';
import { PageWrapper } from '@/components/Page';
import { useModal } from '@/components/Modal';
import { useMessage } from '@/hooks/web/useMessage';
import { DeptTree } from './page';
import { DeptModal } from './page';
import { PosGroupModal } from './page';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, searchFormSchema } from './dept.data';
defineOptions({ name: 'DeptManagement' });
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal: openDeptModal }] = useModal();
const [registerPosGroupModal, { openModal: openPosGroupModal }] = useModal();
const searchInfo = reactive<Recordable>({});
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
title: '通知详情',
api: getNoticeList,
rowKey: 'Id',
columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
rowSelection: {
//
type: 'checkbox',
// type: 'radio',
},
useSearchForm: true,
showTableSetting: true,
bordered: true,
handleSearchInfoFn(info) {
return info;
},
});
async function handlePoGroup() {
let rows = getSelectRows();
if (!rows.length) {
return createMessage.warn('请选择一个部门');
}
var record = rows[0];
openPosGroupModal(true, {
record,
isUpdate: false,
});
}
const childRef = ref<any>();
function handleCreate() {
openDeptModal(true, {
isUpdate: false,
});
}
function handleEdit() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请选择一个部门进行编辑');
}
const record = rows[0];
openDeptModal(true, {
record,
isUpdate: true,
});
}
async function handleDelete() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请选择一个部门进行删除');
}
const query = [rows[0].id];
createConfirm({
iconType: 'info',
title: '删除',
content: '确定要删除当前部门吗',
onOk: async () => {
const data = await deleteDept(query);
if (data) {
handleSuccess();
return createMessage.success('删除成功');
} else {
return createMessage.error('删除失败');
}
},
});
}
function onBtnClicked(domId) {
switch (domId) {
case 'btnAdd':
handleCreate();
break;
case 'btnEdit':
handleEdit();
break;
case 'btnDelete':
handleDelete();
break;
case 'btnPoGroup':
handlePoGroup();
break;
default:
break;
}
}
function handleSelect(orgId = '') {
searchInfo.orgId = orgId;
reload();
}
function handleSuccess() {
clearSelectedRowKeys();
childRef.value.fetch();
reload();
}
</script>

View File

@ -0,0 +1,116 @@
<template>
<BasicModal
v-bind="$attrs"
@register="registerModal"
:centered="true"
:canFullscreen="false"
:defaultFullscreen="false"
:showCancelBtn="true"
:showOkBtn="true"
:draggable="false"
:title="getTitle"
:useWrapper="true"
@ok="handleOk"
>
<BasicForm ref="registerFormRef" @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { ref, computed, unref, defineEmits } from 'vue';
import { BasicModal, useModalInner } from '@/components/Modal';
import { BasicForm, useForm } from '@/components/Form';
import { useMessage } from '@/hooks/web/useMessage';
// ts
import { formSchema } from './dbsource.data';
// api
import { fun_AddForm, fun_UpdateForm } from '@/api/demo/dbsource';
const emit = defineEmits(['submit']);
const { createMessage } = useMessage();
//
const isUpdate = ref(false);
//
const getTitle = computed(() => (unref(isUpdate) ? '编辑数据源' : '新增数据源'));
//
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
setModalProps({ confirmLoading: false });
isUpdate.value = data.isUpdate;
if (isUpdate.value) {
setFieldsValue(data.record);
} else {
validate();
resetFields();
}
});
// form
const registerFormRef = ref<any>();
const [registerForm, { setFieldsValue, getFieldsValue, resetFields, validate }] = useForm({
labelWidth: 100,
schemas: formSchema,
showActionButtonGroup: false,
baseColProps: { lg: 24, md: 24 },
});
//
async function handleOk() {
validate();
let record = getFieldsValue();
let params = {
code: record.code,
name: record.name,
dbId: record.dbId,
sql: record.sql,
description: record.description,
};
if (isUpdate.value) {
//
params.id = record.id;
params.createUserName = record.createUserName;
params.createDate = record.createDate;
let data = await fun_UpdateForm(params);
if (data) {
createMessage.success('修改成功!');
closeModal();
emit('submit');
}
} else {
//
params.createUserName = localStorage.getItem('fireUserLoginName');
params.createDate = new Date();
let data = await fun_AddForm(params);
if (data) {
createMessage.success('新增成功!');
closeModal();
emit('submit');
}
}
}
</script>
<style lang="less" scoped>
.l-rblock {
width: 60%;
height: 60%;
background-color: @border-color-base;
&_content {
box-sizing: border-box;
position: relative;
width: 100%;
height: 100%;
max-width: 794px;
overflow: hidden auto;
background: @component-background;
border-radius: 4px;
margin: auto;
padding: 24px;
}
&_formLine {
height: 50px;
}
}
</style>

View File

@ -0,0 +1,5 @@
export { default as DeptTree } from './DeptTree.vue';
export { default as DeptModal } from './DeptModal.vue';
export { default as PosGroupModal } from './PosGroupModal.vue';

View File

@ -0,0 +1,162 @@
<template>
<div>
<BasicTable @register="registerTable" :searchInfo="searchInfo">
<template #toolbar>
<PermissionBtn @btn-event="onBtnClicked" />
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
// icon: 'ant-design:ellipsis-outlined',
label: '查看',
onClick: viewAccount.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRoleListByPage,getReportList, deleteRole } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
import { useModal } from '@/components/Modal';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, searchFormSchema } from './report.data';
defineOptions({ name: 'RoleManagement' });
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal: openRoleModal }] = useModal();
const [registerModulesModal, { openModal: openModulesModal }] = useModal();
const [registerAccountModal, { openModal: openAccountModal }] = useModal();
const searchInfo = reactive<Recordable>({});
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
//
title: '报告打印',
//
api: getReportList,
// BasicColumn[]
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
// 使
useSearchForm: true,
//
showTableSetting: true,
//
bordered: true,
//
showIndexColumn: false,
//
rowSelection: {
//
// type: 'checkbox',
type: 'radio',
},
//
handleSearchInfoFn(info) {
return info;
},
actionColumn: {
width: 80,
title: '查看账号',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: undefined,
},
});
function handleCreate() {
openRoleModal(true, {
isUpdate: false,
});
}
function handleExport(){
createMessage.success("下载成功!");
}
function viewAccount(record: Recordable) {
openAccountModal(true, {
record,
});
}
function handleEdit() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openRoleModal(true, {
record,
isUpdate: true,
});
}
async function handleDelete() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行删除');
}
const query = [rows[0].id];
createConfirm({
iconType: 'info',
title: '删除',
content: '确定要删除当前角色吗',
onOk: async () => {
const data = await deleteRole(query);
if (data) {
handleSuccess();
return createMessage.success('删除成功');
} else {
return createMessage.error('删除失败');
}
},
});
}
function handleSuccess() {
clearSelectedRowKeys();
reload();
}
function onBtnClicked(domId) {
switch (domId) {
case 'btnAdd':
handleCreate();
break;
case 'btnEdit':
handleEdit();
break;
case 'btnDelete':
handleDelete();
break;
case 'btnModules':
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openModulesModal(true, {
record,
});
break;
case 'btnExport':
handleExport();
break;
default:
break;
}
}
</script>

View File

@ -0,0 +1,6 @@
export { default as AccountModal } from './AccountModal.vue';
export { default as ModulesModal } from './ModulesModal.vue';
export { default as RoleDrawer } from './RoleDrawer.vue';
export { default as RoleModal } from './RoleModal.vue';

View File

@ -0,0 +1,98 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Switch,Tag } from 'ant-design-vue';
import { setRoleStatus } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
type CheckedType = boolean | string | number;
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 200,
},{
title: '案件描述',
dataIndex: 'case_description',
width: 200,
},{
title: '办结状态',
dataIndex: 'handle_status_name',
width: 200,
},{
title: '上报人',
dataIndex: 'createusername',
width: 200,
},{
title: '上报时间',
dataIndex: 'createtime',
width: 200,
}
];
export const searchFormSchema: FormSchema[] = [
{
field: 'key',
label: '关键字段',
component: 'Input',
colProps: { span: 6 },
},
{
field: 'is_intact',
component: 'Select',
label: '案件状态',
colProps: {
span: 6,
},
componentProps: {
options: [
{
label: '全部',
value: null,
key: null,
},
{
label: '未判读',
value: '0',
key: '0',
},{
label: '已提交',
value: '1',
key: '1',
},{
label: '已关闭',
value: '99',
key: '99',
},
],
},
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: '角色名称',
required: true,
component: 'Input',
ifShow:false,
},
{
field: 'name',
label: '角色名称',
required: true,
component: 'Input',
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: 0,
componentProps: {
options: [
{ label: '启用', value: 0},
{ label: '停用', value: 1 },
],
},
},
];

View File

@ -0,0 +1,174 @@
<template>
<BasicTable @register="registerTable" >
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'streetname'">
<TableAction
:actions="[
{
label: '详情',
onClick: handlePreViewData.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRoleListByPage,getReportList, deleteRole } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
import { useModal } from '@/components/Modal';
import { columns,columnsDataPreview,searchFormSchema } from './record.data';
defineOptions({ name: 'RoleManagement' });
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal: openRoleModal }] = useModal();
const [registerModulesModal, { openModal: openModulesModal }] = useModal();
const [registerAccountModal, { openModal: openAccountModal }] = useModal();
const searchInfo = reactive<Recordable>({});
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
//
title: '',
//
api: getReportList,
// BasicColumn[]
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
// 使
useSearchForm: false,
//
showTableSetting: false,
//
bordered: true,
//
showIndexColumn: false,
//
rowSelection: false,
//
handleSearchInfoFn(info) {
return info;
},
});
function handleCreate() {
openRoleModal(true, {
isUpdate: false,
});
}
function viewAccount(record: Recordable) {
openAccountModal(true, {
record,
});
}
function handlePreViewData(record:Recordable){
console.log(record)
}
function handleEdit() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openRoleModal(true, {
record,
isUpdate: true,
});
}
async function handleDelete() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行删除');
}
const query = [rows[0].id];
createConfirm({
iconType: 'info',
title: '删除',
content: '确定要删除当前角色吗',
onOk: async () => {
const data = await deleteRole(query);
if (data) {
handleSuccess();
return createMessage.success('删除成功');
} else {
return createMessage.error('删除失败');
}
},
});
}
function handlePrint(){
}
function handleExport(){
createMessage.success("数据导出成功!")
}
function handleSuccess() {
clearSelectedRowKeys();
reload();
reloadDataPreview();
}
function onBtnClicked(domId) {
switch (domId) {
case 'btnAdd':
handleCreate();
break;
case 'btnEdit':
handleEdit();
break;
case 'btnDelete':
handleDelete();
break;
case 'btnModules':
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openModulesModal(true, {
record,
});
break;
case 'btnPrint':
handlePrint();
break;
case 'btnExport':
handleExport();
break;
default:
break;
}
}
</script>
<style>
.data-preview-container{
width:100%;
height: calc( 100% - 50px);
position:absolute;
background:#fff;
padding:30px;
top:0px;
left:0px;
}
</style>

View File

@ -0,0 +1,249 @@
<template>
<div>
<BasicTable @register="registerTable" :searchInfo="searchInfo">
<template #toolbar>
<PermissionBtn @btn-event="onBtnClicked" />
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'streetname'">
<TableAction
:actions="[
{
label: record.streetname,
onClick: handlePreViewData.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<div class="data-preview-container" v-if="showRecordList">
<a-tabs hide-add type="editable-card" @edit="onEdit">
<a-tab-pane v-for="pane in panes" :key="pane.key" :tab="pane.title" :closable="pane.closable">
{{ pane.content }}
</a-tab-pane>
</a-tabs>
<RecordList></RecordList>
<div class="data-preview-container-option">
<div @click="handleCloseRecordList()">
<MinusOutlined />
</div>
<div @click="handleCloseRecordList()">
<CloseOutlined />
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref,reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRoleListByPage,getReportList, deleteRole } from '@/api/demo/system';
// import {DataPreivew} from './RecordList.vue'
import { useMessage } from '@/hooks/web/useMessage';
import { useModal } from '@/components/Modal';
import { RecordList } from './page';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, columnsDataPreview,searchFormSchema } from './statistical.data';
import {MinusOutlined,CloseOutlined} from '@ant-design/icons-vue'
defineOptions({ name: 'RoleManagement' });
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal: openRoleModal }] = useModal();
const [registerModulesModal, { openModal: openModulesModal }] = useModal();
const [registerAccountModal, { openModal: openAccountModal }] = useModal();
const searchInfo = reactive<Recordable>({});
const showRecordList = ref<boolean>(false);
const panes = reactive<{ title: string; content: string; key: string; closable?: boolean}[]>([
{ title: '东蒙镇-24h为核查', content: '', key: '1' },
{ title: '大田庄乡-违法', content: '', key: '2' },
{ title: '费城街道-伪变化', content: '', key: '3' }
])
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys }] = useTable({
//
title: '统计报表',
//
api: getReportList,
// BasicColumn[]
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
// 使
useSearchForm: true,
//
showTableSetting: true,
//
bordered: true,
//
showIndexColumn: false,
//
rowSelection: false,
//
handleSearchInfoFn(info) {
return info;
},
});
const [registerTableDataPreview,{ reloadDataPreview, getSelectRowsDataPreview, clearSelectedRowKeysDataPreview }] = useTable({
//
title: '',
//
api: getReportList,
// BasicColumn[]
columnsDataPreview,
rowKey: 'id',
formConfig: {
labelWidth: 120,
// schemas: searchFormSchema,
},
// 使
useSearchForm: false,
//
showTableSetting: false,
//
bordered: true,
//
showIndexColumn: false,
//
rowSelection: false,
//
handleSearchInfoFn(info) {
return info;
},
});
function handleCloseRecordList(){
showRecordList.value = false;
}
function handleCreate() {
openRoleModal(true, {
isUpdate: false,
});
}
function viewAccount(record: Recordable) {
openAccountModal(true, {
record,
});
}
function handlePreViewData(record:Recordable){
showRecordList.value = true;
console.log(record)
}
function handleEdit() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openRoleModal(true, {
record,
isUpdate: true,
});
}
async function handleDelete() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行删除');
}
const query = [rows[0].id];
createConfirm({
iconType: 'info',
title: '删除',
content: '确定要删除当前角色吗',
onOk: async () => {
const data = await deleteRole(query);
if (data) {
handleSuccess();
return createMessage.success('删除成功');
} else {
return createMessage.error('删除失败');
}
},
});
}
function handlePrint(){
}
function handleExport(){
createMessage.success("数据导出成功!")
}
function handleSuccess() {
clearSelectedRowKeys();
reload();
reloadDataPreview();
}
function onBtnClicked(domId) {
switch (domId) {
case 'btnAdd':
handleCreate();
break;
case 'btnEdit':
handleEdit();
break;
case 'btnDelete':
handleDelete();
break;
case 'btnModules':
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openModulesModal(true, {
record,
});
break;
case 'btnPrint':
handlePrint();
break;
case 'btnExport':
handleExport();
break;
default:
break;
}
}
</script>
<style>
.data-preview-container{
width:100%;
height: calc( 100% - 30px);
position:absolute;
padding:30px 0px;
top:0px;
left:0px;
}
.data-preview-container-option{
width:80px;
height: 40px;
position:absolute;
top:30px;
right:0px;
}
.data-preview-container-option div{
width:40px;
height:40px;
line-height:40px;
float:left;
text-align: center;
cursor:pointer;
}
</style>

View File

@ -0,0 +1,3 @@
export { default as RecordList} from './RecordList.vue'

View File

@ -0,0 +1,234 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Switch,Tag } from 'ant-design-vue';
import { setRoleStatus } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
type CheckedType = boolean | string | number;
export const columnsDataPreview: BasicColumn[] = [
{
title: '乡镇(街道)',
dataIndex: 'streetname',
width: 120,
},{
title: '无人机发现数量',
dataIndex: 'allCount',
width: 120,
},{
title: '外业图斑核查情况',
children:[
{
title: '完成外业核查数量',
dataIndex: 'handleStatus',
width: 120,
},{
title: '24h内未核查',
dataIndex: 'notDealHour24',
width: 120,
}
]
},{
title: '下发疑似图斑类型',
children:[
{
title: '房屋翻新',
dataIndex: 'typeFanxinCount',
width: 120,
},{
title: '房屋加盖',
dataIndex: 'typeJiagaiCount',
width: 120,
},{
title: '房屋翻建',
dataIndex: 'typeFanjianCount',
width: 120,
},{
title: '存量建设',
dataIndex: 'typeCunliangCount',
width: 120,
},{
title: '推土',
dataIndex: 'typeTuituCount',
width: 120,
},{
title: '其他',
dataIndex: 'typeOtherCount',
width: 120,
}
]
},{
title: '图斑判定',
children:[
{
title: '合法',
dataIndex: 'illegal0Count',
width: 120,
},{
title: '违法',
dataIndex: 'illegal1Count',
width: 120,
},{
title: '伪变化',
dataIndex: 'illegal2Count',
width: 120,
}
]
},{
title: '新增违法图斑整改情况',
dataIndex: 'handle_status_name',
children:[
{
title: '外业核实后确定违法数',
dataIndex: 'beginTime',
width: 120,
},{
title: '违法面积',
dataIndex: 'illegalHandleAreaList',
width: 120,
},{
title: '整改销号数',
dataIndex: 'beginTime',
width: 120,
},{
title: '销号面积',
dataIndex: 'beginTime',
width: 120,
},{
title: '尚未整改宗数',
dataIndex: 'beginTime',
width: 120,
},{
title: '未整改面积',
dataIndex: 'beginTime',
width: 120,
}
]
},{
title: '违法图斑整改进度情况',
children:[
{
title: '3日内未整改完成',
dataIndex: 'notComplete3',
},{
title: '7日内未整改完成',
dataIndex: 'notComplete7',
},{
title: '30日内未整改完成',
dataIndex: 'notComplete30',
},{
title: '30日以上未整改完成',
dataIndex: 'notComplete30More',
}
]
},{
title: '百分制考核计分',
dataIndex: 'handle_status_name',
children:[
{
title: '24h外业核查计分',
dataIndex: 'beginTime',
width: 120,
},{
title: '整改进度计分',
dataIndex: 'beginTime',
width: 120,
}
]
},{
title: '备注',
dataIndex: 'createusername',
width: 200,
}
];
export const columns: BasicColumn[] = [
{
title: '案件编号',
dataIndex: 'case_no',
width: 120,
}
,{
title: '村/社区',
dataIndex: 'communityname',
width: 120,
},{
title: '案件描述',
dataIndex: 'case_description',
width: 120,
},{
title: '所属类型',
dataIndex: 'typename',
width: 120,
},{
title: '处理人',
dataIndex: 'deal_username',
width: 120,
},{
title: '处理时间',
dataIndex: 'deal_time',
width: 120,
},
{
title: '审核人',
dataIndex: 'verifyuser',
width: 120,
},{
title: '审核时间',
dataIndex: 'verifytime',
width: 120,
},{
title: '案件状态',
dataIndex: 'handle_status_name',
width: 120,
}
];
export const searchFormSchema: FormSchema[] = [
{
field: 'key',
label: '关键字段',
component: 'Input',
colProps: { span: 6 },
},
{
field: '[startDate, endDate]',
label: '日期范围',
component: 'RangePicker',
colProps: { span: 8 },
componentProps: {
format: 'YYYY-MM-DD',
placeholder: ['开始日期', '结束日期'],
},
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: '角色名称',
required: true,
component: 'Input',
ifShow:false,
},
{
field: 'name',
label: '角色名称',
required: true,
component: 'Input',
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: 0,
componentProps: {
options: [
{ label: '启用', value: 0},
{ label: '停用', value: 1 },
],
},
},
];

View File

@ -0,0 +1,328 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { h } from 'vue';
import { Switch,Tag } from 'ant-design-vue';
import { setRoleStatus } from '@/api/demo/system';
import { useMessage } from '@/hooks/web/useMessage';
type CheckedType = boolean | string | number;
export const columnsDataPreview: BasicColumn[] = [
{
title: '乡镇(街道)',
dataIndex: 'streetname',
width: 120,
},{
title: '无人机发现数量',
dataIndex: 'allCount',
width: 120,
},{
title: '外业图斑核查情况',
children:[
{
title: '完成外业核查数量',
dataIndex: 'handleStatus',
width: 120,
},{
title: '24h内未核查',
dataIndex: 'notDealHour24',
width: 120,
}
]
},{
title: '下发疑似图斑类型',
children:[
{
title: '房屋翻新',
dataIndex: 'typeFanxinCount',
width: 120,
},{
title: '房屋加盖',
dataIndex: 'typeJiagaiCount',
width: 120,
},{
title: '房屋翻建',
dataIndex: 'typeFanjianCount',
width: 120,
},{
title: '存量建设',
dataIndex: 'typeCunliangCount',
width: 120,
},{
title: '推土',
dataIndex: 'typeTuituCount',
width: 120,
},{
title: '其他',
dataIndex: 'typeOtherCount',
width: 120,
}
]
},{
title: '图斑判定',
children:[
{
title: '合法',
dataIndex: 'illegal0Count',
width: 120,
},{
title: '违法',
dataIndex: 'illegal1Count',
width: 120,
},{
title: '伪变化',
dataIndex: 'illegal2Count',
width: 120,
}
]
},{
title: '新增违法图斑整改情况',
dataIndex: 'handle_status_name',
children:[
{
title: '外业核实后确定违法数',
dataIndex: 'beginTime',
width: 120,
},{
title: '违法面积',
dataIndex: 'illegalHandleAreaList',
width: 120,
},{
title: '整改销号数',
dataIndex: 'beginTime',
width: 120,
},{
title: '销号面积',
dataIndex: 'beginTime',
width: 120,
},{
title: '尚未整改宗数',
dataIndex: 'beginTime',
width: 120,
},{
title: '未整改面积',
dataIndex: 'beginTime',
width: 120,
}
]
},{
title: '违法图斑整改进度情况',
children:[
{
title: '3日内未整改完成',
dataIndex: 'notComplete3',
},{
title: '7日内未整改完成',
dataIndex: 'notComplete7',
},{
title: '30日内未整改完成',
dataIndex: 'notComplete30',
},{
title: '30日以上未整改完成',
dataIndex: 'notComplete30More',
}
]
},{
title: '百分制考核计分',
dataIndex: 'handle_status_name',
children:[
{
title: '24h外业核查计分',
dataIndex: 'beginTime',
width: 120,
},{
title: '整改进度计分',
dataIndex: 'beginTime',
width: 120,
}
]
},{
title: '备注',
dataIndex: 'createusername',
width: 200,
}
];
export const columns: BasicColumn[] = [
{
title: '乡镇(街道)',
dataIndex: 'streetname',
width: 120,
},{
title: '无人机发现数量',
dataIndex: 'allCount',
width: 120,
},{
title: '外业图斑核查情况',
children:[
{
title: '完成外业核查数量',
dataIndex: 'handleStatus',
width: 120,
},{
title: '24h内未核查',
dataIndex: 'notDealHour24',
width: 120,
}
]
},{
title: '下发疑似图斑类型',
children:[
{
title: '房屋翻新',
dataIndex: 'typeFanxinCount',
width: 120,
},{
title: '房屋加盖',
dataIndex: 'typeJiagaiCount',
width: 120,
},{
title: '房屋翻建',
dataIndex: 'typeFanjianCount',
width: 120,
},{
title: '存量建设',
dataIndex: 'typeCunliangCount',
width: 120,
},{
title: '推土',
dataIndex: 'typeTuituCount',
width: 120,
},{
title: '其他',
dataIndex: 'typeOtherCount',
width: 120,
}
]
},{
title: '图斑判定',
children:[
{
title: '合法',
dataIndex: 'illegal0Count',
width: 120,
},{
title: '违法',
dataIndex: 'illegal1Count',
width: 120,
},{
title: '伪变化',
dataIndex: 'illegal2Count',
width: 120,
}
]
},{
title: '新增违法图斑整改情况',
dataIndex: 'handle_status_name',
children:[
{
title: '外业核实后确定违法数',
dataIndex: 'beginTime',
width: 120,
},{
title: '违法面积',
dataIndex: 'illegalHandleAreaList',
width: 120,
},{
title: '整改销号数',
dataIndex: 'beginTime',
width: 120,
},{
title: '销号面积',
dataIndex: 'beginTime',
width: 120,
},{
title: '尚未整改宗数',
dataIndex: 'beginTime',
width: 120,
},{
title: '未整改面积',
dataIndex: 'beginTime',
width: 120,
}
]
},{
title: '违法图斑整改进度情况',
children:[
{
title: '3日内未整改完成',
dataIndex: 'notComplete3',
},{
title: '7日内未整改完成',
dataIndex: 'notComplete7',
},{
title: '30日内未整改完成',
dataIndex: 'notComplete30',
},{
title: '30日以上未整改完成',
dataIndex: 'notComplete30More',
}
]
},{
title: '百分制考核计分',
dataIndex: 'handle_status_name',
children:[
{
title: '24h外业核查计分',
dataIndex: 'beginTime',
width: 120,
},{
title: '整改进度计分',
dataIndex: 'beginTime',
width: 120,
}
]
},{
title: '备注',
dataIndex: 'createusername',
width: 200,
}
];
export const searchFormSchema: FormSchema[] = [
{
field: 'key',
label: '关键字段',
component: 'Input',
colProps: { span: 6 },
},
{
field: '[startDate, endDate]',
label: '日期范围',
component: 'RangePicker',
colProps: { span: 8 },
componentProps: {
format: 'YYYY-MM-DD',
placeholder: ['开始日期', '结束日期'],
},
},
];
export const formSchema: FormSchema[] = [
{
field: 'id',
label: '角色名称',
required: true,
component: 'Input',
ifShow:false,
},
{
field: 'name',
label: '角色名称',
required: true,
component: 'Input',
},
{
field: 'status',
label: '状态',
component: 'RadioButtonGroup',
defaultValue: 0,
componentProps: {
options: [
{ label: '启用', value: 0},
{ label: '停用', value: 1 },
],
},
},
];