12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268 |
- <template>
- <a-spin :spinning="isshowLoading5" :tip="tiptext" size="large" style="background: #f0f2f5">
- <a-layout style="height: 100vh;padding: 20px;overflow: scroll">
- <a-card style="margin-bottom: 20px">
- <!-- 推送时间,业务时间,单位名称 -->
- <!-- 审计线索统计 -->
- <div :class="$style.title">
- <a-form-model layout="inline">
- <a-form-model-item>
- <div :class="$style.time">
- <a-row>
- <a-col :span="6">
- <a-select v-model="searchForm.timeType">
- <a-select-option key="1" value="1">推送时间</a-select-option>
- <a-select-option key="2" value="2">业务时间</a-select-option>
- </a-select>
- </a-col>
- <a-col :span="18" style="padding-top: 1px;">
- <a-range-picker v-model="searchForm.timeArr" />
- </a-col>
- </a-row>
- </div>
- </a-form-model-item>
- <a-form-model-item label="单位名称">
- <div style="width:200px">
- <a-select
- v-if="isUnitType === 'group'"
- ref="zb"
- v-model="targetKeysList"
- mode="multiple"
- :open="false"
- :max-tag-count="2"
- @focus="focusZb"
- >
- <a-select-option v-for="(item, i) in mockData" :key="i" :value="item.key">
- {{ item.title }}
- </a-select-option>
- </a-select>
- <SdGroupPicker
- v-else
- ref="cRelSelect"
- v-model="searchForm.unitArr"
- :read-only="false"
- :root-node="rootNodeData"
- @change="changecompany"
- />
- </div>
- </a-form-model-item>
- <a-form-model-item>
- <a-button type="primary" @click="search('all')">查询</a-button>
- <!-- 重置 -->
- <a-button @click="resetSearch">重置</a-button>
- </a-form-model-item>
- </a-form-model>
- </div>
- <!-- 模型类型 事件标签分类 模型领域 -->
- <!-- 查询导出 -->
- <a-divider />
- <h3 :class="$style.riskviewtitle">审计线索统计</h3>
- <div :class="$style.lineBarBody">
- <a-form-model layout="inline" :class="$style.formBar">
- <a-form-model-item :label="'模型类型'" prop="modelType">
- <a-select v-model="linebarSearchForm.modelType" placeholder="请选择模型类型">
- <a-select-option value="1">定位型-整改类</a-select-option>
- <a-select-option value="2">定位型-关注类</a-select-option>
- </a-select>
- </a-form-model-item>
- <a-form-model-item label="事件标签分类">
- <a-select v-model="linebarSearchForm.eventTag" mode="multiple" allow-clear>
- <a-select-option v-for="(item, i) in eventList" :key="i" :value="item.id">{{
- item.tagName + '-' + item.id
- }}</a-select-option>
- </a-select>
- </a-form-model-item>
- <a-form-model-item label="模型领域">
- <a-select
- v-model="linebarSearchForm.modelField"
- placeholder="请选择模型领域"
- allow-clear
- mode="multiple"
- >
- <a-select-option v-for="(item, i) in areaOption" :key="i" :value="item.id">{{
- item.name
- }}</a-select-option>
- </a-select>
- </a-form-model-item>
- <a-form-model-item>
- <a-button type="primary" @click="search('lineBer')">查询</a-button>
- <a-popover
- v-model="visibleExport"
- title="请选择导出维度"
- placement="bottom"
- trigger="click"
- >
- <div slot="content">
- <!-- 按照 事件标签 按责任人 确定取消按钮 -->
- <a-row style="margin-bottom: 15px">
- <a-radio-group v-model="exportType">
- <a-radio :style="radioStyle" value="1">按照事件标签</a-radio>
- <a-radio :style="radioStyle" value="2">按照责任人</a-radio>
- </a-radio-group>
- </a-row>
- <div style="text-align: right">
- <a-button @click="visibleExport = false">取消</a-button>
- <a-button type="primary" @click="onExportEvent">确定</a-button>
- </div>
- </div>
- <a-button type="primary">
- 导出
- </a-button>
- </a-popover>
- </a-form-model-item>
- </a-form-model>
- <a-spin :spinning="isshowLoading1" tip="正在查询请稍后...">
- <div id="linebar" :class="$style.linebar"></div>
- </a-spin>
- </div>
- </a-card>
- <!-- 整改率统计 -->
- <!-- 按单位 按模型 -->
- <!-- 单位名称 -->
- <a-card style="padding-top: 20px">
- <h3 :class="$style.riskviewtitle">整改率统计</h3>
- <div :class="$style.searchBtn">
- <a-button-group>
- <a-button :type="zgSumType ? 'primary' : ''" @click="zgSumType = true">按单位</a-button>
- <a-button :type="zgSumType ? '' : 'primary'" @click="zgSumType = false"
- >按领域</a-button
- >
- </a-button-group>
- </div>
- <a-form layout="inline">
- <a-form-model-item v-if="zgSumType" label="单位名称">
- <div style="width:200px">
- <SdGroupPicker
- ref="zgRelSelect"
- v-model="lineUnit"
- :root-node="rootNodeData"
- :read-only="false"
- :single="true"
- />
- </div>
- <!-- <a-input v-model=".unitName" /> -->
- </a-form-model-item>
- <a-form-model-item v-else label="模型领域" mode="multiple">
- <div style="width:200px">
- <a-select v-model="areaType" placeholder="请选择模型领域" allow-clear>
- <a-select-option v-for="(item, i) in areaOption" :key="i" :value="item.id">{{
- item.name
- }}</a-select-option>
- </a-select>
- </div>
- </a-form-model-item>
- <a-form-model-item>
- <a-button type="primary" @click="search('line')">查询</a-button>
- <a-button v-if="zgSumType" type="primary" @click="exportBar">导出</a-button>
- </a-form-model-item>
- </a-form>
- <a-spin :spinning="isshowLoading2" tip="正在查询请稍后...">
- <div id="rectifyRate" :class="$style.rectifyRate"></div>
- </a-spin>
- <!-- 问题概括统计饼图、模型领域统计饼图 -->
- <a-row :gutter="24" style="margin-top: 20px">
- <a-col :span="12" :class="$style.exportBody">
- <!-- 右上角导出 -->
- <h3 :class="$style.riskviewtitle">问题概括统计</h3>
- <div :class="$style.exportIcon">
- <a-icon type="download" :style="{ fontSize: '22px' }" @click="exportPie1" />
- </div>
- <a-spin :spinning="isshowLoading3" tip="正在查询请稍后...">
- <div v-if="barishow1" id="problemSummary" :class="$style.bingtu"></div>
- <a-empty
- v-else
- style="height: 400px;
- line-height: 400px;"
- />
- </a-spin>
- </a-col>
- <a-col :span="12" :class="$style.exportBody">
- <h3 :class="$style.riskviewtitle">模型领域统计</h3>
- <div :class="$style.exportIcon">
- <a-icon type="download" :style="{ fontSize: '22px' }" @click="exportPie2" />
- </div>
- <a-spin :spinning="isshowLoading4" tip="正在查询请稍后...">
- <div v-if="barishow2" id="modelField" :class="$style.bingtu"></div>
- <a-empty
- v-else
- style="height: 400px;
- line-height: 400px;"
- />
- </a-spin>
- </a-col>
- </a-row>
- </a-card>
- <a-modal v-model="visibleZb" title="公司选择" @ok="zbOk">
- <a-transfer
- :data-source="mockData"
- show-search
- :list-style="{
- width: '400px',
- height: '500px',
- }"
- :target-keys="targetKeys"
- :render="(item) => item.title"
- @change="handleChangeZb"
- />
- </a-modal>
- </a-layout>
- </a-spin>
- </template>
- <script>
- import components from './_import-components/audit-risk-view-import'
- import auditMaintainService from '../maintain/audit-maintain-service'
- import echarts from 'echarts'
- import AuditRiskbraryService from './riskLibrary'
- import moment from 'moment'
- import { getUserInfo } from '@/common/store-mixin'
- import DataService from '../dataUphold/data-config'
- import SdGroupPicker from '@/common/components/sd-group-picker.vue'
- import download from '@/common/services/download'
- import { message, Modal } from 'ant-design-vue'
- export default {
- name: 'AuditRiskView',
- metaInfo: {
- title: '审计问题看板',
- },
- components: {
- ...components,
- SdGroupPicker,
- },
- data() {
- return {
- isshowLoading1: false,
- isshowLoading2: false,
- isshowLoading3: false,
- isshowLoading4: false,
- isshowLoading5: false,
- tiptext: '正在导出请稍等……',
- formItemLayout: {
- labelCol: { span: 6 },
- wrapperCol: { span: 18 },
- },
- formItemLayout2: {
- labelCol: { span: 8 },
- wrapperCol: { span: 16 },
- },
- searchForm: {
- timeType: '1',
- timeArr: [],
- unitArr: [],
- },
- // 单位类型
- isUnitType: 'unit',
- linebarSearchForm: {
- modelType: '1',
- eventTag: [],
- modelField: [],
- },
- areaType: '',
- lineUnit: [],
- barSearchForm: {
- unitName: '',
- searchType: 'unit',
- },
- // 模型类型
- // 1定位型-整改类 2定位型-关注类
- modelTypeOption: [
- {
- key: '1',
- value: '定位型-整改类',
- },
- {
- key: '2',
- value: '定位型-关注类',
- },
- ],
- targetKeys: [],
- // 模型领域
- areaOption: [],
- rootNodeData: [],
- exportType: '1',
- visibleExport: false,
- radioStyle: {
- display: 'block',
- height: '30px',
- lineHeight: '30px',
- },
- eventList: [],
- // 整改单位类型
- zgSumType: true,
- visibleZb: false,
- mockData: [],
- targetKeysList: [],
- unitCodeList: [],
- chart1: null,
- chart2: null,
- chart3: null,
- chart4: null,
- barishow1: true,
- barishow2: true,
- // 下钻code
- downCode: '',
- // 是否有数据
- }
- },
- watch: {
- zgSumType(val) {
- // 切换单位和领域
- // 清空单位或者领域
- if (val) {
- this.areaType = ''
- } else {
- this.lineUnit = []
- }
- this.initRectifyRate()
- },
- },
- mounted() {
- this.getAreaOption()
- this.initSearchData()
- AuditRiskbraryService.getGroups().then((res) => {
- this.isUnitType = 'group'
- this.mockData = res.data.data.map((item) => ({
- key: item.code + '',
- title: item.name,
- description: item.description,
- }))
- // 如果长度为0,则显示二级单位
- if (this.mockData.length === 0) {
- this.getUserUnitCode()
- this.isUnitType = 'unit'
- }
- this.getMinxLinerBarData()
- this.initRectifyRate()
- this.initProblemSummary()
- this.initModelField()
- })
- // 尺寸变化
- window.addEventListener('resize', () => {
- this.chart1 && this.chart1.resize()
- this.chart2 && this.chart2.resize()
- this.chart3 && this.chart3.resize()
- this.chart4 && this.chart4.resize()
- })
- },
- methods: {
- initSearchData() {
- // 开始时间为当年1月1日 结束时间为当前时间
- this.searchForm.timeArr = [moment().startOf('year'), moment()]
- // 初始化集团
- auditMaintainService.getEventTagList().then((res) => {
- this.eventList = res.data
- })
- },
- changecompany(val) {
- this.searchForm.unitArr = val
- },
- zbOk() {
- this.visibleZb = false
- this.searchForm.zb = this.targetKeys
- this.targetKeysList = this.targetKeys
- },
- focusZb() {
- this.visibleZb = true
- this.$refs.zb.blur()
- AuditRiskbraryService.getGroups().then((res) => {
- this.isUnitType = 'group'
- this.mockData = res.data.data.map((item) => ({
- key: item.code + '',
- title: item.name,
- description: item.description,
- }))
- // 如果长度为0,则显示二级单位
- if (this.mockData.length === 0) {
- this.getUserUnitCode()
- this.isUnitType = 'unit'
- }
- })
- },
- // 获取当前用户单位,并且以当前单位为根节点
- getUserUnitCode() {
- const userInfo = getUserInfo()
- DataService.getCompany(userInfo.account).then((res) => {
- this.rootNodeData = {
- code: res.data.id,
- name: res.data.name,
- orgCode: res.data.code,
- }
- })
- },
- handleChangeZb(nextTargetKeys, direction, moveKeys) {
- this.targetKeys = nextTargetKeys
- },
- // getGroups 获取组织
- // 筛选部分
- getAreaOption() {
- auditMaintainService.getAreaListAll().then((res) => {
- this.areaOption = res.data
- })
- },
- // 搜索
- search(type) {
- if (type === 'all') {
- this.getMinxLinerBarData()
- this.initRectifyRate()
- this.initProblemSummary()
- this.initModelField()
- }
- if (type === 'lineBer') {
- this.getMinxLinerBarData()
- }
- if (type === 'line') {
- this.initRectifyRate()
- }
- },
- // 重置
- resetSearch() {
- this.searchForm = {
- timeType: '1',
- timeArr: [moment().startOf('year'), moment()],
- unitArr: [],
- }
- this.targetKeysList = []
- this.linebarSearchForm = {
- modelType: '1',
- eventTag: [],
- modelField: [],
- }
- this.search('all')
- },
- // onExportEvent 导出
- onExportEvent() {
- this.visibleExport = false
- // 获取导出类型
- this.isshowLoading5 = true
- const params = this.getSearchData('lineBar')
- // 如果下钻code
- // 如果是事件标签
- if (this.exportType === '1') {
- AuditRiskbraryService.exportBoardLine(params)
- .then((res) => {
- if (res.status === 200) {
- const url = URL.createObjectURL(res.data)
- const filename = res.headers['content-disposition']
- const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
- download(url, decodeURI(fname))
- // 导出成功
- message.success('导出成功')
- } else {
- Modal.warning({
- title: '提示',
- content: '导出报错,请联系管理员!',
- })
- return false
- }
- })
- .finally(() => {
- this.isshowLoading5 = false
- })
- }
- if (this.exportType === '2') {
- AuditRiskbraryService.resPersonExport(params)
- .then((res) => {
- if (res.status === 200) {
- const url = URL.createObjectURL(res.data)
- const filename = res.headers['content-disposition']
- const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
- download(url, decodeURI(fname))
- // 导出成功
- this.isshowLoading5 = false
- message.success('导出成功')
- } else {
- this.isshowLoading5 = false
- Modal.warning({
- title: '提示',
- content: '导出报错,请联系管理员!',
- })
- return false
- }
- })
- .finally(() => {
- this.isshowLoading5 = false
- })
- }
- },
- // 获取筛选条件
- getSearchData(type = 'all', xzCode = '') {
- const params = {}
- const timeArr = this.searchForm.timeArr.map((item) =>
- item ? moment(item).format('YYYY-MM-DD') : ''
- )
- // 时间类型
- if (this.searchForm.timeType === '1') {
- params.pushDateSt = timeArr[0]
- params.pushDateEd = timeArr[1]
- } else {
- // 转化为时间戳
- params.bussTimeSt = moment(timeArr[0]).valueOf()
- params.bussTimeEd = moment(timeArr[1]).valueOf()
- }
- // 是否是集团
- if (this.isUnitType === 'group') {
- params.unitCodeList = this.targetKeysList
- params.unitCode = xzCode
- if (this.downCode) {
- params.unitCode = this.downCode
- }
- } else {
- params.unitCodeList = this.searchForm.unitArr.map((item) => item.code)
- }
- // linebar筛选项
- if (type === 'lineBar') {
- params.modelType = this.linebarSearchForm.modelType
- params.eventTagList = this.linebarSearchForm.eventTag
- params.modelDomainList = this.linebarSearchForm.modelField
- }
- if (type === 'line') {
- params.unitName = this.lineUnit.length > 0 ? this.lineUnit[0].name : ''
- params.dimension = this.zgSumType ? 0 : 1
- params.domainName = this.areaOption.find((item) => item.id === this.areaType)?.name || ''
- }
- if (type === 'bar') {
- }
- return params
- },
- getMinxLinerBarData(type, xzCode = '') {
- this.isshowLoading1 = true
- AuditRiskbraryService.reformBoard(this.getSearchData('lineBar', xzCode))
- .then((res) => {
- const data = res.data.data
- const xAxisData = data.map((item) => item.unitName)
- // 整改率
- const seriesData = data.map((item) => ((item.reformRate || 0) * 100).toFixed(2))
- // 期限内已整改
- const seriesData1 = data.map((item) => ({ value: item.status0, ...item }))
- // 逾期已整改
- const seriesData2 = data.map((item) => item.status1)
- // 期限内未整改已完成
- const seriesData3 = data.map((item) => item.status2)
- // 逾期未整改完成
- const seriesData4 = data.map((item) => item.status3)
- // 已查看
- const seriesData5 = data.map((item) => item.viewCount)
- // 未查看
- const seriesData6 = data.map((item) => item.nonViewCount)
- this.unitCodeList = data.map((item) => item.unitCode)
- this.initMixLineBar(
- xAxisData,
- seriesData,
- seriesData1,
- seriesData2,
- seriesData3,
- seriesData4,
- seriesData5,
- seriesData6,
- type
- )
- })
- .finally(() => {
- this.isshowLoading1 = false
- })
- },
- initMixLineBar(
- xAxisData,
- seriesData,
- seriesData1,
- seriesData2,
- seriesData3,
- seriesData4,
- seriesData5,
- seriesData6,
- type
- ) {
- const myChart = echarts.init(document.getElementById('linebar'))
- const colorList = [
- '#fac858',
- '#5470c6',
- '#91cc75',
- '#fac858',
- '#ee6666',
- '#1890ff',
- '#a90000',
- ]
- const option = {
- height: 500,
- tooltip: {
- trigger: 'axis',
- // 调整颜色
- backgroundColor: 'rgba(255,255,255,1)',
- textStyle: {
- color: '#000',
- },
- // 字体颜色
- // 黑色
- formatter: function(params) {
- const paramsMap = params.map((item) => {
- return {
- seriesName: item.seriesName,
- value: item.value,
- }
- })
- if (params[1].data.modelType === 2 || params[1].data.modelType === '2') {
- paramsMap.push({
- seriesName: '已查看',
- value: params[1].data.viewCount,
- })
- paramsMap.push({
- seriesName: '未查看',
- value: params[1].data.nonViewCount,
- })
- }
- let str =
- '<div style="text-align:left;font-size:18px;margin-bottom: 10px">' +
- params[0].name +
- '<br></div>'
- paramsMap.forEach((item, index) => {
- // 如果名字是整改率
- str += `
- <div style='display:flex;justify-content: space-between;'>
- <div style='display:flex;align-items: center;'>
- <div style="display:flex;align-items: center;width: '200px';color:'#333'">
- <div style='margin-right:5px;width:${
- item.seriesName === '整改率' ? '10px' : '20px'
- };height:10px;border-radius:${
- item.seriesName === '整改率' ? '50%' : '2px'
- };background:${colorList[index]}'></div>
- ${item.seriesName}
- </div>
- </div>
- ${item.value} ${item.seriesName === '整改率' ? '%' : '条'}
- </div>
- `
- })
- return str
- },
- },
- grid: {
- top: 100,
- left: '1%', // grid布局设置适当调整避免X轴文字只能部分显示
- right: '5%', // grid布局设置适当调整避免X轴文字只能部分显示
- bottom: '5%',
- containLabel: true,
- },
- toolbox: {
- feature: {
- restore: { show: true },
- saveAsImage: { show: true },
- },
- },
- // x轴滚动
- dataZoom: [
- {
- type: 'slider',
- show: true,
- xAxisIndex: [0],
- start: 0,
- end: 35,
- height: 10,
- },
- {
- type: 'inside',
- xAxisIndex: [0],
- start: 0,
- end: 35,
- height: 10,
- },
- ],
- title: {
- subtext: `注:整改率表示该公司已提交整改材料并经审批通过的问题数(含期限内已整改的问题数)占全部问题数的比例,
- 整改率=100%*(期限内已整改问题数 + 逾期已整改问题数) / (期限内已整改问题数 + 逾期已整改问题数 + 期限内未整改问题数 + 逾期未整改问题数))`,
- left: 'center',
- top: '20px',
- itemGap: 10,
- subtextStyle: {
- fontSize: 14,
- },
- },
- legend: {
- show: true,
- data: ['整改率', '期限内已整改', '逾期已整改', '期限内未整改完成', '逾期未整改完成'],
- // 图例距离图表位置
- top: 0,
- // 图例颜色
- },
- color: ['#fac858', '#5470c6', '#91cc75', '#fac858', '#ee6666'],
- xAxis: [
- {
- type: 'category',
- data: xAxisData,
- axisLabel: {
- // 字体大小16
- show: true, // 是否显示刻度标签,默认显示
- interval: 0, // 坐标轴刻度标签的显示间隔,在类目轴中有效;默认会采用标签不重叠的策略间隔显示标签;可以设置成0强制显示所有标签;如果设置为1,表示『隔一个标签显示一个标签』,如果值为2,表示隔两个标签显示一个标签,以此类推。
- inside: false, // 刻度标签是否朝内,默认朝外
- margin: 6, // 刻度标签与轴线之间的距离
- // formatter: '{value}', // 刻度标签的内容格式器
- fontSize: 16,
- rotate: -15, // 刻度标签旋转的角度
- },
- },
- ],
- yAxis: [
- {
- type: 'value',
- name: '整改率',
- min: 0,
- interval: 10,
- axisLabel: {
- formatter: '{value} %',
- },
- },
- {
- type: 'value',
- name: '问题数据量',
- min: 0,
- axisLabel: {
- formatter: '{value} 条',
- },
- },
- ],
- series: [
- {
- name: '整改率',
- type: 'line',
- yAxisIndex: 0,
- tooltip: {
- valueFormatter: function(value) {
- return value + '%'
- },
- },
- data: seriesData,
- barWidth: 25,
- },
- {
- name: '期限内已整改',
- type: 'bar',
- yAxisIndex: 1,
- // 宽度
- tooltip: {
- valueFormatter: function(value) {
- return value + ' 条'
- },
- },
- // 堆叠
- stack: 'a',
- data: seriesData1,
- barWidth: 25,
- },
- {
- name: '逾期已整改',
- barWidth: 25,
- type: 'bar',
- yAxisIndex: 1,
- tooltip: {
- valueFormatter: function(value) {
- return value + ' 条'
- },
- },
- stack: 'a',
- // data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
- data: seriesData2,
- },
- {
- name: '期限内未整改完成',
- barWidth: 25,
- type: 'bar',
- yAxisIndex: 1,
- tooltip: {
- valueFormatter: function(value) {
- return value + ' 条'
- },
- },
- stack: 'a',
- // data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
- data: seriesData3,
- },
- {
- name: '逾期未整改完成',
- type: 'bar',
- barWidth: 25,
- yAxisIndex: 1,
- tooltip: {
- valueFormatter: function(value) {
- return value + ' 条'
- },
- },
- stack: 'a',
- // data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3],
- data: seriesData4,
- },
- ],
- }
- if (type === 'down') {
- option.graphic = [
- {
- type: 'text',
- left: 50,
- top: 20,
- style: {
- text: '返回',
- fontSize: 18,
- fontWeight: 700,
- },
- onclick: () => {
- // 删除返回
- this.downCode = ''
- this.getMinxLinerBarData()
- },
- },
- ]
- } else {
- option.graphic = [
- {
- type: 'text',
- left: 50,
- top: 20,
- style: {
- text: '',
- fontSize: 18,
- },
- },
- ]
- }
- myChart.setOption(option)
- // 修改unitCodeList 为全局变量
- // 可以下钻并且是集团
- if (type !== 'down' && this.isUnitType === 'group') {
- myChart.on('click', (params) => {
- this.downCode = this.unitCodeList[params.dataIndex]
- const unitCode = this.unitCodeList[params.dataIndex]
- this.getMinxLinerBarData('down', unitCode)
- })
- } else {
- myChart.off('click')
- }
- this.chart1 = myChart
- },
- // 获取整改率统计数据
- initRectifyRate(type, xzCode) {
- this.isshowLoading2 = true
- AuditRiskbraryService.reformRateStatistics(this.getSearchData('line', xzCode))
- .then((res) => {
- const colors = ['#91cc75']
- const data = res.data.data.map((item, i) => {
- return {
- value: ((item.reformRate || 0) * 100).toFixed(2),
- name: this.zgSumType ? item.unitName : item.domainName,
- code: item.unitCode,
- itemStyle: {
- color: colors[i],
- },
- }
- })
- const myChart = echarts.init(document.getElementById('rectifyRate'))
- const option = {
- color: colors,
- tooltip: {
- trigger: 'axis',
- axisPointer: {
- type: 'cross',
- label: {
- backgroundColor: '#6a7985',
- },
- },
- },
- legend: {
- data: ['整改率'],
- },
- toolbox: {
- feature: {
- saveAsImage: {},
- },
- },
- grid: {
- left: '1%', // grid布局设置适当调整避免X轴文字只能部分显示
- right: '5%', // grid布局设置适当调整避免X轴文字只能部分显示
- bottom: '5%',
- containLabel: true,
- },
- xAxis: {
- type: 'category',
- data: data.map((item) => item.name),
- axisLabel: {
- show: true, // 是否显示刻度标签,默认显示
- interval: 0, // 坐标轴刻度标签的显示间隔,在类目轴中有效;默认会采用标签不重叠的策略间隔显示标签;可以设置成0强制显示所有标签;如果设置为1,表示『隔一个标签显示一个标签』,如果值为2,表示隔两个标签显示一个标签,以此类推。
- inside: false, // 刻度标签是否朝内,默认朝外
- margin: 6, // 刻度标签与轴线之间的距离
- fontSize: 16,
- rotate: -15, // 刻度标签旋转的角度
- },
- },
- yAxis: {
- type: 'value',
- interval: 10,
- axisLabel: {
- formatter: '{value} %',
- },
- },
- // x轴滚动
- dataZoom: [
- {
- type: 'slider',
- show: true,
- xAxisIndex: [0],
- start: 0,
- height: 10,
- end: 20,
- },
- {
- type: 'inside',
- xAxisIndex: [0],
- start: 0,
- height: 10,
- end: 20,
- },
- ],
- series: [
- {
- name: '整改率',
- type: 'bar',
- barWidth: 25,
- data: data,
- },
- ],
- }
- if (type === 'down') {
- option.graphic = [
- {
- type: 'text',
- left: 50,
- top: 20,
- style: {
- text: '返回',
- fontSize: 18,
- // 加粗
- fontWeight: 700,
- },
- onclick: () => {
- // 删除返回
- // 清空下钻code
- this.initRectifyRate()
- },
- },
- ]
- } else {
- option.graphic = [
- {
- type: 'text',
- left: 50,
- top: 20,
- style: {
- text: '',
- fontSize: 18,
- },
- },
- ]
- }
- myChart.setOption(option)
- // 点击下钻
- if (type !== 'down' && this.isUnitType === 'group') {
- myChart.on('click', (params) => {
- this.initRectifyRate('down', data[params.dataIndex].code)
- })
- }
- this.chart2 = myChart
- })
- .finally(() => {
- this.isshowLoading2 = false
- })
- },
- initProblemSummary(type) {
- this.isshowLoading3 = true
- // questionNatureStatistics
- AuditRiskbraryService.questionNatureStatistics(this.getSearchData('bar'))
- .then((res) => {
- const list = res.data.data
- // 如果没有数据则
- // 总数
- const sum = list.reduce((prev, cur) => {
- return prev + cur.count
- }, 0)
- // 计算占比
- const data = list.map((item) => {
- return {
- value: ((item.count / sum) * 100).toFixed(2),
- name: item.questionNature,
- }
- })
- if (data.length === 0) {
- this.barishow1 = false
- }
- const myChart = echarts.init(document.getElementById('problemSummary'))
- const option = {
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b} : {c} ({d}%)',
- },
- series: [
- {
- name: '问题概括统计',
- type: 'pie',
- radius: '55%',
- center: ['50%', '45%'],
- data: data,
- label: {
- formatter: `{b}
- {d}%`,
- },
- itemStyle: {
- normal: {
- color: function(params) {
- // 自定义颜色
- var colorList = [
- '#fc8251',
- '#5470c6',
- '#9A60B4',
- '#ef6567',
- '#f9c956',
- '#3BA272',
- ]
- return colorList[params.dataIndex]
- },
- },
- },
- },
- ],
- }
- myChart.setOption(option)
- this.chart3 = myChart
- })
- .finally(() => {
- this.isshowLoading3 = false
- })
- },
- initModelField() {
- this.isshowLoading4 = true
- AuditRiskbraryService.modelDomainStatistics(this.getSearchData('bar'))
- .then((res) => {
- const list = res.data.data
- // 总数
- const sum = list.reduce((prev, cur) => {
- return prev + cur.count
- }, 0)
- // 计算占比
- const data = list.map((item) => {
- return {
- value: ((item.count / sum) * 100).toFixed(2),
- name: item.domainName,
- }
- })
- if (data.length === 0) {
- this.barishow2 = false
- }
- const myChart = echarts.init(document.getElementById('modelField'))
- const option = {
- tooltip: {
- trigger: 'item',
- formatter: '{a} <br/>{b} : {d}%',
- },
- series: [
- {
- name: '模型领域统计',
- type: 'pie',
- radius: '55%',
- center: ['50%', '45%'],
- data: data,
- itemStyle: {
- normal: {
- color: function(params) {
- // 自定义颜色
- var colorList = [
- '#fc8251',
- '#5470c6',
- '#9A60B4',
- '#ef6567',
- '#f9c956',
- '#3BA272',
- ]
- return colorList[params.dataIndex]
- },
- },
- },
- label: {
- formatter: `{b}
- {d}%`,
- },
- },
- ],
- }
- myChart.setOption(option)
- this.chart4 = myChart
- })
- .finally(() => {
- this.isshowLoading4 = false
- })
- },
- // 饼图导出
- exportPie1(type) {
- this.isshowLoading5 = true
- const params = this.getSearchData('bar')
- AuditRiskbraryService.exportBoardBar(params)
- .then((res) => {
- if (res.status === 200) {
- const url = URL.createObjectURL(res.data)
- const filename = res.headers['content-disposition']
- const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
- download(url, decodeURI(fname))
- // 导出成功
- message.success('导出成功')
- } else {
- Modal.warning({
- title: '提示',
- content: '导出报错,请联系管理员!',
- })
- return false
- }
- })
- .finally(() => {
- this.isshowLoading5 = false
- })
- },
- exportPie2(type) {
- this.isshowLoading5 = true
- const params = this.getSearchData('bar')
- AuditRiskbraryService.exportBoardBarModel(params)
- .then((res) => {
- if (res.status === 200) {
- const url = URL.createObjectURL(res.data)
- const filename = res.headers['content-disposition']
- const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
- download(url, decodeURI(fname))
- // 导出成功
- message.success('导出成功')
- } else {
- Modal.warning({
- title: '提示',
- content: '导出报错,请联系管理员!',
- })
- return false
- }
- })
- .finally(() => {
- this.isshowLoading5 = false
- })
- },
- exportBar() {
- this.isshowLoading5 = true
- const params = this.getSearchData('line')
- AuditRiskbraryService.reformRateExport(params)
- .then((res) => {
- if (res.status === 200) {
- const url = URL.createObjectURL(res.data)
- const filename = res.headers['content-disposition']
- const fname = filename.substring(filename.indexOf('filename=') + 9, filename.length)
- download(url, decodeURI(fname))
- // 导出成功
- message.success('导出成功')
- } else {
- Modal.warning({
- title: '提示',
- content: '导出报错,请联系管理员!',
- })
- return false
- }
- })
- .finally(() => {
- this.isshowLoading5 = false
- })
- },
- },
- }
- </script>
- <style module lang="scss">
- @use '@/common/design' as *;
- .title {
- margin-bottom: 20px;
- }
- .linebar {
- width: 100%;
- height: 650px;
- margin-top: 20px;
- }
- .rectify-rate {
- width: 100%;
- height: 600px;
- margin-top: 20px;
- }
- .bingtu {
- width: 100%;
- height: 400px;
- margin-top: 20px;
- }
- .time {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- }
- .line-bar-body {
- }
- .form-bar {
- :global {
- .ant-form-item-control-wrapper {
- width: 200px;
- }
- }
- }
- .search-btn {
- margin-bottom: 20px;
- }
- .export-body {
- position: relative;
- .export-icon {
- position: absolute;
- top: 25px;
- right: 10%;
- z-index: 1;
- cursor: pointer;
- }
- }
- .riskviewtitle {
- // 左侧有竖线
- position: relative;
- padding-left: 15px;
- margin-bottom: 15px;
- font-weight: 800px;
- }
- .riskviewtitle::before {
- position: absolute;
- top: 50%; /* 竖线垂直居中 */
- left: 0;
- width: 4px; /* 竖线宽度 */
- height: 80%; /* 高度与容器高度相同 */
- content: ''; /* 伪元素需要content属性 */
- background: #1890ff; /* 竖线颜色 */
- border-radius: 10px;
- transform: translateY(-50%); /* 对齐调整 */
- }
- </style>
|