Compare commits
	
		
			15 Commits
		
	
	
		
			aa6ae82607
			...
			projects/m
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ceb411180f | ||
| 
						 | 
					53ec6dacd5 | ||
| 
						 | 
					72eb06bb2d | ||
| 
						 | 
					e0058df873 | ||
| 
						 | 
					691f63438a | ||
| 
						 | 
					cddd23855c | ||
| 
						 | 
					d9bfbf0d9a | ||
| 
						 | 
					8075325f50 | ||
| 
						 | 
					7c479072e0 | ||
| 
						 | 
					f3e02b01f1 | ||
| 
						 | 
					c02c26f359 | ||
| 
						 | 
					c7ef61b59b | ||
| 
						 | 
					13285cc2d4 | ||
| 
						 | 
					b11474a8e4 | ||
| 
						 | 
					feb2649c14 | 
							
								
								
									
										2
									
								
								.env.dev
									
									
									
									
									
								
							
							
						
						@@ -5,7 +5,7 @@ ENV = 'development'
 | 
				
			|||||||
VUE_APP_TITLE = 芋道管理系统
 | 
					VUE_APP_TITLE = 芋道管理系统
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 芋道管理系统/开发环境
 | 
					# 芋道管理系统/开发环境
 | 
				
			||||||
VUE_APP_BASE_API = 'http://192.168.0.30:48080'
 | 
					VUE_APP_BASE_API = 'http://192.168.1.61:48080'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# 路由懒加载
 | 
					# 路由懒加载
 | 
				
			||||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true
 | 
					VUE_CLI_BABEL_TRANSPILE_MODULES = true
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -53,6 +53,7 @@
 | 
				
			|||||||
    "highlight.js": "^11.9.0",
 | 
					    "highlight.js": "^11.9.0",
 | 
				
			||||||
    "js-beautify": "^1.15.1",
 | 
					    "js-beautify": "^1.15.1",
 | 
				
			||||||
    "jsencrypt": "3.3.1",
 | 
					    "jsencrypt": "3.3.1",
 | 
				
			||||||
 | 
					    "mockjs": "^1.1.0",
 | 
				
			||||||
    "moment": "^2.30.1",
 | 
					    "moment": "^2.30.1",
 | 
				
			||||||
    "nprogress": "0.2.0",
 | 
					    "nprogress": "0.2.0",
 | 
				
			||||||
    "quill": "^1.3.7",
 | 
					    "quill": "^1.3.7",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								src/assets/YouSheBiaoTiHei-2.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										
											BIN
										
									
								
								src/assets/bgearth.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.6 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/copilot-bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.5 MiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/export-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/full-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/bipv-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/chip-icon-2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 723 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/chip-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 609 B  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/exit-fullscreen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 2.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/fto-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/fullscreen.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/header-bg.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 24 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/images/homeindex/std-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								src/assets/pinicon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.6 KiB  | 
							
								
								
									
										105
									
								
								src/main.js
									
									
									
									
									
								
							
							
						
						@@ -1,68 +1,79 @@
 | 
				
			|||||||
import Vue from 'vue'
 | 
					import Vue from "vue";
 | 
				
			||||||
import Element from 'element-ui'
 | 
					import Element from "element-ui";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 修改如下样式文件,覆盖样式,或者新增样式文件
 | 
					// 修改如下样式文件,覆盖样式,或者新增样式文件
 | 
				
			||||||
import './assets/styles/element-variables.scss'
 | 
					import "./assets/styles/element-variables.scss";
 | 
				
			||||||
import '@/assets/styles/index.scss' // global css
 | 
					import "@/assets/styles/index.scss"; // global css
 | 
				
			||||||
import '@/assets/styles/ruoyi.scss' // ruoyi css
 | 
					import "@/assets/styles/ruoyi.scss"; // ruoyi css
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import App from './App'
 | 
					import App from "./App";
 | 
				
			||||||
import store from './store'
 | 
					import store from "./store";
 | 
				
			||||||
import router from './router'
 | 
					import router from "./router";
 | 
				
			||||||
import directive from './directive' // directive
 | 
					import directive from "./directive"; // directive
 | 
				
			||||||
import plugins from './plugins' // plugins
 | 
					import plugins from "./plugins"; // plugins
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import './assets/icons' // icon
 | 
					import "./assets/icons"; // icon
 | 
				
			||||||
import './permission' // permission control
 | 
					import "./permission"; // permission control
 | 
				
			||||||
import { getDicts } from "@/api/system/dict/data";
 | 
					import { getDicts } from "@/api/system/dict/data";
 | 
				
			||||||
import { parseTime, resetForm, handleTree, addBeginAndEndTime, divide } from "@/utils/ruoyi";
 | 
					import {
 | 
				
			||||||
 | 
					  parseTime,
 | 
				
			||||||
 | 
					  resetForm,
 | 
				
			||||||
 | 
					  handleTree,
 | 
				
			||||||
 | 
					  addBeginAndEndTime,
 | 
				
			||||||
 | 
					  divide,
 | 
				
			||||||
 | 
					} from "@/utils/ruoyi";
 | 
				
			||||||
import Pagination from "@/components/Pagination";
 | 
					import Pagination from "@/components/Pagination";
 | 
				
			||||||
// 自定义表格工具扩展
 | 
					// 自定义表格工具扩展
 | 
				
			||||||
import RightToolbar from "@/components/RightToolbar"
 | 
					import RightToolbar from "@/components/RightToolbar";
 | 
				
			||||||
// 代码高亮插件
 | 
					// 代码高亮插件
 | 
				
			||||||
// import hljs from 'highlight.js'
 | 
					// import hljs from 'highlight.js'
 | 
				
			||||||
// import 'highlight.js/styles/github-gist.css'
 | 
					// import 'highlight.js/styles/github-gist.css'
 | 
				
			||||||
import { DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2 } from "@/utils/dict";
 | 
					import {
 | 
				
			||||||
 | 
					  DICT_TYPE,
 | 
				
			||||||
 | 
					  getDictDataLabel,
 | 
				
			||||||
 | 
					  getDictDatas,
 | 
				
			||||||
 | 
					  getDictDatas2,
 | 
				
			||||||
 | 
					} from "@/utils/dict";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import './theme/index.css'; // 自定义主题包 - code-brick-zj
 | 
					import "./theme/index.css"; // 自定义主题包 - code-brick-zj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 全局方法挂载
 | 
					// 全局方法挂载
 | 
				
			||||||
Vue.prototype.getDicts = getDicts
 | 
					Vue.prototype.getDicts = getDicts;
 | 
				
			||||||
Vue.prototype.parseTime = parseTime
 | 
					Vue.prototype.parseTime = parseTime;
 | 
				
			||||||
Vue.prototype.resetForm = resetForm
 | 
					Vue.prototype.resetForm = resetForm;
 | 
				
			||||||
Vue.prototype.getDictDatas = getDictDatas
 | 
					Vue.prototype.getDictDatas = getDictDatas;
 | 
				
			||||||
Vue.prototype.getDictDatas2 = getDictDatas2
 | 
					Vue.prototype.getDictDatas2 = getDictDatas2;
 | 
				
			||||||
Vue.prototype.getDictDataLabel = getDictDataLabel
 | 
					Vue.prototype.getDictDataLabel = getDictDataLabel;
 | 
				
			||||||
Vue.prototype.DICT_TYPE = DICT_TYPE
 | 
					Vue.prototype.DICT_TYPE = DICT_TYPE;
 | 
				
			||||||
Vue.prototype.handleTree = handleTree
 | 
					Vue.prototype.handleTree = handleTree;
 | 
				
			||||||
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime
 | 
					Vue.prototype.addBeginAndEndTime = addBeginAndEndTime;
 | 
				
			||||||
Vue.prototype.divide = divide
 | 
					Vue.prototype.divide = divide;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 全局组件挂载
 | 
					// 全局组件挂载
 | 
				
			||||||
Vue.component('DictTag', DictTag)
 | 
					Vue.component("DictTag", DictTag);
 | 
				
			||||||
Vue.component('Pagination', Pagination)
 | 
					Vue.component("Pagination", Pagination);
 | 
				
			||||||
Vue.component('RightToolbar', RightToolbar)
 | 
					Vue.component("RightToolbar", RightToolbar);
 | 
				
			||||||
// 字典标签组件
 | 
					// 字典标签组件
 | 
				
			||||||
import DictTag from '@/components/DictTag'
 | 
					import DictTag from "@/components/DictTag";
 | 
				
			||||||
// 头部标签插件
 | 
					// 头部标签插件
 | 
				
			||||||
import VueMeta from 'vue-meta'
 | 
					import VueMeta from "vue-meta";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vue.use(directive)
 | 
					Vue.use(directive);
 | 
				
			||||||
Vue.use(plugins)
 | 
					Vue.use(plugins);
 | 
				
			||||||
Vue.use(VueMeta)
 | 
					Vue.use(VueMeta);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Form Generator 组件需要使用到 tinymce
 | 
					// Form Generator 组件需要使用到 tinymce
 | 
				
			||||||
import Tinymce from '@/components/tinymce/index.vue'
 | 
					import Tinymce from "@/components/tinymce/index.vue";
 | 
				
			||||||
Vue.component('tinymce', Tinymce)
 | 
					Vue.component("tinymce", Tinymce);
 | 
				
			||||||
import '@/assets/icons'
 | 
					import "@/assets/icons";
 | 
				
			||||||
import request from "@/utils/request"
 | 
					import request from "@/utils/request";
 | 
				
			||||||
console.log(request)
 | 
					console.log(request);
 | 
				
			||||||
Vue.prototype.$axios = request
 | 
					Vue.prototype.$axios = request;
 | 
				
			||||||
import '@/styles/index.scss'
 | 
					import "@/styles/index.scss";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 默认点击背景不关闭弹窗
 | 
					// 默认点击背景不关闭弹窗
 | 
				
			||||||
import ElementUI from 'element-ui'
 | 
					import ElementUI from "element-ui";
 | 
				
			||||||
ElementUI.Dialog.props.closeOnClickModal.default = false
 | 
					ElementUI.Dialog.props.closeOnClickModal.default = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * If you don't want to use mock-server
 | 
					 * If you don't want to use mock-server
 | 
				
			||||||
