diff --git a/src/components/DesignForm/app/index.vue b/src/components/DesignForm/app/index.vue index bcd66a3..a15ae6d 100644 --- a/src/components/DesignForm/app/index.vue +++ b/src/components/DesignForm/app/index.vue @@ -54,7 +54,7 @@ import CalendarPage from "@/components/DesignForm/app/calendar/calendar1/calenda import SearchSelect from "@/components/DesignForm/app/calendar/selectSearch.vue"; import AKSelect from "@/components/DesignForm/public/form/select.vue"; import ContainerPath from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/echatesUnit/container.vue"; -import exportPanel from '../exportPanel.vue'; +import exportPanel from "../exportPanel.vue"; import importPanel from "../importPanel.vue"; const props = withDefaults( @@ -155,7 +155,7 @@ const currentAsfTableDataList = ref([]); //当前点击的关联表单数据 const openTaskDrawer = ref(false); //新增数据 //导出窗口的父元素 -const dynamicVNode = ref(null) //组件的父组件 +const dynamicVNode = ref(null); //组件的父组件 const state = reactive({ loading: false, @@ -551,10 +551,10 @@ const setUpClick = (val: string, id: string) => { if (val.key == "newAdd") { drawerWith.value = container.value?.clientWidth; openTaskDrawer.value = true; - }else if (val.key === "export"){ - doExportTableData() - }else if (val.key === "import"){ - doImportTableData() + } else if (val.key === "export") { + doExportTableData(); + } else if (val.key === "import") { + doImportTableData(); } else if (val.key == "showQrCode") { //liwenxuan 20250114 二维码打印弹窗 start //在此组装参数,以生成二维码图片 @@ -869,19 +869,19 @@ const columnsFilter = computed(() => { console.log("获取表格头内容", props.data.columns); }); -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) +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}) - }) + arr.push({ table: item.name, field: sub.name, label: sub.item.label }); + }); } - }) - return {tables:names,fields:arr} -}) + }); + return { tables: names, fields: arr }; +}); /** @ 作者: 秦东 @@ -981,42 +981,46 @@ const getPageData = () => { default: state.loading = true; //by han2015, 抽成独立部分,方便其他功能调用 - doGainFormPageListCont(sendData).then(datas=>{ - tableDataList.value = datas.list - state.total=datas.total - }).finally(()=>{ - //原 finally的处理内容 - state.loading = false; - asfs = []; - radios = []; - checkboxs = []; - switchs = []; - selects = []; - tables = []; - dofs = []; - getAsfs(); - }) + doGainFormPageListCont(sendData) + .then((datas) => { + tableDataList.value = datas.list; + state.total = datas.total; + }) + .finally(() => { + //原 finally的处理内容 + state.loading = false; + asfs = []; + radios = []; + checkboxs = []; + switchs = []; + selects = []; + tables = []; + dofs = []; + getAsfs(); + }); } }; //表单导入 -function doImportTableData(){ - dynamicVNode.value=h(importPanel,{ - fields:props.fieldsDetailList.filter(val=>val.type!=="table"), - formId:props.versionid, - commitFunc:()=>{ - getPageData() //刷新table页面 - dynamicVNode.value=null +function doImportTableData() { + dynamicVNode.value = h(importPanel, { + fields: props.fieldsDetailList.filter((val) => val.type !== "table"), + formId: props.versionid, + commitFunc: () => { + getPageData(); //刷新table页面 + dynamicVNode.value = null; }, - closeFunc:()=>dynamicVNode.value=null - }) - + closeFunc: () => (dynamicVNode.value = null), + }); } //表格导出 -function doExportTableData(){ +function doExportTableData() { //fields表示主表单的导出字段,subs表示主表单包含的子表格的导出字段 - function exportFunc(fields:{field:string,label:string}[],subs:{table:string,field:string,label:string}[]){ + function exportFunc( + fields: { field: string; label: string }[], + subs: { table: string; field: string; label: string }[] + ) { let sendData = { formId: props.formId, page: 1, @@ -1024,79 +1028,87 @@ function doExportTableData(){ 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)=>{ - const line=[]; - let maxline=0; - //写主表列 - for (let val of fields){ - if(typeof(val)==="string") line.push((item[val.field] as string).replaceAll(",",",")) - else line.push(item[val.field]) + doGainFormPageListCont(sendData) + .then((datas) => { + const array: string[] = []; + //写入表头行 + const title: string[] = []; + for (let val of fields) { + title.push(val.label); } - - //写子表列 - 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 + for (let val of subs) { + title.push(val.label); + } + array.push(title.join(",")); + + //写入数据行 + datas.list.forEach((item) => { + const line = []; + let maxline = 0; + //写主表列 + for (let val of fields) { + if (typeof val === "string") + line.push((item[val.field] as string).replaceAll(",", ",")); + else line.push(item[val.field]); } - //除第一行数据包含子表数据外,其他行都省略主表字段数据,用spaceprefix填充,避免重复 - const spacePrefix=Array(line.length).fill("") - - for(let i=0;i { - 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(",")) + //写子表列 + 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(",")); + }); - return - } - //没有子表 - array.push(line.join(",")) - }) + //去掉标题行的统计 + if (array.length - 1 !== datas.total) + alert(`导出记录数:${datas.total}, 共计:${array.length - 1} 行`); - //去掉标题行的统计 - 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 + 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); @@ -1105,21 +1117,22 @@ function doExportTableData(){ document.body.appendChild(link); link.click(); document.body.removeChild(link); - } - }).finally(()=>dynamicVNode.value=null) + } + }) + .finally(() => (dynamicVNode.value = null)); } - dynamicVNode.value=h(exportPanel,{ - fields:columnsFilter.value.filter((item)=>item.pattern!=="table"), - subtabs:columnsFilter.value.filter((item)=>item.pattern==="table"), - subFields:subTableFieldsFilter.value.fields, - commitFunc:exportFunc, - closeFunc:()=>dynamicVNode.value=null - }) + dynamicVNode.value = h(exportPanel, { + fields: columnsFilter.value.filter((item) => item.pattern !== "table"), + subtabs: columnsFilter.value.filter((item) => item.pattern === "table"), + subFields: subTableFieldsFilter.value.fields, + commitFunc: exportFunc, + closeFunc: () => (dynamicVNode.value = null), + }); } -async function doGainFormPageListCont(sendData:any){ - const data =await gainFormPageListCont(sendData) +async function doGainFormPageListCont(sendData: any) { + const data = await gainFormPageListCont(sendData); // console.log("获取列表详细信息----------------->",data) //console.log(dataList) asfDetails = props.data.columns.filter((item: any) => { @@ -1179,68 +1192,68 @@ async function doGainFormPageListCont(sendData:any){ } return dataList.data; }); - } - + } + return data.data; - } + } //console.log(data.data.list) - transferDetails.forEach(element => { + transferDetails.forEach((element) => { //console.log(element) data.data.list.forEach((obj: any) => { //console.log(obj) for (const key in obj) { // 确保只处理对象自身的属性(不包括原型链上的) if (Object.prototype.hasOwnProperty.call(obj, key)) { - const value = obj[key]; - - // 特殊处理数组/嵌套对象(使用JSON格式化) - const formattedValue = - (Array.isArray(value) || (typeof value === 'object' && value !== null)) - ? JSON.stringify(value, null, 2) - : value; - - //console.log(`${key}: ${formattedValue}`); - if(key==element.field){ - //console.log(key) - /* console.log(element.control.fixedOptions) + const value = obj[key]; + + // 特殊处理数组/嵌套对象(使用JSON格式化) + const formattedValue = + Array.isArray(value) || (typeof value === "object" && value !== null) + ? JSON.stringify(value, null, 2) + : value; + + //console.log(`${key}: ${formattedValue}`); + if (key == element.field) { + //console.log(key) + /* console.log(element.control.fixedOptions) console.log(obj[key]) */ - obj[key] = mapIdsToLabels(element.control.fixedOptions,obj[key]) - } + obj[key] = mapIdsToLabels(element.control.fixedOptions, obj[key]); + } } - } + } }); }); - + return data.data; - + //tableDataList.value = data.data.list //liwenxuan 关联表单数据获取 end } interface TreeNode { - id: string; - label: string; - disabled: boolean; - children: TreeNode[]; + id: string; + label: string; + disabled: boolean; + children: TreeNode[]; } function mapIdsToLabels(treeNodes: TreeNode[], ids1: string): string[] { - const ids: string[] = JSON.parse(ids1); - // 创建id到label的映射字典 - const idToLabelMap: Record = {}; - - // 递归遍历树节点并填充映射字典 - function traverse(node: TreeNode) { - idToLabelMap[node.id] = node.label; // 存储当前节点的映射 - node.children.forEach(child => traverse(child)); // 递归处理子节点 - } + const ids: string[] = JSON.parse(ids1); + // 创建id到label的映射字典 + const idToLabelMap: Record = {}; + + // 递归遍历树节点并填充映射字典 + function traverse(node: TreeNode) { + idToLabelMap[node.id] = node.label; // 存储当前节点的映射 + node.children.forEach((child) => traverse(child)); // 递归处理子节点 + } - // 遍历根节点列表 - treeNodes.forEach(root => traverse(root)); - //console.log(ids) - // 将id数组转换为label数组 - return ids.map(id => idToLabelMap[id] || "已删除的节点(id):"+id); + // 遍历根节点列表 + treeNodes.forEach((root) => traverse(root)); + //console.log(ids) + // 将id数组转换为label数组 + return ids.map((id) => idToLabelMap[id] || "已删除的节点(id):" + id); } const asfGetPageData = (asfFormId: any, asfToSelectMastersKey: any) => { @@ -1755,7 +1768,7 @@ const transformOption = (val: string | number, type?: string) => { }; const readerColumnSun = (column: any) => { - console.log("表头label长度-11->", column); + // console.log("表头label长度-11->", column); let labelLong = 0; // 表头label长度 if (column.children) { labelLong = column.children.length; @@ -1764,12 +1777,12 @@ const readerColumnSun = (column: any) => { let countLenght = 3; column.children.forEach((item: any) => { if (item.label.length < 3) { - countLenght = countLenght + 90; + countLenght = countLenght + 15; } else { - countLenght = countLenght + item.label.length * 40; + countLenght = countLenght + item.label.length * 15; } }); - console.log("表头label长度-->", countLenght); + // console.log("表头label长度-->", countLenght); return countLenght; } else { return 100; @@ -2044,7 +2057,6 @@ const readerColumnSun = (column: any) => { > - + { {{ scope.row[scope.column.property] }}== - @@ -2516,7 +2527,7 @@ const readerColumnSun = (column: any) => { width: 100%; } .table-list-comm { - padding: 0px 15px 5px 15px; + padding: 0px 5px 5px 5px; } .seacherForm { min-height: auto; diff --git a/src/components/DesignForm/public/expand/lowcodeImage.vue b/src/components/DesignForm/public/expand/lowcodeImage.vue index 0b3a8dd..f82d4c8 100644 --- a/src/components/DesignForm/public/expand/lowcodeImage.vue +++ b/src/components/DesignForm/public/expand/lowcodeImage.vue @@ -120,7 +120,11 @@ const getFormItemInputStyle = (ele: any, sty: number) => { diff --git a/src/components/DesignForm/public/expand/uploadPageList.vue b/src/components/DesignForm/public/expand/uploadPageList.vue index f8cb337..340b2c2 100644 --- a/src/components/DesignForm/public/expand/uploadPageList.vue +++ b/src/components/DesignForm/public/expand/uploadPageList.vue @@ -3,27 +3,30 @@ @ 时间: 2024-09-17 14:57:49 @ 备注: 解析上传文件问题 --> - - diff --git a/src/components/DesignForm/public/form/formItem.vue b/src/components/DesignForm/public/form/formItem.vue index 1ea16ef..1436830 100644 --- a/src/components/DesignForm/public/form/formItem.vue +++ b/src/components/DesignForm/public/form/formItem.vue @@ -1066,7 +1066,7 @@ const diGuiJilian = (val: any, options: any[]) => { /> @@ -1194,6 +1194,21 @@ const diGuiJilian = (val: any, options: any[]) => { :type="type" v-model="value" /> +