已修改15个文件
已添加10个文件
已重命名4个文件
| | |
| | | CompGenericWrapper: typeof import('./components/CompGenericWrapper.vue')['default'] |
| | | CompQuickSet: typeof import('./components/search-option/CompQuickSet.vue')['default'] |
| | | Content: typeof import('./components/core/Content.vue')['default'] |
| | | copy: typeof import('./components/search-option/FYOptionScene copy.vue')['default'] |
| | | ElAffix: typeof import('element-plus/es')['ElAffix'] |
| | | ElAside: typeof import('element-plus/es')['ElAside'] |
| | | ElAvatar: typeof import('element-plus/es')['ElAvatar'] |
| | |
| | | FYOptionSupervisionStatus: typeof import('./components/search-option/FYOptionSupervisionStatus.vue')['default'] |
| | | FYOptionText: typeof import('./components/search-option/base/FYOptionText.vue')['default'] |
| | | FYOptionTime: typeof import('./components/search-option/FYOptionTime.vue')['default'] |
| | | FYOptionTopTask: typeof import('./components/search-option/FYOptionTopTask.vue')['default'] |
| | | FYOptionUserType: typeof import('./components/search-option/FYOptionUserType.vue')['default'] |
| | | FYPageHeader: typeof import('./components/head/FYPageHeader.vue')['default'] |
| | | FYReconfrimButton: typeof import('./components/button/FYReconfrimButton.vue')['default'] |
| | |
| | | <template> |
| | | <el-form-item :label="placeholder" :prop="prop"> |
| | | <el-cascader |
| | | v-bind="$attrs" |
| | | :model-value="formatedValue" |
| | | @change="handleChange" |
| | | :options="locations" |
| | | :placeholder="placeholder" |
| | | :props="optionProps" |
| | | style="width: 320px" |
| | | v-bind="$attrs" |
| | | /> |
| | | </el-form-item> |
| | | </template> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-form-item :label="label" :prop="prop"> |
| | | <el-select |
| | | :model-value="formatedValue" |
| | | @update:model-value="handleChange" |
| | | placeholder="æ»ä»»å¡" |
| | | style="width: 260px" |
| | | > |
| | | <el-option |
| | | v-for="s in topTasks" |
| | | :key="s.value" |
| | | :label="s.label" |
| | | :value="s.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </template> |
| | | |
| | | <script> |
| | | import taskApi from '@/api/fysp/taskApi'; |
| | | |
| | | export default { |
| | | props: { |
| | | label: { |
| | | type: String, |
| | | default: 'æ»ä»»å¡' |
| | | }, |
| | | // è¿åç»æ |
| | | value: Object, |
| | | // æ¯å¦é»è®¤è¿ååå§é项 |
| | | initValue: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // form表åç»å®å±æ§å |
| | | prop: { |
| | | type: String, |
| | | default: 'topTaskId' |
| | | }, |
| | | }, |
| | | emits: ['update:value'], |
| | | data() { |
| | | return { |
| | | selected: {}, |
| | | topTasks: [], |
| | | }; |
| | | }, |
| | | computed: { |
| | | formatedValue() { |
| | | return this.value.tguid; |
| | | } |
| | | }, |
| | | methods: { |
| | | //è·åæ¥è¯¢æ¡ä»¶ |
| | | getOptions() { |
| | | taskApi.getTopTask().then((res) => { |
| | | const list = res.map((r) => { |
| | | return { |
| | | value: r.tguid, |
| | | label: r.name, |
| | | data: r |
| | | }; |
| | | }); |
| | | this.topTasks = list; |
| | | if (this.initValue) { |
| | | this.handleChange(list[0].value); |
| | | } |
| | | }); |
| | | }, |
| | | //æ¥è¯¢åä»»å¡ç»è®¡ä¿¡æ¯ |
| | | handleChange(value) { |
| | | const task = this.topTasks.find( |
| | | (t) => t.data.tguid == value |
| | | ); |
| | | const param = task ? task.data : {} |
| | | |
| | | this.$emit('update:value', param); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.getOptions(); |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | type: Number, |
| | | default: 0 |
| | | }, |
| | | defaultPageSize: { |
| | | type: Number, |
| | | default: 20 |
| | | }, |
| | | // é¢å¤çé«åº¦ï¼ç¨äºè®¡ç®è¡¨æ ¼é«åº¦ |
| | | extraHeight: { |
| | | type: Number, |
| | |
| | | tableData: [], |
| | | total: 0, |
| | | currentPage: 1, |
| | | pageSize: 20, |
| | | pageSize: this.defaultPageSize, |
| | | loading: false, |
| | | fontSize: 'default' |
| | | }; |
| | |
| | | if (nValue != oValue) { |
| | | this.tableHeight = this.calcTableHeight(); |
| | | } |
| | | }, |
| | | } |
| | | } |
| | | }, |
| | | computed: {}, |
| | |
| | | name: 'ä¸é´æ°æ®äº§å', |
| | | children: [ |
| | | { |
| | | path: '/fysp/data-product/middle/home/inspectionSummary', |
| | | icon: 'Document', |
| | | name: 'æåº¦å·¡æ¥ç®æ¥' |
| | | }, |
| | | { |
| | | path: '/fysp/data-product/profollow', |
| | | icon: 'Document', |
| | | name: 'é®é¢å¨æè·è¸ª' |
| | |
| | | import isSameOrAfter from 'dayjs/plugin/isSameOrAfter'; |
| | | import isSameOrBefore from 'dayjs/plugin/isSameOrBefore'; |
| | | |
| | | // echarts |
| | | import * as echarts from 'echarts' |
| | | |
| | | |
| | | dayjs.extend(isSameOrAfter); |
| | | dayjs.extend(isSameOrBefore); |
| | |
| | | const app = createApp(App); |
| | | |
| | | app.config.globalProperties.$fm = timeUtil; |
| | | app.config.globalProperties.$echarts = echarts |
| | | app.config.globalProperties.$message = ElMessage |
| | | app.config.globalProperties.$notification = ElNotification |
| | | app.config.globalProperties.$messageBox = ElMessageBox |
| | |
| | | }, |
| | | { |
| | | // åºç¡äº§å-管ç |
| | | name: 'ProdManage', |
| | | name: 'ManageBaseProd', |
| | | path: 'fysp/data-product/base/home', |
| | | component: () => |
| | | import('@/views/fysp/data-product/base-data-product/ProdManage.vue'), |
| | | import('@/views/fysp/data-product/base-data-product/ManageBaseProd.vue'), |
| | | children: [ |
| | | { |
| | | // åºç¡äº§å-åºæ¯æ¸
å |
| | |
| | | import('@/views/fysp/data-product/ProdSceneReport.vue') |
| | | }, |
| | | { |
| | | //åºæ¯æ¥å |
| | | //èåæ§æ³æ¸
å |
| | | name: 'lawenforcelist', |
| | | path: 'lawenforcelist', |
| | | component: () => |
| | |
| | | children: [ |
| | | { |
| | | // åºç¡äº§å-管ç |
| | | name: 'ProdManage', |
| | | name: 'ManageBaseProd', |
| | | path: 'home', |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/base-data-product/ProdManage.vue' |
| | | '@/views/fysp/data-product/base-data-product/ManageBaseProd.vue' |
| | | ), |
| | | children: [ |
| | | { |
| | | // åºç¡äº§å-åºæ¯æ¸
å |
| | | path: 'scene', |
| | | name: 'ProdSceneInfo', |
| | | meta: { keepAlive: true, key: 'ProdManage' }, |
| | | meta: { keepAlive: false, key: 'ManageBaseProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/base-data-product/ProdSceneInfo.vue' |
| | |
| | | // åºç¡äº§å-è§èæ§è¯ä¼° |
| | | path: 'evaluate', |
| | | name: 'ProdEvaluationInfo', |
| | | meta: { keepAlive: true, key: 'ProdManage' }, |
| | | meta: { keepAlive: false, key: 'ManageBaseProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/base-data-product/ProdEvaluationInfo.vue' |
| | | ) |
| | | }, |
| | | { |
| | | // åºç¡äº§å-å·¡æ¥ä¿¡æ¯ |
| | | // åºç¡äº§å-æ´æ¹æ¸
å |
| | | path: 'inspection', |
| | | name: 'ProdInspectionInfo', |
| | | meta: { keepAlive: true, key: 'ProdManage' }, |
| | | meta: { keepAlive: false, key: 'ManageBaseProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/base-data-product/ProdInspectionInfo.vue' |
| | |
| | | // åºç¡äº§å-çæµæ°æ® |
| | | path: 'monitordata', |
| | | name: 'ProdMonitorDataInfo', |
| | | meta: { keepAlive: true, key: 'ProdManage' }, |
| | | meta: { keepAlive: false, key: 'ManageBaseProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/base-data-product/ProdMonitorDataInfo.vue' |
| | |
| | | ) |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | name: 'dataProdMiddle', |
| | | path: 'middle', |
| | | children: [ |
| | | { |
| | | // ä¸é´äº§å-管ç |
| | | name: 'ManageMiddleProd', |
| | | path: 'home', |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/middle-data-product/ManageMiddleProd.vue' |
| | | ), |
| | | children: [ |
| | | { |
| | | // ä¸é´äº§å-æåº¦å·¡æ¥æ
嵿±æ» |
| | | path: 'inspectionSummary', |
| | | name: 'ProdInspectionSummary', |
| | | meta: { keepAlive: false, key: 'ManageMiddleProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/middle-data-product/ProdInspectionSummary.vue' |
| | | ) |
| | | }, |
| | | { |
| | | // ä¸é´äº§å-æåº¦é®é¢æ±æ» |
| | | path: 'problemTypeSummary', |
| | | name: 'ProdProblemTypeSummary', |
| | | meta: { keepAlive: false, key: 'ManageMiddleProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/middle-data-product/ProdProblemTypeSummary.vue' |
| | | ) |
| | | }, |
| | | { |
| | | // ä¸é´äº§å-åè¡éååºæ¯é®é¢æ°åå¼ |
| | | path: 'problemCountSummary', |
| | | name: 'ProdProblemCountSummary', |
| | | meta: { keepAlive: false, key: 'ManageMiddleProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/middle-data-product/ProdProblemCountSummary.vue' |
| | | ) |
| | | }, |
| | | { |
| | | // ä¸é´äº§å-çæµè®¾å¤æ±æ» |
| | | path: 'monitorDeviceSummary', |
| | | name: 'ProdMonitorDeviceSummary', |
| | | meta: { keepAlive: false, key: 'ManageMiddleProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/middle-data-product/ProdMonitorDeviceSummary.vue' |
| | | ) |
| | | }, |
| | | { |
| | | // ä¸é´äº§å-è¯ä¼°æ
åµ |
| | | path: 'evaluationSummary', |
| | | name: 'ProdEvaluationSummary', |
| | | meta: { keepAlive: false, key: 'ManageMiddleProd' }, |
| | | component: () => |
| | | import( |
| | | '@/views/fysp/data-product/middle-data-product/ProdEvaluationSummary.vue' |
| | | ) |
| | | }, |
| | | ] |
| | | }, |
| | | ] |
| | | } |
| | | ] |
| | | }, |
| | |
| | | // éå½çè·åobjä¸çprop屿§ è§£å³ææ¶éè¦åval.obj.propçæ
åµ |
| | | function getPropValueLoop(obj, prop) { |
| | | if (typeof prop !== 'string') { |
| | | return obj; |
| | | } |
| | | const props = prop.split('.'); |
| | | let result = obj; |
| | | props.forEach((item) => { |
| | | result = result[item]; |
| | | }); |
| | | return result; |
| | | } |
| | | function getCount(array, element) { |
| | | let count = 0; |
| | | array.forEach((e) => { |
| | | if (e == element) { |
| | | count++; |
| | | } |
| | | }); |
| | | return count; |
| | | } |
| | | export default { |
| | | /** å°chartå¾è¡¨è½¬å为å¾çurl |
| | | * @param chartï¼ chartå¾è¡¨çå®ä¾ |
| | | * */ |
| | | chartToImageUrl(chart) { |
| | | const dataURL = chart.getDataURL({ |
| | | pixelRatio: 5, // æé«å¾çè´¨é |
| | | backgroundColor: '#FFFFFF', // è®¾ç½®èæ¯é¢è² |
| | | excludeComponents: ['toolbox'], // æé¤å·¥å
·ç®±ç»ä»¶ |
| | | type: 'png' // è¾åºå¾çç±»å为PNG |
| | | }); |
| | | return dataURL; |
| | | }, |
| | | // å±ç¤º data æ°ç»ä¸å¯¹è±¡ç prop 屿§ç饼å¾, title æ¯é¥¼å¾çæ é¢ |
| | | getPieChartByDataAndProp(data, prop, label) { |
| | | let chartData = []; |
| | | function hasThisName(name) { |
| | | for (let index = 0; index < chartData.length; index++) { |
| | | const element = chartData[index]; |
| | | if (element.name === name) { |
| | | return true; |
| | | function pieChartOption() { |
| | | return { |
| | | color: [ |
| | | '#5470c6', |
| | | '#91cc75', |
| | | '#fac858', |
| | | '#ee6666', |
| | | '#73c0de', |
| | | '#3ba272', |
| | | '#fc8452', |
| | | '#9a60b4', |
| | | '#ea7ccc', |
| | | '#514a9d', |
| | | '#2ec7c9', |
| | | '#b6a2de' |
| | | ], |
| | | title: { |
| | | text: `饼å¾é»è®¤åç§°`, |
| | | left: 'center' // æ é¢å±
䏿¾ç¤º |
| | | }, |
| | | // æ·»å å·¥å
·æ é
ç½®ï¼å
å«ä¸è½½åè½ |
| | | toolbox: { |
| | | show: true, |
| | | feature: { |
| | | saveAsImage: { |
| | | show: true, |
| | | title: 'ä¸è½½å¾è¡¨', |
| | | type: 'png', |
| | | pixelRatio: 2 // æé«å¾çæ¸
æ°åº¦ |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | data.map((item) => { |
| | | const name = getPropValueLoop(item, prop); |
| | | if (hasThisName(name)) { |
| | | chartData.map((item) => { |
| | | if (item.name === name) { |
| | | item.value++; |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item', // 饼å¾ä½¿ç¨item触åtooltip |
| | | formatter: '{a} <br/>{b}: {c} ({d}%)' // æ¾ç¤ºæ ¼å¼ï¼åç§°: æ°é (ç¾åæ¯) |
| | | }, |
| | | legend: { |
| | | show: false, |
| | | orient: 'vertical', |
| | | left: 'right', // å¾ä¾å±
å·¦åç´æå |
| | | data: ['sample1', 'sample2', 'sample3'] // å¾ä¾æ°æ®ä¸ºé®é¢ç±»ååç§° |
| | | }, |
| | | series: [ |
| | | { |
| | | name: 'sample', |
| | | type: 'pie', // å¾è¡¨ç±»åæ¹ä¸ºé¥¼å¾ |
| | | radius: '60%', // 饼å¾åå¾ |
| | | center: ['50%', '55%'], // 饼å¾ä¸å¿ä½ç½® |
| | | data: [ |
| | | { |
| | | name: 'sample1', |
| | | value: 100 |
| | | }, |
| | | { |
| | | name: 'sample2', |
| | | value: 200 |
| | | }, |
| | | { |
| | | name: 'sample3', |
| | | value: 300 |
| | | } |
| | | }); |
| | | } else { |
| | | chartData.push({ |
| | | name: name, |
| | | value: 1 |
| | | }); |
| | | ], |
| | | label: { |
| | | show: true, |
| | | formatter: '{b}: {c} ({d}%)' // æåºæ ç¾æ¾ç¤ºï¼åç§°: æ°é (ç¾åæ¯) |
| | | } |
| | | } |
| | | }); |
| | | ] |
| | | }; |
| | | } |
| | | |
| | | return { |
| | | title: { |
| | | text: label, |
| | | left: 'center' |
| | | }, |
| | | tooltip: { |
| | | trigger: 'item' |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'left' |
| | | }, |
| | | series: [ |
| | | { |
| | | type: 'pie', |
| | | radius: '50%', |
| | | data: chartData, |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | | shadowOffsetX: 0, |
| | | shadowColor: 'rgba(0, 0, 0, 0.5)' |
| | | } |
| | | } |
| | | } |
| | | ] |
| | | }; |
| | | }, |
| | | // å±ç¤º data æ°ç»ä¸å¯¹è±¡ç prop 屿§çç´æ¹å¾, title æ¯ç´æ¹å¾çæ é¢ |
| | | getBarChartByDataAndProp(data, prop, title) { |
| | | let series = data.map((item) => getPropValueLoop(item, prop)); |
| | | const option = { |
| | | title: { |
| | | text: title //设置æ é¢ |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: Array.from(new Set(series)), |
| | | axisLabel: { |
| | | rotate: 45, // æè½¬æ ç¾ï¼é¿å
éå |
| | | // æè
|
| | | interval: 0 // æ¾ç¤ºæææ ç¾ï¼å¯è½å¯¼è´éå ï¼æ ¹æ®éæ±è°æ´ |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'value' |
| | | }, |
| | | series: [ |
| | | { |
| | | data: Array.from(new Set(series)).map((item) => |
| | | getCount(series, item) |
| | | ), |
| | | type: 'bar', |
| | | smooth: true |
| | | } |
| | | ] |
| | | }; |
| | | return option; |
| | | } |
| | | }; |
| | | // éè¿ ECharts API ä¸è½½å¾çç彿° |
| | | function downloadChartImage(chart, fileName) { |
| | | if (!chart) return; // ç¡®ä¿å¾è¡¨å·²åå§å |
| | | |
| | | // è·åå¾è¡¨å¾çæ°æ®ï¼æ¯æ png/jpeg æ ¼å¼ï¼pixelRatio æ§å¶æ¸
æ°åº¦ï¼ |
| | | const dataURL = chart.getDataURL({ |
| | | type: 'png', // å¾çæ ¼å¼ |
| | | pixelRatio: 2, // åç´ æ¯ï¼å¼è¶å¤§å¾çè¶æ¸
æ° |
| | | backgroundColor: '#fff', // èæ¯è²ï¼é»è®¤éæï¼ |
| | | excludeComponents: ['toolbox'] |
| | | }); |
| | | // å建ä¸è½½é¾æ¥ |
| | | const link = document.createElement('a'); |
| | | link.href = dataURL; |
| | | // 设置ä¸è½½æä»¶åï¼å¯æ ¹æ®å®é
éæ±è°æ´ï¼ |
| | | link.download = `${fileName}.png`; |
| | | // æ·»å å°ææ¡£å¹¶è§¦åä¸è½½ |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | // æ¸
ç龿¥å
ç´ |
| | | document.body.removeChild(link); |
| | | } |
| | | |
| | | export { pieChartOption, downloadChartImage }; |
| | |
| | | import * as XLSX from 'xlsx'; |
| | | import FileSaver from 'file-saver'; |
| | | import { ElMessage } from 'element-plus'; |
| | | |
| | | |
| | | function conversionFromTable(elementId, title) { |
| | | // è·åè¡¨æ ¼å
ç´ |
| | |
| | | `${title}.xlsx` //ä¿®æ¹åå |
| | | ); |
| | | //è¿éå¯ä»¥æ¾å
¥ä½ çåè°å½æ° |
| | | alert('å¼å§ä¸è½½'); |
| | | ElMessage.success('å¼å§ä¸è½½'); |
| | | } catch (e) { |
| | | if (typeof console !== 'undefined') console.log(e, table_write); |
| | | } |
| | |
| | | <el-icon class="is-loading" v-if="row._loading"> |
| | | <Loading color="#409eff" /> |
| | | </el-icon> |
| | | <div v-else> |
| | | <template v-if="row._problems.length > 0"> |
| | | <div v-for="(p, i) in row._problems" :key="p.guid"> |
| | | <el-text>{{ i + 1 }}ã</el-text> |
| | | <el-text>{{ p.problemname }}</el-text> |
| | | </div> |
| | | <template v-else-if="row._problems.length > 0"> |
| | | <template v-for="(p, i) in row._problems" :key="p.guid"> |
| | | <br v-if="i > 0" />{{ i + 1 + 'ã' + p.problemname }} |
| | | </template> |
| | | <el-text v-else>/</el-text> |
| | | </div> |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column |
| | |
| | | filterHandler(value, row, column) { |
| | | const property = column['property']; |
| | | return row[property] === value; |
| | | }, |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.addRefreshEvent(this.$refs.tableRef.doLayout); |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <CompProdManage :menu="menu" /> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import CompProdManage from '@/views/fysp/data-product/components/CompProdManage.vue'; |
| | | |
| | | const menu = ref([ |
| | | { |
| | | name: 'åºæ¯æ¸
å', |
| | | path: 'scene', |
| | | }, |
| | | { |
| | | name: 'è¯ä¼°æ¸
å', |
| | | path: 'evaluate' |
| | | }, |
| | | { |
| | | name: 'æ´æ¹æ¸
å', |
| | | path: 'inspection' |
| | | }, |
| | | { |
| | | name: 'çæµæ°æ®', |
| | | path: 'monitorData' |
| | | } |
| | | ]); |
| | | </script> |
| | | <style scoped></style> |
| | |
| | | <script setup> |
| | | import { ref, inject } from 'vue'; |
| | | import dayjs from 'dayjs'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/base-data-product/components/BaseProdProcess.vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodbaseApi from '@/api/fysp/dataprodbaseApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | |
| | | <el-table-column prop="cityname" label="å¸" width="90" /> |
| | | <el-table-column prop="districtname" label="åºå¿" width="90" /> --> |
| | | <el-table-column prop="subTask.townname" label="è¡é" width="80" /> |
| | | <el-table-column prop="problems.length" label="é®é¢æ°" width="60" /> |
| | | <el-table-column label="é®é¢æè¦" width="300"> |
| | | <template #default="{ row }"> |
| | | <template v-for="(value, index) in row.problems" :key="value.guid"> |
| | | <br v-if="index > 0" />{{ index + 1 + 'ã' + value.problemname }} |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="problems.length" |
| | | label="é®é¢æ°" |
| | | width="60" |
| | | /> |
| | | <el-table-column prop="scoreLevel" label="é®é¢æè¦" width="70" /> |
| | | <el-table-column |
| | | prop="evaluate.resultscorebef" |
| | | prop="unChangeProblems.length" |
| | | label="æªæ´æ¹æ°" |
| | | width="60" |
| | | /> |
| | | <el-table-column prop="scoreLevel" label="æªæ´æ¹é®é¢" width="70" /> |
| | | <el-table-column |
| | | <el-table-column label="æªæ´æ¹é®é¢" width="300"> |
| | | <template #default="{ row }"> |
| | | <template |
| | | v-for="(value, index) in row.unChangeProblems" |
| | | :key="value.guid" |
| | | > |
| | | <br v-if="index > 0" />{{ index + 1 + 'ã' + value.problemname }} |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- <el-table-column |
| | | prop="evaluate.updatedate" |
| | | label="æ´æ°æ¶é´" |
| | | width="140" |
| | | :formatter="timeFormat" |
| | | /> |
| | | /> --> |
| | | </el-table> |
| | | </template> |
| | | </BaseProdProcess> |
| | |
| | | <script setup> |
| | | import { ref, inject } from 'vue'; |
| | | import dayjs from 'dayjs'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/base-data-product/components/BaseProdProcess.vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodbaseApi from '@/api/fysp/dataprodbaseApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | |
| | | .fetchProdInspectionInfo(opt) |
| | | .then((res) => { |
| | | if (res.success) { |
| | | tableData.value = res.data; |
| | | tableData.value = res.data.map((item) => { |
| | | return { |
| | | ...item, |
| | | unChangeProblems: item.problems.filter((p) => !p.ischanged) |
| | | }; |
| | | }); |
| | | } |
| | | changeActive(); |
| | | }) |
| | |
| | | <template> |
| | | 1 |
| | | <BaseProdProcess |
| | | v-model:active="active" |
| | | @onStep1="onStep1" |
| | | @onStep2="onStep2" |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | <template #step2="{ contentHeight }"> |
| | | <el-table |
| | | id="prod-scene-table" |
| | | :data="tableData" |
| | | v-loading="loading" |
| | | :height="contentHeight + 'px'" |
| | | table-layout="fixed" |
| | | :show-overflow-tooltip="true" |
| | | size="small" |
| | | border |
| | | > |
| | | <el-table-column fixed="left" prop="index" label="æå" width="50"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | fixed="left" |
| | | prop="scene.name" |
| | | label="åç§°" |
| | | :show-overflow-tooltip="true" |
| | | min-width="200" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column prop="data.drAvg" label="å¹³åå¼(mg/m³)" width="100" /> |
| | | <el-table-column |
| | | prop="data.drOverAvgPer" |
| | | label="è¶
åºåå¼" |
| | | width="80" |
| | | :formatter="ratioFormat" |
| | | /> |
| | | <el-table-column label="è¶
å¸åå¼" width="80" /> |
| | | <!-- <el-table-column prop="provincename" label="ç" width="90" /> |
| | | <el-table-column prop="cityname" label="å¸" width="90" /> |
| | | <el-table-column prop="districtname" label="åºå¿" width="90" /> --> |
| | | <el-table-column prop="scene.townname" label="å±å°" width="110" /> |
| | | </el-table> |
| | | </template> |
| | | <!-- <template #step3></template> --> |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup></script> |
| | | <script setup> |
| | | import { ref, inject } from 'vue'; |
| | | import dayjs from 'dayjs'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodbaseApi from '@/api/fysp/dataprodbaseApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | | |
| | | const { active, changeActive } = useProdStepChange(); |
| | | const loading = ref(false); |
| | | const tableData = ref([]); |
| | | |
| | | function onStep1(opt) { |
| | | loading.value = true; |
| | | dataprodbaseApi |
| | | .fetchProdMonitorDataInfo(opt) |
| | | .then((res) => { |
| | | if (res.success) { |
| | | tableData.value = res.data |
| | | .sort((a, b) => { |
| | | return b.data.drAvg - a.data.drAvg; |
| | | }) |
| | | .map((item, index) => { |
| | | return { |
| | | ...item, |
| | | index: index + 1 |
| | | }; |
| | | }); |
| | | } |
| | | changeActive(); |
| | | }) |
| | | .finally(() => { |
| | | loading.value = false; |
| | | }); |
| | | } |
| | | |
| | | function onStep2() { |
| | | changeActive(); |
| | | } |
| | | |
| | | function onStep3(val) { |
| | | if (val.downloadType == '1') { |
| | | loading.value = true; |
| | | conversionFromTable('prod-scene-table', 'å¨çº¿çæµæ°æ®æ¸
å'); |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | function ratioFormat(row, column, cellValue, index) { |
| | | return Math.round(cellValue * 1000) / 10 + '%'; |
| | | } |
| | | </script> |
| | |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | <!-- <template #step1> |
| | | <ProdQueryOpt :loading="loading" @submit="onSearch"> </ProdQueryOpt> |
| | | </template> --> |
| | | <template #step2="{ contentHeight }"> |
| | | <el-table |
| | | id="prod-scene-table" |
| | |
| | | /> --> |
| | | </el-table> |
| | | </template> |
| | | <!-- <template #step3></template> --> |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup> |
| | | import { ref, inject } from 'vue'; |
| | | import dayjs from 'dayjs'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/base-data-product/components/BaseProdProcess.vue'; |
| | | import ProdQueryOpt from '@/views/fysp/data-product/base-data-product/components/ProdQueryOpt.vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodbaseApi from '@/api/fysp/dataprodbaseApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
ÎļþÃû´Ó src/views/fysp/data-product/base-data-product/components/BaseProdProcess.vue ÐÞ¸Ä |
| | |
| | | <script setup> |
| | | import { computed, inject, ref, watch, onMounted, onUnmounted } from 'vue'; |
| | | import { unCalc } from '@/utils/css-util'; |
| | | import ProdQueryOpt from '@/views/fysp/data-product/base-data-product/components/ProdQueryOpt.vue'; |
| | | import ProdDownload from '@/views/fysp/data-product/base-data-product/components/ProdDownload.vue'; |
| | | import ProdQueryOpt from '@/views/fysp/data-product/components/ProdQueryOpt.vue'; |
| | | import ProdDownload from '@/views/fysp/data-product/components/ProdDownload.vue'; |
| | | |
| | | const props = defineProps({ |
| | | active: { |
ÎļþÃû´Ó src/views/fysp/data-product/base-data-product/ProdManage.vue ÐÞ¸Ä |
| | |
| | | <el-affix> |
| | | <el-menu |
| | | ref="menuRef" |
| | | default-active="scene" |
| | | :default-active="menu.length > 0 ? menu[0].path : ''" |
| | | ellipsis |
| | | mode="horizontal" |
| | | > |
| | |
| | | </template> |
| | | <script setup> |
| | | import { ref, onMounted, provide, inject, computed } from 'vue'; |
| | | import { useRouter, useRoute } from 'vue-router'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | const contentMaxHeight = inject('contentMaxHeight'); |
| | | |
| | | const props = defineProps({ |
| | | menu: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | }) |
| | | |
| | | const router = useRouter(); |
| | | const route = useRoute(); |
| | | |
| | | const menuRef = ref(null); |
| | | const height = ref(contentMaxHeight.value); |
| | | |
| | | const menu = ref([ |
| | | { |
| | | name: 'åºæ¯æ¸
å', |
| | | path: 'scene', |
| | | selected: true |
| | | }, |
| | | { |
| | | name: 'è¯ä¼°æ¸
å', |
| | | path: 'evaluate' |
| | | }, |
| | | { |
| | | name: 'æ´æ¹æ¸
å', |
| | | path: 'inspection' |
| | | }, |
| | | { |
| | | name: 'çæµæ°æ®', |
| | | path: 'monitorData' |
| | | } |
| | | ]); |
| | | // const menu = ref([ |
| | | // { |
| | | // name: 'åºæ¯æ¸
å', |
| | | // path: 'scene', |
| | | // selected: true |
| | | // }, |
| | | // { |
| | | // name: 'è¯ä¼°æ¸
å', |
| | | // path: 'evaluate' |
| | | // }, |
| | | // { |
| | | // name: 'æ´æ¹æ¸
å', |
| | | // path: 'inspection' |
| | | // }, |
| | | // { |
| | | // name: 'çæµæ°æ®', |
| | | // path: 'monitorData' |
| | | // } |
| | | // ]); |
| | | |
| | | const navPage = (item) => { |
| | | if (item.index) { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-input v-model="textarea" autosize type="textarea" placeholder="" /> |
| | | </template> |
| | | <script setup> |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | const props = defineProps({ |
| | | // æ¨¡æ¿ |
| | | template: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | // åæ° |
| | | params: { |
| | | type: Object, |
| | | default: () => {} |
| | | } |
| | | }); |
| | | |
| | | const textarea = computed(() => { |
| | | return props.template.replace(/{(\w+)}/g, (match, p1) => { |
| | | return props.params[p1] || ''; |
| | | }); |
| | | }); |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-card shadow="never"> |
| | | <template #header> |
| | | <div><el-text tag="b" size="large">产åçæé项</el-text></div> |
| | | </template> |
| | | <el-form :inline="true" :model="formSearch"> |
| | | <FYOptionTopTask v-model:value="formSearch.topTask"></FYOptionTopTask> |
| | | <FYOptionScene |
| | | :allOption="false" |
| | | :type="2" |
| | | v-model:value="formSearch.scenetype" |
| | | ></FYOptionScene> |
| | | </el-form> |
| | | <el-form :inline="true" :model="formSearch2"> |
| | | <FYOptionTopTask v-model:value="formSearch2.topTask"></FYOptionTopTask> |
| | | </el-form> |
| | | <template #footer> |
| | | <el-row v-show="active" justify="end"> |
| | | <el-button |
| | | type="primary" |
| | | size="default" |
| | | :loading="loading" |
| | | @click="submit" |
| | | >çæ</el-button |
| | | > |
| | | </el-row> |
| | | </template> |
| | | </el-card> |
| | | </template> |
| | | <script setup> |
| | | import { ref, computed } from 'vue'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | const props = defineProps({ |
| | | loading: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | active: { |
| | | type: Boolean, |
| | | default: true |
| | | } |
| | | }); |
| | | const emit = defineEmits(['submit']); |
| | | |
| | | const formSearch = ref({ |
| | | topTask: {}, |
| | | scenetype: {} |
| | | }); |
| | | |
| | | const formSearch2 = ref({ |
| | | topTask: {} |
| | | }); |
| | | |
| | | const submit = () => { |
| | | const opt1 = { |
| | | topTaskId: formSearch.value.topTask.tguid, |
| | | topTaskName: formSearch.value.topTask.name, |
| | | provinceCode: formSearch.value.topTask.provincecode, |
| | | provinceName: formSearch.value.topTask.provincename, |
| | | cityCode: formSearch.value.topTask.citycode, |
| | | cityName: formSearch.value.topTask.cityname, |
| | | districtCode: formSearch.value.topTask.districtcode, |
| | | districtName: formSearch.value.topTask.districtname, |
| | | townCode: formSearch.value.topTask.towncode, |
| | | townName: formSearch.value.topTask.townname, |
| | | startTime: dayjs(formSearch.value.topTask.starttime).format( |
| | | 'YYYY-MM-DD HH:mm:ss' |
| | | ), |
| | | endTime: dayjs(formSearch.value.topTask.endtime) |
| | | .add(1, 'day') |
| | | .add(-1, 'second') |
| | | .format('YYYY-MM-DD HH:mm:ss'), |
| | | sceneTypeId: formSearch.value.scenetype.value, |
| | | sceneTypeName: formSearch.value.scenetype.label, |
| | | needCache: true |
| | | }; |
| | | const opt2 = { |
| | | topTaskId: formSearch2.value.topTask.tguid, |
| | | topTaskName: formSearch2.value.topTask.name, |
| | | provinceCode: formSearch2.value.topTask.provincecode, |
| | | provinceName: formSearch2.value.topTask.provincename, |
| | | cityCode: formSearch2.value.topTask.citycode, |
| | | cityName: formSearch2.value.topTask.cityname, |
| | | districtCode: formSearch2.value.topTask.districtcode, |
| | | districtName: formSearch2.value.topTask.districtname, |
| | | townCode: formSearch2.value.topTask.towncode, |
| | | townName: formSearch2.value.topTask.townname, |
| | | startTime: dayjs(formSearch2.value.topTask.starttime).format( |
| | | 'YYYY-MM-DD HH:mm:ss' |
| | | ), |
| | | endTime: dayjs(formSearch2.value.topTask.endtime) |
| | | .add(1, 'day') |
| | | .add(-1, 'second') |
| | | .format('YYYY-MM-DD HH:mm:ss'), |
| | | sceneTypeId: formSearch.value.scenetype.value, |
| | | sceneTypeName: formSearch.value.scenetype.label, |
| | | needCache: true |
| | | }; |
| | | emit('submit', [opt1, opt2]); |
| | | }; |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <CompProdManage :menu="menu" /> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import CompProdManage from '@/views/fysp/data-product/components/CompProdManage.vue'; |
| | | |
| | | const menu = ref([ |
| | | { |
| | | name: 'æåº¦å·¡æ¥æ
嵿±æ»', |
| | | path: 'inspectionSummary', |
| | | }, |
| | | { |
| | | name: 'æåº¦é®é¢æ±æ»', |
| | | path: 'problemTypeSummary' |
| | | }, |
| | | { |
| | | name: 'åè¡éååºæ¯é®é¢æ°åå¼', |
| | | path: 'problemCountSummary' |
| | | }, |
| | | { |
| | | name: 'çæµè®¾å¤æ±æ»', |
| | | path: 'monitorDeviceSummary' |
| | | }, |
| | | { |
| | | name: 'è¯ä¼°æ
嵿±æ»', |
| | | path: 'evaluationSummary' |
| | | } |
| | | ]); |
| | | </script> |
| | | <style scoped></style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BaseProdProcess |
| | | v-model:active="active" |
| | | @onStep1="onStep1" |
| | | @onStep2="onStep2" |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodmiddleApi from '@/api/fysp/dataprodmiddleApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | | |
| | | const { active, changeActive } = useProdStepChange(); |
| | | const loading = ref(false); |
| | | |
| | | function onStep1(opt) {} |
| | | |
| | | function onStep2() { |
| | | changeActive(); |
| | | } |
| | | |
| | | function onStep3(val) {} |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BaseProdProcess |
| | | v-model:active="active" |
| | | @onStep1="onStep1" |
| | | @onStep2="onStep2" |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | <template #step2="{ contentHeight }"> |
| | | <el-scrollbar :height="contentHeight"> |
| | | <el-card shadow="never"> |
| | | <el-form :inline="false" label-position="left" label-width="150px"> |
| | | <el-form-item label="å·¡æ¥åºæ¯æ»æ°"> |
| | | <el-text>{{ data.sceneCount }}</el-text> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ¥ç¹æ¬¡"> |
| | | <el-text>{{ data.pointCount }}</el-text> |
| | | </el-form-item> |
| | | <el-form-item label="夿 ¸ç¹æ¬¡"> |
| | | <el-text>{{ data.reviewPointCount }}</el-text> |
| | | </el-form-item> |
| | | <el-form-item label="åå·¥åºæ¯æ°"> |
| | | <el-text>{{ data.stopSceneCount }}</el-text> |
| | | </el-form-item> |
| | | <el-form-item label="å®å·¥åºæ¯æ°"> |
| | | <el-text>{{ data.completeSceneCount }}</el-text> |
| | | </el-form-item> |
| | | </el-form> |
| | | <!-- <CompProdTextGenerator |
| | | :template="template" |
| | | :params="params" |
| | | /> --> |
| | | </el-card> |
| | | </el-scrollbar> |
| | | </template> |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import CompProdTextGenerator from '@/views/fysp/data-product/components/CompProdTextGenerator.vue'; |
| | | import dataprodmiddleApi from '@/api/fysp/dataprodmiddleApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | | import { ElMessage } from 'element-plus'; |
| | | |
| | | const { active, changeActive } = useProdStepChange(); |
| | | const loading = ref(false); |
| | | const data = ref({}); |
| | | |
| | | const template = ref('2025å¹´7æï¼ç¬¬ä¸æ¹å¨åºçæç¯å¢å±æå¯¼ä¸å¯¹è¾åºå
72å®¶å·¥å°å¼å±äºæ¬å°æ±¡æé²æ²»ç°åºå·¡æ¥ã对é®é¢è¾ä¸¥éææ¬å°ç®¡æ§ä¸å°ä½å·¥å°è¿è¡4å®¶æ¬¡å¤æ ¸ï¼æ¬è½®å
±è®¡å·¡æ¥76家次ï¼7æé
åèåæ§æ³ææ°å·¥å°äº¤åºå®£è´¯å
±åºå¨6ç»7人次ã'); |
| | | const params = ref({}); |
| | | |
| | | function onStep1(opt) { |
| | | loading.value = true; |
| | | dataprodmiddleApi |
| | | .fetchInspectionSummary(opt) |
| | | .then((res) => { |
| | | if (res.success) { |
| | | data.value = res.data; |
| | | } |
| | | changeActive(); |
| | | }) |
| | | .finally(() => { |
| | | loading.value = false; |
| | | }); |
| | | } |
| | | |
| | | function onStep2() { |
| | | // changeActive(); |
| | | ElMessage.error('æä¸æä¾ä¸è½½'); |
| | | } |
| | | |
| | | function onStep3(val) {} |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BaseProdProcess |
| | | v-model:active="active" |
| | | @onStep1="onStep1" |
| | | @onStep2="onStep2" |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodmiddleApi from '@/api/fysp/dataprodmiddleApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | | |
| | | const { active, changeActive } = useProdStepChange(); |
| | | const loading = ref(false); |
| | | |
| | | function onStep1(opt) {} |
| | | |
| | | function onStep2() { |
| | | changeActive(); |
| | | } |
| | | |
| | | function onStep3(val) {} |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BaseProdProcess |
| | | v-model:active="active" |
| | | @onStep2="onStep2" |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | <template #step1> |
| | | <ProdQueryOptCompare @submit="onStep1"></ProdQueryOptCompare> |
| | | </template> |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodmiddleApi from '@/api/fysp/dataprodmiddleApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | | import ProdQueryOptCompare from '@/views/fysp/data-product/components/ProdQueryOptCompare.vue'; |
| | | |
| | | const { active, changeActive } = useProdStepChange(); |
| | | const loading = ref(false); |
| | | |
| | | function onStep1(opts) { |
| | | console.log('onStep1', opts); |
| | | } |
| | | |
| | | function onStep2() { |
| | | changeActive(); |
| | | } |
| | | |
| | | function onStep3(val) {} |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <BaseProdProcess |
| | | v-model:active="active" |
| | | @onStep1="onStep1" |
| | | @onStep2="onStep2" |
| | | @onStep3="onStep3" |
| | | :loading="loading" |
| | | > |
| | | <template #step2="{ contentHeight }"> |
| | | <el-scrollbar :height="contentHeight"> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-table |
| | | id="prod-problem-type-table" |
| | | :data="tableData" |
| | | v-loading="loading" |
| | | table-layout="fixed" |
| | | :show-overflow-tooltip="true" |
| | | size="small" |
| | | border |
| | | > |
| | | <el-table-column |
| | | fixed="left" |
| | | type="index" |
| | | label="ç¼å·" |
| | | width="50" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | | fixed="left" |
| | | prop="typeName" |
| | | label="é®é¢ç±»å" |
| | | min-width="200" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column prop="count" label="æ°é" min-width="50" /> |
| | | <el-table-column |
| | | prop="ratio" |
| | | label="æ¬æå æ¯" |
| | | min-width="70" |
| | | :formatter="ratioFormat" |
| | | /> |
| | | <el-table-column |
| | | prop="ratioDiff" |
| | | label="è¾ä¸æå æ¯åå" |
| | | min-width="70" |
| | | :formatter="ratioFormat" |
| | | /> |
| | | </el-table> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-row justify="center"> |
| | | <div ref="chartRef" style="height: 400px; width: 100%;max-width: 800px;"></div> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | </el-scrollbar> |
| | | </template> |
| | | </BaseProdProcess> |
| | | </template> |
| | | <script setup> |
| | | import { ref } from 'vue'; |
| | | import * as echarts from 'echarts'; |
| | | import BaseProdProcess from '@/views/fysp/data-product/components/BaseProdProcess.vue'; |
| | | import dataprodmiddleApi from '@/api/fysp/dataprodmiddleApi.js'; |
| | | import { conversionFromTable } from '@/utils/excel'; |
| | | import { useProdStepChange } from '@/views/fysp/data-product/prod-step-change.js'; |
| | | import dayjs from 'dayjs'; |
| | | import { pieChartOption, downloadChartImage } from '@/utils/echart-util.js'; |
| | | |
| | | const { active, changeActive } = useProdStepChange(); |
| | | const loading = ref(false); |
| | | const tableData = ref([]); |
| | | const chartRef = ref(null); |
| | | let chart; |
| | | |
| | | function onStep1(opt) { |
| | | loading.value = true; |
| | | dataprodmiddleApi |
| | | .fetchProblemTypeSummary(opt) |
| | | .then((res) => { |
| | | if (res.success) { |
| | | tableData.value = res.data; |
| | | } |
| | | changeActive(); |
| | | setTimeout(() => { |
| | | genChart(opt); |
| | | }, 500); |
| | | }) |
| | | .finally(() => { |
| | | loading.value = false; |
| | | }); |
| | | } |
| | | |
| | | function onStep2() { |
| | | changeActive(); |
| | | } |
| | | |
| | | function onStep3(val) { |
| | | if (val.downloadType == '1') { |
| | | loading.value = true; |
| | | // conversionFromTable('prod-problem-type-table', 'æ¬å°æ±¡æé®é¢ç±»åå æ¯æ¸
å'); |
| | | downloadChartImage(chart, 'æ¬å°æ±¡æé®é¢ç±»åå æ¯'); |
| | | loading.value = false; |
| | | } |
| | | } |
| | | |
| | | function genChart(opt) { |
| | | if (chart == undefined) { |
| | | chart = echarts.init(chartRef.value); |
| | | } |
| | | const startTime = dayjs(opt.startTime).format('YYYYå¹´MMæ'); |
| | | const option = pieChartOption(); |
| | | option.title.text = `${startTime}æ¬å°æ±¡æé®é¢ç±»åå æ¯`; |
| | | option.legend.data = tableData.value.map((item) => item.typeName); |
| | | option.series[0].name = 'é®é¢ç±»å'; |
| | | option.series[0].data = tableData.value.map((item) => ({ |
| | | name: item.typeName, |
| | | value: item.count |
| | | })); |
| | | chart.setOption(option); |
| | | } |
| | | |
| | | function ratioFormat(row, column, cellValue, index) { |
| | | return Math.round(cellValue * 1000) / 10 + '%'; |
| | | } |
| | | </script> |
| | |
| | | :total-count="total" |
| | | @search="onSearch" |
| | | :extraHeight="tabsHeaderHeight" |
| | | :defaultPageSize="10" |
| | | > |
| | | <!-- <template #options> </template> |
| | | <template #buttons> </template> --> |
| | | <template #options> |
| | | <FYOptionLocation |
| | | :disabled="true" |
| | | :checkStrictly="false" |
| | | :initValue="false" |
| | | :allOption="false" |
| | | :level="3" |
| | | v-model:value="formSearch._locations" |
| | | ></FYOptionLocation> |
| | | </template> |
| | | <!-- <template #buttons> </template> --> |
| | | <template #table-column> |
| | | <el-table-column |
| | | fixed="left" |
| | |
| | | |
| | | const tabsHeaderHeight = inject('tabsHeaderHeight', 0); |
| | | |
| | | const formSearch = ref({ |
| | | _locations: { |
| | | pCode: '31', |
| | | pName: '䏿µ·å¸', |
| | | cCode: '3100', |
| | | cName: '䏿µ·å¸', |
| | | dCode: '310106', |
| | | dName: 'éå®åº' |
| | | } |
| | | }); |
| | | // å¤é´æ½å·¥è®°å½åæ»æ° |
| | | const data = ref([]); |
| | | const total = ref(0); |