@@ -77,11 +88,11 @@ Vue.use(Element, {
 | 
				
			|||||||
  size: localStorage.getItem("size") || "medium", // set element-ui default size
 | 
					  size: localStorage.getItem("size") || "medium", // set element-ui default size
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vue.config.productionTip = false
 | 
					Vue.config.productionTip = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
new Vue({
 | 
					new Vue({
 | 
				
			||||||
  el: '#app',
 | 
					  el: "#app",
 | 
				
			||||||
  router,
 | 
					  router,
 | 
				
			||||||
  store,
 | 
					  store,
 | 
				
			||||||
  render: h => h(App)
 | 
					  render: (h) => h(App),
 | 
				
			||||||
})
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
 * @Author: zwq
 | 
					 * @Author: zwq
 | 
				
			||||||
 * @Date: 2022-08-24 11:19:43
 | 
					 * @Date: 2022-08-24 11:19:43
 | 
				
			||||||
 * @LastEditors: zwq
 | 
					 * @LastEditors: zwq
 | 
				
			||||||
 * @LastEditTime: 2024-04-02 09:34:56
 | 
					 * @LastEditTime: 2024-04-09 16:56:16
 | 
				
			||||||
 * @Description:
 | 
					 * @Description:
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
import { listData } from "@/api/system/dict/data"; //数据字典接口
 | 
					import { listData } from "@/api/system/dict/data"; //数据字典接口
 | 
				
			||||||
@@ -14,7 +14,7 @@ export default {
 | 
				
			|||||||
        createURL: '', //新增接口
 | 
					        createURL: '', //新增接口
 | 
				
			||||||
        updateURL: '', //编辑提交接口
 | 
					        updateURL: '', //编辑提交接口
 | 
				
			||||||
        infoURL: '', //编辑时获取单条数据接口
 | 
					        infoURL: '', //编辑时获取单条数据接口
 | 
				
			||||||
        codeURL: '', //获取code接口(返回结果为dataForm.code字段)
 | 
					        codeURL: null, //获取code接口(返回结果为dataForm.code字段)
 | 
				
			||||||
        optionArrUrl: [], //需要获取下拉框的方法数组
 | 
					        optionArrUrl: [], //需要获取下拉框的方法数组
 | 
				
			||||||
        optionArr: {}, //需要获取下拉框的方法数组的返回结果
 | 
					        optionArr: {}, //需要获取下拉框的方法数组的返回结果
 | 
				
			||||||
        dictNameList: [], //数据字典name数组
 | 
					        dictNameList: [], //数据字典name数组
 | 
				
			||||||
@@ -35,7 +35,7 @@ export default {
 | 
				
			|||||||
      if (this.urlOptions.optionArrUrl.length > 0) {
 | 
					      if (this.urlOptions.optionArrUrl.length > 0) {
 | 
				
			||||||
        this.getArr()
 | 
					        this.getArr()
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (this.urlOptions.dictNameList > 0) {
 | 
					      if (this.urlOptions.dictNameList.length > 0) {
 | 
				
			||||||
        this.getDict()
 | 
					        this.getDict()
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      this.$nextTick(() => {
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
@@ -78,7 +78,7 @@ export default {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
    /** 查询字典数据列表 */
 | 
					    /** 查询字典数据列表 */
 | 
				
			||||||
    getDict() {
 | 
					    getDict() {
 | 
				
			||||||
      this.dictNameList.forEach((item,index)=>{
 | 
					      this.urlOptions.dictNameList.forEach((item,index)=>{
 | 
				
			||||||
        const queryParams = {
 | 
					        const queryParams = {
 | 
				
			||||||
          pageNo: 1,
 | 
					          pageNo: 1,
 | 
				
			||||||
          pageSize: 99,
 | 
					          pageSize: 99,
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										101
									
								
								src/mixins/chart.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,101 @@
 | 
				
			|||||||
 | 
					import * as echarts from "echarts";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function __resizeHandler(entries) {
 | 
				
			||||||
 | 
					  for (const entry of entries) {
 | 
				
			||||||
 | 
					    if (entry.contentBoxSize) {
 | 
				
			||||||
 | 
					      // manipulate contentBoxSize
 | 
				
			||||||
 | 
					      const contentBoxSize = Array.isArray(entry.contentBoxSize)
 | 
				
			||||||
 | 
					        ? entry.contentBoxSize[0]
 | 
				
			||||||
 | 
					        : entry.contentBoxSize;
 | 
				
			||||||
 | 
					      this.chart_mixin_chartInstance.resize({
 | 
				
			||||||
 | 
					        width:
 | 
				
			||||||
 | 
					          contentBoxSize.inlineSize < this.MIN_WIDTH
 | 
				
			||||||
 | 
					            ? this.MIN_WIDTH
 | 
				
			||||||
 | 
					            : contentBoxSize.inlineSize,
 | 
				
			||||||
 | 
					        height: contentBoxSize.blockSize,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      // manipulate contentRect
 | 
				
			||||||
 | 
					      this.chart_mixin_chartInstance.resize({
 | 
				
			||||||
 | 
					        width:
 | 
				
			||||||
 | 
					          entry.contentRect.width < this.MIN_WIDTH
 | 
				
			||||||
 | 
					            ? this.MIN_WIDTH
 | 
				
			||||||
 | 
					            : entry.contentRect.width,
 | 
				
			||||||
 | 
					        height: entry.contentRect.height,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    const resizeObserver = new ResizeObserver(__resizeHandler.bind(this));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      MIN_WIDTH: 400,
 | 
				
			||||||
 | 
					      chart_mixin_chartInstance: null,
 | 
				
			||||||
 | 
					      chart_mixin_observer: resizeObserver,
 | 
				
			||||||
 | 
					      chart_mixin_options: {
 | 
				
			||||||
 | 
					        grid: {
 | 
				
			||||||
 | 
					          left: "3%",
 | 
				
			||||||
 | 
					          right: "4%",
 | 
				
			||||||
 | 
					          bottom: "3%",
 | 
				
			||||||
 | 
					          containLabel: true,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tooltip: {},
 | 
				
			||||||
 | 
					        legend: {
 | 
				
			||||||
 | 
					          data: ["Sales"],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        xAxis: {
 | 
				
			||||||
 | 
					          data: [
 | 
				
			||||||
 | 
					            "shirt",
 | 
				
			||||||
 | 
					            "cardign",
 | 
				
			||||||
 | 
					            "chiffon shirt",
 | 
				
			||||||
 | 
					            "pants",
 | 
				
			||||||
 | 
					            "heels",
 | 
				
			||||||
 | 
					            "socks",
 | 
				
			||||||
 | 
					          ],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        yAxis: {},
 | 
				
			||||||
 | 
					        series: [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "Sales",
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            data: [5, 20, 36, 10, 10, 20],
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    // this.$nextTick(() => {
 | 
				
			||||||
 | 
					    //   this.initChart().then(() => {
 | 
				
			||||||
 | 
					    //     this.initOptions(this.chart_mixin_options);
 | 
				
			||||||
 | 
					    //     this.initListener();
 | 
				
			||||||
 | 
					    //   });
 | 
				
			||||||
 | 
					    // });
 | 
				
			||||||
 | 
					    this.initChart();
 | 
				
			||||||
 | 
					    this.initListener();
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    initChart() {
 | 
				
			||||||
 | 
					      (this.$refs.chart ||
 | 
				
			||||||
 | 
					        console.warn('[mixins/chart] 注意是否有 ref="chart" 的元素存在')) &&
 | 
				
			||||||
 | 
					        (this.chart_mixin_chartInstance = echarts.init(this.$refs.chart));
 | 
				
			||||||
 | 
					      //   return new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					      //     this.$refs.chart ? resolve(true) : reject(false);
 | 
				
			||||||
 | 
					      //   });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    initOptions(options) {
 | 
				
			||||||
 | 
					      this.chart_mixin_chartInstance.setOption(options);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    initListener() {
 | 
				
			||||||
 | 
					      this.chart_mixin_observer.observe(this.$refs.chart);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  beforeDestroy() {
 | 
				
			||||||
 | 
					    if (this.chart_mixin_chartInstance) {
 | 
				
			||||||
 | 
					      this.chart_mixin_chartInstance.dispose();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										23
									
								
								src/mixins/fullscreen.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					import screenfull from "screenfull";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      isFullscreen: false,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
 | 
				
			||||||
 | 
					    isFullscreen(val) {
 | 
				
			||||||
 | 
					      // 暴露一个全屏状态改变的回调函数
 | 
				
			||||||
 | 
					      this.fullscreenCallback(val);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    if (screenfull.isEnabled) {
 | 
				
			||||||
 | 
					      screenfull.on("change", () => {
 | 
				
			||||||
 | 
					        this.isFullscreen = screenfull.isFullscreen;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -18,6 +18,9 @@ const getters = {
 | 
				
			|||||||
  defaultRoutes:state => state.permission.defaultRoutes,
 | 
					  defaultRoutes:state => state.permission.defaultRoutes,
 | 
				
			||||||
  sidebarRouters:state => state.permission.sidebarRouters,
 | 
					  sidebarRouters:state => state.permission.sidebarRouters,
 | 
				
			||||||
  // 数据字典
 | 
					  // 数据字典
 | 
				
			||||||
  dict_datas: state => state.dict.dictDatas
 | 
					  dict_datas: state => state.dict.dictDatas,
 | 
				
			||||||
 | 
					  // 驾驶舱和首页
 | 
				
			||||||
 | 
					  home: state => state.copilot.home,
 | 
				
			||||||
 | 
					  copilot: state => state.copilot.copilot,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
export default getters
 | 
					export default getters
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,6 +6,7 @@ import tagsView from './modules/tagsView'
 | 
				
			|||||||
import permission from './modules/permission'
 | 
					import permission from './modules/permission'
 | 
				
			||||||
import settings from './modules/settings'
 | 
					import settings from './modules/settings'
 | 
				
			||||||
import dict from './modules/dict'
 | 
					import dict from './modules/dict'
 | 
				
			||||||
 | 
					import copilot from './modules/home'
 | 
				
			||||||
import getters from './getters'
 | 
					import getters from './getters'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Vue.use(Vuex)
 | 
					Vue.use(Vuex)
 | 
				
			||||||
@@ -17,7 +18,8 @@ const store = new Vuex.Store({
 | 
				
			|||||||
    tagsView,
 | 
					    tagsView,
 | 
				
			||||||
    permission,
 | 
					    permission,
 | 
				
			||||||
    settings,
 | 
					    settings,
 | 
				
			||||||
    dict
 | 
					    dict,
 | 
				
			||||||
 | 
					    copilot
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  getters
 | 
					  getters
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										195
									
								
								src/store/modules/home.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,195 @@
 | 
				
			|||||||
 | 
					import axios from "@/utils/request";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function random_default() {
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					  let a = Math.floor(Math.random() * 1000);
 | 
				
			||||||
 | 
					  while (a < 600) {
 | 
				
			||||||
 | 
					    a = Math.floor(Math.random() * 1000);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return a;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 接口 */
 | 
				
			||||||
 | 
					async function getHomeInfo() {
 | 
				
			||||||
 | 
					  const { code, data } = await axios.post("/ip/prod-output/query-by-date", {
 | 
				
			||||||
 | 
					    factorys: [],
 | 
				
			||||||
 | 
					    date: 4,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  if (code == 0) {
 | 
				
			||||||
 | 
					    return data;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  console.warn("getHomeInfo failed, code: ", code);
 | 
				
			||||||
 | 
					  return null;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function getHomeTarget() {
 | 
				
			||||||
 | 
					  const { code, data } = await axios.post("/ip/prod-target/query-by-date", {
 | 
				
			||||||
 | 
					    factorys: [],
 | 
				
			||||||
 | 
					    date: 4,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  if (code == 0) {
 | 
				
			||||||
 | 
					    return data;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  console.warn("getHomeTarget failed, code: ", code);
 | 
				
			||||||
 | 
					  return null;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 状态 */
 | 
				
			||||||
 | 
					const state = {
 | 
				
			||||||
 | 
					  copilot: {
 | 
				
			||||||
 | 
					    /* 产量驾驶舱 */
 | 
				
			||||||
 | 
					    yield: {},
 | 
				
			||||||
 | 
					    /* 能源驾驶舱 */
 | 
				
			||||||
 | 
					    energy: {},
 | 
				
			||||||
 | 
					    /* 效率驾驶舱 */
 | 
				
			||||||
 | 
					    efficiency: {},
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  home: {
 | 
				
			||||||
 | 
					    ftoInvest: null,
 | 
				
			||||||
 | 
					    chipInvest: null,
 | 
				
			||||||
 | 
					    chipOutput: null,
 | 
				
			||||||
 | 
					    stdOutput: null,
 | 
				
			||||||
 | 
					    bipvOutput: null,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const mutations = {
 | 
				
			||||||
 | 
					  SET_HOME_INFO: (state, payload) => {
 | 
				
			||||||
 | 
					    state.home.ftoInvest = payload.ftoInvest;
 | 
				
			||||||
 | 
					    state.home.chipInvest = payload.chipInvest;
 | 
				
			||||||
 | 
					    state.home.chipOutput = payload.chipOutput;
 | 
				
			||||||
 | 
					    state.home.stdOutput = payload.stdOutput;
 | 
				
			||||||
 | 
					    state.home.bipvOutput = payload.bipvOutput;
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  SET_COPILOT_INFO: (state) => {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const actions = {
 | 
				
			||||||
 | 
					  /** 初始化首页数据 */
 | 
				
			||||||
 | 
					  async initHome({ commit }) {
 | 
				
			||||||
 | 
					    const dataArr = await getHomeInfo();
 | 
				
			||||||
 | 
					    const targetArr = await getHomeTarget();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const chipInvest = {
 | 
				
			||||||
 | 
					      current: Array(7).fill(0),
 | 
				
			||||||
 | 
					      previous: Array(7).fill(0),
 | 
				
			||||||
 | 
					    }; // 芯片投入
 | 
				
			||||||
 | 
					    const ftoInvest = {
 | 
				
			||||||
 | 
					      current: Array(7).fill(0),
 | 
				
			||||||
 | 
					      previous: Array(7).fill(0),
 | 
				
			||||||
 | 
					    }; // FTO投入
 | 
				
			||||||
 | 
					    const chipOutput = {
 | 
				
			||||||
 | 
					      current: Array(7).fill(0),
 | 
				
			||||||
 | 
					      previous: Array(7).fill(0),
 | 
				
			||||||
 | 
					      target: Array(7).fill(0),
 | 
				
			||||||
 | 
					    }; // 芯片产出
 | 
				
			||||||
 | 
					    const stdOutput = {
 | 
				
			||||||
 | 
					      current: Array(7).fill(0),
 | 
				
			||||||
 | 
					      previous: Array(7).fill(0),
 | 
				
			||||||
 | 
					      target: Array(7).fill(0),
 | 
				
			||||||
 | 
					    }; // 标准组件产出
 | 
				
			||||||
 | 
					    const bipvOutput = {
 | 
				
			||||||
 | 
					      current: Array(7).fill(0),
 | 
				
			||||||
 | 
					      previous: Array(7).fill(0),
 | 
				
			||||||
 | 
					      target: Array(7).fill(0),
 | 
				
			||||||
 | 
					    }; // BIPV产出
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (dataArr) {
 | 
				
			||||||
 | 
					      for (const factory of dataArr) {
 | 
				
			||||||
 | 
					        /* 工厂索引 */
 | 
				
			||||||
 | 
					        const factoryId = factory.factory;
 | 
				
			||||||
 | 
					        /* 收集目标数据 */
 | 
				
			||||||
 | 
					        if (targetArr) {
 | 
				
			||||||
 | 
					          const target = targetArr.find((item) => item.factory === factoryId);
 | 
				
			||||||
 | 
					          if (target) {
 | 
				
			||||||
 | 
					            chipOutput.target.splice(factoryId, 1, target.chipYield ?? 0);
 | 
				
			||||||
 | 
					            stdOutput.target.splice(factoryId, 1, target.componentYield ?? 0);
 | 
				
			||||||
 | 
					            bipvOutput.target.splice(factoryId, 1, target.bipvProductOutput ?? 0);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        /* 收集芯片投入数据 */
 | 
				
			||||||
 | 
					        chipInvest.current.splice(
 | 
				
			||||||
 | 
					          factoryId,
 | 
				
			||||||
 | 
					          1,
 | 
				
			||||||
 | 
					          factory.inputNumber ?? random_default()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        chipInvest.previous.splice(
 | 
				
			||||||
 | 
					          factoryId,
 | 
				
			||||||
 | 
					          1,
 | 
				
			||||||
 | 
					          factory.previousYearInputNumber ?? random_default()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        /* 收集FTO投入数据 */
 | 
				
			||||||
 | 
					        ftoInvest.current.splice(
 | 
				
			||||||
 | 
					          factoryId,
 | 
				
			||||||
 | 
					          1,
 | 
				
			||||||
 | 
					          factory.chipInput ?? random_default()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        ftoInvest.previous.splice(
 | 
				
			||||||
 | 
					          factoryId,
 | 
				
			||||||
 | 
					          1,
 | 
				
			||||||
 | 
					          factory.previousYearChipInput ?? random_default()
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        /* 收集产出数据 */
 | 
				
			||||||
 | 
					        switch (factory.glassType) {
 | 
				
			||||||
 | 
					          case 0:
 | 
				
			||||||
 | 
					            // 玻璃芯片 产出
 | 
				
			||||||
 | 
					            chipOutput.current.splice(
 | 
				
			||||||
 | 
					              factoryId,
 | 
				
			||||||
 | 
					              1,
 | 
				
			||||||
 | 
					              factory.outputNumber ?? random_default()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            chipOutput.previous.splice(
 | 
				
			||||||
 | 
					              factoryId,
 | 
				
			||||||
 | 
					              1,
 | 
				
			||||||
 | 
					              factory.previousYearOutputNumber ?? random_default()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					          case 1:
 | 
				
			||||||
 | 
					            // 标准组件 产出
 | 
				
			||||||
 | 
					            stdOutput.current.splice(
 | 
				
			||||||
 | 
					              factoryId,
 | 
				
			||||||
 | 
					              1,
 | 
				
			||||||
 | 
					              factory.outputNumber ?? random_default()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            stdOutput.previous.splice(
 | 
				
			||||||
 | 
					              factoryId,
 | 
				
			||||||
 | 
					              1,
 | 
				
			||||||
 | 
					              factory.previousYearOutputNumber ?? random_default()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					          case 2:
 | 
				
			||||||
 | 
					            // BIPV 产出
 | 
				
			||||||
 | 
					            bipvOutput.current.splice(
 | 
				
			||||||
 | 
					              factoryId,
 | 
				
			||||||
 | 
					              1,
 | 
				
			||||||
 | 
					              factory.outputNumber ?? random_default()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            bipvOutput.previous.splice(
 | 
				
			||||||
 | 
					              factoryId,
 | 
				
			||||||
 | 
					              1,
 | 
				
			||||||
 | 
					              factory.previousYearOutputNumber ?? random_default()
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /* 更新 state */
 | 
				
			||||||
 | 
					      commit("SET_HOME_INFO", {
 | 
				
			||||||
 | 
					        ftoInvest,
 | 
				
			||||||
 | 
					        chipInvest,
 | 
				
			||||||
 | 
					        chipOutput,
 | 
				
			||||||
 | 
					        stdOutput,
 | 
				
			||||||
 | 
					        bipvOutput,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  /** 初始化驾驶舱数据 */
 | 
				
			||||||
 | 
					  async initCopilot({ commit }) {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  namespaced: true,
 | 
				
			||||||
 | 
					  state,
 | 
				
			||||||
 | 
					  mutations,
 | 
				
			||||||
 | 
					  actions,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										69
									
								
								src/views/components/ChartContainer.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: ChartContainer.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 08:54:33
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					    todo: 驾驶舱和首页的 ChartContainer, 实现滑动条 和动态宽高
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="chart-container" :class="{ 'no-scroll': noScroll }">
 | 
				
			||||||
 | 
					    <slot />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "ChartContainer",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    noScroll: {
 | 
				
			||||||
 | 
					      type: Boolean,
 | 
				
			||||||
 | 
					      default: false,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.chart-container {
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  overflow-x: scroll;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.no-scroll::-webkit-scrollbar {
 | 
				
			||||||
 | 
					  width: 0;
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-scrollbar {
 | 
				
			||||||
 | 
					  width: 8px;
 | 
				
			||||||
 | 
					  height: 8px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-scrollbar-button {
 | 
				
			||||||
 | 
					  width: 0;
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					  //   width: 10px;
 | 
				
			||||||
 | 
					  //   height: 10px;
 | 
				
			||||||
 | 
					  //   background: #14305f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-scrollbar-track {
 | 
				
			||||||
 | 
					  background: #14305f;
 | 
				
			||||||
 | 
					  border: 0 none;
 | 
				
			||||||
 | 
					  border-radius: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					::-webkit-scrollbar-thumb {
 | 
				
			||||||
 | 
					  background: #004798;
 | 
				
			||||||
 | 
					  border: 0 none;
 | 
				
			||||||
 | 
					  border-radius: 6px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										226
									
								
								src/views/copilot/components/Container.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,226 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: Container.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-09 10:44:09
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="copilot-container">
 | 
				
			||||||
 | 
					    <!-- refresh btn  -->
 | 
				
			||||||
 | 
					    <button
 | 
				
			||||||
 | 
					      style="
 | 
				
			||||||
 | 
					        appearance: none;
 | 
				
			||||||
 | 
					        outline: none;
 | 
				
			||||||
 | 
					        border: none;
 | 
				
			||||||
 | 
					        background: none;
 | 
				
			||||||
 | 
					        color: #fff;
 | 
				
			||||||
 | 
					        cursor: pointer;
 | 
				
			||||||
 | 
					        position: absolute;
 | 
				
			||||||
 | 
					        top: 8px;
 | 
				
			||||||
 | 
					        right: 8px;
 | 
				
			||||||
 | 
					      "
 | 
				
			||||||
 | 
					      @click="$emit('refresh')"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <svg
 | 
				
			||||||
 | 
					        xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					        fill="none"
 | 
				
			||||||
 | 
					        viewBox="0 0 24 24"
 | 
				
			||||||
 | 
					        stroke-width="1.5"
 | 
				
			||||||
 | 
					        stroke="currentColor"
 | 
				
			||||||
 | 
					        style="width: 24px; height: 24px"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          stroke-linecap="round"
 | 
				
			||||||
 | 
					          stroke-linejoin="round"
 | 
				
			||||||
 | 
					          d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </svg>
 | 
				
			||||||
 | 
					    </button>
 | 
				
			||||||
 | 
					    <!-- decoration  -->
 | 
				
			||||||
 | 
					    <div class="corner tl"></div>
 | 
				
			||||||
 | 
					    <div class="corner tr"></div>
 | 
				
			||||||
 | 
					    <div v-if="side == 'left'" class="corner bl"></div>
 | 
				
			||||||
 | 
					    <div v-if="side == 'right'" class="corner br"></div>
 | 
				
			||||||
 | 
					    <!-- content  -->
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="container-head"
 | 
				
			||||||
 | 
					      :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <Icon :icon="icon"></Icon>
 | 
				
			||||||
 | 
					      <h2 class="container-title">{{ title }}</h2>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="container-body"
 | 
				
			||||||
 | 
					      :class="[
 | 
				
			||||||
 | 
					        side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
 | 
				
			||||||
 | 
					      ]"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <slot />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import ContainerIconVue from "./ContainerIcon.vue";
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "DashboardContainer",
 | 
				
			||||||
 | 
					  components: {
 | 
				
			||||||
 | 
					    Icon: ContainerIconVue,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    side: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "left",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    icon: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "cube",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    title: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "Default Title",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.copilot-container {
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  box-shadow: inset 0 0 20px 1px #fff1;
 | 
				
			||||||
 | 
					  backdrop-filter: blur(4px);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &::before {
 | 
				
			||||||
 | 
					    content: "";
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    display: inline-block;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    width: 0.11415vw;
 | 
				
			||||||
 | 
					    border-radius: 2px;
 | 
				
			||||||
 | 
					    top: 0%;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					    background: radial-gradient(circle at center , #024798 2%, #024798 30%, transparent);
 | 
				
			||||||
 | 
					    z-index: 1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &::after {
 | 
				
			||||||
 | 
					    content: "";
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    display: inline-block;
 | 
				
			||||||
 | 
					    width: 60%;
 | 
				
			||||||
 | 
					    height: 0.31415vh;
 | 
				
			||||||
 | 
					    border-radius: 2px;
 | 
				
			||||||
 | 
					    left: 8%;
 | 
				
			||||||
 | 
					    bottom: 0;
 | 
				
			||||||
 | 
					    background: linear-gradient(to right, #024798, transparent);
 | 
				
			||||||
 | 
					    z-index: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .container-head {
 | 
				
			||||||
 | 
					    // height: 40px;
 | 
				
			||||||
 | 
					    height: 3.8vh;
 | 
				
			||||||
 | 
					    padding: 8px;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    gap: 8px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .container-title {
 | 
				
			||||||
 | 
					      font-size: 1.18vw;
 | 
				
			||||||
 | 
					      line-height: 1.39vw;
 | 
				
			||||||
 | 
					      font-weight: normal;
 | 
				
			||||||
 | 
					      letter-spacing: 2px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .container-body {
 | 
				
			||||||
 | 
					    padding: 12px;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    flex: 1;
 | 
				
			||||||
 | 
					    height: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner {
 | 
				
			||||||
 | 
					    z-index: 1;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    // width: 16px;
 | 
				
			||||||
 | 
					    // height: 16px;
 | 
				
			||||||
 | 
					    width: 0.95vw;
 | 
				
			||||||
 | 
					    height: 0.95vw;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.tl {
 | 
				
			||||||
 | 
					    border-top: 2px solid #0175dc;
 | 
				
			||||||
 | 
					    border-left: 2px solid #0175dc;
 | 
				
			||||||
 | 
					    top: 0;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.tr {
 | 
				
			||||||
 | 
					    top: 0;
 | 
				
			||||||
 | 
					    right: 0;
 | 
				
			||||||
 | 
					    border-top: 2px solid #0175dc;
 | 
				
			||||||
 | 
					    border-right: 2px solid #0175dc;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.bl {
 | 
				
			||||||
 | 
					    // width: 20px;
 | 
				
			||||||
 | 
					    // height: 20px;
 | 
				
			||||||
 | 
					    width: 1.064vw;
 | 
				
			||||||
 | 
					    height: 1.064vw;
 | 
				
			||||||
 | 
					    bottom: 0;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					    // border-left: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    // border-bottom: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    // border-top: 10px solid transparent;
 | 
				
			||||||
 | 
					    // border-right: 10px solid transparent;
 | 
				
			||||||
 | 
					    border-left: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					    border-bottom: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					    border-top: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					    border-right: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.br {
 | 
				
			||||||
 | 
					    bottom: 0;
 | 
				
			||||||
 | 
					    right: 0;
 | 
				
			||||||
 | 
					    // width: 20px;
 | 
				
			||||||
 | 
					    // height: 20px;
 | 
				
			||||||
 | 
					    width: 1.064vw;
 | 
				
			||||||
 | 
					    height: 1.064vw;
 | 
				
			||||||
 | 
					    // border-left: 10px solid transparent;
 | 
				
			||||||
 | 
					    // border-bottom: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    // border-top: 10px solid transparent;
 | 
				
			||||||
 | 
					    // border-right: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    border-left: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					    border-bottom: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					    border-top: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					    border-right: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .gradient-to-right {
 | 
				
			||||||
 | 
					    background: linear-gradient(to right, #0c3f68cc, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .gradient-to-left {
 | 
				
			||||||
 | 
					    background: linear-gradient(to left, #0c3f68cc, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .body-gradient-to-right {
 | 
				
			||||||
 | 
					    background: linear-gradient(to right, #0003, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .body-gradient-to-left {
 | 
				
			||||||
 | 
					    background: linear-gradient(to left, #0003, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										58
									
								
								src/views/copilot/components/ContainerIcon.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: ContainerIcon.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-09 16:41:36
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="container-icon" :style="bgStyle"></div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import cube from "@/assets/images/homeindex/fto-icon.png";
 | 
				
			||||||
 | 
					import chip from "@/assets/images/homeindex/chip-icon.png";
 | 
				
			||||||
 | 
					import chip2 from "@/assets/images/homeindex/chip-icon-2.png";
 | 
				
			||||||
 | 
					import bipv from "@/assets/images/homeindex/bipv-icon.png";
 | 
				
			||||||
 | 
					import std from "@/assets/images/homeindex/std-icon.png";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "ContainerIcon",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    icon: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "cube",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    bgStyle() {
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        cube:
 | 
				
			||||||
 | 
					          "background: url(" + cube + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        chip:
 | 
				
			||||||
 | 
					          "background: url(" + chip + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        chip2:
 | 
				
			||||||
 | 
					          "background: url(" + chip2 + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        bipv:
 | 
				
			||||||
 | 
					          "background: url(" + bipv + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        std: "background: url(" + std + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					      }[this.icon];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.container-icon {
 | 
				
			||||||
 | 
					  //   width: 32px;
 | 
				
			||||||
 | 
					  //   height: 32px;
 | 
				
			||||||
 | 
					  width: 1.701vw;
 | 
				
			||||||
 | 
					  height: 1.701vw;
 | 
				
			||||||
 | 
					  background: #ccc2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										127
									
								
								src/views/copilot/components/CopilotHeader.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,127 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: CopilotHeader.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-16 15:14:01
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="copilot-header">
 | 
				
			||||||
 | 
					    <section class="menu">
 | 
				
			||||||
 | 
					      <CopilotButton
 | 
				
			||||||
 | 
					        v-for="i in ['产量', '效率', '能源']"
 | 
				
			||||||
 | 
					        :key="i"
 | 
				
			||||||
 | 
					        :label="i"
 | 
				
			||||||
 | 
					        :active="i === active"
 | 
				
			||||||
 | 
					        @click="() => $emit('update:active', i)"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					    <section class="menu">
 | 
				
			||||||
 | 
					      <CopilotButton
 | 
				
			||||||
 | 
					        v-for="i in ['日', '周', '月', '年']"
 | 
				
			||||||
 | 
					        :key="i"
 | 
				
			||||||
 | 
					        :label="i"
 | 
				
			||||||
 | 
					        :active="i === period"
 | 
				
			||||||
 | 
					        @click="() => $emit('update:period', i)"
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					      <div class="btn-group">
 | 
				
			||||||
 | 
					        <button type="button" class="export-btn" />
 | 
				
			||||||
 | 
					        <button
 | 
				
			||||||
 | 
					          type="button"
 | 
				
			||||||
 | 
					          class="fullscreen-btn"
 | 
				
			||||||
 | 
					          :class="[isFullscreen ? 'exit-fullscreen' : '']"
 | 
				
			||||||
 | 
					          @click="toggleFullScreen"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					    <div class="page-title">{{ active }}驾驶舱</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import CopilotButton from "./button.vue";
 | 
				
			||||||
 | 
					import screenfull from "screenfull";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "CopilotHeader",
 | 
				
			||||||
 | 
					  components: { CopilotButton },
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    active: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    period: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      isFullscreen: false,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    toggleFullScreen() {
 | 
				
			||||||
 | 
					      this.isFullscreen = !this.isFullscreen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      screenfull.toggle(document.querySelector(".copilot-layout"));
 | 
				
			||||||
 | 
					      // 矫正宽度
 | 
				
			||||||
 | 
					      // const el = document.querySelector(".copilot-layout");
 | 
				
			||||||
 | 
					      // el.style.width = this.isFullscreen ? "100vw" : "calc(100vw - 54px)";
 | 
				
			||||||
 | 
					      // el.style.left = this.isFullscreen ? "0" : "54px";
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: 优设标题黑;
 | 
				
			||||||
 | 
					  src: url(../../../assets/YouSheBiaoTiHei-2.ttf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-header {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  gap: 12px;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-header > section {
 | 
				
			||||||
 | 
					  width: 24vw;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					  gap: 8px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.export-btn,
 | 
				
			||||||
 | 
					.fullscreen-btn {
 | 
				
			||||||
 | 
					  width: 32px;
 | 
				
			||||||
 | 
					  height: 32px;
 | 
				
			||||||
 | 
					  margin-left: 24px;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.export-btn {
 | 
				
			||||||
 | 
					  background: url(../../../assets/images/export-icon.png) 0 0 / 100% 100%
 | 
				
			||||||
 | 
					    no-repeat;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.fullscreen-btn {
 | 
				
			||||||
 | 
					  background: url(../../../assets/images/full-icon.png) 0 0 / 100% 100%
 | 
				
			||||||
 | 
					    no-repeat;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.exit-fullscreen {
 | 
				
			||||||
 | 
					  background: url(../../../assets/images/homeindex/exit-fullscreen.png) 0 0 / 100% 100%
 | 
				
			||||||
 | 
					    no-repeat;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.page-title {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  font-size: 54px;
 | 
				
			||||||
 | 
					  line-height: 70px;
 | 
				
			||||||
 | 
					  letter-spacing: 5px;
 | 
				
			||||||
 | 
					  font-family: 优设标题黑;
 | 
				
			||||||
 | 
					  color: #6db6ff;
 | 
				
			||||||
 | 
					  text-align: right;
 | 
				
			||||||
 | 
					  user-select: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										90
									
								
								src/views/copilot/components/button.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,90 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: button.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-16 15:02:34
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <button
 | 
				
			||||||
 | 
					    class="copilot-btn"
 | 
				
			||||||
 | 
					    :class="[active ? 'active' : '']"
 | 
				
			||||||
 | 
					    @click="$emit('click', label)"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    {{ label }}
 | 
				
			||||||
 | 
					  </button>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "CopilotButton",
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    label: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    active: {
 | 
				
			||||||
 | 
					      type: Boolean,
 | 
				
			||||||
 | 
					      default: false,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					button {
 | 
				
			||||||
 | 
					  appearance: none;
 | 
				
			||||||
 | 
					  outline: none;
 | 
				
			||||||
 | 
					  border: none;
 | 
				
			||||||
 | 
					  background: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.copilot-btn {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  background: #006acd40;
 | 
				
			||||||
 | 
					  backdrop-filter: blur(3px);
 | 
				
			||||||
 | 
					  text-align: center;
 | 
				
			||||||
 | 
					  padding: 12px;
 | 
				
			||||||
 | 
					  padding-left: 20px;
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  font-size: 22px;
 | 
				
			||||||
 | 
					  letter-spacing: 10px;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-btn.active {
 | 
				
			||||||
 | 
					  background: linear-gradient(
 | 
				
			||||||
 | 
					    to top,
 | 
				
			||||||
 | 
					    #159aff99,
 | 
				
			||||||
 | 
					    #159aff44,
 | 
				
			||||||
 | 
					    #006acd40
 | 
				
			||||||
 | 
					  ) !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-btn::before,
 | 
				
			||||||
 | 
					.copilot-btn::after {
 | 
				
			||||||
 | 
					  content: "";
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  width: 16px;
 | 
				
			||||||
 | 
					  height: 16px;
 | 
				
			||||||
 | 
					  top: 0;
 | 
				
			||||||
 | 
					  background: transparent;
 | 
				
			||||||
 | 
					  border-style: solid;
 | 
				
			||||||
 | 
					  border-width: 2px;
 | 
				
			||||||
 | 
					  border-color: transparent;
 | 
				
			||||||
 | 
					  border-top-color: #007be4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-btn::before {
 | 
				
			||||||
 | 
					  left: 0;
 | 
				
			||||||
 | 
					  border-left-color: #007be4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-btn::after {
 | 
				
			||||||
 | 
					  right: 0;
 | 
				
			||||||
 | 
					  border-right-color: #007be4;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/views/copilot/components/charts/BipvOutput.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: BipvOutput.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-17 09:55:12
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <DoubleRingWrapperVue />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import DoubleRingWrapperVue from "./base/DoubleRingWrapper.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "BipvOutput",
 | 
				
			||||||
 | 
					  components: { DoubleRingWrapperVue },
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.flex-1 {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.stretch {
 | 
				
			||||||
 | 
					  align-self: stretch;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/views/copilot/components/charts/ChipOutput.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: ChipOutput.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-17 09:55:12
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <DoubleRingWrapperVue />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import DoubleRingWrapperVue from "./base/DoubleRingWrapper.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "ChipOutput",
 | 
				
			||||||
 | 
					  components: { DoubleRingWrapperVue },
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.flex-1 {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.stretch {
 | 
				
			||||||
 | 
					  align-self: stretch;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/views/copilot/components/charts/StdOutput.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: StdOutput.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-17 09:55:12
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <DoubleRingWrapperVue />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import DoubleRingWrapperVue from "./base/DoubleRingWrapper.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "StdOutput",
 | 
				
			||||||
 | 
					  components: { DoubleRingWrapperVue },
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.flex-1 {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.stretch {
 | 
				
			||||||
 | 
					  align-self: stretch;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										119
									
								
								src/views/copilot/components/charts/base/DoubleRingChart.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,119 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: DoubleRingChart.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-17 11:01:55
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="double-ring-chart">
 | 
				
			||||||
 | 
					    <div ref="chart" class="double-ring-chart__container"></div>
 | 
				
			||||||
 | 
					    <!--   :style="{ height: vHeight + 'vh' }" -->
 | 
				
			||||||
 | 
					    <div class="double-ring-chart__legend">
 | 
				
			||||||
 | 
					      <div v-for="item in legendItems" :key="item.label" class="legend-item">
 | 
				
			||||||
 | 
					        <span class="legend-item__label">{{ item.label }}</span>
 | 
				
			||||||
 | 
					        <span class="legend-item__value">{{
 | 
				
			||||||
 | 
					          item.value.toLocaleString()
 | 
				
			||||||
 | 
					        }}</span>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import chartMixin from "@/mixins/chart.js";
 | 
				
			||||||
 | 
					import fullscreenMixin from "@/mixins/fullscreen.js";
 | 
				
			||||||
 | 
					import options from "./double-ring-chart-options";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "DoubleRingChart",
 | 
				
			||||||
 | 
					  mixins: [chartMixin, fullscreenMixin],
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    vHeight: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 24,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    legendItems: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      default: () => [
 | 
				
			||||||
 | 
					        { label: "2023年累计", value: 88002 },
 | 
				
			||||||
 | 
					        { label: "2024年累计", value: 88002 },
 | 
				
			||||||
 | 
					        { label: "2025年累计", value: 88002 },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    this.initOptions(options);
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    // fullscreen mixin 需要的回调
 | 
				
			||||||
 | 
					    fullscreenCallback(isFullscreen) {
 | 
				
			||||||
 | 
					      console.log("isFullscreen--->", isFullscreen);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.double-ring-chart {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.double-ring-chart__container {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.double-ring-chart__legend {
 | 
				
			||||||
 | 
					  padding: 12px;
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  justify-content: center;
 | 
				
			||||||
 | 
					  gap: 32px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.legend-item {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  align-items: flex-start;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.legend-item__label {
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.legend-item__label::before {
 | 
				
			||||||
 | 
					  content: "";
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  width: 12px;
 | 
				
			||||||
 | 
					  height: 12px;
 | 
				
			||||||
 | 
					  background: #ccc;
 | 
				
			||||||
 | 
					  border-radius: 2px;
 | 
				
			||||||
 | 
					  top: 6px;
 | 
				
			||||||
 | 
					  left: -18px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.legend-item:nth-child(1) .legend-item__label::before {
 | 
				
			||||||
 | 
					  background: #0f65ff;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.legend-item:nth-child(1) .legend-item__value {
 | 
				
			||||||
 | 
					  color: #0f65ff;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.legend-item:nth-child(2) .legend-item__label::before {
 | 
				
			||||||
 | 
					  background: #12fff5;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.legend-item:nth-child(2) .legend-item__value {
 | 
				
			||||||
 | 
					  color: #12fff5;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.legend-item:nth-child(3) .legend-item__label::before {
 | 
				
			||||||
 | 
					  background: #003982;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: DoubleRingWrapper.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-17 09:55:12
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="double-ring-wrapper">
 | 
				
			||||||
 | 
					    <copilot-select :options="cityOptions" />
 | 
				
			||||||
 | 
					    <div class="flex-1 stretch">
 | 
				
			||||||
 | 
					      <DoubleRingChartVue />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import CopilotSelect from "../../select.vue";
 | 
				
			||||||
 | 
					import fetcher from "./fetcherDoubleRing";
 | 
				
			||||||
 | 
					import DoubleRingChartVue from "./DoubleRingChart.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "DoubleRingWrapper",
 | 
				
			||||||
 | 
					  components: { CopilotSelect, DoubleRingChartVue },
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      cityOptions: [
 | 
				
			||||||
 | 
					        "成都",
 | 
				
			||||||
 | 
					        "邯郸",
 | 
				
			||||||
 | 
					        "株洲",
 | 
				
			||||||
 | 
					        "瑞昌",
 | 
				
			||||||
 | 
					        "佳木斯",
 | 
				
			||||||
 | 
					        "凯盛光伏",
 | 
				
			||||||
 | 
					        "蚌埠兴科",
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    fetcher.getData().then((res) => {
 | 
				
			||||||
 | 
					      console.log("getData--->", res);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.double-ring-wrapper {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					  padding: 12px 24px;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  gap: 12px;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.flex-1 {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.stretch {
 | 
				
			||||||
 | 
					  align-self: stretch;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -0,0 +1,127 @@
 | 
				
			|||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  grid: {
 | 
				
			||||||
 | 
					    left: 0,
 | 
				
			||||||
 | 
					    right: 0,
 | 
				
			||||||
 | 
					    bottom: 0,
 | 
				
			||||||
 | 
					    top: 0,
 | 
				
			||||||
 | 
					    containLabel: true,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  tooltip: {},
 | 
				
			||||||
 | 
					  title: {
 | 
				
			||||||
 | 
					    text: "78%",
 | 
				
			||||||
 | 
					    left: "50%",
 | 
				
			||||||
 | 
					    top: "40%",
 | 
				
			||||||
 | 
					    textAlign: "center",
 | 
				
			||||||
 | 
					    textStyle: {
 | 
				
			||||||
 | 
					      fontWeight: 600,
 | 
				
			||||||
 | 
					      fontSize: 32,
 | 
				
			||||||
 | 
					      color: "#fffd",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    subtext: "\u200224年累计产出\u2002",
 | 
				
			||||||
 | 
					    subtextStyle: {
 | 
				
			||||||
 | 
					      fontSize: 14,
 | 
				
			||||||
 | 
					      fontWeight: 100,
 | 
				
			||||||
 | 
					      color: "#fffd",
 | 
				
			||||||
 | 
					      align: "right",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  series: [
 | 
				
			||||||
 | 
					    // 背景 series - 2024计划
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      type: "pie",
 | 
				
			||||||
 | 
					      name: "2024目标",
 | 
				
			||||||
 | 
					      radius: ["70%", "85%"],
 | 
				
			||||||
 | 
					      center: ["50%", "52%"],
 | 
				
			||||||
 | 
					      emptyCircleStyle: {
 | 
				
			||||||
 | 
					        color: "#042c5f33",
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    // 数据 series - 2024累计
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      type: "pie",
 | 
				
			||||||
 | 
					      radius: ["70%", "85%"],
 | 
				
			||||||
 | 
					      center: ["50%", "52%"],
 | 
				
			||||||
 | 
					      avoidLabelOvervlap: false,
 | 
				
			||||||
 | 
					      label: {
 | 
				
			||||||
 | 
					        show: false,
 | 
				
			||||||
 | 
					        // position: "center",
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      labelLine: {
 | 
				
			||||||
 | 
					        show: false,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      data: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          value: 90,
 | 
				
			||||||
 | 
					          name: "2024累计产出",
 | 
				
			||||||
 | 
					          selected: false,
 | 
				
			||||||
 | 
					          itemStyle: {
 | 
				
			||||||
 | 
					            borderJoin: "round",
 | 
				
			||||||
 | 
					            borderCap: "round",
 | 
				
			||||||
 | 
					            borderWidth: 12,
 | 
				
			||||||
 | 
					            borderRadius: "50%",
 | 
				
			||||||
 | 
					            color: {
 | 
				
			||||||
 | 
					              type: "linear",
 | 
				
			||||||
 | 
					              x: 1,
 | 
				
			||||||
 | 
					              y: 0,
 | 
				
			||||||
 | 
					              x2: 0,
 | 
				
			||||||
 | 
					              y2: 1,
 | 
				
			||||||
 | 
					              colorStops: [
 | 
				
			||||||
 | 
					                { offset: 0, color: "#4CF0E811" },
 | 
				
			||||||
 | 
					                { offset: 1, color: "#4CF0E8" },
 | 
				
			||||||
 | 
					              ],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          value: 20,
 | 
				
			||||||
 | 
					          name: "-",
 | 
				
			||||||
 | 
					          itemStyle: { color: "transparent" },
 | 
				
			||||||
 | 
					          label: { show: false },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    // 数据 series2 - 2023累计
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      type: "pie",
 | 
				
			||||||
 | 
					      radius: ["55%", "70%"],
 | 
				
			||||||
 | 
					      center: ["50%", "52%"],
 | 
				
			||||||
 | 
					      avoidLabelOvervlap: false,
 | 
				
			||||||
 | 
					      label: {
 | 
				
			||||||
 | 
					        show: false,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      labelLine: {
 | 
				
			||||||
 | 
					        show: false,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      data: [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          value: 90,
 | 
				
			||||||
 | 
					          name: "2023累计产出",
 | 
				
			||||||
 | 
					          selected: false,
 | 
				
			||||||
 | 
					          itemStyle: {
 | 
				
			||||||
 | 
					            borderJoin: "round",
 | 
				
			||||||
 | 
					            borderCap: "round",
 | 
				
			||||||
 | 
					            borderWidth: 12,
 | 
				
			||||||
 | 
					            borderRadius: "50%",
 | 
				
			||||||
 | 
					            color: {
 | 
				
			||||||
 | 
					              type: "linear",
 | 
				
			||||||
 | 
					              x: 1,
 | 
				
			||||||
 | 
					              y: 0,
 | 
				
			||||||
 | 
					              x2: 0,
 | 
				
			||||||
 | 
					              y2: 1,
 | 
				
			||||||
 | 
					              colorStops: [
 | 
				
			||||||
 | 
					                { offset: 0, color: "#1065ff66" },
 | 
				
			||||||
 | 
					                { offset: 1, color: "#1065ff" },
 | 
				
			||||||
 | 
					              ],
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          value: 20,
 | 
				
			||||||
 | 
					          name: "-",
 | 
				
			||||||
 | 
					          itemStyle: { color: "transparent" },
 | 
				
			||||||
 | 
					          label: { show: false },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  getData: async function (url) {
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    return await new Promise((resolve, reject) => {
 | 
				
			||||||
 | 
					      setTimeout(() => {
 | 
				
			||||||
 | 
					        resolve([90119, 40801, 44028]);
 | 
				
			||||||
 | 
					      }, 1200);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										0
									
								
								src/views/copilot/components/name.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										75
									
								
								src/views/copilot/components/select.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: select.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-17 09:50:03
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div style="display: inline-block; text-align: center">
 | 
				
			||||||
 | 
					    <div class="copilot-select">
 | 
				
			||||||
 | 
					      <button
 | 
				
			||||||
 | 
					        type="button"
 | 
				
			||||||
 | 
					        v-for="item in options"
 | 
				
			||||||
 | 
					        :key="item"
 | 
				
			||||||
 | 
					        @click="currentActive = item"
 | 
				
			||||||
 | 
					        :class="[item == currentActive ? 'active' : '']"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        {{ item }}
 | 
				
			||||||
 | 
					      </button>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "CopilotSelect",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    options: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      default: () => [],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      currentActive: '',
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.copilot-select {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  align-items: center;
 | 
				
			||||||
 | 
					  background: #01306c;
 | 
				
			||||||
 | 
					  border-radius: 4px;
 | 
				
			||||||
 | 
					  overflow: hidden;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button {
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  padding: 8px 12px;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  transition: all .3s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button.active,
 | 
				
			||||||
 | 
					button:hover {
 | 
				
			||||||
 | 
					  background: #1d74d8;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					button:not(:first-child)::before {
 | 
				
			||||||
 | 
					  content: "";
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  top: 20%;
 | 
				
			||||||
 | 
					  left: -1px;
 | 
				
			||||||
 | 
					  width: 2px;
 | 
				
			||||||
 | 
					  height: 60%;
 | 
				
			||||||
 | 
					  background: #02236d;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										76
									
								
								src/views/copilot/container.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: container.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-16 14:51:25
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="copilot-layout">
 | 
				
			||||||
 | 
					    <CopilotHeaderVue
 | 
				
			||||||
 | 
					      :active="page"
 | 
				
			||||||
 | 
					      :period="period"
 | 
				
			||||||
 | 
					      @update:active="page = $event"
 | 
				
			||||||
 | 
					      @update:period="period = $event"
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <YieldCopilot v-if="page == '产量'" :period="period" />
 | 
				
			||||||
 | 
					    <EnergyCopilot v-if="page == '能源'" :period="period" />
 | 
				
			||||||
 | 
					    <EfficiencyCopilot v-if="page == '效率'" :period="period" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="copilot-footer">© 中建材智能自动化研究院有限公司</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import CopilotHeaderVue from "./components/CopilotHeader.vue";
 | 
				
			||||||
 | 
					import YieldCopilot from "./yield/index.vue";
 | 
				
			||||||
 | 
					import EnergyCopilot from "./energy/index.vue";
 | 
				
			||||||
 | 
					import EfficiencyCopilot from "./efficiency/index.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "CopilotContainer",
 | 
				
			||||||
 | 
					  components: {
 | 
				
			||||||
 | 
					    CopilotHeaderVue,
 | 
				
			||||||
 | 
					    YieldCopilot,
 | 
				
			||||||
 | 
					    EnergyCopilot,
 | 
				
			||||||
 | 
					    EfficiencyCopilot,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      page: "产量",
 | 
				
			||||||
 | 
					      period: "日",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					.copilot-layout {
 | 
				
			||||||
 | 
					  padding: 16px;
 | 
				
			||||||
 | 
					  background: url(../../assets/images/copilot-bg.png) 0 0 / 100% 100% no-repeat;
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  height: calc(100% + 38px);
 | 
				
			||||||
 | 
					  left: -16px;
 | 
				
			||||||
 | 
					  top: -8px;
 | 
				
			||||||
 | 
					  width: calc(100% + 30px);
 | 
				
			||||||
 | 
					  z-index: 1001;
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  gap: 8px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.copilot-footer {
 | 
				
			||||||
 | 
					  /** position: absolute;
 | 
				
			||||||
 | 
					  bottom: 10px; **/
 | 
				
			||||||
 | 
					  height: 10px;
 | 
				
			||||||
 | 
					  width: 100%;
 | 
				
			||||||
 | 
					  color: rgb(80, 80, 80);
 | 
				
			||||||
 | 
					  user-select: none;
 | 
				
			||||||
 | 
					  font-size: 14px;
 | 
				
			||||||
 | 
					  letter-spacing: 1px;
 | 
				
			||||||
 | 
					  display: grid;
 | 
				
			||||||
 | 
					  place-content: center;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										42
									
								
								src/views/copilot/efficiency/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,42 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: index.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-16 14:40:15
 | 
				
			||||||
 | 
					    description: 效率驾驶舱
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="efficiency-copilot">
 | 
				
			||||||
 | 
					    <db-container title="芯片良率" icon="chip2"></db-container>
 | 
				
			||||||
 | 
					    <db-container title="标准组件良率" icon="std"></db-container>
 | 
				
			||||||
 | 
					    <db-container title="芯片OEE" icon="chip"></db-container>
 | 
				
			||||||
 | 
					    <db-container title="转化效率" icon="cube"></db-container>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import Container from "../../dashboard/components/Container.vue";
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "EfficiencyCopilot",
 | 
				
			||||||
 | 
					  components: { DbContainer: Container },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.efficiency-copilot {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  display: grid;
 | 
				
			||||||
 | 
					  gap: 16px;
 | 
				
			||||||
 | 
					  grid-template-columns: 1fr 1fr;
 | 
				
			||||||
 | 
					  grid-template-rows: 1fr 1fr;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.efficiency-copilot > div {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										25
									
								
								src/views/copilot/energy/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: index.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-16 14:40:15
 | 
				
			||||||
 | 
					    description: 能源驾驶舱
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="energy-copilot">能源驾驶舱</div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "EnergyCopilot",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped></style>
 | 
				
			||||||
							
								
								
									
										74
									
								
								src/views/copilot/yield/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: index.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-16 14:40:15
 | 
				
			||||||
 | 
					    description: 产量驾驶舱
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="yield-copilot">
 | 
				
			||||||
 | 
					    <section class="top flex">
 | 
				
			||||||
 | 
					      <db-container class="std-yield" title="标准组件产出" icon="std">
 | 
				
			||||||
 | 
					        <std-output />
 | 
				
			||||||
 | 
					      </db-container>
 | 
				
			||||||
 | 
					      <db-container class="chip-yield" title="芯片产出" icon="chip2">
 | 
				
			||||||
 | 
					        <chip-output />
 | 
				
			||||||
 | 
					      </db-container>
 | 
				
			||||||
 | 
					      <db-container class="bipv-yield" title="BIPV产出" icon="bipv">
 | 
				
			||||||
 | 
					        <bipv-output />
 | 
				
			||||||
 | 
					      </db-container>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					    <section class="bottom flex">
 | 
				
			||||||
 | 
					      <db-container class="fto-involve" title="FTO投入"></db-container>
 | 
				
			||||||
 | 
					      <db-container
 | 
				
			||||||
 | 
					        class="chip-involve"
 | 
				
			||||||
 | 
					        title="芯片投入"
 | 
				
			||||||
 | 
					        icon="chip"
 | 
				
			||||||
 | 
					      ></db-container>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import Container from "../components/Container.vue";
 | 
				
			||||||
 | 
					import StdOutputVue from "../components/charts/StdOutput.vue";
 | 
				
			||||||
 | 
					import ChipOutputVue from "../components/charts/ChipOutput.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import BipvOutputVue from "../components/charts/BipvOutput.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "YieldCopilot",
 | 
				
			||||||
 | 
					  components: {
 | 
				
			||||||
 | 
					    DbContainer: Container,
 | 
				
			||||||
 | 
					    StdOutput: StdOutputVue,
 | 
				
			||||||
 | 
					    ChipOutput: ChipOutputVue,
 | 
				
			||||||
 | 
					    BipvOutput: BipvOutputVue,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.yield-copilot {
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  gap: 16px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.flex {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  gap: 16px;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.top > div,
 | 
				
			||||||
 | 
					.bottom > div {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										89
									
								
								src/views/dashboard/charts/Bipv.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: Bipv.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 15:39:54
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <right-chart-base
 | 
				
			||||||
 | 
					    :legend="legend"
 | 
				
			||||||
 | 
					    :series="series"
 | 
				
			||||||
 | 
					    :xAxis="xAxis"
 | 
				
			||||||
 | 
					    :vHeight="20.5"
 | 
				
			||||||
 | 
					    class="bipv-chart"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import RightChartBase from "./RightChartBase.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "BipvChart",
 | 
				
			||||||
 | 
					  components: { RightChartBase },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    const year = new Date().getFullYear();
 | 
				
			||||||
 | 
					    // 城市数组的顺序必须是固定的
 | 
				
			||||||
 | 
					    const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"];
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      legend: [
 | 
				
			||||||
 | 
					        { label: `${year}年目标值`, color: "#f3c000" },
 | 
				
			||||||
 | 
					        { label: `${year - 1}年`, color: "#12f7f1" },
 | 
				
			||||||
 | 
					        { label: `${year}年`, color: "#58adfa" },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      xAxis: cities,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    series() {
 | 
				
			||||||
 | 
					      const bipvOutput = this.$store.getters.home.bipvOutput;
 | 
				
			||||||
 | 
					      // const bipvTarget = this.$store.getters.home.bipvTarget;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (
 | 
				
			||||||
 | 
					        !bipvOutput ||
 | 
				
			||||||
 | 
					        !bipvOutput.current ||
 | 
				
			||||||
 | 
					        !bipvOutput.previous ||
 | 
				
			||||||
 | 
					        !bipvOutput.target
 | 
				
			||||||
 | 
					      ) {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2024年目标值",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2023年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2024年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear()}年目标值`,
 | 
				
			||||||
 | 
					          data: bipvOutput.target,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear() - 1}年`,
 | 
				
			||||||
 | 
					          data: bipvOutput.previous,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear()}年`,
 | 
				
			||||||
 | 
					          data: bipvOutput.current,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss"></style>
 | 
				
			||||||
							
								
								
									
										70
									
								
								src/views/dashboard/charts/ChipInvest.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,70 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: chip-invest.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 08:59:28
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <left-chart-base
 | 
				
			||||||
 | 
					    :legend="legend"
 | 
				
			||||||
 | 
					    :series="series"
 | 
				
			||||||
 | 
					    :xAxis="xAxis"
 | 
				
			||||||
 | 
					    class="chip-invest-chart"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import LeftChartBase from "./LeftChartBase.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "chip-investChart",
 | 
				
			||||||
 | 
					  components: { LeftChartBase },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    const year = new Date().getFullYear();
 | 
				
			||||||
 | 
					    // 城市数组的顺序必须是固定的
 | 
				
			||||||
 | 
					    const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"];
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      legend: [
 | 
				
			||||||
 | 
					        { label: `${year - 1}年`, color: "#12f7f1" },
 | 
				
			||||||
 | 
					        { label: `${year}年`, color: "#58adfa" },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      xAxis: cities,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    series() {
 | 
				
			||||||
 | 
					      const chipInvest = this.$store.getters.home.chipInvest;
 | 
				
			||||||
 | 
					      console.log("FTO ==> ", chipInvest);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!chipInvest || !chipInvest.current || !chipInvest.previous) {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2023年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2024年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear() - 1}年`,
 | 
				
			||||||
 | 
					          data: chipInvest.previous,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear()}年`,
 | 
				
			||||||
 | 
					          data: chipInvest.current,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
							
								
								
									
										231
									
								
								src/views/dashboard/charts/ChipYield.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,231 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: ChipYield.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-11 10:46:47
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="chip-yield">
 | 
				
			||||||
 | 
					    <chip-yield-chart :factory="activeLoc" />
 | 
				
			||||||
 | 
					    <section class="right-part">
 | 
				
			||||||
 | 
					      <div class="yield-location">
 | 
				
			||||||
 | 
					        <section class="btn-group">
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '1'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '1' ? 'active' : ''"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            成都
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '2'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '2' ? 'active' : ''"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            邯郸
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '3'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '3' ? 'active' : ''"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            株洲
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '4'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '4' ? 'active' : ''"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            瑞昌
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					        </section>
 | 
				
			||||||
 | 
					        <section class="btn-group">
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '5'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '5' ? 'active' : ''"
 | 
				
			||||||
 | 
					            class="fixwidth"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            佳木斯
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '6'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '6' ? 'active' : ''"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            凯盛光伏
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					          <button
 | 
				
			||||||
 | 
					            @click="activeLoc = '7'"
 | 
				
			||||||
 | 
					            :class="activeLoc === '7' ? 'active' : ''"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            蚌埠兴科
 | 
				
			||||||
 | 
					          </button>
 | 
				
			||||||
 | 
					        </section>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div class="yield-summary">
 | 
				
			||||||
 | 
					        <div class="legend">
 | 
				
			||||||
 | 
					          <span class="legend-label">2024年累计</span>
 | 
				
			||||||
 | 
					          <span class="legend-value deep-green">{{ output.current }}</span>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div class="legend">
 | 
				
			||||||
 | 
					          <span class="legend-label">2024年目标</span>
 | 
				
			||||||
 | 
					          <span class="legend-value">{{ output.target }}</span>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					        <div class="legend">
 | 
				
			||||||
 | 
					          <span class="legend-label">2023年累计</span>
 | 
				
			||||||
 | 
					          <span class="legend-value deep-blue">{{ output.previous }}</span>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </section>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import ChipYieldChart from "./ChipYieldChart.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "ChipYield",
 | 
				
			||||||
 | 
					  components: { ChipYieldChart },
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      activeLoc: "1",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    output() {
 | 
				
			||||||
 | 
					      // ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"]
 | 
				
			||||||
 | 
					      const chipOutput = this.$store.getters.home.chipOutput;
 | 
				
			||||||
 | 
					      if (
 | 
				
			||||||
 | 
					        !chipOutput ||
 | 
				
			||||||
 | 
					        !chipOutput.target ||
 | 
				
			||||||
 | 
					        !chipOutput.current ||
 | 
				
			||||||
 | 
					        !chipOutput.previous
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					          target: 0,
 | 
				
			||||||
 | 
					          current: 0,
 | 
				
			||||||
 | 
					          previous: 0,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      const index =
 | 
				
			||||||
 | 
					        this.activeLoc == "1"
 | 
				
			||||||
 | 
					          ? 4
 | 
				
			||||||
 | 
					          : this.activeLoc == "2"
 | 
				
			||||||
 | 
					          ? 1
 | 
				
			||||||
 | 
					          : this.activeLoc == "3"
 | 
				
			||||||
 | 
					          ? 2
 | 
				
			||||||
 | 
					          : this.activeLoc == "4"
 | 
				
			||||||
 | 
					          ? 0
 | 
				
			||||||
 | 
					          : this.activeLoc == "5"
 | 
				
			||||||
 | 
					          ? 3
 | 
				
			||||||
 | 
					          : this.activeLoc == "6"
 | 
				
			||||||
 | 
					          ? 5
 | 
				
			||||||
 | 
					          : 6;
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        target: parseInt(chipOutput.target[index]).toLocaleString(),
 | 
				
			||||||
 | 
					        current: parseInt(chipOutput.current[index]).toLocaleString(),
 | 
				
			||||||
 | 
					        previous: parseInt(chipOutput.previous[index]).toLocaleString(),
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.chip-yield {
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  gap: 12px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .yield-location {
 | 
				
			||||||
 | 
					    margin-top: 2.2vh;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .btn-group {
 | 
				
			||||||
 | 
					      margin-top: 8px;
 | 
				
			||||||
 | 
					      display: flex;
 | 
				
			||||||
 | 
					      border-radius: 4px;
 | 
				
			||||||
 | 
					      overflow: hidden;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      button {
 | 
				
			||||||
 | 
					        flex: 1;
 | 
				
			||||||
 | 
					        appearance: none;
 | 
				
			||||||
 | 
					        outline: none;
 | 
				
			||||||
 | 
					        border: none;
 | 
				
			||||||
 | 
					        cursor: pointer;
 | 
				
			||||||
 | 
					        background: #01306c;
 | 
				
			||||||
 | 
					        color: #fff;
 | 
				
			||||||
 | 
					        padding: 8px 6px;
 | 
				
			||||||
 | 
					        font-size: 0.63vw;
 | 
				
			||||||
 | 
					        position: relative;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      button.fixwidth {
 | 
				
			||||||
 | 
					        flex: unset;
 | 
				
			||||||
 | 
					        width: 2.765vw;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      button:not(:first-child)::before {
 | 
				
			||||||
 | 
					        content: "";
 | 
				
			||||||
 | 
					        display: inline-block;
 | 
				
			||||||
 | 
					        width: 2px;
 | 
				
			||||||
 | 
					        height: 60%;
 | 
				
			||||||
 | 
					        background: #052141;
 | 
				
			||||||
 | 
					        position: absolute;
 | 
				
			||||||
 | 
					        top: 20%;
 | 
				
			||||||
 | 
					        left: -1px;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      button.active {
 | 
				
			||||||
 | 
					        background: #1d74d8;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .yield-summary {
 | 
				
			||||||
 | 
					    margin-top: 3vh;
 | 
				
			||||||
 | 
					    display: grid;
 | 
				
			||||||
 | 
					    gap: 0.56vw;
 | 
				
			||||||
 | 
					    grid-auto-rows: 40px;
 | 
				
			||||||
 | 
					    grid-template-columns: 1fr 1fr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .legend {
 | 
				
			||||||
 | 
					      border-radius: 4px;
 | 
				
			||||||
 | 
					      padding: 1px;
 | 
				
			||||||
 | 
					      display: flex;
 | 
				
			||||||
 | 
					      flex-direction: column;
 | 
				
			||||||
 | 
					      font-size: 0.725vw;
 | 
				
			||||||
 | 
					      padding-left: 0.88vw;
 | 
				
			||||||
 | 
					      position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      &::before {
 | 
				
			||||||
 | 
					        content: "";
 | 
				
			||||||
 | 
					        position: absolute;
 | 
				
			||||||
 | 
					        top: 20%;
 | 
				
			||||||
 | 
					        left: 0;
 | 
				
			||||||
 | 
					        width: 0.52vw;
 | 
				
			||||||
 | 
					        height: 0.52vw;
 | 
				
			||||||
 | 
					        border-radius: 2px;
 | 
				
			||||||
 | 
					        background: #ccc;
 | 
				
			||||||
 | 
					        display: inline-block;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      &:first-child::before {
 | 
				
			||||||
 | 
					        background: #11f0e8;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      &:nth-child(2)::before {
 | 
				
			||||||
 | 
					        background: #003982;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      &:last-child::before {
 | 
				
			||||||
 | 
					        background: #0551c7;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .deep-blue {
 | 
				
			||||||
 | 
					        color: #0551c7;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      .deep-green {
 | 
				
			||||||
 | 
					        color: #11f0e8;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										269
									
								
								src/views/dashboard/charts/ChipYieldChart.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,269 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: ChipYield.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-11 10:46:47
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <chart-container class="chip-yield-chart" :noScroll="true">
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      ref="chart"
 | 
				
			||||||
 | 
					      style="width: 10vw"
 | 
				
			||||||
 | 
					      :style="{ height: vHeight + 'vh' }"
 | 
				
			||||||
 | 
					    ></div>
 | 
				
			||||||
 | 
					  </chart-container>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import ChartContainerVue from "../../components/ChartContainer.vue";
 | 
				
			||||||
 | 
					import chartMixin from "@/mixins/chart.js";
 | 
				
			||||||
 | 
					import screenfull from "screenfull";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "ChipYield",
 | 
				
			||||||
 | 
					  components: { ChartContainer: ChartContainerVue },
 | 
				
			||||||
 | 
					  mixins: [chartMixin],
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    vHeight: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 22,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    factory: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "1",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    const year = new Date().getFullYear();
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      isFullscreen: false,
 | 
				
			||||||
 | 
					      options: {
 | 
				
			||||||
 | 
					        grid: {
 | 
				
			||||||
 | 
					          left: 0,
 | 
				
			||||||
 | 
					          right: 0,
 | 
				
			||||||
 | 
					          bottom: 0,
 | 
				
			||||||
 | 
					          top: 0,
 | 
				
			||||||
 | 
					          containLabel: true,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tooltip: {},
 | 
				
			||||||
 | 
					        title: {
 | 
				
			||||||
 | 
					          text: "0%",
 | 
				
			||||||
 | 
					          left: "48%",
 | 
				
			||||||
 | 
					          top: "40%",
 | 
				
			||||||
 | 
					          textAlign: "center",
 | 
				
			||||||
 | 
					          textStyle: {
 | 
				
			||||||
 | 
					            fontWeight: 600,
 | 
				
			||||||
 | 
					            fontSize: 32,
 | 
				
			||||||
 | 
					            color: "#fffd",
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          subtext: `\u2002${year}年累计产出\u2002`,
 | 
				
			||||||
 | 
					          subtextStyle: {
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					            fontWeight: 100,
 | 
				
			||||||
 | 
					            color: "#fffd",
 | 
				
			||||||
 | 
					            align: "right",
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        series: [
 | 
				
			||||||
 | 
					          // 背景 series - 2024计划
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            type: "pie",
 | 
				
			||||||
 | 
					            name: `${year}目标`,
 | 
				
			||||||
 | 
					            radius: ["70%", "85%"],
 | 
				
			||||||
 | 
					            center: ["50%", "52%"],
 | 
				
			||||||
 | 
					            emptyCircleStyle: {
 | 
				
			||||||
 | 
					              color: "#042c5f33",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          // 数据 series - 2024累计
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            type: "pie",
 | 
				
			||||||
 | 
					            radius: ["70%", "85%"],
 | 
				
			||||||
 | 
					            center: ["50%", "52%"],
 | 
				
			||||||
 | 
					            avoidLabelOvervlap: false,
 | 
				
			||||||
 | 
					            label: {
 | 
				
			||||||
 | 
					              show: false,
 | 
				
			||||||
 | 
					              // position: "center",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            labelLine: {
 | 
				
			||||||
 | 
					              show: false,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                value: 90,
 | 
				
			||||||
 | 
					                name: `${year}累计产出`,
 | 
				
			||||||
 | 
					                selected: false,
 | 
				
			||||||
 | 
					                itemStyle: {
 | 
				
			||||||
 | 
					                  borderJoin: "round",
 | 
				
			||||||
 | 
					                  borderCap: "round",
 | 
				
			||||||
 | 
					                  borderWidth: 12,
 | 
				
			||||||
 | 
					                  borderRadius: "50%",
 | 
				
			||||||
 | 
					                  color: {
 | 
				
			||||||
 | 
					                    type: "linear",
 | 
				
			||||||
 | 
					                    x: 1,
 | 
				
			||||||
 | 
					                    y: 0,
 | 
				
			||||||
 | 
					                    x2: 0,
 | 
				
			||||||
 | 
					                    y2: 1,
 | 
				
			||||||
 | 
					                    colorStops: [
 | 
				
			||||||
 | 
					                      { offset: 0, color: "#4CF0E811" },
 | 
				
			||||||
 | 
					                      { offset: 1, color: "#4CF0E8" },
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                value: 20,
 | 
				
			||||||
 | 
					                name: "-",
 | 
				
			||||||
 | 
					                itemStyle: { color: "transparent" },
 | 
				
			||||||
 | 
					                label: { show: false },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          // 数据 series2 - 2023累计
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            type: "pie",
 | 
				
			||||||
 | 
					            radius: ["55%", "70%"],
 | 
				
			||||||
 | 
					            center: ["50%", "52%"],
 | 
				
			||||||
 | 
					            avoidLabelOvervlap: false,
 | 
				
			||||||
 | 
					            label: {
 | 
				
			||||||
 | 
					              show: false,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            labelLine: {
 | 
				
			||||||
 | 
					              show: false,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                value: 90,
 | 
				
			||||||
 | 
					                name: `${year - 1}累计产出`,
 | 
				
			||||||
 | 
					                selected: false,
 | 
				
			||||||
 | 
					                itemStyle: {
 | 
				
			||||||
 | 
					                  borderJoin: "round",
 | 
				
			||||||
 | 
					                  borderCap: "round",
 | 
				
			||||||
 | 
					                  borderWidth: 12,
 | 
				
			||||||
 | 
					                  borderRadius: "50%",
 | 
				
			||||||
 | 
					                  color: {
 | 
				
			||||||
 | 
					                    type: "linear",
 | 
				
			||||||
 | 
					                    x: 1,
 | 
				
			||||||
 | 
					                    y: 0,
 | 
				
			||||||
 | 
					                    x2: 0,
 | 
				
			||||||
 | 
					                    y2: 1,
 | 
				
			||||||
 | 
					                    colorStops: [
 | 
				
			||||||
 | 
					                      { offset: 0, color: "#1065ff66" },
 | 
				
			||||||
 | 
					                      { offset: 1, color: "#1065ff" },
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                value: 0,
 | 
				
			||||||
 | 
					                name: "-",
 | 
				
			||||||
 | 
					                itemStyle: { color: "transparent" },
 | 
				
			||||||
 | 
					                label: { show: false },
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    output() {
 | 
				
			||||||
 | 
					      const chipOutput = this.$store.getters.home.chipOutput;
 | 
				
			||||||
 | 
					      if (
 | 
				
			||||||
 | 
					        !chipOutput ||
 | 
				
			||||||
 | 
					        !chipOutput.target ||
 | 
				
			||||||
 | 
					        !chipOutput.current ||
 | 
				
			||||||
 | 
					        !chipOutput.previous
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					          target: 0,
 | 
				
			||||||
 | 
					          current: 0,
 | 
				
			||||||
 | 
					          previous: 0,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      const index =
 | 
				
			||||||
 | 
					        this.factory == "1"
 | 
				
			||||||
 | 
					          ? 4
 | 
				
			||||||
 | 
					          : this.factory == "2"
 | 
				
			||||||
 | 
					          ? 1
 | 
				
			||||||
 | 
					          : this.factory == "3"
 | 
				
			||||||
 | 
					          ? 2
 | 
				
			||||||
 | 
					          : this.factory == "4"
 | 
				
			||||||
 | 
					          ? 0
 | 
				
			||||||
 | 
					          : this.factory == "5"
 | 
				
			||||||
 | 
					          ? 3
 | 
				
			||||||
 | 
					          : this.factory == "6"
 | 
				
			||||||
 | 
					          ? 5
 | 
				
			||||||
 | 
					          : 6;
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        target: chipOutput.target[index], //  parseInt(chipOutput.target[index]).toLocaleString(),
 | 
				
			||||||
 | 
					        current: chipOutput.current[index], //  parseInt(chipOutput.current[index]).toLocaleString(),
 | 
				
			||||||
 | 
					        previous: chipOutput.previous[index], //  parseInt(chipOutput.previous[index]).toLocaleString(),
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    actualOptions() {
 | 
				
			||||||
 | 
					      const options = JSON.parse(JSON.stringify(this.options));
 | 
				
			||||||
 | 
					      // 标题
 | 
				
			||||||
 | 
					      if (!this.output.target) options.title.text = "0%";
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					        options.title.text =
 | 
				
			||||||
 | 
					          (this.output.current / this.output.target) * 100 + "%";
 | 
				
			||||||
 | 
					      // 外环
 | 
				
			||||||
 | 
					      if (
 | 
				
			||||||
 | 
					        this.output.current == this.output.target &&
 | 
				
			||||||
 | 
					        this.output.current == 0
 | 
				
			||||||
 | 
					      ) {
 | 
				
			||||||
 | 
					        options.series[1].data[0].value = 0;
 | 
				
			||||||
 | 
					        options.series[1].data[1].value = 100;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        options.series[1].data[0].value = this.output.current;
 | 
				
			||||||
 | 
					        options.series[1].data[1].value =
 | 
				
			||||||
 | 
					          this.output.target - this.output.current;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // 内环
 | 
				
			||||||
 | 
					      if (this.output.previous == 0) {
 | 
				
			||||||
 | 
					        options.series[2].data[0].value = 0;
 | 
				
			||||||
 | 
					        options.series[2].data[1].value = 100;
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        options.series[2].data[0].value = this.output.previous;
 | 
				
			||||||
 | 
					        options.series[2].data[1].value = 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return options;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
 | 
				
			||||||
 | 
					    isFullscreen(val) {
 | 
				
			||||||
 | 
					      // this.options.title.top = val ? "40%" : "37%";
 | 
				
			||||||
 | 
					      this.options.title.textStyle.fontSize = val ? 48 : 32;
 | 
				
			||||||
 | 
					      this.options.title.subtextStyle.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      // this.options.title.subtextStyle.fontSize = val ? 18 : 14;
 | 
				
			||||||
 | 
					      this.initOptions(this.actualOptions);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    factory(val) {
 | 
				
			||||||
 | 
					      this.initOptions(this.actualOptions);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    console.log("mounted", this.actualOptions);
 | 
				
			||||||
 | 
					    /** 清除 MIN_WIDTH, 此处比较特殊, 需要这么一步, 去除 chart mixin 的滚动条功能 */
 | 
				
			||||||
 | 
					    this.MIN_WIDTH = 0;
 | 
				
			||||||
 | 
					    this.initOptions(this.actualOptions);
 | 
				
			||||||
 | 
					    debugger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (screenfull.isEnabled) {
 | 
				
			||||||
 | 
					      screenfull.on("change", () => {
 | 
				
			||||||
 | 
					        this.isFullscreen = screenfull.isFullscreen;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.chip-yield-chart {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  overflow: visible;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										68
									
								
								src/views/dashboard/charts/Fto.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: fto.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 08:59:28
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <left-chart-base
 | 
				
			||||||
 | 
					    :legend="legend"
 | 
				
			||||||
 | 
					    :series="series"
 | 
				
			||||||
 | 
					    :xAxis="xAxis"
 | 
				
			||||||
 | 
					    class="fto-chart"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import LeftChartBase from "./LeftChartBase.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "FtoChart",
 | 
				
			||||||
 | 
					  components: { LeftChartBase },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    const year = new Date().getFullYear();
 | 
				
			||||||
 | 
					    // 城市数组的顺序必须是固定的
 | 
				
			||||||
 | 
					    const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"];
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      legend: [
 | 
				
			||||||
 | 
					        { label: `${year - 1}年`, color: "#12f7f1" },
 | 
				
			||||||
 | 
					        { label: `${year}年`, color: "#58adfa" },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      xAxis: cities,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    series() {
 | 
				
			||||||
 | 
					      const ftoInvest = this.$store.getters.home.ftoInvest;
 | 
				
			||||||
 | 
					      if (!ftoInvest || !ftoInvest.current || !ftoInvest.previous) {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2023年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2024年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear() - 1}年`,
 | 
				
			||||||
 | 
					          data: ftoInvest.previous,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear()}年`,
 | 
				
			||||||
 | 
					          data: ftoInvest.current,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
							
								
								
									
										260
									
								
								src/views/dashboard/charts/LeftChartBase.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,260 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: left-chart-base
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 08:59:28
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <chart-container class="left-chart-base">
 | 
				
			||||||
 | 
					    <div class="legend">
 | 
				
			||||||
 | 
					      <span
 | 
				
			||||||
 | 
					        v-for="item in legend"
 | 
				
			||||||
 | 
					        :key="item.label"
 | 
				
			||||||
 | 
					        class="legend-item"
 | 
				
			||||||
 | 
					        :style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }"
 | 
				
			||||||
 | 
					        >{{ item.label }}</span
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      ref="chart"
 | 
				
			||||||
 | 
					      style="max-width: 22vw"
 | 
				
			||||||
 | 
					      :style="{ height: vHeight + 'vh' }"
 | 
				
			||||||
 | 
					    ></div>
 | 
				
			||||||
 | 
					  </chart-container>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import screenfull from "screenfull";
 | 
				
			||||||
 | 
					import ChartContainerVue from "../../components/ChartContainer.vue";
 | 
				
			||||||
 | 
					import chartMixin from "@/mixins/chart.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "LeftChartBase",
 | 
				
			||||||
 | 
					  components: {
 | 
				
			||||||
 | 
					    ChartContainer: ChartContainerVue,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mixins: [chartMixin],
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    vHeight: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 34,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    legend: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    xAxis: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    series: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      isFullscreen: false,
 | 
				
			||||||
 | 
					      actualOptions: null,
 | 
				
			||||||
 | 
					      options: {
 | 
				
			||||||
 | 
					        grid: {
 | 
				
			||||||
 | 
					          left: "3%",
 | 
				
			||||||
 | 
					          right: "4%",
 | 
				
			||||||
 | 
					          bottom: "0",
 | 
				
			||||||
 | 
					          top: "15%",
 | 
				
			||||||
 | 
					          containLabel: true,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tooltip: {},
 | 
				
			||||||
 | 
					        xAxis: {
 | 
				
			||||||
 | 
					          axisTick: {
 | 
				
			||||||
 | 
					            show: false,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLine: {
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#4561AE",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLabel: {
 | 
				
			||||||
 | 
					            color: "#fff",
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          data: this.xAxis,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        yAxis: {
 | 
				
			||||||
 | 
					          name: "单位/片",
 | 
				
			||||||
 | 
					          nameTextStyle: {
 | 
				
			||||||
 | 
					            color: "#fff",
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisTick: {
 | 
				
			||||||
 | 
					            show: false,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLabel: {
 | 
				
			||||||
 | 
					            color: "#fff",
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLine: {
 | 
				
			||||||
 | 
					            show: true,
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#4561AE",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          splitLine: {
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#4561AE",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        series: [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: '', // this.series[0].name,
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            barWidth: 12,
 | 
				
			||||||
 | 
					            itemStyle: {
 | 
				
			||||||
 | 
					              borderRadius: [10, 10, 0, 0],
 | 
				
			||||||
 | 
					              color: {
 | 
				
			||||||
 | 
					                type: "linear",
 | 
				
			||||||
 | 
					                x: 0,
 | 
				
			||||||
 | 
					                y: 0,
 | 
				
			||||||
 | 
					                x2: 0,
 | 
				
			||||||
 | 
					                y2: 1,
 | 
				
			||||||
 | 
					                colorStops: [
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0,
 | 
				
			||||||
 | 
					                    color: "#12f7f1", // 0% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0.35,
 | 
				
			||||||
 | 
					                    color: "#12f7f177", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0.75,
 | 
				
			||||||
 | 
					                    color: "#12f7f133", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 1,
 | 
				
			||||||
 | 
					                    color: "transparent", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                global: false, // 缺省为 false
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [], // this.series[0].data,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: '', // this.series[1].name,
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            barWidth: 12,
 | 
				
			||||||
 | 
					            // tooltip: {
 | 
				
			||||||
 | 
					            //   valueFormatter: function (value) {
 | 
				
			||||||
 | 
					            //     return value + " ml";
 | 
				
			||||||
 | 
					            //   },
 | 
				
			||||||
 | 
					            // },
 | 
				
			||||||
 | 
					            itemStyle: {
 | 
				
			||||||
 | 
					              borderRadius: [10, 10, 0, 0],
 | 
				
			||||||
 | 
					              color: {
 | 
				
			||||||
 | 
					                type: "linear",
 | 
				
			||||||
 | 
					                x: 0,
 | 
				
			||||||
 | 
					                y: 0,
 | 
				
			||||||
 | 
					                x2: 0,
 | 
				
			||||||
 | 
					                y2: 1,
 | 
				
			||||||
 | 
					                colorStops: [
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0,
 | 
				
			||||||
 | 
					                    color: "#57abf8", // 0% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 1,
 | 
				
			||||||
 | 
					                    color: "#364BFE66", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                global: false, // 缺省为 false
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [], // this.series[1].data,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
 | 
				
			||||||
 | 
					    isFullscreen(val) {
 | 
				
			||||||
 | 
					      this.actualOptions.series.map((item) => {
 | 
				
			||||||
 | 
					        item.barWidth = val ? 18 : 12;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      this.initOptions(this.actualOptions);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    series(val) {
 | 
				
			||||||
 | 
					      if (!val) {
 | 
				
			||||||
 | 
					        this.initOptions(this.options);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      const actualOptions = JSON.parse(JSON.stringify(this.options));
 | 
				
			||||||
 | 
					      actualOptions.series[0].data = val[0].data;
 | 
				
			||||||
 | 
					      actualOptions.series[0].name = val[0].name;
 | 
				
			||||||
 | 
					      actualOptions.series[1].data = val[1].data;
 | 
				
			||||||
 | 
					      actualOptions.series[1].name = val[1].name;
 | 
				
			||||||
 | 
					      this.actualOptions = actualOptions;
 | 
				
			||||||
 | 
					      this.initOptions(actualOptions);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    this.actualOptions = this.options;
 | 
				
			||||||
 | 
					    this.initOptions(this.options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (screenfull.isEnabled) {
 | 
				
			||||||
 | 
					      screenfull.on("change", () => {
 | 
				
			||||||
 | 
					        this.isFullscreen = screenfull.isFullscreen;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.left-chart-base {
 | 
				
			||||||
 | 
					  // position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend {
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    top: 5.2vh;
 | 
				
			||||||
 | 
					    right: 1vw;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item {
 | 
				
			||||||
 | 
					    position: relative;
 | 
				
			||||||
 | 
					    // font-size: 12px;
 | 
				
			||||||
 | 
					    margin-right: 0.67vw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &::before {
 | 
				
			||||||
 | 
					      content: "";
 | 
				
			||||||
 | 
					      display: inline-block;
 | 
				
			||||||
 | 
					      // width: 10px;
 | 
				
			||||||
 | 
					      // height: 10px;
 | 
				
			||||||
 | 
					      width: 0.531vw;
 | 
				
			||||||
 | 
					      height: 0.531vw;
 | 
				
			||||||
 | 
					      background-color: #ccc;
 | 
				
			||||||
 | 
					      border-radius: 2px;
 | 
				
			||||||
 | 
					      margin-right: 0.22vw;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item:nth-child(1):before {
 | 
				
			||||||
 | 
					    background-color: #12f7f1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item:nth-child(2):before {
 | 
				
			||||||
 | 
					    background-color: #58adfa;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** add more */
 | 
				
			||||||
 | 
					  // .legend-item:nth-child(3):before {
 | 
				
			||||||
 | 
					  //   background-color: #f7f1;
 | 
				
			||||||
 | 
					  // }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										325
									
								
								src/views/dashboard/charts/RightChartBase.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,325 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: right-chart-base
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 08:59:28
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <chart-container class="right-chart-base">
 | 
				
			||||||
 | 
					    <div class="legend">
 | 
				
			||||||
 | 
					      <span
 | 
				
			||||||
 | 
					        v-for="item in legend"
 | 
				
			||||||
 | 
					        :key="item.label"
 | 
				
			||||||
 | 
					        class="legend-item"
 | 
				
			||||||
 | 
					        :style="{ fontSize: isFullscreen ? '0.58vw' : '0.54vw' }"
 | 
				
			||||||
 | 
					        >{{ item.label }}</span
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      ref="chart"
 | 
				
			||||||
 | 
					      style="max-width: 22vw"
 | 
				
			||||||
 | 
					      :style="{ height: vHeight + 'vh' }"
 | 
				
			||||||
 | 
					    ></div>
 | 
				
			||||||
 | 
					  </chart-container>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import screenfull from "screenfull";
 | 
				
			||||||
 | 
					import ChartContainerVue from "../../components/ChartContainer.vue";
 | 
				
			||||||
 | 
					import chartMixin from "@/mixins/chart.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "RightChartBase",
 | 
				
			||||||
 | 
					  components: {
 | 
				
			||||||
 | 
					    ChartContainer: ChartContainerVue,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mixins: [chartMixin],
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    vHeight: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 34,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    legend: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    xAxis: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    series: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      isFullscreen: false,
 | 
				
			||||||
 | 
					      options: {
 | 
				
			||||||
 | 
					        grid: {
 | 
				
			||||||
 | 
					          left: "3%",
 | 
				
			||||||
 | 
					          right: "4%",
 | 
				
			||||||
 | 
					          bottom: "0",
 | 
				
			||||||
 | 
					          top: "18%",
 | 
				
			||||||
 | 
					          containLabel: true,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        tooltip: {},
 | 
				
			||||||
 | 
					        xAxis: {
 | 
				
			||||||
 | 
					          axisTick: {
 | 
				
			||||||
 | 
					            show: false,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLine: {
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#4561AE",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLabel: {
 | 
				
			||||||
 | 
					            color: "#fff",
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          data: this.xAxis,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        yAxis: {
 | 
				
			||||||
 | 
					          name: "单位/片",
 | 
				
			||||||
 | 
					          nameTextStyle: {
 | 
				
			||||||
 | 
					            color: "#fff",
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisTick: {
 | 
				
			||||||
 | 
					            show: false,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLabel: {
 | 
				
			||||||
 | 
					            color: "#fff",
 | 
				
			||||||
 | 
					            fontSize: 12,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          axisLine: {
 | 
				
			||||||
 | 
					            show: true,
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#4561AE",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          splitLine: {
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#4561AE",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        series: [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "", // "2024年目标值",
 | 
				
			||||||
 | 
					            type: "line",
 | 
				
			||||||
 | 
					            lineStyle: {
 | 
				
			||||||
 | 
					              color: "#f3c000",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            itemStyle: {
 | 
				
			||||||
 | 
					              color: "#f3c000",
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            areaStyle: {
 | 
				
			||||||
 | 
					              color: {
 | 
				
			||||||
 | 
					                type: "linear",
 | 
				
			||||||
 | 
					                x: 0,
 | 
				
			||||||
 | 
					                y: 0,
 | 
				
			||||||
 | 
					                x2: 0,
 | 
				
			||||||
 | 
					                y2: 1,
 | 
				
			||||||
 | 
					                colorStops: [
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0,
 | 
				
			||||||
 | 
					                    color: "#f3c000", // 0% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0.55,
 | 
				
			||||||
 | 
					                    color: "#f3c00033",
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 1,
 | 
				
			||||||
 | 
					                    color: "transparent", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                global: false, // 缺省为 false
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [], // this.series[0].data,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "", // "2023年",
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            barWidth: 12,
 | 
				
			||||||
 | 
					            itemStyle: {
 | 
				
			||||||
 | 
					              borderRadius: [10, 10, 0, 0],
 | 
				
			||||||
 | 
					              color: {
 | 
				
			||||||
 | 
					                type: "linear",
 | 
				
			||||||
 | 
					                x: 0,
 | 
				
			||||||
 | 
					                y: 0,
 | 
				
			||||||
 | 
					                x2: 0,
 | 
				
			||||||
 | 
					                y2: 1,
 | 
				
			||||||
 | 
					                colorStops: [
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0,
 | 
				
			||||||
 | 
					                    color: "#12f7f1", // 0% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0.35,
 | 
				
			||||||
 | 
					                    color: "#12f7f177", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0.75,
 | 
				
			||||||
 | 
					                    color: "#12f7f133", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 1,
 | 
				
			||||||
 | 
					                    color: "transparent", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                global: false, // 缺省为 false
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [], // this.series[1].data,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "", // "2024年",
 | 
				
			||||||
 | 
					            type: "bar",
 | 
				
			||||||
 | 
					            barWidth: 12,
 | 
				
			||||||
 | 
					            // tooltip: {
 | 
				
			||||||
 | 
					            //   valueFormatter: function (value) {
 | 
				
			||||||
 | 
					            //     return value + " ml";
 | 
				
			||||||
 | 
					            //   },
 | 
				
			||||||
 | 
					            // },
 | 
				
			||||||
 | 
					            itemStyle: {
 | 
				
			||||||
 | 
					              borderRadius: [10, 10, 0, 0],
 | 
				
			||||||
 | 
					              color: {
 | 
				
			||||||
 | 
					                type: "linear",
 | 
				
			||||||
 | 
					                x: 0,
 | 
				
			||||||
 | 
					                y: 0,
 | 
				
			||||||
 | 
					                x2: 0,
 | 
				
			||||||
 | 
					                y2: 1,
 | 
				
			||||||
 | 
					                colorStops: [
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 0,
 | 
				
			||||||
 | 
					                    color: "#57abf8", // 0% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    offset: 1,
 | 
				
			||||||
 | 
					                    color: "#364BFE66", // 100% 处的颜色
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                global: false, // 缺省为 false
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            data: [], // this.series[2].data,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      actualOptions: null,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    /** 全屏状态切换时,对柱子粗细和字体大小进行相应调整 */
 | 
				
			||||||
 | 
					    isFullscreen(val) {
 | 
				
			||||||
 | 
					      this.actualOptions.series.map((item) => {
 | 
				
			||||||
 | 
					        item.barWidth = val ? 18 : 12;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      this.actualOptions.xAxis.axisLabel.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      this.actualOptions.yAxis.axisLabel.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      this.actualOptions.yAxis.nameTextStyle.fontSize = val ? 18 : 12;
 | 
				
			||||||
 | 
					      this.initOptions(this.actualOptions);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    series(val) {
 | 
				
			||||||
 | 
					      if (!val) {
 | 
				
			||||||
 | 
					        this.initOptions(this.options);
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      const actualOptions = JSON.parse(JSON.stringify(this.options));
 | 
				
			||||||
 | 
					      actualOptions.series[0].data = val[0].data;
 | 
				
			||||||
 | 
					      actualOptions.series[0].name = val[0].name;
 | 
				
			||||||
 | 
					      actualOptions.series[1].data = val[1].data;
 | 
				
			||||||
 | 
					      actualOptions.series[1].name = val[1].name;
 | 
				
			||||||
 | 
					      actualOptions.series[2].data = val[2].data;
 | 
				
			||||||
 | 
					      actualOptions.series[2].name = val[2].name;
 | 
				
			||||||
 | 
					      this.actualOptions = actualOptions;
 | 
				
			||||||
 | 
					      this.initOptions(actualOptions);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    this.actualOptions = this.options;
 | 
				
			||||||
 | 
					    this.initOptions(this.options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (screenfull.isEnabled) {
 | 
				
			||||||
 | 
					      screenfull.on("change", () => {
 | 
				
			||||||
 | 
					        this.isFullscreen = screenfull.isFullscreen;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.right-chart-base {
 | 
				
			||||||
 | 
					  // position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend {
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    top: 5.2vh;
 | 
				
			||||||
 | 
					    right: 1vw;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item {
 | 
				
			||||||
 | 
					    position: relative;
 | 
				
			||||||
 | 
					    // font-size: 12px;
 | 
				
			||||||
 | 
					    margin-right: 0.67vw;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    &::before {
 | 
				
			||||||
 | 
					      content: "";
 | 
				
			||||||
 | 
					      display: inline-block;
 | 
				
			||||||
 | 
					      // width: 10px;
 | 
				
			||||||
 | 
					      // height: 10px;
 | 
				
			||||||
 | 
					      width: 0.531vw;
 | 
				
			||||||
 | 
					      height: 0.531vw;
 | 
				
			||||||
 | 
					      background-color: #ccc;
 | 
				
			||||||
 | 
					      border-radius: 2px;
 | 
				
			||||||
 | 
					      margin-right: 0.22vw;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item:nth-child(1):before {
 | 
				
			||||||
 | 
					    // width: 12px;
 | 
				
			||||||
 | 
					    // height: 2px;
 | 
				
			||||||
 | 
					    width: 0.638vw;
 | 
				
			||||||
 | 
					    height: 0.1064vw;
 | 
				
			||||||
 | 
					    background-color: #f3c000;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    top: 50%;
 | 
				
			||||||
 | 
					    // left: -16px;
 | 
				
			||||||
 | 
					    left: -0.851vw;
 | 
				
			||||||
 | 
					    transform: translateY(-50%);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  .legend-item:nth-child(1):after {
 | 
				
			||||||
 | 
					    background-color: #f3c000;
 | 
				
			||||||
 | 
					    content: "";
 | 
				
			||||||
 | 
					    display: inline-block;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    // width: 6px;
 | 
				
			||||||
 | 
					    // height: 6px;
 | 
				
			||||||
 | 
					    width: 0.3191vw;
 | 
				
			||||||
 | 
					    height: 0.3191vw;
 | 
				
			||||||
 | 
					    border-radius: 100%;
 | 
				
			||||||
 | 
					    top: 50%;
 | 
				
			||||||
 | 
					    left: -0.851vw;
 | 
				
			||||||
 | 
					    // left: -16px;
 | 
				
			||||||
 | 
					    transform: translateY(-50%) translateX(50%);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item:nth-child(2):before {
 | 
				
			||||||
 | 
					    background-color: #12f7f1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .legend-item:nth-child(3):before {
 | 
				
			||||||
 | 
					    background-color: #58adfa;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /** add more */
 | 
				
			||||||
 | 
					  // .legend-item:nth-child(3):before {
 | 
				
			||||||
 | 
					  //   background-color: #f7f1;
 | 
				
			||||||
 | 
					  // }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										84
									
								
								src/views/dashboard/charts/StdChart.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: Bipv.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-10 15:39:54
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <right-chart-base
 | 
				
			||||||
 | 
					    :legend="legend"
 | 
				
			||||||
 | 
					    :series="series"
 | 
				
			||||||
 | 
					    :xAxis="xAxis"
 | 
				
			||||||
 | 
					    :vHeight="20.5"
 | 
				
			||||||
 | 
					    class="std-chart"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import RightChartBase from "./RightChartBase.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "StdChart",
 | 
				
			||||||
 | 
					  components: { RightChartBase },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    const year = new Date().getFullYear();
 | 
				
			||||||
 | 
					    // 城市数组的顺序必须是固定的
 | 
				
			||||||
 | 
					    const cities = ["瑞昌", "邯郸", "株洲", "佳木斯", "成都", "凯盛", "蚌埠"];
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      legend: [
 | 
				
			||||||
 | 
					        { label: `${year}年目标值`, color: "#f3c000" },
 | 
				
			||||||
 | 
					        { label: `${year - 1}年`, color: "#12f7f1" },
 | 
				
			||||||
 | 
					        { label: `${year}年`, color: "#58adfa" },
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      xAxis: cities,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    series() {
 | 
				
			||||||
 | 
					      const stdOutput = this.$store.getters.home.stdOutput;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (!stdOutput || !stdOutput.current || !stdOutput.previous) {
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2024年目标值",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2023年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name: "样例数据--2024年",
 | 
				
			||||||
 | 
					            data: Array.from({ length: 7 }, () =>
 | 
				
			||||||
 | 
					              Math.floor(Math.random() * 1000)
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear()}年目标值`,
 | 
				
			||||||
 | 
					          data: stdOutput.target,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear() - 1}年`,
 | 
				
			||||||
 | 
					          data: stdOutput.previous,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          name: `${new Date().getFullYear()}年`,
 | 
				
			||||||
 | 
					          data: stdOutput.current,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss"></style>
 | 
				
			||||||
							
								
								
									
										129
									
								
								src/views/dashboard/components/CompanyInfo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,129 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: CompanyInfo.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-08 15:27:04
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="company-info" :style="styles">
 | 
				
			||||||
 | 
					    <div class="corner bl"></div>
 | 
				
			||||||
 | 
					    <div class="corner br"></div>
 | 
				
			||||||
 | 
					    <h2>{{ info.companyName }}</h2>
 | 
				
			||||||
 | 
					    <ul>
 | 
				
			||||||
 | 
					      <li v-for="item in info.items" :key="item.label">
 | 
				
			||||||
 | 
					        {{ item.label }} {{ item.value | currency }}
 | 
				
			||||||
 | 
					      </li>
 | 
				
			||||||
 | 
					    </ul>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "CompanyInfo",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    info: {
 | 
				
			||||||
 | 
					      type: Object,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					      default: () => ({}),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    position: {
 | 
				
			||||||
 | 
					      type: Object,
 | 
				
			||||||
 | 
					      required: true,
 | 
				
			||||||
 | 
					      default: () => ({ x: 0, y: 0 }),
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  filters: {
 | 
				
			||||||
 | 
					    currency(value) {
 | 
				
			||||||
 | 
					      return value.toLocaleString();
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    styles() {
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        left: `${this.position.x}%`,
 | 
				
			||||||
 | 
					        top: `${this.position.y}%`,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					@font-face {
 | 
				
			||||||
 | 
					  font-family: 优设标题黑;
 | 
				
			||||||
 | 
					  src: url(../../../assets/YouSheBiaoTiHei-2.ttf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.company-info {
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  background: #4443;
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  z-index: 9999;
 | 
				
			||||||
 | 
					  // padding: 14px;
 | 
				
			||||||
 | 
					  padding: 0.745vw;
 | 
				
			||||||
 | 
					  backdrop-filter: blur(2px);
 | 
				
			||||||
 | 
					  border-radius: 4px;
 | 
				
			||||||
 | 
					  transform: translate(-50%, -100%);
 | 
				
			||||||
 | 
					  box-shadow: inset 0 0 12px 2px #fff3;
 | 
				
			||||||
 | 
					  // 在这里设置一个总的字体大小 不失为一个好的选择
 | 
				
			||||||
 | 
					  font-size: 1vw;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h2 {
 | 
				
			||||||
 | 
					  margin: 6px 0;
 | 
				
			||||||
 | 
					  font-family: 优设标题黑;
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					  // font-size: 24px;
 | 
				
			||||||
 | 
					  font-size: 1.276em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ul,
 | 
				
			||||||
 | 
					li {
 | 
				
			||||||
 | 
					  padding: 0;
 | 
				
			||||||
 | 
					  margin: 0;
 | 
				
			||||||
 | 
					  list-style: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ul {
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  gap: 6px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					li {
 | 
				
			||||||
 | 
					  font-size: 0.851em;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.corner {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  bottom: 0;
 | 
				
			||||||
 | 
					  // width: 12px;
 | 
				
			||||||
 | 
					  // height: 12px;
 | 
				
			||||||
 | 
					  width: 0.639vw;
 | 
				
			||||||
 | 
					  height: 0.639vw;
 | 
				
			||||||
 | 
					  border-style: solid;
 | 
				
			||||||
 | 
					  border-color: transparent;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.bl {
 | 
				
			||||||
 | 
					  left: 0;
 | 
				
			||||||
 | 
					  border-left: 0.1596vw solid #ffa600;
 | 
				
			||||||
 | 
					  border-bottom: 0.1596vw solid #ffa600;
 | 
				
			||||||
 | 
					  // border-left: 3px solid #ffa600;
 | 
				
			||||||
 | 
					  // border-bottom: 3px solid #ffa600;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.br {
 | 
				
			||||||
 | 
					  right: 0;
 | 
				
			||||||
 | 
					  // border-right: 3px solid #ffa600;
 | 
				
			||||||
 | 
					  // border-bottom: 3px solid #ffa600;
 | 
				
			||||||
 | 
					  border-right: 0.1596vw solid #ffa600;
 | 
				
			||||||
 | 
					  border-bottom: 0.1596vw solid #ffa600;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										203
									
								
								src/views/dashboard/components/Container.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,203 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: Container.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-09 10:44:09
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="dashboard-container">
 | 
				
			||||||
 | 
					    <!-- refresh btn  -->
 | 
				
			||||||
 | 
					    <button
 | 
				
			||||||
 | 
					      v-if="0"
 | 
				
			||||||
 | 
					      style="appearance: none; outline: none; border: none; background: none; color:#fff; cursor: pointer; position: absolute; top: 8px; right: 8px"
 | 
				
			||||||
 | 
					      @click="$emit('refresh')"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <svg
 | 
				
			||||||
 | 
					        xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					        fill="none"
 | 
				
			||||||
 | 
					        viewBox="0 0 24 24"
 | 
				
			||||||
 | 
					        stroke-width="1.5"
 | 
				
			||||||
 | 
					        stroke="currentColor"
 | 
				
			||||||
 | 
					        style="width: 24px; height: 24px"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <path
 | 
				
			||||||
 | 
					          stroke-linecap="round"
 | 
				
			||||||
 | 
					          stroke-linejoin="round"
 | 
				
			||||||
 | 
					          d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </svg>
 | 
				
			||||||
 | 
					    </button>
 | 
				
			||||||
 | 
					    <!-- decoration  -->
 | 
				
			||||||
 | 
					    <div class="corner tl"></div>
 | 
				
			||||||
 | 
					    <div class="corner tr"></div>
 | 
				
			||||||
 | 
					    <div v-if="side == 'left'" class="corner bl"></div>
 | 
				
			||||||
 | 
					    <div v-if="side == 'right'" class="corner br"></div>
 | 
				
			||||||
 | 
					    <!-- content  -->
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="container-head"
 | 
				
			||||||
 | 
					      :class="[side == 'left' ? 'gradient-to-right' : 'gradient-to-left']"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <Icon :icon="icon"></Icon>
 | 
				
			||||||
 | 
					      <h2 class="container-title">{{ title }}</h2>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="container-body"
 | 
				
			||||||
 | 
					      :class="[
 | 
				
			||||||
 | 
					        side == 'left' ? 'body-gradient-to-right' : 'body-gradient-to-left',
 | 
				
			||||||
 | 
					      ]"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <slot />
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import ContainerIconVue from "./ContainerIcon.vue";
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "DashboardContainer",
 | 
				
			||||||
 | 
					  components: {
 | 
				
			||||||
 | 
					    Icon: ContainerIconVue,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    side: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "left",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    icon: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "cube",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    title: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "Default Title",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {},
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.dashboard-container {
 | 
				
			||||||
 | 
					  height: 0;
 | 
				
			||||||
 | 
					  flex: 1;
 | 
				
			||||||
 | 
					  display: flex;
 | 
				
			||||||
 | 
					  flex-direction: column;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  box-shadow: inset 0 0 20px 1px #fff1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // &::after {
 | 
				
			||||||
 | 
					  //   content: "";
 | 
				
			||||||
 | 
					  //   position: absolute;
 | 
				
			||||||
 | 
					  //   display: inline-block;
 | 
				
			||||||
 | 
					  //   width: 60%;
 | 
				
			||||||
 | 
					  //   height: 0.31415vh;
 | 
				
			||||||
 | 
					  //   border-radius: 2px;
 | 
				
			||||||
 | 
					  //   left: 8%;
 | 
				
			||||||
 | 
					  //   bottom: 0;
 | 
				
			||||||
 | 
					  //   background: linear-gradient(to right, #024798, transparent);
 | 
				
			||||||
 | 
					  //   z-index: 0;
 | 
				
			||||||
 | 
					  // }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .container-head {
 | 
				
			||||||
 | 
					    // height: 40px;
 | 
				
			||||||
 | 
					    height: 3.8vh;
 | 
				
			||||||
 | 
					    padding: 8px;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    align-items: center;
 | 
				
			||||||
 | 
					    gap: 8px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .container-title {
 | 
				
			||||||
 | 
					      font-size: 1.18vw;
 | 
				
			||||||
 | 
					      line-height: 1.39vw;
 | 
				
			||||||
 | 
					      font-weight: normal;
 | 
				
			||||||
 | 
					      letter-spacing: 2px;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .container-body {
 | 
				
			||||||
 | 
					    padding: 12px;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    flex: 1;
 | 
				
			||||||
 | 
					    height: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner {
 | 
				
			||||||
 | 
					    z-index: 1;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    // width: 16px;
 | 
				
			||||||
 | 
					    // height: 16px;
 | 
				
			||||||
 | 
					    width: 0.95vw;
 | 
				
			||||||
 | 
					    height: 0.95vw;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.tl {
 | 
				
			||||||
 | 
					    border-top: 2px solid #0175dc;
 | 
				
			||||||
 | 
					    border-left: 2px solid #0175dc;
 | 
				
			||||||
 | 
					    top: 0;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.tr {
 | 
				
			||||||
 | 
					    top: 0;
 | 
				
			||||||
 | 
					    right: 0;
 | 
				
			||||||
 | 
					    border-top: 2px solid #0175dc;
 | 
				
			||||||
 | 
					    border-right: 2px solid #0175dc;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.bl {
 | 
				
			||||||
 | 
					    // width: 20px;
 | 
				
			||||||
 | 
					    // height: 20px;
 | 
				
			||||||
 | 
					    width: 1.064vw;
 | 
				
			||||||
 | 
					    height: 1.064vw;
 | 
				
			||||||
 | 
					    bottom: 0;
 | 
				
			||||||
 | 
					    left: 0;
 | 
				
			||||||
 | 
					    // border-left: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    // border-bottom: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    // border-top: 10px solid transparent;
 | 
				
			||||||
 | 
					    // border-right: 10px solid transparent;
 | 
				
			||||||
 | 
					    border-left: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					    border-bottom: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					    border-top: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					    border-right: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .corner.br {
 | 
				
			||||||
 | 
					    bottom: 0;
 | 
				
			||||||
 | 
					    right: 0;
 | 
				
			||||||
 | 
					    // width: 20px;
 | 
				
			||||||
 | 
					    // height: 20px;
 | 
				
			||||||
 | 
					    width: 1.064vw;
 | 
				
			||||||
 | 
					    height: 1.064vw;
 | 
				
			||||||
 | 
					    // border-left: 10px solid transparent;
 | 
				
			||||||
 | 
					    // border-bottom: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    // border-top: 10px solid transparent;
 | 
				
			||||||
 | 
					    // border-right: 10px solid #0175dc;
 | 
				
			||||||
 | 
					    border-left: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					    border-bottom: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					    border-top: 0.532vw solid transparent;
 | 
				
			||||||
 | 
					    border-right: 0.532vw solid #0175dc;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .gradient-to-right {
 | 
				
			||||||
 | 
					    background: linear-gradient(to right, #0c3f68cc, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .gradient-to-left {
 | 
				
			||||||
 | 
					    background: linear-gradient(to left, #0c3f68cc, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .body-gradient-to-right {
 | 
				
			||||||
 | 
					    background: linear-gradient(to right, #0003, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .body-gradient-to-left {
 | 
				
			||||||
 | 
					    background: linear-gradient(to left, #0003, transparent);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										58
									
								
								src/views/dashboard/components/ContainerIcon.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: ContainerIcon.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-09 16:41:36
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="container-icon" :style="bgStyle"></div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import cube from "@/assets/images/homeindex/fto-icon.png";
 | 
				
			||||||
 | 
					import chip from "@/assets/images/homeindex/chip-icon.png";
 | 
				
			||||||
 | 
					import chip2 from "@/assets/images/homeindex/chip-icon-2.png";
 | 
				
			||||||
 | 
					import bipv from "@/assets/images/homeindex/bipv-icon.png";
 | 
				
			||||||
 | 
					import std from "@/assets/images/homeindex/std-icon.png";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "ContainerIcon",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    icon: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: "cube",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    bgStyle() {
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        cube:
 | 
				
			||||||
 | 
					          "background: url(" + cube + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        chip:
 | 
				
			||||||
 | 
					          "background: url(" + chip + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        chip2:
 | 
				
			||||||
 | 
					          "background: url(" + chip2 + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        bipv:
 | 
				
			||||||
 | 
					          "background: url(" + bipv + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					        std: "background: url(" + std + ") no-repeat center center / 100% 100%",
 | 
				
			||||||
 | 
					      }[this.icon];
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.container-icon {
 | 
				
			||||||
 | 
					  //   width: 32px;
 | 
				
			||||||
 | 
					  //   height: 32px;
 | 
				
			||||||
 | 
					  width: 1.701vw;
 | 
				
			||||||
 | 
					  height: 1.701vw;
 | 
				
			||||||
 | 
					  background: #ccc2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
							
								
								
									
										102
									
								
								src/views/dashboard/components/Header.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,102 @@
 | 
				
			|||||||
 | 
					<!-- 
 | 
				
			||||||
 | 
					    filename: Header.vue
 | 
				
			||||||
 | 
					    author: liubin
 | 
				
			||||||
 | 
					    date: 2024-04-09 09:04:12
 | 
				
			||||||
 | 
					    description: 
 | 
				
			||||||
 | 
					-->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <header class="dashboard-header">
 | 
				
			||||||
 | 
					    <div class="btn" :style="btnStyle" @click="toggleFullscreen"></div>
 | 
				
			||||||
 | 
					    <h1>发电玻璃智能管控平台地图总览</h1>
 | 
				
			||||||
 | 
					    <span class="side left">晴转多云 14℃</span>
 | 
				
			||||||
 | 
					    <span class="side right">23:12|星期一|2023.12.13</span>
 | 
				
			||||||
 | 
					  </header>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import screenfull from "screenfull";
 | 
				
			||||||
 | 
					import fullscreenIcon from "@/assets/images/homeindex/fullscreen.png";
 | 
				
			||||||
 | 
					import fullscreenExitIcon from "@/assets/images/homeindex/exit-fullscreen.png";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: "DashboardHeader",
 | 
				
			||||||
 | 
					  components: {},
 | 
				
			||||||
 | 
					  props: {},
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      isFullscreen: false,
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    btnStyle() {
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        backgroundImage: `url(${
 | 
				
			||||||
 | 
					          this.isFullscreen ? fullscreenExitIcon : fullscreenIcon
 | 
				
			||||||
 | 
					        })`,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    toggleFullscreen() {
 | 
				
			||||||
 | 
					      screenfull.toggle();
 | 
				
			||||||
 | 
					      this.isFullscreen = !this.isFullscreen;
 | 
				
			||||||
 | 
					      // 矫正宽度
 | 
				
			||||||
 | 
					      const el = document.querySelector(".dashboard-factory-all");
 | 
				
			||||||
 | 
					      el.style.width = this.isFullscreen ? "100vw" : "calc(100vw - 54px)";
 | 
				
			||||||
 | 
					      el.style.left = this.isFullscreen ? "0" : "54px";
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped lang="scss">
 | 
				
			||||||
 | 
					.dashboard-header {
 | 
				
			||||||
 | 
					  height: 8vh;
 | 
				
			||||||
 | 
					  background: url(../../../assets/images/homeindex/header-bg.png) no-repeat 0 0 /
 | 
				
			||||||
 | 
					    100% 100%;
 | 
				
			||||||
 | 
					  position: relative;
 | 
				
			||||||
 | 
					  display: grid;
 | 
				
			||||||
 | 
					  place-content: center;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .btn {
 | 
				
			||||||
 | 
					    cursor: pointer;
 | 
				
			||||||
 | 
					    position: absolute;
 | 
				
			||||||
 | 
					    width: 2vw;
 | 
				
			||||||
 | 
					    height: 2vw;
 | 
				
			||||||
 | 
					    top: 50%;
 | 
				
			||||||
 | 
					    right: 1.18vw;
 | 
				
			||||||
 | 
					    background-size: 100% 100%;
 | 
				
			||||||
 | 
					    background-position: 0 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					h1 {
 | 
				
			||||||
 | 
					  //   font-size: 32px;
 | 
				
			||||||
 | 
					  font-size: 1.65vw;
 | 
				
			||||||
 | 
					  //   line-height: 45px;
 | 
				
			||||||
 | 
					  line-height: 1.25;
 | 
				
			||||||
 | 
					  letter-spacing: 0.32vw;
 | 
				
			||||||
 | 
					  user-select: none;
 | 
				
			||||||
 | 
					  text-shadow: 0 4px 0 rgba(0, 0, 0, 0.5);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.side {
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  font-size: 1.18vw;
 | 
				
			||||||
 | 
					  // line-height: 24px;
 | 
				
			||||||
 | 
					  line-height: 1.277vw;
 | 
				
			||||||
 | 
					  letter-spacing: 2px;
 | 
				
			||||||
 | 
					  color: #69b4ff;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.left {
 | 
				
			||||||
 | 
					  left: 22vw;
 | 
				
			||||||
 | 
					  top: 4.9vh;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.right {
 | 
				
			||||||
 | 
					  right: 15vw;
 | 
				
			||||||
 | 
					  top: 4.9vh;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -1,98 +1,286 @@
 | 
				
			|||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <div class="dashboard-editor-container">
 | 
					  <div class="dashboard-factory-all">
 | 
				
			||||||
    <!-- 首页http://localhost:81/index 数据展示  -->
 | 
					    <div id="map-container">
 | 
				
			||||||
    <panel-group @handleSetLineChartData="handleSetLineChartData" />
 | 
					      <div class="databoard">
 | 
				
			||||||
 | 
					        <db-header class="db-header"></db-header>
 | 
				
			||||||
    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
 | 
					        <div class="db-body">
 | 
				
			||||||
      <line-chart :chart-data="lineChartData" />
 | 
					          <div class="db-left">
 | 
				
			||||||
    </el-row>
 | 
					            <db-container
 | 
				
			||||||
 | 
					              icon="cube"
 | 
				
			||||||
    <el-row :gutter="32">
 | 
					              title="FTO投入"
 | 
				
			||||||
      <el-col :xs="24" :sm="24" :lg="8">
 | 
					              @refresh="() => (ftoKey = Math.random())"
 | 
				
			||||||
        <div class="chart-wrapper">
 | 
					            >
 | 
				
			||||||
          <raddar-chart />
 | 
					              <fto-chart :key="ftoKey" />
 | 
				
			||||||
 | 
					            </db-container>
 | 
				
			||||||
 | 
					            <db-container
 | 
				
			||||||
 | 
					              icon="chip2"
 | 
				
			||||||
 | 
					              title="芯片投入"
 | 
				
			||||||
 | 
					              @refresh="() => (chipInvestKey = Math.random())"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <chip-invest-chart :key="chipInvestKey" />
 | 
				
			||||||
 | 
					            </db-container>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
      </el-col>
 | 
					          <div class="db-right">
 | 
				
			||||||
      <el-col :xs="24" :sm="24" :lg="8">
 | 
					            <db-container
 | 
				
			||||||
        <div class="chart-wrapper">
 | 
					              side="right"
 | 
				
			||||||
          <pie-chart />
 | 
					              icon="chip"
 | 
				
			||||||
 | 
					              title="芯片产出"
 | 
				
			||||||
 | 
					              @refresh="() => (chipYieldKey = Math.random())"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <chip-yield-chart :key="chipYieldKey" />
 | 
				
			||||||
 | 
					            </db-container>
 | 
				
			||||||
 | 
					            <db-container
 | 
				
			||||||
 | 
					              side="right"
 | 
				
			||||||
 | 
					              icon="std"
 | 
				
			||||||
 | 
					              title="标准组件产出"
 | 
				
			||||||
 | 
					              @refresh="() => (stdKey = Math.random())"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <std-chart :key="stdKey" />
 | 
				
			||||||
 | 
					            </db-container>
 | 
				
			||||||
 | 
					            <db-container
 | 
				
			||||||
 | 
					              side="right"
 | 
				
			||||||
 | 
					              icon="bipv"
 | 
				
			||||||
 | 
					              title="BIPV产出"
 | 
				
			||||||
 | 
					              @refresh="() => (bipvKey = Math.random())"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <bipv-chart :key="bipvKey" />
 | 
				
			||||||
 | 
					            </db-container>
 | 
				
			||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
      </el-col>
 | 
					 | 
				
			||||||
      <el-col :xs="24" :sm="24" :lg="8">
 | 
					 | 
				
			||||||
        <div class="chart-wrapper">
 | 
					 | 
				
			||||||
          <bar-chart />
 | 
					 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </el-col>
 | 
					      </div>
 | 
				
			||||||
    </el-row>
 | 
					    </div>
 | 
				
			||||||
 | 
					    <company-info
 | 
				
			||||||
    
 | 
					      v-if="visible"
 | 
				
			||||||
 | 
					      :info="info"
 | 
				
			||||||
 | 
					      :position="hintPosition"
 | 
				
			||||||
 | 
					      @close="closeHint"
 | 
				
			||||||
 | 
					    />
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<script>
 | 
					<script>
 | 
				
			||||||
import PanelGroup from './dashboard/PanelGroup'
 | 
					import store from "@/store";
 | 
				
			||||||
import LineChart from './dashboard/LineChart'
 | 
					import DashboardHeader from "./dashboard/components/Header.vue";
 | 
				
			||||||
import RaddarChart from './dashboard/RaddarChart'
 | 
					import CompanyInfo from "./dashboard/components/CompanyInfo.vue";
 | 
				
			||||||
import PieChart from './dashboard/PieChart'
 | 
					import Container from "./dashboard/components/Container.vue";
 | 
				
			||||||
import BarChart from './dashboard/BarChart'
 | 
					import FtoChart from "./dashboard/charts/Fto.vue";
 | 
				
			||||||
 | 
					import ChipInvestChart from "./dashboard/charts/ChipInvest.vue";
 | 
				
			||||||
 | 
					import BipvChart from "./dashboard/charts/Bipv.vue";
 | 
				
			||||||
 | 
					import ChipYieldChart from "./dashboard/charts/ChipYield.vue";
 | 
				
			||||||
 | 
					import StdChart from "./dashboard/charts/StdChart.vue";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const lineChartData = {
 | 
					const LOCATIONS = [
 | 
				
			||||||
  newVisitis: {
 | 
					  // 佳木斯
 | 
				
			||||||
    expectedData: [100, 120, 161, 134, 105, 160, 165],
 | 
					  { x: 67, y: 20 },
 | 
				
			||||||
    actualData: [120, 82, 91, 154, 162, 140, 145]
 | 
					  // 成都
 | 
				
			||||||
  },
 | 
					  { x: 46, y: 56 },
 | 
				
			||||||
  messages: {
 | 
					  // 蚌埠1
 | 
				
			||||||
    expectedData: [200, 192, 120, 144, 160, 130, 140],
 | 
					  { x: 60, y: 52 },
 | 
				
			||||||
    actualData: [180, 160, 151, 106, 145, 150, 130]
 | 
					  // 蚌埠2
 | 
				
			||||||
  },
 | 
					  { x: 61, y: 53 },
 | 
				
			||||||
  purchases: {
 | 
					  // 江西 瑞昌
 | 
				
			||||||
    expectedData: [80, 100, 121, 104, 105, 90, 100],
 | 
					  { x: 60, y: 58 },
 | 
				
			||||||
    actualData: [120, 90, 100, 138, 142, 130, 130]
 | 
					  // 湖南 株洲
 | 
				
			||||||
  },
 | 
					  { x: 56, y: 60 },
 | 
				
			||||||
  shoppings: {
 | 
					  // 邯郸
 | 
				
			||||||
    expectedData: [130, 140, 141, 142, 145, 150, 160],
 | 
					  { x: 58, y: 45 },
 | 
				
			||||||
    actualData: [120, 82, 91, 154, 162, 140, 130]
 | 
					];
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default {
 | 
					export default {
 | 
				
			||||||
  name: 'Index',
 | 
					  name: "Index",
 | 
				
			||||||
  components: {
 | 
					  components: {
 | 
				
			||||||
    PanelGroup,
 | 
					    CompanyInfo,
 | 
				
			||||||
    LineChart,
 | 
					    DbHeader: DashboardHeader,
 | 
				
			||||||
    RaddarChart,
 | 
					    DbContainer: Container,
 | 
				
			||||||
    PieChart,
 | 
					    FtoChart,
 | 
				
			||||||
    BarChart
 | 
					    ChipInvestChart,
 | 
				
			||||||
 | 
					    ChipYieldChart,
 | 
				
			||||||
 | 
					    BipvChart,
 | 
				
			||||||
 | 
					    StdChart,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  data() {
 | 
					  data() {
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      lineChartData: lineChartData.newVisitis
 | 
					      visible: false,
 | 
				
			||||||
    }
 | 
					      hintPosition: null,
 | 
				
			||||||
 | 
					      ftoKey: Math.random(),
 | 
				
			||||||
 | 
					      chipInvestKey: Math.random(),
 | 
				
			||||||
 | 
					      chipYieldKey: Math.random(),
 | 
				
			||||||
 | 
					      stdKey: Math.random(),
 | 
				
			||||||
 | 
					      bipvKey: Math.random(),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    this.$store.dispatch("copilot/initHome");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.$nextTick(() => {
 | 
				
			||||||
 | 
					      this.initPins();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // 调整 echarts 大小
 | 
				
			||||||
 | 
					      window.onresize = () => {};
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  beforeRouteEnter(to, from, next) {
 | 
				
			||||||
 | 
					    next((vm) => {
 | 
				
			||||||
 | 
					      store.dispatch("app/closeSideBar", { withoutAnimation: true });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  methods: {
 | 
					  methods: {
 | 
				
			||||||
    handleSetLineChartData(type) {
 | 
					    initPins() {
 | 
				
			||||||
      this.lineChartData = lineChartData[type]
 | 
					      LOCATIONS.map((loc) => {
 | 
				
			||||||
    }
 | 
					        const pin = document.createElement("div");
 | 
				
			||||||
  }
 | 
					        pin.className = "pin";
 | 
				
			||||||
 | 
					        pin.style.left = `${loc.x}%`;
 | 
				
			||||||
 | 
					        pin.style.top = `${loc.y}%`;
 | 
				
			||||||
 | 
					        pin.addEventListener("mouseenter", () => {
 | 
				
			||||||
 | 
					          this.showHint(loc);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        pin.addEventListener("mouseleave", () => {
 | 
				
			||||||
 | 
					          this.closeHint();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        document.getElementById("map-container").appendChild(pin);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    closeHint() {
 | 
				
			||||||
 | 
					      this.visible = false;
 | 
				
			||||||
 | 
					      this.hintPosition = null;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    showHint(position) {
 | 
				
			||||||
 | 
					      const homeStore = this.$store.getters.home;
 | 
				
			||||||
 | 
					      this.hintPosition = position;
 | 
				
			||||||
 | 
					      const templateInfo = {
 | 
				
			||||||
 | 
					        companyName: "",
 | 
				
			||||||
 | 
					        items: [
 | 
				
			||||||
 | 
					          { label: "FTO投入", value: 0 }, // Math.floor(Math.random() * 1000000) },
 | 
				
			||||||
 | 
					          { label: "芯片产出", value: 0 }, // Math.floor(Math.random() * 10000000) },
 | 
				
			||||||
 | 
					          { label: "芯片投入", value: 0 }, // Math.floor(Math.random() * 1000000) },
 | 
				
			||||||
 | 
					          { label: "标准组件产出", value: 0 }, // Math.floor(Math.random() * 1000000) },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (position === LOCATIONS[0]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "佳木斯中建材光电材料有限公司";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[3];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[3];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[3];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[3];
 | 
				
			||||||
 | 
					      } else if (position === LOCATIONS[1]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "成都中建材光电材料有限公司";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[4];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[4];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[4];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[4];
 | 
				
			||||||
 | 
					      } else if (position === LOCATIONS[2]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "蚌埠兴科玻璃有限公司";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[6];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[6];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[6];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[6];
 | 
				
			||||||
 | 
					      } else if (position === LOCATIONS[3]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "凯盛光伏材料有限公司(本部)";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[5];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[5];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[5];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[5];
 | 
				
			||||||
 | 
					      } else if (position === LOCATIONS[4]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "瑞昌中建材光电材料有限公司";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[0];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[0];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[0];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[0];
 | 
				
			||||||
 | 
					      } else if (position === LOCATIONS[5]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "中建材(株洲)光电材料有限公司";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[2];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[2];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[2];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[2];
 | 
				
			||||||
 | 
					      } else if (position === LOCATIONS[6]) {
 | 
				
			||||||
 | 
					        templateInfo.companyName = "中建材(邯郸)光电材料有限公司";
 | 
				
			||||||
 | 
					        templateInfo.items[0].value = homeStore.ftoInvest.current[1];
 | 
				
			||||||
 | 
					        templateInfo.items[2].value = homeStore.chipInvest.current[1];
 | 
				
			||||||
 | 
					        templateInfo.items[1].value = homeStore.chipOutput.current[1];
 | 
				
			||||||
 | 
					        templateInfo.items[3].value = homeStore.stdOutput.current[1];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.info = templateInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
 | 
					        this.visible = true;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					.hideSidebar.mobile .dashboard-factory-all {
 | 
				
			||||||
 | 
					  left: 0 !important;
 | 
				
			||||||
 | 
					  width: 100vw !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss" scoped>
 | 
					<style lang="scss" scoped>
 | 
				
			||||||
.dashboard-editor-container {
 | 
					.dashboard-factory-all {
 | 
				
			||||||
  padding: 32px;
 | 
					  background: #151516;
 | 
				
			||||||
  background-color: rgb(240, 242, 245);
 | 
					  position: fixed;
 | 
				
			||||||
 | 
					  top: 0;
 | 
				
			||||||
 | 
					  left: 54px;
 | 
				
			||||||
 | 
					  height: 100vh;
 | 
				
			||||||
 | 
					  width: calc(100vw - 54px);
 | 
				
			||||||
 | 
					  z-index: 1001;
 | 
				
			||||||
 | 
					  color: #fff;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#map-container {
 | 
				
			||||||
 | 
					  height: 100%;
 | 
				
			||||||
 | 
					  background: url(../assets/bgearth.png) no-repeat 0 0 / 100% 100%;
 | 
				
			||||||
  position: relative;
 | 
					  position: relative;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .chart-wrapper {
 | 
					  .databoard {
 | 
				
			||||||
    background: #fff;
 | 
					    position: absolute;
 | 
				
			||||||
    padding: 16px 16px 0;
 | 
					    top: 0;
 | 
				
			||||||
    margin-bottom: 32px;
 | 
					    left: 0;
 | 
				
			||||||
  }
 | 
					    width: 100%;
 | 
				
			||||||
 | 
					    height: 100%;
 | 
				
			||||||
 | 
					    z-index: 1;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media (max-width:1024px) {
 | 
					  .db-body {
 | 
				
			||||||
  .chart-wrapper {
 | 
					    flex: 1;
 | 
				
			||||||
    padding: 8px;
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    justify-content: space-between;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .db-left,
 | 
				
			||||||
 | 
					  .db-right {
 | 
				
			||||||
 | 
					    // width: 420px;
 | 
				
			||||||
 | 
					    width: 24vw;
 | 
				
			||||||
 | 
					    padding: 20px;
 | 
				
			||||||
 | 
					    display: flex;
 | 
				
			||||||
 | 
					    flex-direction: column;
 | 
				
			||||||
 | 
					    gap: 20px;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
</style>
 | 
					</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style>
 | 
				
			||||||
 | 
					.pin {
 | 
				
			||||||
 | 
					  display: inline-block;
 | 
				
			||||||
 | 
					  position: absolute;
 | 
				
			||||||
 | 
					  z-index: 9998;
 | 
				
			||||||
 | 
					  width: 1.702vw;
 | 
				
			||||||
 | 
					  height: 1.702vw;
 | 
				
			||||||
 | 
					  /* 
 | 
				
			||||||
 | 
					  width: 32px;
 | 
				
			||||||
 | 
					  height: 32px; 
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					  background: url(../assets/pinicon.png) no-repeat 0 0 / 100% 100%;
 | 
				
			||||||
 | 
					  transition: transform 0.1s linear;
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.pin:hover {
 | 
				
			||||||
 | 
					  transform: scale(1.2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						@@ -3201,16 +3201,16 @@
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    "delayed-stream" "~1.0.0"
 | 
					    "delayed-stream" "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"commander@*", "commander@^2.18.0", "commander@^2.20.0":
 | 
				
			||||||
 | 
					  "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
 | 
				
			||||||
 | 
					  "resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz"
 | 
				
			||||||
 | 
					  "version" "2.20.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"commander@^10.0.0":
 | 
					"commander@^10.0.0":
 | 
				
			||||||
  "integrity" "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="
 | 
					  "integrity" "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="
 | 
				
			||||||
  "resolved" "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz"
 | 
					  "resolved" "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz"
 | 
				
			||||||
  "version" "10.0.1"
 | 
					  "version" "10.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"commander@^2.18.0", "commander@^2.20.0":
 | 
					 | 
				
			||||||
  "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
 | 
					 | 
				
			||||||
  "resolved" "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz"
 | 
					 | 
				
			||||||
  "version" "2.20.3"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
"commander@^9.3.0":
 | 
					"commander@^9.3.0":
 | 
				
			||||||
  "integrity" "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
 | 
					  "integrity" "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
 | 
				
			||||||
  "resolved" "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz"
 | 
					  "resolved" "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz"
 | 
				
			||||||
@@ -7143,6 +7143,13 @@
 | 
				
			|||||||
  "resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz"
 | 
					  "resolved" "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz"
 | 
				
			||||||
  "version" "1.0.4"
 | 
					  "version" "1.0.4"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"mockjs@^1.1.0":
 | 
				
			||||||
 | 
					  "integrity" "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ=="
 | 
				
			||||||
 | 
					  "resolved" "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz"
 | 
				
			||||||
 | 
					  "version" "1.1.0"
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    "commander" "*"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"moment@^2.30.1":
 | 
					"moment@^2.30.1":
 | 
				
			||||||
  "integrity" "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
 | 
					  "integrity" "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
 | 
				
			||||||
  "resolved" "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz"
 | 
					  "resolved" "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz"
 | 
				
			||||||
 
 | 
				
			|||||||