@@ -179,3 +179,21 @@ export function horizontalSummaryStatisticsExport(query) { | |||||
params: query | params: query | ||||
}) | }) | ||||
} | } | ||||
// 查询统计报列表(行级) | |||||
export function listLineReporttitle(query) { | |||||
return request({ | |||||
url: '/entity/reporttitle/lineList', | |||||
method: 'get', | |||||
params: query | |||||
}) | |||||
} | |||||
// 竖向统计(不相加) | |||||
export function summaryList(query) { | |||||
return request({ | |||||
url: '/entity/report/summaryList', | |||||
method: 'get', | |||||
params: query | |||||
}) | |||||
} |
@@ -3552,6 +3552,33 @@ export const constantRoutes = [ | |||||
}, | }, | ||||
component: (resolve) => require(['@/views/sunVillage_info/entityReport/reportView'], resolve) | component: (resolve) => require(['@/views/sunVillage_info/entityReport/reportView'], resolve) | ||||
}, | }, | ||||
{ // 行级填报 | |||||
path: '/sunVillage_info/entityReportLineList', | |||||
name: 'entityReportLineList', | |||||
meta: { | |||||
title: '行级填报', | |||||
hidden: true, | |||||
}, | |||||
component: (resolve) => require(['@/views/sunVillage_info/entityReport/reportLineList'], resolve) | |||||
}, | |||||
{ // 行级填报 | |||||
path: '/sunVillage_info/entityReportLineView', | |||||
name: 'entityReportLineView', | |||||
meta: { | |||||
title: '行级填报', | |||||
hidden: true, | |||||
}, | |||||
component: (resolve) => require(['@/views/sunVillage_info/entityReport/reportLineView'], resolve) | |||||
}, | |||||
{ // 行级填报 | |||||
path: '/sunVillage_info/entityReportLineSummary', | |||||
name: 'entityReportLineSummary', | |||||
meta: { | |||||
title: '行级填报', | |||||
hidden: true, | |||||
}, | |||||
component: (resolve) => require(['@/views/sunVillage_info/entityReport/reportLineSummary'], resolve) | |||||
}, | |||||
{ // 统计填报 | { // 统计填报 | ||||
path: '/sunVillage_info/statistical_report', | path: '/sunVillage_info/statistical_report', | ||||
name: 'sunVillageInfoStatisticalReport', | name: 'sunVillageInfoStatisticalReport', | ||||
@@ -0,0 +1,263 @@ | |||||
<template> | |||||
<div class="app-container"> | |||||
<div class="header_main-placeholder"> | |||||
<div class="header_main"> | |||||
行级填报 | |||||
<div class="return_btn" @click="$router.back()"></div> | |||||
</div> | |||||
</div> | |||||
<van-pull-refresh v-model="refreshing" @refresh="getList()"> | |||||
<van-list | |||||
class="list_main" | |||||
v-model="loading" | |||||
:finished="finished" | |||||
finished-text="没有更多了" | |||||
@load="getList('+1')" | |||||
> | |||||
<van-swipe-cell class="item" v-for="(item,index) in list" :key="index"> | |||||
<div class="item_box" @click="view(item)"> | |||||
<div class="head_block"> | |||||
<i class="icon"></i> | |||||
<div class="title">{{item.reportName}}</div> | |||||
</div> | |||||
<div class="order_block"> | |||||
<div class="flex_block"> | |||||
<i class="icon icon_1"></i> | |||||
<div class="text">最近填报: {{item.params.lastOperatorDate}}</div> | |||||
</div> | |||||
<div class="flex_block"> | |||||
<i class="icon icon_2"></i> | |||||
<div class="text">填报数: {{item.params.numReport}}</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<template #right> | |||||
<van-row class="full-height toolbar"> | |||||
<van-col class="full-height"> | |||||
<van-button square text="填报" type="primary" :to="{name:'entityReportLineView', query: {templateId:item.id, intent: 'add'}}" class="full-height" /> | |||||
</van-col> | |||||
</van-row> | |||||
</template> | |||||
</van-swipe-cell> | |||||
</van-list> | |||||
</van-pull-refresh> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import {delReport, listLineReporttitle} from "@/api/sunVillage_info/entity/report.js"; | |||||
export default { | |||||
name: "ReportLineList", | |||||
data() { | |||||
return { | |||||
list:[], | |||||
loading: false, | |||||
finished: false, | |||||
refreshing: false, | |||||
total: 0, | |||||
queryParams:{ | |||||
pageNum:1, | |||||
pageSize:10, | |||||
orderByColumn:'createTime', | |||||
isAsc:'desc', | |||||
type: '2', | |||||
} | |||||
}; | |||||
}, | |||||
created() { | |||||
this.getList(); | |||||
}, | |||||
methods: { | |||||
view(row){ | |||||
this.$router.push({ | |||||
name: 'entityReportLineSummary', | |||||
query: { | |||||
intent: 'view', | |||||
templateId: row.id, | |||||
} | |||||
}); | |||||
}, | |||||
getList(target){ | |||||
let type = typeof (target); | |||||
//console.log(type, target); | |||||
if(target && this.finished) | |||||
return; | |||||
if (target === 0) { | |||||
this.refreshing = true; | |||||
this.finished = true; | |||||
this.total = 0; | |||||
this.queryParams.pageNum = 1; | |||||
this.list = []; | |||||
} | |||||
else if (type === 'number') | |||||
this.queryParams.pageNum = target; | |||||
else if (type === 'string') { | |||||
this.queryParams.pageNum = eval(this.queryParams.pageNum + target) | |||||
} | |||||
else | |||||
{ | |||||
this.refreshing = true; | |||||
this.finished = true; | |||||
this.total = 0; | |||||
this.queryParams.pageNum = 1; | |||||
this.list = [] | |||||
} | |||||
listLineReporttitle(this.queryParams).then(response => { | |||||
if (response.rows.length === 0) { | |||||
this.finished = true; | |||||
return; | |||||
} | |||||
this.list.push(...response.rows); | |||||
this.total += response.rows.length; | |||||
this.finished = this.total >= response.total; | |||||
}).finally(() => { | |||||
this.loading = false; | |||||
this.refreshing = false; | |||||
}); | |||||
}, | |||||
remove(row, index){ | |||||
this.$dialog.confirm({ | |||||
message: '您确认删除综合填报?', | |||||
}) | |||||
.then(() => { | |||||
delReport(row.id).then(res => { | |||||
this.$toast.success('删除成功'); | |||||
this.list.splice(index,1); | |||||
}); | |||||
}) | |||||
.catch(() => { | |||||
}); | |||||
}, | |||||
refresh() { | |||||
this.getList(); return; | |||||
this.list = []; | |||||
this.queryParams.pageNum = 1; | |||||
this.refreshing = true; | |||||
this.finished = false; | |||||
}, | |||||
}, | |||||
} | |||||
</script> | |||||
<style scoped lang="scss"> | |||||
.app-container { | |||||
//padding: 0.2rem 3%; | |||||
width: 100vw; | |||||
height: 100vh; | |||||
} | |||||
.full-height { | |||||
height: 100%; | |||||
} | |||||
.header_main-placeholder { | |||||
height: 116px; | |||||
} | |||||
.header_main { | |||||
height: 116px; | |||||
background: url('../../../assets/images/sunVillage_info/list_head.png') no-repeat; | |||||
background-size: 100% 100%; | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
font-size: 36px; | |||||
line-height: 116px; | |||||
text-align: center; | |||||
color: #fff; | |||||
z-index: 999; | |||||
.return_btn { | |||||
width: 24px; | |||||
height: 43.2px; | |||||
background: url('../../../assets/images/sunVillage_info/list_icon_5.png') center center no-repeat; | |||||
background-size: 20px 36px; | |||||
position: absolute; | |||||
left: 38px; | |||||
top: 36px; | |||||
} | |||||
.add_btn { | |||||
width: 56.4px; | |||||
height: 40.8px; | |||||
background: url('../../../assets/images/sunVillage_info/list_icon_9.png') center center no-repeat; | |||||
background-size: 47px 34px; | |||||
position: absolute; | |||||
right: 38px; | |||||
top: 36px; | |||||
} | |||||
} | |||||
.list_main{ | |||||
padding:26px 22px 0; | |||||
.item{ | |||||
height: 162px; | |||||
border-radius: 30px; | |||||
background: #fff; | |||||
box-shadow: 4px 6px 5px rgba(63, 68, 75, 0.1); | |||||
margin-bottom: 20px; | |||||
.item_box{ | |||||
padding:25px 32px; | |||||
} | |||||
.head_block{ | |||||
height: 62px; | |||||
display: flex; | |||||
align-items: center; | |||||
width: 100%; | |||||
.icon{ | |||||
width: 34px; | |||||
height: 30px; | |||||
background: url('../../../assets/images/sunVillage_info/fixedAssets_icon_4.png') no-repeat; | |||||
background-size: 100% 100%; | |||||
display: block; | |||||
margin-right: 12px; | |||||
} | |||||
.title{ | |||||
flex:1; | |||||
font-size: 32px; | |||||
color: #252525; | |||||
overflow: hidden; | |||||
text-overflow: ellipsis; | |||||
white-space: nowrap; | |||||
padding-right: 20px; | |||||
} | |||||
} | |||||
.order_block{ | |||||
display: flex; | |||||
height: 52px; | |||||
padding-top: 12px; | |||||
font-size: 24px; | |||||
color: #858585; | |||||
align-items: center; | |||||
padding-bottom: 10px; | |||||
.flex_block{ | |||||
display: flex; | |||||
align-items: center; | |||||
justify-content: center; | |||||
margin-right: 28px; | |||||
height: 42px; | |||||
.icon{ | |||||
width: 25px; | |||||
height: 25px; | |||||
margin-top: 3px; | |||||
margin-right: 8px; | |||||
&.icon_1{ | |||||
background: url('../../../assets/images/sunVillage_info/fixedAssets_icon_3.png') no-repeat; | |||||
background-size: 100% 100%; | |||||
} | |||||
&.icon_2{ | |||||
background: url('../../../assets/images/sunVillage_info/fixedAssets_icon_5.png') no-repeat; | |||||
background-size: 100% 100%; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.toolbar { | |||||
margin-left: 2px; | |||||
} | |||||
</style> |
@@ -0,0 +1,462 @@ | |||||
<template> | |||||
<div class="app-container"> | |||||
<div class="header_main-placeholder"> | |||||
<div class="header_main"> | |||||
行级填报 | |||||
<div class="return_btn" @click="back"></div> | |||||
<div class="add_btn" @click="add"></div> | |||||
</div> | |||||
</div> | |||||
<van-form ref="form" readonly :class="{'form_readonly': disableEdit}"> | |||||
<van-row> | |||||
<van-col :span="editorData.templateId ? 16 : 24"> | |||||
<field-select | |||||
class="template-selector" | |||||
:value="editorData.templateId" | |||||
label=" 模板" | |||||
value-key="reportName" | |||||
data-key="id" | |||||
placeholder="报表模板" | |||||
:rules="[{ required: true }]" | |||||
:readonly="true" | |||||
:columns="templateList" | |||||
@input="getTemplate" | |||||
/> | |||||
</van-col> | |||||
<van-col span="8" v-if="!!editorData.templateId"> | |||||
<field-date-picker | |||||
class="field_no-label" | |||||
v-model="editorData.reportYear" | |||||
placeholder="报表年度" | |||||
formatter="yyyy" | |||||
:readonly="disableEdit" | |||||
input-align="center" | |||||
type="year" | |||||
/> | |||||
</van-col> | |||||
</van-row> | |||||
<van-row v-if="!!editorData.templateId"> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.titleLeft" label="" placeholder="左上" input-align="left"/> | |||||
</van-col> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.titleCenter" label="" placeholder="中上" input-align="center"/> | |||||
</van-col> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.titleRight" label="" placeholder="右上" input-align="right"/> | |||||
</van-col> | |||||
</van-row> | |||||
<div class="main-table" v-if="!!editorData.templateId"> | |||||
<table> | |||||
<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> | |||||
</thead> | |||||
<tbody> | |||||
<tr v-for="(row, rindex) in editorData.rows"> | |||||
<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), | |||||
}"> | |||||
<div class="full-height"> | |||||
<div class="full-height" v-if="editorData.headers[col.colIndex].type === '2'"> | |||||
<input class="input-field align-right full-height" v-model="col.val" :readonly="disableEdit" type="number"></input> | |||||
</div> | |||||
<div class="full-height" v-else-if="editorData.headers[col.colIndex].type === '4'"> | |||||
<input class="input-field align-center full-height" v-model="col.name" :readonly="disableEdit"></input> | |||||
</div> | |||||
<div class="full-height" v-else :style="{'text-align': calcAlign(editorData.headers[col.colIndex].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)"/> | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
<template v-if="!!editorData.templateId"> | |||||
<div> | |||||
<van-field :readonly="disableEdit" v-model="editorData.reportRemark" label="备注" placeholder="报表备注"/> | |||||
</div> | |||||
<!-- <div> | |||||
<van-field readonly :value="editorData.rule" label="规则" placeholder="报表效验公式"></van-field> | |||||
</div>--> | |||||
</template> | |||||
</van-form> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import FieldSelect from "@/components/form/FieldSelect"; | |||||
import { | |||||
addReport, delReport, | |||||
getReport, | |||||
getReportTemplate, | |||||
listReporttitle, summaryList, | |||||
updateReport | |||||
} from "@/api/sunVillage_info/entity/report"; | |||||
import {array_grouping, array_toMap, date_format} from "@/utils"; | |||||
import {Expression} from "@/utils/expression"; | |||||
import {is_not_number} from "@/utils/utils"; | |||||
import FieldDatePicker from "@/components/form/FieldDatePicker"; | |||||
import {Notify} from "vant"; | |||||
import Cookies from "js-cookie"; | |||||
export default { | |||||
name: "ReportLineSummary", | |||||
components: {FieldDatePicker, FieldSelect}, | |||||
data() { | |||||
return { | |||||
editorData: { | |||||
id: null, | |||||
templateId: null, | |||||
reportRemark: null, | |||||
titleLeft: null, | |||||
titleCenter: null, | |||||
titleRight: null, | |||||
reportStatus: "0", | |||||
createBy: null, | |||||
createTime: null, | |||||
updateBy: null, | |||||
updateTime: null, | |||||
reportName: '', | |||||
operatorName: '', | |||||
operatorDate: '', | |||||
operatorDepartment: '', | |||||
rule: null, | |||||
reportYear: date_format('%Y'), | |||||
headers: [], | |||||
rows: [], | |||||
cells: [], | |||||
rules: [], | |||||
}, | |||||
templateList: [], | |||||
loading: false, | |||||
disableEdit: false, | |||||
intent: 'add', | |||||
templateId: null, | |||||
}; | |||||
}, | |||||
created() { | |||||
this.getTemplateList(); | |||||
this.parseQuery(); | |||||
}, | |||||
mounted(){ | |||||
this.init(); | |||||
}, | |||||
methods: { | |||||
getTemplateList() { | |||||
listReporttitle({ | |||||
type: '2', | |||||
reportStatus: '0', | |||||
}).then((resp) => { | |||||
this.templateList = resp.rows; | |||||
}); | |||||
}, | |||||
getTemplate() { | |||||
if(!this.editorData.templateId) | |||||
return; | |||||
this.loading = true; | |||||
summaryList({ | |||||
templateId: this.editorData.templateId, | |||||
}).then((resp) => { | |||||
this.editorData = resp.data; | |||||
}).finally(() => { | |||||
this.loading = false; | |||||
}); | |||||
}, | |||||
cellIsPlaceholder(x) { | |||||
return x.colspan <= 0 || (x.hasOwnProperty('rowspan') && x.rowspan <= 0); | |||||
}, | |||||
removePlaceholder(cells) { | |||||
return cells.filter((x) => !this.cellIsPlaceholder(x)); | |||||
}, | |||||
calcAlign(type) { | |||||
switch(type) | |||||
{ | |||||
case '2': | |||||
return 'right'; | |||||
case '3': | |||||
case '4': | |||||
return 'center'; | |||||
case '1': | |||||
return 'left'; | |||||
} | |||||
}, | |||||
calcColor(type) { | |||||
switch(type) | |||||
{ | |||||
case '2': | |||||
return 'unset'; | |||||
case '4': | |||||
return 'unset'; | |||||
case '3': | |||||
return '#d7e8f3'; | |||||
case '1': | |||||
return '#aad8f6'; | |||||
} | |||||
}, | |||||
calcTextColor(type) { | |||||
switch(type) | |||||
{ | |||||
case '2': | |||||
case '4': | |||||
return '#2facfe'; | |||||
case '3': | |||||
case '1': | |||||
return '#858585'; | |||||
} | |||||
}, | |||||
add() { | |||||
this.$router.push({ | |||||
name: 'entityReportLineView', | |||||
query: { | |||||
intent: 'add', | |||||
templateId: this.templateId, | |||||
} | |||||
}); | |||||
}, | |||||
reset() { | |||||
this.$refs.form.resetValidation(); | |||||
this.editorData = { | |||||
id: null, | |||||
deptId: null, | |||||
deptName: null, | |||||
templateId: null, | |||||
reportName: null, | |||||
reportYear: null, | |||||
reportRemark: null, | |||||
titleLeft: null, | |||||
titleCenter: null, | |||||
titleRight: null, | |||||
rule: null, | |||||
operatorName: null, | |||||
operatorDate: null, | |||||
createBy: null, | |||||
createTime: null, | |||||
updateBy: null, | |||||
updateTime: null, | |||||
headers: [], | |||||
rows: [], | |||||
cells: [], | |||||
rules: [], | |||||
}; | |||||
}, | |||||
parseQuery() { | |||||
let query = this.$route.query; | |||||
this.templateId = query.templateId; | |||||
this.intent = query.intent; | |||||
if(!this.templateId) | |||||
{ | |||||
this.$router.back(); | |||||
return; | |||||
} | |||||
}, | |||||
init() { | |||||
this.editorData.templateId = this.templateId; | |||||
this.getTemplate(); | |||||
this.disableEdit = this.intent === 'view'; | |||||
}, | |||||
back() { | |||||
this.$router.back(); | |||||
}, | |||||
notify(message, type) { | |||||
Notify.clear(); | |||||
Notify({ type: type || 'primary', message: message }); | |||||
}, | |||||
edit(row) { | |||||
this.$router.push({ | |||||
name: 'entityReportLineView', | |||||
query: { | |||||
intent: 'edit', | |||||
templateId: '', | |||||
reportId: row.reportId, | |||||
} | |||||
}); | |||||
}, | |||||
canEdit(col) { | |||||
return col.createBy == Cookies.get('deptId'); | |||||
}, | |||||
}, | |||||
computed: { | |||||
isAdd() { | |||||
return this.intent === 'add'; | |||||
}, | |||||
isEdit() { | |||||
return this.intent === 'edit'; | |||||
}, | |||||
isView() { | |||||
return this.intent === 'view'; | |||||
}, | |||||
} | |||||
} | |||||
</script> | |||||
<style scoped lang="scss"> | |||||
.app-container{ | |||||
background: #e9e9e9; | |||||
min-height: 100vh; | |||||
width: 100vw; | |||||
.header_main-placeholder { | |||||
height: 116px; | |||||
} | |||||
.header_main { | |||||
height: 116px; | |||||
background: url('../../../assets/images/sunVillage_info/list_head.png') no-repeat; | |||||
background-size: 100% 100%; | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
font-size: 36px; | |||||
line-height: 116px; | |||||
text-align: center; | |||||
color: #fff; | |||||
z-index: 999; | |||||
.return_btn { | |||||
width: 24px; | |||||
height: 43.2px; | |||||
background: url('../../../assets/images/sunVillage_info/list_icon_5.png') center center no-repeat; | |||||
background-size: 20px 36px; | |||||
position: absolute; | |||||
left: 38px; | |||||
top: 36px; | |||||
} | |||||
.add_btn { | |||||
width: 56.4px; | |||||
height: 40.8px; | |||||
background: url('../../../assets/images/sunVillage_info/list_icon_9.png') center center no-repeat; | |||||
background-size: 47px 34px; | |||||
position: absolute; | |||||
right: 38px; | |||||
top: 36px; | |||||
} | |||||
} | |||||
.main-table { | |||||
overflow-x: auto; | |||||
overflow-y: auto; | |||||
position: relative; | |||||
background-color: #ffffff; | |||||
padding: 0.15rem 0.15rem; | |||||
border-radius: 0.15rem; | |||||
margin: 0.1rem 0.1rem; | |||||
table { | |||||
/*width: max-content;*/ | |||||
border-collapse: collapse; | |||||
border: 0.01rem solid #1989fa; | |||||
table-layout: fixed; | |||||
} | |||||
thead td { | |||||
text-align: center; | |||||
border: 0.01rem solid #1989fa; | |||||
height: 1rem; | |||||
font-size: 0.32rem; | |||||
padding: 0 0.4rem; | |||||
margin: 0; | |||||
font-weight: bold; | |||||
white-space: nowrap; | |||||
/*max-width: 1.2rem;*/ | |||||
} | |||||
tbody td { | |||||
font-size: 0.3rem; | |||||
border: 0.01rem solid #1989fa; | |||||
height: 1rem; | |||||
white-space: break-spaces; | |||||
word-wrap: break-word; | |||||
overflow-wrap: break-word; | |||||
padding: 0 0.1rem; | |||||
margin: 0; | |||||
/*max-width: 1.5rem;*/ | |||||
position: relative; | |||||
} | |||||
.input-field { | |||||
width: 100%; | |||||
background-color: unset; | |||||
border: 0; | |||||
} | |||||
.validate-error { | |||||
color: #F56C6C; | |||||
} | |||||
.validate-error-box { | |||||
color: #F56C6C; | |||||
border: 0.02rem solid #F56C6C; | |||||
} | |||||
} | |||||
.align-right { | |||||
text-align: right; | |||||
} | |||||
.align-center { | |||||
text-align: center; | |||||
} | |||||
.full-height { | |||||
height: 100%; | |||||
} | |||||
/deep/ .van-field__label { | |||||
background-color: #2facfe; | |||||
margin: 0; | |||||
color: #fff; | |||||
border-top-left-radius: 0.15rem; | |||||
border-bottom-left-radius: 0.15rem; | |||||
padding: 0 0.2rem; | |||||
display: flex; | |||||
align-items: center; | |||||
} | |||||
/deep/ .van-field__body { | |||||
background-color: #ffffff; | |||||
border-top-right-radius: 0.15rem; | |||||
border-bottom-right-radius: 0.15rem; | |||||
padding: 0 0.1rem; | |||||
} | |||||
/deep/ .van-field__body { | |||||
height: 100%; | |||||
} | |||||
/deep/ .van-field { | |||||
background-color: unset; | |||||
padding: 0.1rem 0.15rem; | |||||
height: 1rem; | |||||
} | |||||
.field_no-label /deep/ .van-field__body { | |||||
border-top-left-radius: 0.15rem; | |||||
border-bottom-left-radius: 0.15rem; | |||||
} | |||||
.template-selector /deep/ span { | |||||
padding-left: 0.8rem; | |||||
background: #2facfe url('../../../assets/images/sunVillage_info/list_icon_11.png') left center no-repeat; | |||||
background-size: 0.45rem; | |||||
} | |||||
.form_readonly /deep/ .van-icon-arrow-down { | |||||
display: none; | |||||
} | |||||
.edit-icon { | |||||
display: inline-block; | |||||
width: 0.6rem; | |||||
position: absolute; | |||||
right: -0.6rem; | |||||
top: calc(50% - 0.3rem); | |||||
} | |||||
} | |||||
</style> |
@@ -0,0 +1,508 @@ | |||||
<template> | |||||
<div class="app-container"> | |||||
<div class="header_main-placeholder"> | |||||
<div class="header_main"> | |||||
行级填报 | |||||
<div class="return_btn" @click="back"></div> | |||||
<div class="add_btn" @click="save" v-if="(isAdd || isEdit) && editorData.templateId">保 存</div> | |||||
</div> | |||||
</div> | |||||
<van-form ref="form" :class="{'form_readonly': disableEdit}"> | |||||
<van-row> | |||||
<van-col :span="editorData.templateId ? 16 : 24"> | |||||
<field-select | |||||
class="template-selector" | |||||
:value="editorData.templateId" | |||||
label=" 模板" | |||||
value-key="reportName" | |||||
data-key="id" | |||||
placeholder="报表模板" | |||||
:rules="[{ required: true }]" | |||||
:readonly="true" | |||||
:columns="templateList" | |||||
@input="getTemplate" | |||||
/> | |||||
</van-col> | |||||
<van-col span="8" v-if="!!editorData.templateId"> | |||||
<field-date-picker | |||||
class="field_no-label" | |||||
v-model="editorData.reportYear" | |||||
placeholder="报表年度" | |||||
formatter="yyyy" | |||||
:readonly="disableEdit" | |||||
input-align="center" | |||||
type="year" | |||||
/> | |||||
</van-col> | |||||
</van-row> | |||||
<van-row v-if="!!editorData.templateId"> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.titleLeft" label="" placeholder="左上" input-align="left"/> | |||||
</van-col> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.titleCenter" label="" placeholder="中上" input-align="center"/> | |||||
</van-col> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.titleRight" label="" placeholder="右上" input-align="right"/> | |||||
</van-col> | |||||
</van-row> | |||||
<div class="main-table" v-if="!!editorData.templateId"> | |||||
<div v-for="(header, rindex) in editorData.headers"> | |||||
<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 label-width="50%" :readonly="true" :value="editorData.rows[0][rindex].name" :label="header.headerName" :placeholder="header.headerName" input-align="right"/> | |||||
</div> | |||||
</div> | |||||
<template v-if="!!editorData.templateId"> | |||||
<div> | |||||
<van-field :readonly="disableEdit" v-model="editorData.reportRemark" label="备注" placeholder="报表备注"/> | |||||
</div> | |||||
<!-- <div> | |||||
<van-field readonly :value="editorData.rule" label="规则" placeholder="报表效验公式"></van-field> | |||||
</div>--> | |||||
<van-row> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.operatorDepartment" label="" placeholder="填报单位" input-align="left"/> | |||||
</van-col> | |||||
<van-col span="8"> | |||||
<van-field class="field_no-label" :readonly="disableEdit" v-model="editorData.operatorName" label="" placeholder="填报人" input-align="center"/> | |||||
</van-col> | |||||
<van-col span="8"> | |||||
<field-date-picker | |||||
class="field_no-label" | |||||
v-model="editorData.operatorDate" | |||||
placeholder="填报日期" | |||||
formatter="yyyy-MM-dd" | |||||
:readonly="disableEdit" | |||||
input-align="right" | |||||
/> | |||||
</van-col> | |||||
</van-row> | |||||
</template> | |||||
</van-form> | |||||
</div> | |||||
</template> | |||||
<script> | |||||
import FieldSelect from "@/components/form/FieldSelect"; | |||||
import { | |||||
addReport, delReport, | |||||
getReport, | |||||
getReportTemplate, | |||||
listReporttitle, | |||||
updateReport | |||||
} from "@/api/sunVillage_info/entity/report"; | |||||
import {array_grouping, array_toMap, date_format} from "@/utils"; | |||||
import {Expression} from "@/utils/expression"; | |||||
import {is_not_number} from "@/utils/utils"; | |||||
import FieldDatePicker from "@/components/form/FieldDatePicker"; | |||||
import {Notify} from "vant"; | |||||
export default { | |||||
name: "ReportLineView", | |||||
components: {FieldDatePicker, FieldSelect}, | |||||
data() { | |||||
return { | |||||
editorData: { | |||||
id: null, | |||||
templateId: null, | |||||
reportRemark: null, | |||||
titleLeft: null, | |||||
titleCenter: null, | |||||
titleRight: null, | |||||
reportStatus: "0", | |||||
createBy: null, | |||||
createTime: null, | |||||
updateBy: null, | |||||
updateTime: null, | |||||
reportName: '', | |||||
operatorName: '', | |||||
operatorDate: '', | |||||
operatorDepartment: '', | |||||
rule: null, | |||||
reportYear: date_format('%Y'), | |||||
headers: [], | |||||
rows: [], | |||||
cells: [], | |||||
rules: [], | |||||
}, | |||||
templateList: [], | |||||
loading: false, | |||||
disableEdit: false, | |||||
intent: 'add', | |||||
templateId: null, | |||||
reportId: null, | |||||
}; | |||||
}, | |||||
created() { | |||||
this.getTemplateList(); | |||||
this.parseQuery(); | |||||
}, | |||||
mounted(){ | |||||
this.init(); | |||||
}, | |||||
methods: { | |||||
getTemplateList() { | |||||
listReporttitle({ | |||||
type: '2', | |||||
reportStatus: '0', | |||||
}).then((resp) => { | |||||
this.templateList = resp.rows; | |||||
}); | |||||
}, | |||||
getTemplate() { | |||||
if(!this.editorData.templateId && !this.editorData.id) | |||||
return; | |||||
this.loading = true; | |||||
if(this.editorData.id) // 修改 | |||||
{ | |||||
getReport(this.editorData.id).then((resp) => { | |||||
let reportData = resp.data; | |||||
getReportTemplate(reportData.templateId).then((resp) => { | |||||
let templateData = resp.data; | |||||
this.setTableData(templateData, reportData); | |||||
}).finally(() => { | |||||
this.loading = false; | |||||
}); | |||||
}).catch(() => { | |||||
this.loading = false; | |||||
}); | |||||
} | |||||
else | |||||
{ | |||||
getReportTemplate(this.editorData.templateId).then((resp) => { | |||||
let templateData = resp.data; | |||||
this.setTableData(templateData); | |||||
}).finally(() => { | |||||
this.loading = false; | |||||
}); | |||||
} | |||||
}, | |||||
setTableData(templateData, reportData) { | |||||
let data; | |||||
if(!reportData) | |||||
{ | |||||
data = templateData; | |||||
data.rows.forEach((x) => { | |||||
x.forEach((y) => { | |||||
y.error = false; | |||||
}); | |||||
}); | |||||
} | |||||
else | |||||
{ | |||||
let cells = reportData.cells; | |||||
data = reportData; | |||||
data.headers = templateData.headers; | |||||
data.rows = templateData.rows; | |||||
data.cells = templateData.cells; | |||||
data.rules = templateData.rules; | |||||
data.rule = templateData.rule; | |||||
let group = array_grouping(cells, (x) => x.rowIndex); | |||||
Object.keys(group).forEach((x) => group[x] = array_toMap(group[x], (x) => x.colIndex)); | |||||
data.rows.forEach((cols, rowIndex) => { | |||||
cols.forEach((x) => { | |||||
if(group[rowIndex] && group[rowIndex][x.colIndex]) | |||||
{ | |||||
if(templateData.headers[x.colIndex].type === '4') | |||||
x.name = group[rowIndex][x.colIndex].name; | |||||
x.val = group[rowIndex][x.colIndex].val; | |||||
} | |||||
}) | |||||
}); | |||||
} | |||||
this.editorData = data; | |||||
}, | |||||
calcAlign(type) { | |||||
switch(type) | |||||
{ | |||||
case '2': | |||||
return 'right'; | |||||
case '3': | |||||
case '4': | |||||
return 'center'; | |||||
case '1': | |||||
return 'left'; | |||||
} | |||||
}, | |||||
calcColor(type) { | |||||
switch(type) | |||||
{ | |||||
case '2': | |||||
return 'unset'; | |||||
case '4': | |||||
return 'unset'; | |||||
case '3': | |||||
return '#d7e8f3'; | |||||
case '1': | |||||
return '#aad8f6'; | |||||
} | |||||
}, | |||||
calcTextColor(type) { | |||||
switch(type) | |||||
{ | |||||
case '2': | |||||
case '4': | |||||
return '#2facfe'; | |||||
case '3': | |||||
case '1': | |||||
return '#858585'; | |||||
} | |||||
}, | |||||
save() { | |||||
this.$refs.form.validate().then(() => { | |||||
this.preHandle(); | |||||
this.loading = true; | |||||
let func = this.editorData.id ? updateReport : addReport; | |||||
func(this.editorData).then((resp) => { | |||||
this.notify("保存成功!", 'success'); | |||||
this.back(); | |||||
}).finally(() => { | |||||
this.loading = false; | |||||
}); | |||||
}).catch(() => { | |||||
this.notify("请填写完整表单", 'danger'); | |||||
this.$refs.form.scrollToField(); | |||||
}); | |||||
}, | |||||
preHandle() { | |||||
this.editorData.cells = []; | |||||
this.editorData.rows.forEach((x) => this.editorData.cells.push(...x)); | |||||
}, | |||||
reset() { | |||||
this.$refs.form.resetValidation(); | |||||
this.editorData = { | |||||
id: null, | |||||
deptId: null, | |||||
deptName: null, | |||||
templateId: null, | |||||
reportName: null, | |||||
reportYear: null, | |||||
reportRemark: null, | |||||
titleLeft: null, | |||||
titleCenter: null, | |||||
titleRight: null, | |||||
rule: null, | |||||
operatorName: null, | |||||
operatorDate: null, | |||||
createBy: null, | |||||
createTime: null, | |||||
updateBy: null, | |||||
updateTime: null, | |||||
headers: [], | |||||
rows: [], | |||||
cells: [], | |||||
rules: [], | |||||
}; | |||||
}, | |||||
parseQuery() { | |||||
let query = this.$route.query; | |||||
this.templateId = query.templateId; | |||||
this.reportId = query.reportId; | |||||
this.intent = query.intent; | |||||
if(!this.reportId) | |||||
{ | |||||
this.intent = 'add'; | |||||
return; | |||||
} | |||||
if(this.intent === 'add') | |||||
{ | |||||
this.reportId = null; | |||||
} | |||||
if(!this.templateId && !this.reportId) | |||||
{ | |||||
this.$router.back(); | |||||
return; | |||||
} | |||||
}, | |||||
init() { | |||||
this.editorData.templateId = this.templateId; | |||||
this.editorData.id = this.reportId; | |||||
this.getTemplate(); | |||||
this.disableEdit = this.intent === 'view'; | |||||
}, | |||||
back() { | |||||
this.$router.back(); | |||||
}, | |||||
notify(message, type) { | |||||
Notify.clear(); | |||||
Notify({ type: type || 'primary', message: message }); | |||||
}, | |||||
}, | |||||
computed: { | |||||
isAdd() { | |||||
return this.intent === 'add'; | |||||
}, | |||||
isEdit() { | |||||
return this.intent === 'edit'; | |||||
}, | |||||
isView() { | |||||
return this.intent === 'view'; | |||||
}, | |||||
} | |||||
} | |||||
</script> | |||||
<style scoped lang="scss"> | |||||
.app-container{ | |||||
background: #e9e9e9; | |||||
min-height: 100vh; | |||||
width: 100vw; | |||||
.header_main-placeholder { | |||||
height: 116px; | |||||
} | |||||
.header_main { | |||||
height: 116px; | |||||
background: url('../../../assets/images/sunVillage_info/list_head.png') no-repeat; | |||||
background-size: 100% 100%; | |||||
position: fixed; | |||||
top: 0; | |||||
left: 0; | |||||
width: 100%; | |||||
font-size: 36px; | |||||
line-height: 116px; | |||||
text-align: center; | |||||
color: #fff; | |||||
z-index: 999; | |||||
.return_btn { | |||||
width: 24px; | |||||
height: 43.2px; | |||||
background: url('../../../assets/images/sunVillage_info/list_icon_5.png') center center no-repeat; | |||||
background-size: 20px 36px; | |||||
position: absolute; | |||||
left: 38px; | |||||
top: 36px; | |||||
} | |||||
.add_btn { | |||||
width: 72px; | |||||
//height: 40.8px; | |||||
//background: url('../../../assets/images/sunVillage_info/list_icon_9.png') center center no-repeat; | |||||
//background-size: 47px 34px; | |||||
position: absolute; | |||||
right: 38px; | |||||
top: 0; | |||||
font-size: 28px; | |||||
} | |||||
} | |||||
.main-table { | |||||
overflow-x: auto; | |||||
overflow-y: auto; | |||||
position: relative; | |||||
background-color: #ffffff; | |||||
padding: 0.15rem 0.15rem; | |||||
border-radius: 0.15rem; | |||||
margin: 0.1rem 0.1rem; | |||||
table { | |||||
width: max-content; | |||||
border-collapse: collapse; | |||||
border: 0.01rem solid #1989fa; | |||||
table-layout: fixed; | |||||
} | |||||
thead td { | |||||
text-align: center; | |||||
border: 0.01rem solid #1989fa; | |||||
height: 1rem; | |||||
font-size: 0.32rem; | |||||
padding: 0 0.4rem; | |||||
margin: 0; | |||||
font-weight: bold; | |||||
max-width: 1.2rem; | |||||
} | |||||
tbody td { | |||||
font-size: 0.3rem; | |||||
border: 0.01rem solid #1989fa; | |||||
height: 1rem; | |||||
white-space: break-spaces; | |||||
word-wrap: break-word; | |||||
overflow-wrap: break-word; | |||||
padding: 0; | |||||
margin: 0; | |||||
max-width: 1.5rem; | |||||
position: relative; | |||||
} | |||||
.input-field { | |||||
width: 100%; | |||||
background-color: unset; | |||||
border: 0; | |||||
} | |||||
.validate-error { | |||||
color: #F56C6C; | |||||
} | |||||
.validate-error-box { | |||||
color: #F56C6C; | |||||
border: 0.02rem solid #F56C6C; | |||||
} | |||||
} | |||||
.align-right { | |||||
text-align: right; | |||||
} | |||||
.align-center { | |||||
text-align: center; | |||||
} | |||||
.full-height { | |||||
height: 100%; | |||||
} | |||||
/deep/ .van-field__label { | |||||
background-color: #2facfe; | |||||
margin: 0; | |||||
color: #fff; | |||||
border-top-left-radius: 0.15rem; | |||||
border-bottom-left-radius: 0.15rem; | |||||
padding: 0 0.2rem; | |||||
display: flex; | |||||
align-items: center; | |||||
} | |||||
/deep/ .van-field__body { | |||||
background-color: #ffffff; | |||||
border-top-right-radius: 0.15rem; | |||||
border-bottom-right-radius: 0.15rem; | |||||
padding: 0 0.1rem; | |||||
} | |||||
/deep/ .van-field__body { | |||||
height: 100%; | |||||
} | |||||
/deep/ .van-field { | |||||
background-color: unset; | |||||
padding: 0.1rem 0.15rem; | |||||
height: 1rem; | |||||
} | |||||
.field_no-label /deep/ .van-field__body { | |||||
border-top-left-radius: 0.15rem; | |||||
border-bottom-left-radius: 0.15rem; | |||||
} | |||||
.main-table /deep/ .van-field__body { | |||||
border-right: 0.01rem solid #ccc; | |||||
border-top: 0.01rem solid #ccc; | |||||
border-bottom: 0.01rem solid #ccc; | |||||
} | |||||
.template-selector /deep/ span { | |||||
padding-left: 0.8rem; | |||||
background: #2facfe url('../../../assets/images/sunVillage_info/list_icon_11.png') left center no-repeat; | |||||
background-size: 0.45rem; | |||||
} | |||||
.form_readonly /deep/ .van-icon-arrow-down { | |||||
display: none; | |||||
} | |||||
} | |||||
</style> |
@@ -8,7 +8,7 @@ | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<van-form ref="form" :class="{'form_readonly': disableEdit}"> | |||||
<van-form ref="form" :readonly="disableEdit" :class="{'form_readonly': disableEdit}"> | |||||
<van-row> | <van-row> | ||||
<van-col :span="editorData.templateId ? 16 : 24"> | <van-col :span="editorData.templateId ? 16 : 24"> | ||||
<field-select | <field-select | ||||
@@ -20,7 +20,7 @@ | |||||
placeholder="报表模板" | placeholder="报表模板" | ||||
:rules="[{ required: true }]" | :rules="[{ required: true }]" | ||||
:required="true" | :required="true" | ||||
:readonly="disableEdit" | |||||
:readonly="disableEdit || !!editorData.id" | |||||
:columns="templateList" | :columns="templateList" | ||||
@input="getTemplate" | @input="getTemplate" | ||||
/> | /> | ||||
@@ -56,9 +56,7 @@ | |||||
<td v-for="(header) in removePlaceholder(editorData.headers)" :colspan="header.colspan" :style="{ | <td v-for="(header) in removePlaceholder(editorData.headers)" :colspan="header.colspan" :style="{ | ||||
'background-color': calcColor(header.type), | 'background-color': calcColor(header.type), | ||||
'color': calcTextColor(header.type), | 'color': calcTextColor(header.type), | ||||
}"> | |||||
{{header.headerName}} | |||||
</td> | |||||
}">{{header.headerName}}</td> | |||||
</tr> | </tr> | ||||
</thead> | </thead> | ||||
@@ -68,13 +66,13 @@ | |||||
'text-align': calcAlign(editorData.headers[col.colIndex].type), | 'text-align': calcAlign(editorData.headers[col.colIndex].type), | ||||
'background-color': calcColor(editorData.headers[col.colIndex].type), | 'background-color': calcColor(editorData.headers[col.colIndex].type), | ||||
}"> | }"> | ||||
<div class="full-height" v-if="editorData.headers[col.colIndex].type === '2'" :class="{'validate-error': col.error, 'validate-error-box': col.error,}"> | |||||
<div class="absolute-full" v-if="editorData.headers[col.colIndex].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="editorData.headers[col.colIndex].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 v-else :style="{'text-align': calcAlign(editorData.headers[col.colIndex].type)}">{{col.name}}</div> | |||||
<div class="full-height" v-else :style="{'text-align': calcAlign(editorData.headers[col.colIndex].type)}">{{col.name}}</div> | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
</tbody> | </tbody> | ||||
@@ -499,7 +497,7 @@ export default { | |||||
margin: 0.1rem 0.1rem; | margin: 0.1rem 0.1rem; | ||||
table { | table { | ||||
width: max-content; | |||||
/*width: max-content;*/ | |||||
border-collapse: collapse; | border-collapse: collapse; | ||||
border: 0.01rem solid #1989fa; | border: 0.01rem solid #1989fa; | ||||
table-layout: fixed; | table-layout: fixed; | ||||
@@ -512,7 +510,8 @@ export default { | |||||
padding: 0 0.4rem; | padding: 0 0.4rem; | ||||
margin: 0; | margin: 0; | ||||
font-weight: bold; | font-weight: bold; | ||||
max-width: 1.2rem; | |||||
white-space: nowrap; | |||||
/*max-width: 1.2rem;*/ | |||||
} | } | ||||
tbody td { | tbody td { | ||||
font-size: 0.3rem; | font-size: 0.3rem; | ||||
@@ -521,9 +520,9 @@ export default { | |||||
white-space: break-spaces; | white-space: break-spaces; | ||||
word-wrap: break-word; | word-wrap: break-word; | ||||
overflow-wrap: break-word; | overflow-wrap: break-word; | ||||
padding: 0; | |||||
padding: 0 0.1rem; | |||||
margin: 0; | margin: 0; | ||||
max-width: 1.5rem; | |||||
/*max-width: 1.5rem;*/ | |||||
position: relative; | position: relative; | ||||
} | } | ||||
@@ -593,6 +592,14 @@ export default { | |||||
.form_readonly /deep/ .van-icon-arrow-down { | .form_readonly /deep/ .van-icon-arrow-down { | ||||
display: none; | display: none; | ||||
} | } | ||||
.absolute-full { | |||||
position: absolute; | |||||
top: 0; | |||||
bottom: 0; | |||||
left: 0; | |||||
right: 0; | |||||
} | |||||
} | } | ||||