diff --git a/src/components/DesignForm/app/index.vue b/src/components/DesignForm/app/index.vue index 8f8f378..507bf98 100644 --- a/src/components/DesignForm/app/index.vue +++ b/src/components/DesignForm/app/index.vue @@ -27,7 +27,10 @@ import { checkboxUnit, orgDeptUnit, } from "@/api/DesignForm/fieldUnit"; -import type { FormInstance, FormRules, ElNotification } from "element-plus"; +import type { FormInstance, FormRules } from "element-plus"; +import { ElLoading,ElMessage,ElNotification } from 'element-plus' +import html2canvas from 'html2canvas'; +import JSZip, { forEach } from 'jszip'; import { gainFormPageListCont } from "@/api/DesignForm/requestapi"; import { Picture, InfoFilled, QuestionFilled } from "@element-plus/icons-vue"; import request from "@/utils/request"; @@ -69,6 +72,8 @@ const props = withDefaults( pickAppMenu?: any; versiontitle?: string; viewPage?: viewPageType; + formBasicConfig?: any; + fieldsDetailList?:any; }>(), { showPage: true, @@ -108,6 +113,12 @@ const props = withDefaults( viewPage: () => { return []; }, + formBasicConfig: () => { + return {}; + }, + fieldsDetailList: () => { + return {}; + }, } ); const emits = defineEmits<{ @@ -214,6 +225,235 @@ const resetFields = (formEl: FormInstance | undefined) => { }); } }; + + +//20250117 李文轩 二维码表格 +const qrCodesPrintDialogFlag = ref(false) +let tableRefs = reactive({}); +const tablesData = ref({}) +function getDetailQrCodes(val:any) { + return request({ + url: "/javasys/lowCode/QrCode/getDetailQrCodes", + method: "post", + data: { + cfid: props.formId, + idArray:val, + settings:props.formBasicConfig, + }, + }); +} + +function modifyFieldsMap4(fieldsMap: any): Array<{ key: string, value: string }> { + let result: Array<{ key: string, value: string }> = []; + // 使用 Object.entries 获取键值对数组,保留原始顺序 + for (const [key, value] of Object.entries(fieldsMap)) { + let parts = value.split("!@#@!"); + if (parts.length === 2) { + result.push({ key: parts[0], value: parts[1] }); + } else { + // 如果格式不符合,可进行错误处理,这里暂时不做处理,直接使用原属性名和属性值 + result.push({ key, value }); + } + } + return result; +} + +// 定义两个响应式的布尔值来控制按钮的禁用状态 +const isButton1Disabled = ref(false); +const isButton2Disabled = ref(false); + +async function downloadTables() { + isButton1Disabled.value = true; + isButton2Disabled.value = true; + const loadingInstance = ElLoading.service({ + fullscreen: true, + text: '正在生成图片,请稍候...' // 添加的文字内容,可根据需要修改 + }); + //ElMessage('This is a message.') + const zip = new JSZip(); + //console.log(tableRefs) + for (const [tableKey, element] of Object.entries(tableRefs)) { + try { + const canvas = await html2canvas(element); + const dataUrl = canvas.toDataURL('image/png'); + const byteString = atob(dataUrl.split(',')[1]); + const mimeString = dataUrl.split(',')[0].split(':')[1].split(';')[0]; + const ab = new ArrayBuffer(byteString.length); + const ia = new Uint8Array(ab); + + for (let i = 0; i < byteString.length; i++) { + ia[i] = byteString.charCodeAt(i); + } + + const blob = new Blob([ab], { type: mimeString }); + zip.file(`${props.formBasicConfig.formName}-${tableKey}.png`, blob); + } catch (error) { + console.error(`Error converting ${tableKey} to image:`, error); + } + } + + zip.generateAsync({ type: 'blob' }).then(function(content) { + const now = new Date(); + const formattedDate = `${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, '0')}${String(now.getDate()).padStart(2, '0')}_${String(now.getHours()).padStart(2, '0')}${String(now.getMinutes()).padStart(2, '0')}${String(now.getSeconds()).padStart(2, '0')}`; + const fileName = `${props.formBasicConfig.formName}-${formattedDate}.zip`; + + const link = document.createElement('a'); + link.href = URL.createObjectURL(content); + link.download = fileName; + loadingInstance.close() + link.click(); + tableRefs = {} + // 不管成功与否,最后都要恢复按钮的状态 + isButton1Disabled.value = false; + isButton2Disabled.value = false; + }); +} +function closeQrDownload(){ + qrCodesPrintDialogFlag.value = false + tableRefs = {} + //console.log(tableRefs) + +} + +let asfs: any[] = []; +let radios: any[] = []; +let checkboxs: any[] = []; +let switchs: any[] = []; +let selects: any[] = []; +let tables: any[] = []; +function getAsfs() { + //setTimeout(() => { + 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 == "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 (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 (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 == "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) + } + } + } + } + } + } + } + } + } + } + //}, 500); +} + + +function convertStringToArray(str: string) { + if (typeof str!== 'string') { + throw new Error('Input must be a string.'); + } + if (str === '') { + return []; + } + // 去除首尾的中括号 + str = str.slice(1, -1); + if (str === '') { + return []; + } + let parts = str.split(','); + return parts.map(part => parseFloat(part)); +} + + +//liwenxuan 20250120 二维码 end + + + /** @ 作者: 秦东 @ 时间: 2024-04-01 11:36:07 @@ -226,8 +466,192 @@ const setUpClick = (val: string, id: string) => { drawerWith.value = container.value?.clientWidth; openTaskDrawer.value = true; } else if(val.key == "showQrCode"){ - //alert(val) - console.log(idList) + + + //liwenxuan 20250114 二维码打印弹窗 start + //在此组装参数,以生成二维码图片 + let idArray = state.selectionChecked.map(item => item.id); + if(idArray.length>0){ + const loadingInstance1 = ElLoading.service({ + fullscreen: true, + text: '正在生成二维码,请稍候...' // 添加的文字内容,可根据需要修改 + }); + //console.log(props.formBasicConfig) + //请求数据 + let getDetailQrCodesData: any = {} + let currentFieldsMapArrObj: any = {} + getDetailQrCodes(idArray).then(({ data }) => { + getDetailQrCodesData = JSON.parse(JSON.stringify(data)); + if(props.formBasicConfig.qrCodePrintStyle&&props.formBasicConfig.qrCodePrintStyle=="2"){ + let asfQueryParams1: any[] = []; + for (let key in getDetailQrCodesData) { + currentFieldsMapArrObj[key] = getDetailQrCodesData[key] + if (getDetailQrCodesData.hasOwnProperty(key)) { + let currentFieldsMap = getDetailQrCodesData[key].fieldsMap + //console.log(currentFieldsMap) + // 遍历对象的属性 + for (let attr_name in currentFieldsMap) { + if (currentFieldsMap.hasOwnProperty(attr_name)) { + //console.log("attr_name------"+attr_name) + //console.log(`属性名: ${attr_name}, 属性值: ${currentFieldsMap[attr_name]}`); + radios.forEach(function(element) { + if(attr_name==element.name){ + //表格属性中存在此单选,将其value根据options替换为可读值 + let toConvertValue = currentFieldsMap[attr_name].split("!@#@!")[1] + let optionsHasCurrentValue = false + element.options.forEach((element1: any) => { + if(toConvertValue==element1.value){ + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+element1.label + optionsHasCurrentValue = true + } + }); + if(optionsHasCurrentValue==false){ + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+"" + } + } + }); + selects.forEach(function(element) { + if(attr_name==element.name){ + //表格属性中存在此单选,将其value根据options替换为可读值 + let toConvertValue = currentFieldsMap[attr_name].split("!@#@!")[1] + let optionsHasCurrentValue = false + element.options.forEach((element1: any) => { + if(toConvertValue==element1.value){ + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+element1.label + optionsHasCurrentValue = true + } + }); + if(optionsHasCurrentValue==false){ + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+"" + } + } + }); + switchs.forEach(function(element) { + if(attr_name==element.name){ + //表格属性中存在此单选,将其value根据options替换为可读值 + let toConvertValue = currentFieldsMap[attr_name].split("!@#@!")[1] + if(toConvertValue=="0"){ + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+"禁用" + }else{ + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+"启用" + } + } + }); + checkboxs.forEach(function(element) { + if(attr_name==element.name){ + //表格属性中存在此单选,将其value根据options替换为可读值 + let toConvertValue = currentFieldsMap[attr_name].split("!@#@!")[1] + let toConvertArr = convertStringToArray(toConvertValue); + let toAddStr = "" + if(toConvertArr.length>0){ + toConvertArr.forEach((element1: any) => { + element.options.forEach((element2: any) => { + if(element1==element2.value){ + toAddStr = toAddStr+element2.label+"," + } + }); + }); + toAddStr = toAddStr.slice(0, -1) + currentFieldsMap[attr_name] = currentFieldsMap[attr_name].split("!@#@!")[0]+"!@#@!"+toAddStr + } + } + }); + asfs.forEach(function(element) { + if(attr_name==element.name){ + //表格属性中存在此关联表单,将其value根据options替换为可读值 + let toConvertValue = currentFieldsMap[attr_name].split("!@#@!")[1] + if(toConvertValue.length>0){ + //console.log(element) + let fieldCount = 0;//如果>0则有此field名 + asfQueryParams1.forEach((item1: any) => { + //如果参数数组中已存在同field的 关联表单asfQueryParamsItem1,则往已存在的如果参数数组中已存在同field的关联表单asfQueryParamsItem1.asfToSelectIds1中新增asfMasterAndAsfId1 + // 不存在则push一个新的关联表单asfQueryParamsItem1 + if(item1.field==element.name){ + fieldCount++ + } + }); + if(fieldCount>0){ + //已存在 + //得到已存在的相关field参数对象 + asfQueryParams1.forEach((item1: any) => { + if(item1.field==element.name){ + let asfMasterAndAsfId1: any = {}; + asfMasterAndAsfId1.asfId = toConvertValue+""; + asfMasterAndAsfId1.asfMasterId = key+""; + item1.asfToSelectIds.push(asfMasterAndAsfId1) + } + }); + }else{ + //不存在 + let asfQueryParamsItem1: any = {}; + asfQueryParamsItem1.formId = element.control.formid; + asfQueryParamsItem1.field = element.name; + let asfToSelectIds1: any[] = []; + asfQueryParamsItem1.asfToSelectIds = asfToSelectIds1; + let asfMasterAndAsfId1: any = {}; + asfMasterAndAsfId1.asfId = toConvertValue+""; + asfMasterAndAsfId1.asfMasterId = key+""; + asfToSelectIds1.push(asfMasterAndAsfId1) + asfQueryParams1.push(asfQueryParamsItem1) + } + } + } + }) + } + } + setTimeout(()=>{ + getDetailQrCodesData[key].fieldsMap = modifyFieldsMap4(currentFieldsMap) + },800) + } + } + + getAsfDataTitlesByIds(asfQueryParams1).then(({ data }) => { + let getAsfDataTitlesByIdsData = JSON.parse(JSON.stringify(data)); + for (let key in currentFieldsMapArrObj) { + if (getDetailQrCodesData.hasOwnProperty(key)) { + let currentFieldsMap = getDetailQrCodesData[key].fieldsMap + getAsfDataTitlesByIdsData.forEach((element1: any) => { + element1.list.forEach((element2: any) => { + if(key==element2.asfMasterId){ + currentFieldsMap[element1.field] = currentFieldsMap[element1.field].split("!@#@!")[0]+"!@#@!"+element2.label + } + }) + }) + } + } + }) + + + + setTimeout(()=>{ + tablesData.value = getDetailQrCodesData + },810) + + + + setTimeout(()=>{ + loadingInstance1.close() + qrCodesPrintDialogFlag.value = true + },820) + + }else if(props.formBasicConfig.qrCodePrintStyle&&props.formBasicConfig.qrCodePrintStyle=="1"){ + //fieldsMap = null + tablesData.value = getDetailQrCodesData + qrCodesPrintDialogFlag.value = true + loadingInstance1.close() + } + + })/* .finally(()=>{ + loadingInstance1.close() + qrCodesPrintDialogFlag.value = true + }) */ + }else{ + alert("未选中任何一条,请先选择") + + } + //liwenxuan 20250114 二维码打印弹窗 end + + }else { if (idList.value.length > 0) { ElMessageBox.confirm("确认删除此数据项?删除后不可恢复!", "警告", { @@ -459,6 +883,13 @@ const getPageData = () => { }) .finally(() => { state.loading = false; + asfs = []; + radios = []; + checkboxs = []; + switchs = []; + selects = []; + tables = []; + getAsfs() }); } }; @@ -623,6 +1054,7 @@ onMounted(() => { nextTick(() => { drawerWith.value = container.value?.clientWidth; }); + getAsfs() }); /** @ 作者: 秦东 @@ -1499,6 +1931,65 @@ const transformOption = (val: string | number, type?: string) => { @searchquery="getListData" /> + + +
+
+ + + + + + + + + +
{{ tablesData[tableKey].appName }}-{{ tablesData[tableKey].formName }}二维码
{{ item.key }}{{ item.value }}
+
+
+
+
+ + + + + + + +
{{ tablesData[tableKey].appName }}-{{ tablesData[tableKey].formName }}-{{ tablesData[tableKey].dataTitle }}
二维码
+
+
+ + +
diff --git a/src/components/DesignForm/tableListPage/index.vue b/src/components/DesignForm/tableListPage/index.vue index 28eda11..c734382 100644 --- a/src/components/DesignForm/tableListPage/index.vue +++ b/src/components/DesignForm/tableListPage/index.vue @@ -27,13 +27,13 @@ import { checkboxUnit, orgDeptUnit, } from "@/api/DesignForm/fieldUnit"; -import type { FormInstance, FormRules, ElNotification } from "element-plus"; +import type { FormInstance, FormRules } from "element-plus"; import { gainFormPageListCont } from "@/api/DesignForm/requestapi"; import { Picture, InfoFilled, QuestionFilled } from "@element-plus/icons-vue"; import request from "@/utils/request"; import html2canvas from 'html2canvas'; import JSZip, { forEach } from 'jszip'; -import { ElLoading,ElMessage } from 'element-plus' +import { ElLoading,ElMessage,ElNotification } from 'element-plus' import { softDeletion, retractRunWorkFlow } from "@/api/taskapi/management"; import { formatNumber } from "@/api/DesignForm/utils"; diff --git a/src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue b/src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue index fbd8540..e630a35 100644 --- a/src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue +++ b/src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue @@ -355,6 +355,8 @@ function optionsValue3Get3(data: any, fieldName: string) { :sign-code="appInitData.signCode" :pickAppMenu="props.pickAppMenu" :viewPage="stateList.view" + :form-basic-config="stateForm.formData.form" + :fields-detail-list="stateForm.formData.list" />