数通互联化工云平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1387 lines
51 KiB

<!--
@ 作者: 秦东
@ 时间: 2026-01-28 09:13:22
@ 备注:
-->
<script lang='ts' setup>
import { checkboxUnit, choiceUnit, inputUnit, orgDeptUnit, orgUnit, switchUnit, timeUnit } from '@/api/DesignForm/fieldUnit';
import { attrButton, FormPageConfig, FormPageList, tableButton, viewPageType } from '@/api/DesignForm/tableButton';
import { echatsViewStruct } from '@/api/DesignForm/types';
import { formatNumber } from '@/api/DesignForm/utils';
import { useDesignFormStore } from '@/store/DesignForm/designForm';
import { json2string } from '@/utils/DesignForm/form';
import { FormInstance } from 'element-plus';
import { useRoute } from 'vue-router';
import { formHasPower } from '@/directive/permission/button';
import { gainFormPageListCont } from '@/api/DesignForm/requestapi';
import request from '@/utils/request';
//引入组件
import SearchSelect from "@/components/DesignForm/app/calendar/selectSearch.vue";
import exportPanel from "@/components/DesignForm/exportPanel.vue";
//引入页面
import TablesList from "@/components/DesignForm/app\pageViews\tableList.vue"
const props = withDefaults(
defineProps<{
data: FormPageList | any;
searchData?: attrButton[] | any;
config?: FormPageConfig;
appKey?: string;
formId?: string;
signCode?: string;
beforeRequest?: (params: any, rout: any) => any;
afterResponse?: (result: any) => any | string;
beforeDelete?: (params: any, route: any) => any;
showPage?: boolean;
requestUrl?: string; // 请求的api
deleteUrl?: string; // 删除的api
dict?: { [key: string | number]: string | number };
fixedBottomScroll?: boolean;
query?: { [key: string]: any }; // 一些附加的请求参数
autoLoad?: boolean; // 初始时自动请求加载数据
delKey?: string; // 删除标识
lookPageIsShow?: boolean;
versionid?: string;
pickAppMenu?: any;
versiontitle?: string;
viewPage?: viewPageType | any;
formBasicConfig?: any;
fieldsDetailList?: any;
orgAndManTree?: any;
echatsViews: echatsViewStruct;
}>(),
{
showPage: true,
data: () => {
return { columns: [], controlBtn: [], operateBtn: [], config: {} };
},
searchData: () => {
return [];
},
config: ():FormPageConfig => {
return {
pageSize: 0,
searchIsShow: false,
searchFormIsShow: false,
openPageMode: ''
};
},
dict: () => {
return {};
},
appKey: () => {
return "";
},
requestUrl: () => {
return "";
},
deleteUrl: () => {
return "";
},
formId: () => {
return "";
},
signCode: () => {
return "";
},
versionid: () => {
return "";
},
versiontitle: () => {
return "";
},
fixedBottomScroll: true,
autoLoad: true,
delKey: "id",
query: () => {
return {};
},
lookPageIsShow: () => {
return false;
},
viewPage: ():viewPageType => {
return {
card: undefined,
list: {
status: false,
isClick: false,
form: {
sortWord: '',
sortClass: 0
}
},
date: {
status: false,
isClick: false,
form: {
startTime: '',
endTime: '',
dayType: 0
}
},
time: {
status: false,
isClick: false,
form: {
sortWord: '',
sort: 0
}
},
gantt: {
status: false,
isClick: false,
form: {
startTime: '',
endTime: '',
dayType: 0,
sortWord: '',
sort: 0
}
},
map: {
status: false,
isClick: false,
form: {
mapWord: '',
sortWord: '',
sort: 0
}
},
chart: {
status: false,
isClick: false,
form: {
mapWord: '',
sortWord: '',
sort: 0
}
}
};
},
formBasicConfig: () => {
return {};
},
fieldsDetailList: () => {
return {};
},
orgAndManTree: () => {
return {};
},
pickAppMenu: () => {
return {};
},
beforeRequest: (params: any, rout: any):any => {
return
},
afterResponse: (result: any):any | string => {
return
},
beforeDelete: (params: any, rout: any):any => {
return
}
}
)
const emits = defineEmits(["selectionChange", "btnClick"]);
const tableDataList = ref([]); // 表格行数据
const calendarPageRef = ref(null); //数据页面
const route = useRoute();
const designStore = useDesignFormStore();
//基础设定
const state = reactive({
loading: false,
currentPage: 1,
pageSize: props.config?.pageSize || 2,
total: 0,
selectionChecked: [],
dict: {}, // 接口返回的
searchFormDown: false,
treeValue: {}, // 侧栏树选中的值
tableScrollMargin: 0,
columnsCheck: designStore.getColumnsCheck(route.path),
currentNodeKey: "",
});
const viewType = ref(1); //试图类型 (1:列表视图;2:日历视图;3:时间轴;4:甘特图;5:地图视图;6:卡片视图;7:BI报表)
const viewLayout = ref<any>(); //当前视图框架
const ruleSearchForm = ref(); //搜索表单
const drawerWith = ref(); //编辑表单时抽屉宽度
const container = ref(); //实例化内容容器
const openTaskDrawer = ref(false); //新增数据
const idList = ref<string[]>([]);
//导出窗口的父元素
const dynamicVNode = ref<VNode | null>(null); //组件的父组件
const operState = ref<number>(1); //操作状态 1:新增;2:重新发起;3:申请修改;4:提交审批;5:普通表单修改
const tablePageClass = ref(1);
const pageInfoCont = ref<any>();
const lookPageInfoIsShow = ref(false);
// 重置所有视图的 isClick 状态
const resetViewClickStates = (excludeView?: string) => {
if (!props.viewPage || typeof props.viewPage !== 'object') return;
const views = ['list', 'date', 'time', 'gantt', 'map', 'card', 'chart'];
views.forEach(view => {
const viewObj = props.viewPage[view];
if (view !== excludeView && viewObj && typeof viewObj === 'object') {
viewObj.isClick = false;
}
});
};
/**
@ 作者: 秦东
@ 时间: 2026-01-28 10:43:43
@ 功能: 获取数据
*/
const getPageData = () => {
let sendData = {
formId: props.formId,
page: state.currentPage,
pagesize: state.pageSize,
searchData: json2string(props.searchData),
};
console.error("返回值事什么-->",viewType.value)
//根据页面类型获取数据
switch (viewType.value) {
case 2:
nextTick(() => {
// calendarPageRef.value.calendarSearchData(sendData);
})
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
default:
state.loading = true;
doGainFormPageListCont(sendData)
.then((datas) => {
console.error("返回值事什么-->",datas)
tableDataList.value = datas.list;
state.total = datas.total;
})
.finally(() => {
state.loading = false;
asfs = [];
radios = [];
checkboxs = [];
switchs = [];
selects = [];
tables = [];
dofs = [];
getAsfs();
})
break;
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 14:52:46
@ 功能:
*/
const getAsfs = () => {
let dataList = ref({});
dataList.value = props.fieldsDetailList;
if (dataList && Array.isArray(dataList.value) && dataList.value.length > 0) {
for (let i = 0; i < dataList.value.length; i++) {
if (dataList.value[i].type == "associatedForms") {
asfs.push(dataList.value[i]);
} else if (dataList.value[i].type == "radio") {
radios.push(dataList.value[i]);
} else if (dataList.value[i].type == "checkbox") {
checkboxs.push(dataList.value[i]);
} else if (dataList.value[i].type == "switch") {
switchs.push(dataList.value[i]);
} else if (dataList.value[i].type == "select") {
selects.push(dataList.value[i]);
} else if (
dataList.value[i].type == "deptOrg" ||
dataList.value[i].type == "orgCentent" ||
dataList.value[i].type == "founder"
) {
//||dataList.value[i].type == "owner"拥有者,"expand-user"选择用户
dofs.push(dataList.value[i]);
} else if (
dataList.value[i].type == "card" ||
dataList.value[i].type == "flex" ||
dataList.value[i].type == "div" ||
dataList.value[i].type == "table"
) {
if (dataList.value[i].type == "table") {
tables.push(dataList.value[i]);
}
dataList.value[i].list.forEach((element: any) => {
if (element.type == "associatedForms") {
asfs.push(element);
} else if (element.type == "radio") {
radios.push(element);
} else if (element.type == "checkbox") {
checkboxs.push(element);
} else if (element.type == "switch") {
switchs.push(element);
} else if (element.type == "select") {
selects.push(element);
} else if (
element.type == "deptOrg" ||
element.type == "orgCentent" ||
element.type == "founder"
) {
dofs.push(element);
}
});
} else if (dataList.value[i].type == "grid") {
let columns = JSON.parse(JSON.stringify(dataList.value[i].columns));
if (columns.length > 0) {
for (let z = 0; z < columns.length; z++) {
for (let x = 0; x < columns[z].list.length; x++) {
let a = JSON.parse(JSON.stringify(columns[z].list[x]));
if (a.type == "associatedForms") {
asfs.push(a);
} else if (a.type == "radio") {
radios.push(a);
} else if (a.type == "checkbox") {
checkboxs.push(a);
} else if (a.type == "switch") {
switchs.push(a);
} else if (a.type == "select") {
selects.push(a);
} else if (
a.type == "deptOrg" ||
a.type == "orgCentent" ||
a.type == "founder"
) {
dofs.push(a);
}
}
}
}
} else if (dataList.value[i].type == "tabs") {
//tabs标签页有可能再嵌套一层flex或者table
let columns = JSON.parse(JSON.stringify(dataList.value[i].columns));
if (columns.length > 0) {
for (let z = 0; z < columns.length; z++) {
for (let x = 0; x < columns[z].list.length; x++) {
let a = JSON.parse(JSON.stringify(columns[z].list[x]));
if (a.type == "associatedForms") {
asfs.push(a);
} else if (a.type == "radio") {
radios.push(a);
} else if (a.type == "checkbox") {
checkboxs.push(a);
} else if (a.type == "switch") {
switchs.push(a);
} else if (a.type == "select") {
selects.push(a);
} else if (
a.type == "deptOrg" ||
a.type == "orgCentent" ||
a.type == "founder"
) {
dofs.push(a);
} else if (a.type == "flex" || a.type == "table") {
if (a.type == "table") {
tables.push(dataList.value[i]);
}
if (a.list.length > 0) {
for (let m = 0; m < a.list.length; m++) {
let q = JSON.parse(JSON.stringify(a.list[m]));
if (q.type == "associatedForms") {
asfs.push(q);
} else if (q.type == "radio") {
radios.push(q);
} else if (q.type == "checkbox") {
checkboxs.push(q);
} else if (q.type == "switch") {
switchs.push(q);
} else if (q.type == "select") {
selects.push(q);
} else if (
q.type == "deptOrg" ||
q.type == "orgCentent" ||
q.type == "founder"
) {
dofs.push(q);
}
}
}
}
}
}
}
}
}
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 10:17:24
@ 功能: 切换视图展示方式
*/
const tabsView = (val: any, types: number) => {
viewType.value = types;
val.isClick = true;
viewLayout.value = val;
switch (types) {
case 2:
resetViewClickStates('date');
break;
case 3:
resetViewClickStates('time');
getPageData();
break;
case 4:
resetViewClickStates('gantt');
break;
case 5:
resetViewClickStates('map');
break;
case 6:
resetViewClickStates('card');
break;
case 7:
resetViewClickStates('chart');
break;
default:
resetViewClickStates('list');
break;
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 10:58:02
@ 功能: 重置搜索表单
*/
const resetFields = (formEl: FormInstance | undefined) => {
if (props.searchData && props.searchData.length > 0) {
props.searchData.forEach((item: any) => {
item.value = "";
});
}
}
/**
@ 作者: 秦东
@ 时间: 2024-03-28 16:03:12
@ 功能: 判断搜索组件类型
*/
const unitIsShow = (val: attrButton, unitName: string):boolean => {
switch (val.fieldClass) {
case "id": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "masters_key": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "creater": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "creater_time": //自定义表单保留字
return timeUnit.includes(unitName);
break;
case "edit_time": //自定义表单保留字
return timeUnit.includes(unitName);
break;
case "flow_id": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "baidumap": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "input": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "radio": //自定义表单保留字
return choiceUnit.includes(unitName);
break;
case "switch": //自定义表单保留字
return switchUnit.includes(unitName);
break;
case "orgCentent": //自定义表单保留字
return orgUnit.includes(unitName);
break;
case "varchar": //自定义表单保留字
return inputUnit.includes(unitName);
break;
case "checkbox":
return checkboxUnit.includes(unitName);
break;
case "deptOrg":
return orgDeptUnit.includes(unitName);
break;
default:
if (val.fieldClass != "datePicker" && val.fieldClass != "timePicker") {
return inputUnit.includes(unitName);
}
break;
}
return false;
}
// 选择数据转换,默认尝试转数字
const transformOption = (val: string | number, type?: string) => {
return formatNumber(val);
};
/**
@ 作者: 秦东
@ 时间: 2026-01-28 13:04:09
@ 功能: 计算所有子列表的最大行数
*/
const subTableFieldsFilter = computed(() => {
const arr: { table: string; field: string; label: string }[] = [];
const names: string[] = [];
props.fieldsDetailList.forEach((item: any) => {
if (item.type === "table") {
names.push(item.name);
item.list.forEach((sub: any) => {
arr.push({ table: item.name, field: sub.name, label: sub.item.label });
});
}
});
return { tables: names, fields: arr };
});
// 工具函数:处理 CSV 字段值
const processCsvField = (value: any): string => {
if (value === undefined || value === null) {
return "";
}
const stringValue = String(value);
return stringValue.replaceAll(",", ",");
};
/**
@ 作者: 秦东
@ 时间: 2026-01-28 11:26:49
@ 功能: 表格导出
*/
const doExportTableData = () => {
//fields表示主表单的导出字段,subs表示主表单包含的子表格的导出字段
function exportFunc(
fields: { field: string; label: string }[],
subs: { table: string; field: string; label: string }[]
){
let sendData = {
formId: props.formId,
page: 1,
pagesize: 10000,
searchData: json2string(props.searchData),
};
doGainFormPageListCont(sendData)
.then((datas) => {
const array: string[] = [];
//写入表头行
const title: string[] = [];
for (let val of fields) {
title.push(val.label);
}
for (let val of subs) {
title.push(val.label);
}
array.push(title.join(","));
//写入数据行
datas.list.forEach((item: { [x: string]: { [x: string]: any; }[]; }) => {
const line = [];
let maxline = 0;
//写主表列
for (let val of fields) {
// if (typeof val === "string")
// line.push((item[val.field] as unknown as string).replaceAll(",", ","));
// else line.push(item[val.field]);
if (val && val.field) {
line.push(processCsvField(item[val.field]));
} else {
line.push("");
}
}
//写子表列
if (subs.length > 0) {
//计算所有子列表的最大行数
for (let tab of subTableFieldsFilter.value.tables) {
if (item[tab] && item[tab].length > maxline) maxline = item[tab].length;
}
//全都是空的
if (maxline === 0) {
array.push(line.join(",") + "," + Array(subs.length).fill(""));
return;
}
//除第一行数据包含子表数据外,其他行都省略主表字段数据,用spaceprefix填充,避免重复
const spacePrefix = Array(line.length).fill("");
for (let i = 0; i < maxline; i++) {
const row: any[] = [];
subTableFieldsFilter.value.tables.forEach((name) => {
if (item[name] && item[name].length - 1 >= i) {
//添加实际数据
subs
.filter((v) => v.table === name)
.forEach((f) => {
row.push(item[name][i][f.field]);
});
} else {
//添加字段长度的N个空列
row.push(
...Array(subs.filter((v) => v.table === name).length).fill("")
);
}
});
//写入总csv数组
if (i === 0) {
array.push(line.join(",") + "," + row.join(","));
} else {
array.push(spacePrefix + "," + row.join(","));
}
}
return;
}
//没有子表
array.push(line.join(","));
});
//去掉标题行的统计
if (array.length - 1 !== datas.total){
alert(`导出记录数:${datas.total}, 共计:${array.length - 1}`);
}
const filename = props.pickAppMenu.label + ".csv";
const csvString = array.join("\n");
const blob = new Blob([csvString], { type: "text/csv;charset=utf-8;" });
const link = document.createElement("a");
if (link.download !== undefined) {
// feature detection
// Browsers that support HTML5 download attribute
const url = URL.createObjectURL(blob);
link.setAttribute("href", url);
link.setAttribute("download", filename);
link.style.visibility = "hidden";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
})
.finally(() => (dynamicVNode.value = null));
}
dynamicVNode.value = h(exportPanel, {
fields: columnsFilter.value.filter((item: { pattern: string; }) => item.pattern !== "table"),
subtabs: columnsFilter.value.filter((item: { pattern: string; }) => item.pattern === "table"),
subFields: subTableFieldsFilter.value.fields,
commitFunc: exportFunc,
closeFunc: () => (dynamicVNode.value = null),
});
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 13:10:40
@ 功能: 获取表格头内容
*/
const columnsFilter = computed(() => {
// console.log("props.data判断是否有标题", props.data);
if (!state.columnsCheck?.length) {
// console.log("props.data判断是否有标题",props.data)
return props.data.columns;
} else {
// console.log("props.data.columns判断是否有标题",props.data)
return props.data.columns.filter((item: any) => {
return state.columnsCheck.includes(item.prop || item.type);
});
}
// console.log("获取表格头内容", props.data.columns);
});
let asfs: any[] = [];
let radios: any[] = [];
let checkboxs: any[] = [];
let switchs: any[] = [];
let selects: any[] = [];
let tables: any[] = [];
let dofs: any[] = []; //deptOrgAndOrgCententAndFounderArr
let asfDetails = [];
let transferDetails = [];
let asfQueryParams: any[] = [];
let rangedDatePickerInTables: any[] = [];
const rangedDatePickerInTables1: any = []
const dateStringToTimestampLocal = (dateStr: string) => {
const isoStr = dateStr.replace(' ', 'T');
const timestamp = new Date(isoStr).getTime();
if (isNaN(timestamp)) {
//throw new Error('Invalid date string');
return ''
}
return String(timestamp);
}
//liwenxuan 关联表单数据获取 start
const getAsfDataTitlesByIds = (asfQueryParams: any[]) => {
return request({
url: "/javasys/lowCode/AssociatedForms/getAsfDataTitlesByIds",
method: "post",
data: asfQueryParams,
});
}
async function doGainFormPageListCont(sendData: any) {
const data = await gainFormPageListCont(sendData);
console.log("获取列表详细信息----------1111------->",data)
rangedDatePickerInTables.forEach(element => {
let x = element.split('^^^*^^^')
rangedDatePickerInTables1.push(x)
data.data.list.forEach((item: any) => {
let tableValues = item[x[0]]
tableValues.forEach((element1: any) => {
let start = dateStringToTimestampLocal(element1[x[1]])
let end = element1[x[1]+"_end"]
let arr = [start,end]
//console.log(arr)
element1[x[1]] = arr
});
});
});
asfDetails = props.data.columns.filter((item: any) => {
return item.fieldClass == "associatedForms";
});
transferDetails = props.data.columns.filter((item: any) => {
return item.fieldClass == "lowcodeTransfer";
});
if (asfDetails.length > 0 && data.data.list != null) {
//console.log(data.data.list)
//拼装参数,asf值对象数组
asfQueryParams = [];
for (let j = 0; j < asfDetails.length; j++) {
let asfQueryParamsItem: any = {};
//console.log(asfDetails[j])
asfQueryParamsItem.formId = asfDetails[j].control.formid;
asfQueryParamsItem.field = asfDetails[j].field;
let asfToSelectIds = [];
// console.log(data.data.list)
for (let i = 0; i < data.data.list.length; i++) {
let asfMasterAndAsfId: any = {};
asfMasterAndAsfId.asfId = data.data.list[i][asfDetails[j].field];
asfMasterAndAsfId.asfMasterId = data.data.list[i].id;
asfToSelectIds.push(asfMasterAndAsfId);
}
asfQueryParamsItem.asfToSelectIds = asfToSelectIds;
asfQueryParams.push(asfQueryParamsItem);
}
let queryCount = 0;
for (let i = 0; i < asfQueryParams[0].asfToSelectIds.length; i++) {
if (asfQueryParams[0].asfToSelectIds[i].asfId != "") {
queryCount++;
}
}
//console.log(asfQueryParams)
if (queryCount > 0) {
//liwenxuan 关联表单数据获取 start
let dataList = data;
//-------------------直接return 异步结果----------------------
return await getAsfDataTitlesByIds(asfQueryParams).then(({ data }) => {
//console.log(data)
for (let i = 0; i < dataList.data.list.length; i++) {
//console.log(dataList.data.list[i])
for (let j = 0; j < data.length; j++) {
//console.log(data[j])
for (let n = 0; n < data[j].list.length; n++) {
if (dataList.data.list[i].id == data[j].list[n].asfMasterId) {
dataList.data.list[i][data[j].field] = data[j].list[n].label;
}
//console.log(data[j].list[n])
}
}
}
return dataList.data;
});
}
console.error("获取列表详细信息------饭hi之----------->",data)
return data.data;
}else{
return data.data;
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 11:23:27
@ 功能: 功能按钮动作
*/
const setUpClick = (val: any, id?: string) => {
switch(val.key){
case "newAdd":
drawerWith.value = container.value?.clientWidth;
openTaskDrawer.value = true;
break;
case "export":
doExportTableData();
break;
case "import":
break;
case "showQrCode":
break;
default:
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 13:17:48
@ 功能: 取菲值
*/
const getNonValue = () => {
// eslint-disable-next-line vue/no-mutating-props
props.config.searchIsShow = !props.config.searchIsShow
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 14:41:24
@ 功能: 表格选择操作
*/
const selectionChange = (row: any) => {
state.selectionChecked = row;
emits("selectionChange", row);
idList.value.length = 0;
if (row && row.length > 0) {
row.forEach((item: any) => {
// console.log('item', item.masters_key)
idList.value.push(item.masters_key.toString());
});
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 15:59:23
@ 功能: 判断是否有标题
*/
const writeListTitle = (val: any, viewConfig: any) => {
var titleAry: any[] = [];
if (viewConfig.form && viewConfig.form.title) {
if (viewConfig.form.title.length > 0) {
viewConfig.form.title.forEach((item: string|number, index: any) => {
if (val[item]) {
titleAry.push(val[item]);
}
})
}
}
if (titleAry.length > 0) {
return titleAry.join();
} else {
let firstWord = "";
let powerAry = [
"id",
"creater_time",
"edit_time",
"masters_key",
"states",
"flow_id",
];
for (let key in val) {
if (val.hasOwnProperty(key)) {
if (!powerAry.includes(key)) {
if (val[key] != "" && val[key] != null) {
firstWord = val[key];
}
}
}
}
return firstWord;
}
}
/**
@ 作者: 秦东
@ 时间: 2026-01-28 16:08:28
@ 功能: 表格宽度
*/
const readerColumnSun = (column: any) => {
// console.log("表头label长度-11->", column);
let labelLong = 0; // 表头label长度
if (column.label.length) {
labelLong = column.label.length;
}
if (labelLong > 0) {
if(labelLong > 6 ){
return labelLong * 15;
}else{
return labelLong * 30;
}
}else{
return 100;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-04-10 15:32:55
@ 功能: 提交审批
*/
const submitApproval = (val: any) => {
operState.value = 4;
tablePageClass.value = 2;
pageInfoCont.value = val;
drawerWith.value = container.value?.clientWidth;
lookPageInfoIsShow.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2026-01-28 15:01:16
@ 功能: 页面渲染完毕后加载
*/
onMounted(() => {
getPageData();
nextTick(() => {
drawerWith.value = container.value?.clientWidth;
});
})
</script>
<template>
<div ref="container" v-loading="state.loading" class="table-list-comm">
<el-row class="rowBox">
<el-col :span="24">
<el-form v-if="config.searchIsShow" ref="ruleSearchForm" class="seacherForm">
<div v-for="(item, index) in searchData" :key="index" class="group group-input">
<el-form-item :label="item.label" class="form_cont">
<el-input
v-if="unitIsShow(item, 'input')"
v-model="item.value"
:placeholder="'请输入' + item.label"
clearable
/>
<el-date-picker
v-if="unitIsShow(item, 'time')"
v-model="item.value"
type="datetime"
:placeholder="'请选择' + item.label"
/>
<SearchSelect
v-if="unitIsShow(item, 'radio')"
v-model:model-value="item.value"
:data="item"
:disabled="false"
:transform-option="transformOption"
/>
<el-select
v-if="unitIsShow(item, 'switch')"
v-model="item.value"
clearable
:placeholder="'请选择' + item.label"
>
<el-option
:key="item.activeValue"
label="是"
:value="item.activeValue"
/>
<el-option
:key="item.inactiveValue"
label="否"
:value="item.inactiveValue"
/>
</el-select>
<SearchSelect
v-if="unitIsShow(item, 'checkbox')"
v-model:model-value="item.value"
:data="item"
:disabled="false"
:is-checkbox="true"
:transform-option="transformOption"
/>
<el-date-picker
v-if="item.fieldClass == 'datePicker'"
v-model="item.value"
:type="item.auxiliary"
:placeholder="'请选择' + item.label"
value-format="x"
/>
<el-time-picker
v-if="item.fieldClass == 'timePicker'"
v-model="item.value"
arrow-control
:placeholder="'请选择' + item.label"
value-format="x"
/>
<DeptOrgSearch
v-if="unitIsShow(item, 'org')"
v-model="item.value"
clearable
:placeholder="'请选择' + item.label"
>
</DeptOrgSearch>
<DeptOrgSearch
v-if="unitIsShow(item, 'deptOrg')"
v-model:model-value="item.value"
/>
</el-form-item>
</div>
<div v-if="searchData.length" class="group group-btn">
<el-button type="primary" @click="getPageData"><el-icon><Search /></el-icon>查询</el-button>
<el-button @click="resetFields(ruleSearchForm)"><el-icon><Refresh /></el-icon>重置</el-button>
</div>
</el-form>
</el-col>
<el-col :span="24">
<div class="operateButArea">
<div class="operatLeft">
<el-text v-if="data.controlBtn.length === 0" class="mx-1 tipBox" type="info">操作按钮区域</el-text>
<template v-for="item in data.controlBtn" :key="item.type">
<el-button
v-if="formHasPower(props.pickAppMenu.appkey,props.signCode,item.key,0)"
v-bind="item"
@click="setUpClick(item)"
>
{{ item.label }}
</el-button>
</template>
</div>
<div>
<el-button-group class="ml-4">
<el-tooltip
class="box-item"
effect="dark"
content="折叠查询表单"
placement="bottom"
>
<el-button
size="small"
class="fa fa-search"
@click="getNonValue()"
/>
</el-tooltip>
<el-tooltip
v-if="viewPage.list.status"
class="box-item"
effect="dark"
content="列表视图"
placement="top"
>
<el-button
size="small"
class="fa fa-table"
:color="viewPage.list.isClick ? '#a0cfff' : ''"
@click="tabsView(viewPage.list, 1)"
/>
</el-tooltip>
<el-tooltip
v-if="props.viewPage.card && props.viewPage.card.status"
class="box-item"
effect="dark"
content="卡片视图"
placement="top"
>
<el-button
size="small"
class="fa fa-id-card-o"
:color="
props.viewPage.card && props.viewPage.card.isClick ? '#a0cfff' : ''
"
@click="tabsView(props.viewPage.card, 6)"
/>
</el-tooltip>
<el-tooltip
v-if="viewPage.date.status"
class="box-item"
effect="dark"
content="日历视图"
placement="top"
>
<el-button
size="small"
class="fa fa-calendar"
:color="viewPage.date.isClick ? '#a0cfff' : ''"
@click="tabsView(viewPage.date, 2)"
/>
</el-tooltip>
<el-tooltip
v-if="viewPage.time.status"
class="box-item"
effect="dark"
content="时间轴"
placement="top"
>
<el-button
size="small"
class="fa fa-clock-o"
:color="viewPage.time.isClick ? '#a0cfff' : ''"
@click="tabsView(viewPage.time, 3)"
/>
</el-tooltip>
<el-tooltip
v-if="viewPage.gantt.status"
class="box-item"
effect="dark"
content="甘特图"
placement="top"
>
<el-button
size="small"
class="fa fa-bar-chart"
:color="viewPage.gantt.isClick ? '#a0cfff' : ''"
@click="tabsView(viewPage.gantt, 4)"
/>
</el-tooltip>
<el-tooltip
v-if="viewPage.map.status"
class="box-item"
effect="dark"
content="地图视图"
placement="top"
>
<el-button
size="small"
class="fa fa-map-signs"
:color="viewPage.map.isClick ? '#a0cfff' : ''"
@click="tabsView(viewPage.map, 5)"
/>
</el-tooltip>
<el-tooltip
v-if="viewPage.chart&&viewPage.chart.status"
class="box-item"
effect="dark"
content="BI报表"
placement="top"
>
<el-button
size="small"
class="fa fa-line-chart"
:color="viewPage.chart.isClick ? '#a0cfff' : ''"
@click="tabsView(viewPage.chart, 7)"
/>
</el-tooltip>
</el-button-group>
</div>
</div>
</el-col>
<!--列表视图-->
<el-col v-if="viewType == 1" :span="24" class="tableTdClass">
<el-table
v-bind="data.tableProps"
ref="table"
v-loading="state.loading"
:data="tableDataList"
table-layout="fixed"
border
@selection-change="selectionChange"
>
<template v-for="item in columnsFilter" :key="item.id || item.label">
<el-table-column
v-if="['-'].includes(item.fieldClass)"
:type="item.type"
:prop="item.field"
:label="item.label"
config=""
width="60"
fixed
header-align="center"
align="center"
>
<template v-if="item.help" #header="scope">
{{ scope.column.label }}
<tooltip :content="item.help" />
</template>
</el-table-column>
<el-table-column
v-else-if="item.fieldClass == '_lableTitle'"
label="标题"
config=""
min-width="20"
header-align="center"
align="center"
>
<template #default="scope">
{{ writeListTitle(scope.row, viewPage.list) }}
</template>
</el-table-column>
<el-table-column
v-else-if="item.fieldClass == ''"
:prop="item.field"
:label="item.label"
:min-width="readerColumnSun(item)"
header-align="center"
align="center"
>
<template #default>
<template v-if="item.pattern == 'table'">
<template v-for="sunItem in item.children">
{{ sunItem }}
<!-- <el-table-column>
<template #default="scopeChilder">
<div v-html="tableChildren(sunItem.field,scopeChilder.row[item.field])"></div>
</template>
</el-table-column> -->
</template>
</template>
</template>
</el-table-column>
<el-table-column
v-else-if="item.fieldClass == '__control'"
:prop="item.field"
:label="item.label"
config=""
min-width="220"
header-align="center"
align="center"
fixed="right"
>
<template #default="scope">
<el-button-group>
<el-tooltip
v-if="scope.row.flowIsOpens == 1 && scope.row.taskStatus == 1"
class="box-item"
effect="dark"
content="提交审批"
placement="top-end"
>
<el-button
type="success"
size="small"
class="fa fa-send-o"
@click="submitApproval(scope.row)"
/>
</el-tooltip>
</el-button-group>
</template>
</el-table-column>
</template>
</el-table>
</el-col>
<el-col v-if="viewType == 1 && state.total > 0" :span="24" >
</el-col>
<!--日历视图-->
<el-col v-if="viewType == 2" :span="24" >
</el-col>
<!--时间轴-->
<el-col v-if="viewType == 3" :span="24" >
</el-col>
<!--甘特图-->
<el-col v-if="viewType == 4" :span="24" >
</el-col>
<!--地图视图-->
<el-col v-if="viewType == 5" :span="24" >
</el-col>
<!--卡片视图-->
<el-col v-if="viewType == 6" :span="24" >
</el-col>
<!--BI报表-->
<el-col v-if="viewType == 7" :span="24" >
</el-col>
</el-row>
</div>
</template>
<style lang='scss' scoped>
.table-list-comm {
padding: 0px 5px 5px 5px;
}
.rowBox {
width: 100%;
}
.seacherForm {
min-height: auto;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
}
.pageBox {
width: 100%;
margin-top: 20px;
text-align: center;
display: flex;
justify-content: center;
}
.operateButArea {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 15px;
margin-bottom: 15px;
.operatLeft {
padding-bottom: 2px;
}
}
.group {
width: auto;
margin-right: 10px;
}
.demo-image__error .block {
padding: 0px 0;
text-align: center;
border-right: solid 1px var(--el-border-color);
display: inline-block;
width: 100%;
box-sizing: border-box;
vertical-align: top;
}
.demo-image__error .demonstration {
display: block;
color: var(--el-text-color-secondary);
font-size: 14px;
margin-bottom: 20px;
}
.demo-image__error .el-image {
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
}
.demo-image__error .image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
.demo-image__error .image-slot .el-icon {
font-size: 30px;
}
table {
border-collapse: collapse;
width: 100%;
font-size: 13px;
text-align: center;
}
td,
th {
border: 1px solid black;
padding: 8px;
vertical-align: middle; /* 设置文字上下居中 */
}
.tableTdClass{
:deep .cell{
padding: 0;
}
:deep .el-table--default .cell{
padding: 0;
}
}
</style>