123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- <template>
- <a-card>
- <a-form-model ref="search" v-bind="formItemLayout" :class="$style.form">
- <a-row>
- <a-col :span="6">
- <a-form-model-item label="查询公司选择">
- <audit-unit-select
- ref="cRelSelect"
- v-model="orgList"
- :read-only="false"
- :single="false"
- @change="changecompany"
- />
- </a-form-model-item>
- </a-col>
- <a-col :span="6">
- <a-form-model-item label="年份">
- <AuditYearTime v-model="year" />
- </a-form-model-item>
- </a-col>
- <!-- 搜索重置 -->
- <a-col :span="6">
- <a-form-model-item>
- <a-button style="margin-left: 15px" type="primary" @click="handlerSearch">
- 搜索
- </a-button>
- </a-form-model-item>
- </a-col>
- </a-row>
- </a-form-model>
- <div :class="$style.zbType">
- <a-button type="link" size="large">所选指标值:{{ zbName }}</a-button>
- <a-button type="primary" @click="goBack">返回重选</a-button>
- </div>
- <a-card>
- <!-- <sd-table
- :columns="columns"
- :scroll="{ x: '100%' }"
- :data-source="tableData"
- :row-key="(record, i) => record.key"
- :pagination="false"
- >
- </sd-table> -->
- <vxe-table
- ref="xTable"
- :key="tableKey"
- border
- :column-config="{ resizable: true }"
- :data="tableData"
- align="center"
- :tree-config="{}"
- >
- <template v-for="(item, i) in columns">
- <!-- 如果有children 则显示colgroup -->
- <vxe-colgroup
- v-if="item?.children?.length > 0"
- :key="i"
- :title="item.title"
- :field="item.dataIndex"
- align="center"
- :fixed="fixedType(i)"
- >
- <template v-for="(item1, i1) in item.children">
- <vxe-column
- :key="i1"
- :field="item1.dataIndex"
- :title="item1.title"
- align="center"
- min-width="240"
- >
- </vxe-column>
- </template>
- </vxe-colgroup>
- <vxe-column
- v-else
- :key="i"
- :title="item.title"
- :field="item.dataIndex"
- align="center"
- :fixed="fixedType(i)"
- ></vxe-column>
- </template>
- </vxe-table>
- </a-card>
- <a-card>
- <div :class="$style.barLineType">
- <span
- :style="{
- fontSize: '18px',
- color: action === 1 ? '#1890ff' : '#333',
- marginRight: '10px',
- }"
- @click="onTypeChange(1)"
- >柱状图</span
- >
- <span
- :style="{ fontSize: '18px', color: action === 2 ? '#1890ff' : '#333' }"
- @click="onTypeChange(2)"
- >折线图</span
- >
- </div>
- <div id="barLine" :class="$style.barLine"></div>
- </a-card>
- </a-card>
- </template>
- <script>
- import components from './_import-components/audit-contrast-view-import'
- import echarts from 'echarts'
- import AuditYearTime from './audit-year-time.vue'
- import auditUnitSelect from './audit-unit-select'
- import auditPortraitService from './audit-portrait-service'
- import { message } from 'ant-design-vue'
- import VXETable from 'vxe-table'
- import 'vxe-table/lib/style.css'
- import Vue from 'vue'
- Vue.use(VXETable)
- export default {
- name: 'AuditContrastView',
- metaInfo: {
- title: '对比',
- },
- components: {
- ...components,
- AuditYearTime,
- auditUnitSelect,
- },
- data() {
- return {
- formItemLayout: {
- labelCol: { span: 6 },
- wrapperCol: { span: 18 },
- },
- zbName: '',
- orgList: [],
- year: [],
- columns: [],
- tableData: [],
- action: 1,
- myChart: null,
- queryParams: null,
- tableKey: 1,
- }
- },
- created() {
- // this.initEcharts()
- this.initSearchData()
- },
- methods: {
- fixedType(i) {
- if (i === 0) return 'left'
- },
- // 初始化search数据
- initSearchData() {
- // 获取当前公司信息
- this.queryParams = JSON.parse(this.$route.query.params || '{}')
- this.orgList = this.queryParams.orgList || []
- this.year = this.queryParams.year || []
- this.zbName = this.queryParams.zbName || ''
- this.initTableData()
- },
- initTableData() {
- /**
- * mdg_orgCode
- */
- // private List<String> mdgOrgCodes;
- // /**
- // * 年
- // */
- // private List<Integer> year;
- // /**
- // *指标
- // */
- // private String metricName;
- // 获取表格数据
- const params = {
- mdgOrgCodes: this.orgList.map((res) => res.orgCode),
- year: this.year,
- metricName: this.queryParams.zbCode,
- }
- auditPortraitService.listMetricCompare(params).then((res) => {
- this.columns = [
- {
- fixed: 'left',
- children: [
- {
- // 公司名称
- title: '公司名称',
- dataIndex: 'orgName',
- fixed: 'left',
- width: '280px',
- // 自定义渲染 如果超长则显示tooltip
- customRender: (text) => {
- return {
- children: (
- <a-tooltip title={text}>
- <div style='width:100%;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;'>
- {text}
- </div>
- </a-tooltip>
- ),
- }
- },
- },
- ],
- },
- ]
- this.tableData = res.data.data.map((val, i) => {
- const obj = {}
- obj.key = i
- obj.orgName = val.org_name
- obj.orgCode = val.org_code
- val.values.map((item1) => {
- const isValue = this.zbName.includes('率')
- const filterValue = ['99999.99999', '88888.88888', '77777.77777']
- if (isValue) {
- obj[`zbz${item1.year}`] = (item1.value * 100).toFixed(2) || ''
- } else {
- obj[`zbz${item1.year}`] = item1.value
- }
- if (filterValue.includes(item1.index_value + '')) {
- obj[`zbz${item1.year}`] = ''
- }
- // 如果是NaN则显示原本的值
- if (isNaN(obj[`zbz${item1.year}`])) {
- obj[`zbz${item1.year}`] = item1.value
- }
- })
- return obj
- })
- if (res.data.data.length === 0) {
- this.initEcharts()
- return message.warning('暂无数据')
- }
- res.data.data[0].values.map((item1) => {
- this.columns.push({
- // 2020 指标值
- align: 'center',
- title: item1.year,
- children: [
- {
- title: '指标值',
- dataIndex: `zbz${item1.year}`,
- align: 'center',
- width: '180px',
- },
- ],
- })
- })
- this.tableKey++
- this.initEcharts()
- })
- },
- changecompany(val) {
- this.orgList = val
- },
- handlerSearch() {
- this.initTableData()
- },
- resetSearch() {
- this.orgList = []
- this.year = []
- },
- goBack() {
- // 返回上一页
- // window.history.go(-1)
- // 关闭当前页面
- window.close()
- },
- //
- onTypeChange(type) {
- this.action = type
- // 折线图
- this.initEcharts()
- },
- initEcharts() {
- const unitList = this.tableData.map((res) => res.orgName)
- //
- // 单位 CNY 如果colTitle含率则单位为%
- const dw = this.zbName.includes('率') ? '%' : '万元'
- // 根据公司分割数据
- const year = Object.keys(this.tableData[0] || {}).filter((val) => val.includes('zbz'))
- const yearList = year.map((val) => val.replace('zbz', ''))
- const seriesData = yearList.map((val, i) => {
- return {
- name: val,
- data: this.tableData.map((res) => res[`zbz${val}`]),
- type: this.action === 1 ? 'bar' : 'line',
- // 柱子宽度
- barMaxWidth: 50,
- // 柱子颜色 三选择一
- itemStyle: {
- color: i % 2 === 0 ? '#1890ff' : '#E76F00',
- },
- // 柱子间距
- }
- })
- this.myChart = echarts.init(document.getElementById('barLine'))
- const option = {
- title: {
- text: this.zbName,
- textStyle: {
- rich: {
- a: {
- fontSize: 16,
- fontWeight: 600,
- },
- },
- },
- top: '0%',
- left: '45%',
- },
- tooltip: {
- trigger: 'item',
- // 带单位
- formatter: '{a} <br/>{b} : {c}' + dw,
- },
- grid: {
- left: '5%',
- containLabel: true,
- },
- // x轴滚动
- dataZoom: [
- {
- type: 'slider',
- show: true,
- xAxisIndex: [0],
- startValue: 0, // 起始值
- endValue: 10, // 结束值
- },
- {
- type: 'inside',
- xAxisIndex: [0],
- start: 0,
- end: 10,
- },
- ],
- xAxis: {
- type: 'category',
- data: unitList,
- // 每组数据间隔
- axisTick: {
- alignWithLabel: true,
- },
- axisLabel: {
- show: true, // 是否显示刻度标签,默认显示
- interval: 0, // 坐标轴刻度标签的显示间隔,在类目轴中有效;默认会采用标签不重叠的策略间隔显示标签;可以设置成0强制显示所有标签;如果设置为1,表示『隔一个标签显示一个标签』,如果值为2,表示隔两个标签显示一个标签,以此类推。
- inside: false, // 刻度标签是否朝内,默认朝外
- margin: 6, // 刻度标签与轴线之间的距离
- // 文字大小
- fontSize: 18,
- // formatter: '{value}', // 刻度标签的内容格式器
- // 旋转15
- rotate: -15,
- },
- //
- },
- yAxis: {
- name: dw,
- type: 'value',
- minInterval: 1,
- splitLine: {
- lineStyle: {
- type: 'dashed',
- color: '#111',
- },
- },
- },
- // tooltip: {
- // trigger: 'axis',
- // axisPointer: {
- // type: 'shadow',
- // },
- // },
- // 图例
- legend: {
- data: [year],
- textStyle: {
- align: 'right',
- },
- top: '2%',
- right: '2%',
- },
- series: seriesData,
- }
- this.myChart.setOption(option)
- window.addEventListener('resize', () => {
- this.myChart.resize()
- })
- },
- },
- }
- </script>
- <style module lang="scss">
- @use '@/common/design' as *;
- .bar-line {
- width: 100%;
- height: 600px;
- }
- .zb-type {
- margin: 10px 0;
- }
- .bar-line-type {
- span {
- cursor: pointer;
- }
- }
- </style>
|