Sfoglia il codice sorgente

行级填报多级表头

rongxin_prod
zhao 2 anni fa
parent
commit
ad8bf70ccb
3 ha cambiato i file con 92 aggiunte e 43 eliminazioni
  1. +28
    -17
      src/views/sunVillage_info/entityReport/reportLineSummary.vue
  2. +28
    -5
      src/views/sunVillage_info/entityReport/reportLineView.vue
  3. +36
    -21
      src/views/sunVillage_info/entityReport/reportView.vue

+ 28
- 17
src/views/sunVillage_info/entityReport/reportLineSummary.vue Vedi File

@@ -51,30 +51,29 @@
<div class="main-table" v-if="!!editorData.templateId"> <div class="main-table" v-if="!!editorData.templateId">
<table> <table>
<thead> <thead>
<tr>
<td v-for="(header) in removePlaceholder(editorData.headers)" :colspan="header.colspan" :style="{
'background-color': calcColor(header.type),
'color': calcTextColor(header.type),
}">{{header.headerName}}</td>
</tr>
<tr v-for="(headerRow, rindex) in editorData.headerRows">
<th v-for="(header) in removePlaceholder(headerRow)" :__Col="header.headerSort" :__Row="header.headerRowSort" :colspan="header.colspan" :rowspan="header.rowspan">
{{header.headerName}}
</th>
</tr>
</thead> </thead>


<tbody> <tbody>
<tr v-for="(row, rindex) in editorData.rows"> <tr v-for="(row, rindex) in editorData.rows">
<td v-for="(col, cindex) in removePlaceholder(row)" :colspan="col.colspan" :rowspan="col.rowspan" :style="{ <td v-for="(col, cindex) in removePlaceholder(row)" :colspan="col.colspan" :rowspan="col.rowspan" :style="{
'text-align': calcAlign(editorData.headers[col.colIndex].type),
'background-color': calcColor(editorData.headers[col.colIndex].type),
'text-align': calcAlign(col.type),
'background-color': calcColor(col.type),
}"> }">
<div class="full-height"> <div class="full-height">
<div class="full-height" v-if="editorData.headers[col.colIndex].type === '2'">
<div class="full-height" v-if="col.type === '2'">
<input class="input-field align-right full-height" v-model="col.val" :readonly="disableEdit" type="number"></input> <input class="input-field align-right full-height" v-model="col.val" :readonly="disableEdit" type="number"></input>
</div> </div>
<div class="full-height" v-else-if="editorData.headers[col.colIndex].type === '4'">
<div class="full-height" v-else-if="col.type === '4'">
<input class="input-field align-center full-height" v-model="col.name" :readonly="disableEdit"></input> <input class="input-field align-center full-height" v-model="col.name" :readonly="disableEdit"></input>
</div> </div>
<div class="full-height" v-else :style="{'text-align': calcAlign(editorData.headers[col.colIndex].type)}">{{col.name}}</div>
<div v-else :style="{'text-align': calcAlign(col.type)}">{{col.name}}</div>


