Browse Source

Merge branch 'master' into lwx_v27

lwx_v27
liwenxuan 2 days ago
parent
commit
e6f388b8b1
  1. 40
      src/components/DesignForm/printHtmlRender.ts
  2. 68
      src/components/DesignForm/printHtmlRender.vue
  3. 1
      src/store/modules/orgMember.ts
  4. 21
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/printSetupPage2.vue

40
src/components/DesignForm/printHtmlRender.ts

@ -24,12 +24,13 @@ export const printHtmlPage = async (pformid:string,pappkey:string,pversionid:str
})
}
let noTemplate:boolean=false
await getPrintTemplate({"versionid":pversionid,"formkey":pappkey}).then(resp=>{
title=resp.data.title
if(resp.data.formtemplatejson!=""){
data=JSON.parse(resp.data.formtemplatejson)
}else{
noTemplate=true
alert("请先创建打印模板!")
return
}
@ -49,6 +50,8 @@ export const printHtmlPage = async (pformid:string,pappkey:string,pversionid:str
}
})
if(noTemplate) return;
let qrstr=`https://wab.hxgk.group/#/form_table/taskListPage?id=${pformid}&key=${pappkey}&
formid=${pversionid}&formKey=${pformkey}&qrDetailId=${row.id}`
data.forEach(node=>{
@ -86,19 +89,32 @@ export const printHtmlPage = async (pformid:string,pappkey:string,pversionid:str
};
const deepLoopForm=(node:fieldTree, row: Record<string, any>)=>{
if(Array.isArray(node)){
node.forEach(item=>{deepLoopForm(item,row)})
return
}
if(Array.isArray(node)){
node.forEach(item=>{deepLoopForm(item,row)})
return
}
if(node.type=="tabs"&&node.child){
node.child?.forEach(item=>{deepLoopForm(item,row)})
return
}
if(node.field!=""){
let rnode:Object;
if (row.hasOwnProperty(node.field!)){// 有这个字段
if (node.type=="table" || node.type=="tabs"){
node.data=row[node.field!]
}else{
node.field=row[node.field!]
if(node.field!=""){
if (row.hasOwnProperty(node.field!)){// 有这个字段
if (node.type=="table"){
node.data=row[node.field!]
}else if(node.type=="select"||node.type=="checkbox"){
const val=row[node.field!]
node.field=""
for(let op of node.options!){
if(op.value==val){
node.field=op.label
break;
}
}
}else{
node.field=row[node.field!]
}
}
}
}

68
src/components/DesignForm/printHtmlRender.vue

@ -9,6 +9,7 @@ export interface fieldTree{
type:string;
checked?:number;
data?:[];
options?:[];//select, checkbox... options
child?:fieldTree[]
}
@ -38,16 +39,19 @@ const props = withDefaults(defineProps<{
const qrdata=ref("")
const userName=useUserStore().nickname;
function parseDataPicker(val:string){
function parseDataPicker(val:string,vtype:string){
let str:string;
if(typeof(val)=="number"){
str=new Date(val).toISOString()
}else{
if(val==""|| val.match(/[a-z]/) ) return val;
str=new Date(parseInt(val)).toISOString()
str=new Date(val).toLocaleString()
}else{//"";2025-12-17;sheng1chan3ri4qi1;
if(val==""|| val.match(/[a-z-:.]/) ) return val;
str=new Date(parseInt(val)).toLocaleString()
}
return str.slice(0,10)+" "+str.slice(11,16)
if(vtype.startsWith("time")){
return str.slice(11,16)
}
return str.slice(0,10)
}
const generateQrCode= ()=>{
@ -99,7 +103,7 @@ const getStateText=(val:number)=>{
{{item.name}}
</span>
<span v-if="item.type !=='datePicker'" class="content">{{item.field}}</span>
<span v-else class="content">{{parseDataPicker(item.field)}}</span>
<span v-else class="content">{{parseDataPicker(item.field,item.type)}}</span>
</div>
</template>
</div>
@ -121,7 +125,14 @@ const getStateText=(val:number)=>{
<tbody>
<tr v-for="(dd, index) in group.data" :key="dd">
<template v-for="child in group.child">
<td v-if="child.checked!=2" >{{ dd[child.field]}}</td>
<td v-if="child.checked!=2">
<template v-if="child.type.includes('Picker')">
{{parseDataPicker(dd[child.field],child.type)}}
</template>
<template v-else>
{{dd[child.field]}}
</template>
</td>
</template>
</tr>
</tbody>
@ -131,15 +142,15 @@ const getStateText=(val:number)=>{
<h5>{{ group.name }}</h5>
<div v-for="tabs in group.child" class="tabs_item">
<div v-if="Array.isArray(tabs)" class="auto_table">
<template v-for="item in tabs" >
<div v-if="item.checked!=2" class="tabs_cell_box" style="width: auto;">
<span class="box_name">
{{item.name}}
</span>
<span v-if="item.type !=='datePicker'" class="content">{{item.field}}</span>
<span v-else class="content">{{parseDataPicker(item.field)}}</span>
</div>
</template>
<template v-for="item in tabs" >
<div v-if="item.checked!=2" class="tabs_cell_box" style="width: auto;">
<span class="box_name">
{{item.name}}
</span>
<span v-if="item.type !=='datePicker'" class="content">{{item.field}}</span>
<span v-else class="content">{{parseDataPicker(item.field,item.type)}}</span>
</div>
</template>
</div>
<div v-else-if="tabs.type=='divider'" class="title" v-if="tabs.checked!=2"
style="font-size: 12px; margin-top: 20px;">{{ tabs.name }}</div>
@ -160,26 +171,32 @@ const getStateText=(val:number)=>{
<tbody>
<tr v-for="(dd, index) in tabs.data" :key="dd">
<template v-for="child in tabs.child">
<td v-if="child.checked!=2" >{{ dd[child.field]}}</td>
<td v-if="child.checked!=2" >
<template v-if="child.type.includes('Picker')">
{{parseDataPicker(dd[child.field],child.type)}}
</template>
<template v-else>
{{dd[child.field]}}
</template>
</td>
</template>
</tr>
</tbody>
</table>
</div>
<div v-else class="tabs_cell_box" v-if="tabs.checked!=2">
<div v-else class="section tabs_wide_box" v-if="tabs.checked!=2">
<span class="box_name">
{{tabs.name}}
</span>
<span v-if="tabs.type !=='datePicker'" class="content">{{tabs.field}}</span>
<span v-else class="content">{{parseDataPicker(tabs.field??'')}}</span>
<span v-else class="content">{{parseDataPicker(tabs.field??'',tabs.type)}}</span>
</div>
</div>
</div>
<div v-else v-if="group.checked!=2">{{ group }}</div>
<div v-else v-if="group.checked!=2 && group.type">{{ group }}</div>
</div>
<div v-if="props.flowList && props.flowList.length>0" class="section_table">
<table class="bder_table">
<caption >审批流程</caption>
@ -265,7 +282,7 @@ div:empty {
.auto_table{
display: grid;
grid-template-columns: 1fr 1fr;
border: 1px solid rgb(226, 226, 226);
border: 1px solid rgb(200, 200, 200);
}
.operate_log{
display: block;
@ -357,7 +374,7 @@ h5{
}
/* 原有样式(稍作优化) */
.cell_box, .tabs_cell_box {
.cell_box, .tabs_cell_box, .tabs_wide_box{
border: 1px solid rgb(182, 181, 181);
margin-right: -1px; /* 水平排列时用右负margin */
margin-bottom: -1px; /* 垂直排列时用下负margin */
@ -383,8 +400,9 @@ h5{
border-left: 1px solid rgb(182, 181, 181);
}
}
.tabs_cell_box{
.tabs_cell_box, .tabs_wide_box{
width: 100%;
flex-direction: row;
}

1
src/store/modules/orgMember.ts

@ -14,6 +14,7 @@ export const useOrgMemberStore = defineStore('orgMember', () => {
const dataTree = ref<OrgMemberItem>({ id: '', name: '', child: [] })
async function init() {
await request({
url: "/systemapi/app/get_org_everyone_people",//"172.20.2.87:39168",
method: "post",

21
src/views/sysworkflow/lowcodepage/appPage/appPageForm/printSetupPage2.vue

@ -13,6 +13,7 @@ interface fieldTreeEx extends fieldTree{
unitName?:string;
list?:fieldTreeEx[];
columns?:fieldTreeEx[];
options?:[]
}
const printMode=ref("")
@ -104,6 +105,13 @@ const updatePageConfig=(cmd:string)=>{
}
}
const onClearTreeData=()=>{
fieldTreeData.value=[]
props.state.formData.list.forEach((item:fieldTreeEx)=>{
fieldTreeData.value.push(deepLoop(item))
})
}
//
const onSaveTreeData=()=>{
let str:string=safeStringify(htmlRenderData.value)
@ -146,6 +154,15 @@ const deepLoop=(item:fieldTreeEx)=>{
child:[],
}
break;
case "select":
case "checkbox":
data={
field:item.name?? "",
type:item.type,
name:item.item ? item.item.label : "",
options: item.options
}
break;
default:
data={
field:item.name?? "",
@ -270,14 +287,17 @@ onMounted(async ()=>{
})
/*********************为解决pageconfig字段的问题**************************/
console.log(fieldTreeData.value.length,"length????")
let newForm:boolean;
if(fieldTreeData.value.length==0){
newForm=true;
}
props.state.formData.list.forEach((item:fieldTreeEx)=>{
if(systemType.includes(item.type)) {
//type
objPageConfig.value[item.type as keyof PageConfig]=item.name??""
}
//objPageConfigfieldTreeData
if(newForm){
@ -353,6 +373,7 @@ const updateNodeData=(val:fieldTree,val2:boolean,val3:boolean)=>{
<el-radio-button label="纵向" value="vtal" />
</el-radio-group>
<el-button style="position: absolute;right: 190px;" type="primary" @click="onClearTreeData">重置</el-button>
<el-button style="position: absolute;right: 90px;" type="primary" @click="onSaveTreeData">保存模板</el-button>
</div>
<div style="margin: 10px auto; background: white;box-shadow:0px 0px 6px rgba(0,0,0,0.12);overflow-y: scroll; scrollbar-width: none;"

Loading…
Cancel
Save