<van-icon name="edit" v-if="cindex === editorData.headers.length - 1 && canEdit(col)" class="edit-icon" color="#1989fa" size="24" @click="edit(col)"/>
<van-icon name="edit" v-if="cindex === editorData.headerTypes.length - 1 && canEdit(col)" class="edit-icon" color="#1989fa" size="24" @click="edit(col)"/>
</div> </div>
</td> </td>
</tr> </tr>
@@ -136,6 +135,11 @@ export default {
rows: [], rows: [],
cells: [], cells: [],
rules: [], rules: [],
headerRows: [],
headerLength: 0,
headerDeep: 0,
headerTypes: [],
header: null,
}, },
templateList: [], templateList: [],
loading: false, loading: false,
@@ -247,6 +251,11 @@ export default {
rows: [], rows: [],
cells: [], cells: [],
rules: [], rules: [],
headerRows: [],
headerLength: 0,
headerDeep: 0,
headerTypes: [],
header: null,
}; };
}, },
parseQuery() { parseQuery() {
@@ -358,18 +367,19 @@ export default {
border: 0.01rem solid #1989fa; border: 0.01rem solid #1989fa;
table-layout: fixed; table-layout: fixed;
} }
thead td {
th {
text-align: center; text-align: center;
border: 0.01rem solid #1989fa; border: 0.01rem solid #1989fa;
height: 1rem;
min-height: 1rem;
font-size: 0.32rem; font-size: 0.32rem;
padding: 0 0.4rem;
padding: 0.4rem 0.4rem;
margin: 0; margin: 0;
font-weight: bold; font-weight: bold;
min-width: 1rem;
/*max-width: 2rem;*/
white-space: nowrap; white-space: nowrap;
/*max-width: 1.2rem;*/
} }
tbody td {
td {
font-size: 0.3rem; font-size: 0.3rem;
border: 0.01rem solid #1989fa; border: 0.01rem solid #1989fa;
height: 1rem; height: 1rem;
@@ -380,6 +390,7 @@ export default {
margin: 0; margin: 0;
/*max-width: 1.5rem;*/ /*max-width: 1.5rem;*/
position: relative; position: relative;
min-width: 1rem;
} }


.input-field { .input-field {


+ 28
- 5
src/views/sunVillage_info/entityReport/reportLineView.vue Vedi File

@@ -49,7 +49,7 @@
</van-row> </van-row>


<div class="main-table" v-if="!!editorData.templateId"> <div class="main-table" v-if="!!editorData.templateId">
<div v-for="(header, rindex) in editorData.headers">
<div v-for="(header, rindex) in editorData.detailHeaders">
<van-field v-if="header.type === '2'" label-width="50%" :readonly="disableEdit" v-model="editorData.rows[0][rindex].val" :label="header.headerName" :placeholder="header.headerName" input-align="right" type="number"/> <van-field v-if="header.type === '2'" label-width="50%" :readonly="disableEdit" v-model="editorData.rows[0][rindex].val" :label="header.headerName" :placeholder="header.headerName" input-align="right" type="number"/>
<van-field v-else-if="header.type === '4' || header.type === '3'" label-width="50%" :readonly="disableEdit" v-model="editorData.rows[0][rindex].name" :label="header.headerName" :placeholder="header.headerName" input-align="right"/> <van-field v-else-if="header.type === '4' || header.type === '3'" label-width="50%" :readonly="disableEdit" v-model="editorData.rows[0][rindex].name" :label="header.headerName" :placeholder="header.headerName" input-align="right"/>
<van-field v-else label-width="50%" :readonly="true" :value="editorData.rows[0][rindex].name" :label="header.headerName" :placeholder="header.headerName" input-align="right"/> <van-field v-else label-width="50%" :readonly="true" :value="editorData.rows[0][rindex].name" :label="header.headerName" :placeholder="header.headerName" input-align="right"/>
@@ -128,6 +128,12 @@ export default {
rows: [], rows: [],
cells: [], cells: [],
rules: [], rules: [],
headerRows: [],
headerLength: 0,
headerDeep: 0,
headerTypes: [],
header: null,
detailHeaders: [],
}, },
templateList: [], templateList: [],
loading: false, loading: false,
@@ -159,9 +165,13 @@ export default {
this.loading = true; this.loading = true;
if(this.editorData.id) // 修改 if(this.editorData.id) // 修改
{ {
getReport(this.editorData.id).then((resp) => {
getReport(this.editorData.id, {
genDetailHeaders: true
}).then((resp) => {
let reportData = resp.data; let reportData = resp.data;
getReportTemplate(reportData.templateId).then((resp) => {
getReportTemplate(reportData.templateId, {
genDetailHeaders: true
}).then((resp) => {
let templateData = resp.data; let templateData = resp.data;
this.setTableData(templateData, reportData); this.setTableData(templateData, reportData);
}).finally(() => { }).finally(() => {
@@ -173,7 +183,9 @@ export default {
} }
else else
{ {
getReportTemplate(this.editorData.templateId).then((resp) => {
getReportTemplate(this.editorData.templateId, {
genDetailHeaders: true
}).then((resp) => {
let templateData = resp.data; let templateData = resp.data;
this.setTableData(templateData); this.setTableData(templateData);
}).finally(() => { }).finally(() => {
@@ -197,6 +209,11 @@ export default {
let cells = reportData.cells; let cells = reportData.cells;
data = reportData; data = reportData;
data.headers = templateData.headers; data.headers = templateData.headers;
data.headerRows = templateData.headerRows;
data.headerTypes = templateData.headerTypes;
data.headerLength = templateData.headerLength;
data.headerDeep = templateData.headerDeep;
data.detailHeaders = templateData.detailHeaders;
data.rows = templateData.rows; data.rows = templateData.rows;
data.cells = templateData.cells; data.cells = templateData.cells;
data.rules = templateData.rules; data.rules = templateData.rules;
@@ -208,7 +225,7 @@ export default {
cols.forEach((x) => { cols.forEach((x) => {
if(group[rowIndex] && group[rowIndex][x.colIndex]) if(group[rowIndex] && group[rowIndex][x.colIndex])
{ {
if(templateData.headers[x.colIndex].type === '4')
if(templateData.headerTypes[x.colIndex] === '4')
x.name = group[rowIndex][x.colIndex].name; x.name = group[rowIndex][x.colIndex].name;
x.val = group[rowIndex][x.colIndex].val; x.val = group[rowIndex][x.colIndex].val;
} }
@@ -297,6 +314,12 @@ export default {
rows: [], rows: [],
cells: [], cells: [],
rules: [], rules: [],
headerRows: [],
headerLength: 0,
headerDeep: 0,
headerTypes: [],
header: null,
detailHeaders: [],
}; };
}, },
parseQuery() { parseQuery() {


+ 36
- 21
src/views/sunVillage_info/entityReport/reportView.vue Vedi File

@@ -52,27 +52,26 @@
<div class="main-table" v-if="!!editorData.templateId"> <div class="main-table" v-if="!!editorData.templateId">
<table> <table>
<thead> <thead>
<tr>
<td v-for="(header) in removePlaceholder(editorData.headers)" :colspan="header.colspan" :style="{
'background-color': calcColor(header.type),
'color': calcTextColor(header.type),
}">{{header.headerName}}</td>
</tr>
<tr v-for="(headerRow, rindex) in editorData.headerRows">
<th v-for="(header) in removePlaceholder(headerRow)" :__Col="header.headerSort" :__Row="header.headerRowSort" :colspan="header.colspan" :rowspan="header.rowspan">
{{header.headerName}}
</th>
</tr>
</thead> </thead>


<tbody> <tbody>
<tr v-for="(row, rindex) in editorData.rows">
<tr v-for="(row, rindex) in editorData.rows">
<td v-for="(col) in removePlaceholder(row)" :colspan="col.colspan" :rowspan="col.rowspan" :style="{ <td v-for="(col) in removePlaceholder(row)" :colspan="col.colspan" :rowspan="col.rowspan" :style="{
'text-align': calcAlign(editorData.headers[col.colIndex].type),
'background-color': calcColor(editorData.headers[col.colIndex].type),
'text-align': calcAlign(col.type),
'background-color': calcColor(col.type),
}"> }">
<div class="absolute-full" v-if="editorData.headers[col.colIndex].type === '2'" :class="{'validate-error': col.error, 'validate-error-box': col.error,}">
<div class="absolute-full" v-if="col.type === '2'" :class="{'validate-error': col.error, 'validate-error-box': col.error,}">
<input class="input-field align-right full-height" v-model="col.val" :readonly="disableEdit" type="number"></input> <input class="input-field align-right full-height" v-model="col.val" :readonly="disableEdit" type="number"></input>
</div> </div>
<div class="full-height" v-else-if="editorData.headers[col.colIndex].type === '4'">
<div class="full-height" v-else-if="col.type === '4'">
<input class="input-field align-center full-height" v-model="col.name" :readonly="disableEdit"></input> <input class="input-field align-center full-height" v-model="col.name" :readonly="disableEdit"></input>
</div> </div>
<div class="full-height" v-else :style="{'text-align': calcAlign(editorData.headers[col.colIndex].type)}">{{col.name}}</div>
<div v-else :style="{'text-align': calcAlign(col.type)}">{{col.name}}</div>
</td> </td>
</tr> </tr>
</tbody> </tbody>
@@ -155,6 +154,11 @@ export default {
rows: [], rows: [],
cells: [], cells: [],
rules: [], rules: [],
headerRows: [],
headerLength: 0,
headerDeep: 0,
headerTypes: [],
header: null,
}, },
templateList: [], templateList: [],
loading: false, loading: false,
@@ -223,6 +227,10 @@ export default {
let cells = reportData.cells; let cells = reportData.cells;
data = reportData; data = reportData;
data.headers = templateData.headers; data.headers = templateData.headers;
data.headerRows = templateData.headerRows;
data.headerTypes = templateData.headerTypes;
data.headerLength = templateData.headerLength;
data.headerDeep = templateData.headerDeep;
data.rows = templateData.rows; data.rows = templateData.rows;
data.cells = templateData.cells; data.cells = templateData.cells;
data.rules = templateData.rules; data.rules = templateData.rules;
@@ -234,7 +242,7 @@ export default {
cols.forEach((x) => { cols.forEach((x) => {
if(group[rowIndex] && group[rowIndex][x.colIndex]) if(group[rowIndex] && group[rowIndex][x.colIndex])
{ {
if(templateData.headers[x.colIndex].type === '4')
if(templateData.headerTypes[x.colIndex] === '4')
x.name = group[rowIndex][x.colIndex].name; x.name = group[rowIndex][x.colIndex].name;
x.val = group[rowIndex][x.colIndex].val; x.val = group[rowIndex][x.colIndex].val;
} }
@@ -347,16 +355,21 @@ export default {
rows: [], rows: [],
cells: [], cells: [],
rules: [], rules: [],
headerRows: [],
headerLength: 0,
headerDeep: 0,
headerTypes: [],
header: null,
}; };
}, },
validate(showMsg) { validate(showMsg) {
if(!this.editorData.rules || !this.editorData.rules.length) if(!this.editorData.rules || !this.editorData.rules.length)
return true; return true;
let errors = []; let errors = [];
for(let i in this.editorData.headers)
for(let i in this.editorData.headerTypes)
{ {
let header = this.editorData.headers[i];
if(header.type !== '2')
let type = this.editorData.headerTypes[i];
if(type !== '2')
continue; continue;
let map = {}; let map = {};
for(let m in this.editorData.rows) for(let m in this.editorData.rows)
@@ -502,18 +515,19 @@ export default {
border: 0.01rem solid #1989fa; border: 0.01rem solid #1989fa;
table-layout: fixed; table-layout: fixed;
} }
thead td {
th {
text-align: center; text-align: center;
border: 0.01rem solid #1989fa; border: 0.01rem solid #1989fa;
height: 1rem;
min-height: 1rem;
font-size: 0.32rem; font-size: 0.32rem;
padding: 0 0.4rem;
padding: 0.4rem 0.4rem;
margin: 0; margin: 0;
font-weight: bold; font-weight: bold;
min-width: 1rem;
/*max-width: 2rem;*/
white-space: nowrap; white-space: nowrap;
/*max-width: 1.2rem;*/
} }
tbody td {
td {
font-size: 0.3rem; font-size: 0.3rem;
border: 0.01rem solid #1989fa; border: 0.01rem solid #1989fa;
height: 1rem; height: 1rem;
@@ -524,6 +538,7 @@ export default {
margin: 0; margin: 0;
/*max-width: 1.5rem;*/ /*max-width: 1.5rem;*/
position: relative; position: relative;
min-width: 1rem;
} }


.input-field { .input-field {


Caricamento…
Annulla
Salva