Compare commits
	
		
			15 Commits
		
	
	
		
			1969cd3ada
			...
			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_BASE_API = 'http://192.168.0.30:48080'
 | 
			
		||||
VUE_APP_BASE_API = 'http://192.168.1.61:48080'
 | 
			
		||||
 | 
			
		||||
# 路由懒加载
 | 
			
		||||
VUE_CLI_BABEL_TRANSPILE_MODULES = true
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,7 @@
 | 
			
		||||
    "highlight.js": "^11.9.0",
 | 
			
		||||
    "js-beautify": "^1.15.1",
 | 
			
		||||
    "jsencrypt": "3.3.1",
 | 
			
		||||
    "mockjs": "^1.1.0",
 | 
			
		||||
    "moment": "^2.30.1",
 | 
			
		||||
    "nprogress": "0.2.0",
 | 
			
		||||
    "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 Element from 'element-ui'
 | 
			
		||||
import Vue from "vue";
 | 
			
		||||
import Element from "element-ui";
 | 
			
		||||
 | 
			
		||||
// 修改如下样式文件,覆盖样式,或者新增样式文件
 | 
			
		||||
import './assets/styles/element-variables.scss'
 | 
			
		||||
import '@/assets/styles/index.scss' // global css
 | 
			
		||||
import '@/assets/styles/ruoyi.scss' // ruoyi css
 | 
			
		||||
import "./assets/styles/element-variables.scss";
 | 
			
		||||
import "@/assets/styles/index.scss"; // global css
 | 
			
		||||
import "@/assets/styles/ruoyi.scss"; // ruoyi css
 | 
			
		||||
 | 
			
		||||
import App from './App'
 | 
			
		||||
import store from './store'
 | 
			
		||||
import router from './router'
 | 
			
		||||
import directive from './directive' // directive
 | 
			
		||||
import plugins from './plugins' // plugins
 | 
			
		||||
import App from "./App";
 | 
			
		||||
import store from "./store";
 | 
			
		||||
import router from "./router";
 | 
			
		||||
import directive from "./directive"; // directive
 | 
			
		||||
import plugins from "./plugins"; // plugins
 | 
			
		||||
 | 
			
		||||
import './assets/icons' // icon
 | 
			
		||||
import './permission' // permission control
 | 
			
		||||
import "./assets/icons"; // icon
 | 
			
		||||
import "./permission"; // permission control
 | 
			
		||||
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 RightToolbar from "@/components/RightToolbar"
 | 
			
		||||
import RightToolbar from "@/components/RightToolbar";
 | 
			
		||||
// 代码高亮插件
 | 
			
		||||
// import hljs from 'highlight.js'
 | 
			
		||||
// 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.parseTime = parseTime
 | 
			
		||||
Vue.prototype.resetForm = resetForm
 | 
			
		||||
Vue.prototype.getDictDatas = getDictDatas
 | 
			
		||||
Vue.prototype.getDictDatas2 = getDictDatas2
 | 
			
		||||
Vue.prototype.getDictDataLabel = getDictDataLabel
 | 
			
		||||
Vue.prototype.DICT_TYPE = DICT_TYPE
 | 
			
		||||
Vue.prototype.handleTree = handleTree
 | 
			
		||||
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime
 | 
			
		||||
Vue.prototype.divide = divide
 | 
			
		||||
Vue.prototype.getDicts = getDicts;
 | 
			
		||||
Vue.prototype.parseTime = parseTime;
 | 
			
		||||
Vue.prototype.resetForm = resetForm;
 | 
			
		||||
Vue.prototype.getDictDatas = getDictDatas;
 | 
			
		||||
Vue.prototype.getDictDatas2 = getDictDatas2;
 | 
			
		||||
Vue.prototype.getDictDataLabel = getDictDataLabel;
 | 
			
		||||
Vue.prototype.DICT_TYPE = DICT_TYPE;
 | 
			
		||||
Vue.prototype.handleTree = handleTree;
 | 
			
		||||
Vue.prototype.addBeginAndEndTime = addBeginAndEndTime;
 | 
			
		||||
Vue.prototype.divide = divide;
 | 
			
		||||
 | 
			
		||||
// 全局组件挂载
 | 
			
		||||
Vue.component('DictTag', DictTag)
 | 
			
		||||
Vue.component('Pagination', Pagination)
 | 
			
		||||
Vue.component('RightToolbar', RightToolbar)
 | 
			
		||||
Vue.component("DictTag", DictTag);
 | 
			
		||||
Vue.component("Pagination", Pagination);
 | 
			
		||||
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(plugins)
 | 
			
		||||
Vue.use(VueMeta)
 | 
			
		||||
Vue.use(directive);
 | 
			
		||||
Vue.use(plugins);
 | 
			
		||||
Vue.use(VueMeta);
 | 
			
		||||
 | 
			
		||||
// Form Generator 组件需要使用到 tinymce
 | 
			
		||||
import Tinymce from '@/components/tinymce/index.vue'
 | 
			
		||||
Vue.component('tinymce', Tinymce)
 | 
			
		||||
import '@/assets/icons'
 | 
			
		||||
import request from "@/utils/request"
 | 
			
		||||
console.log(request)
 | 
			
		||||
Vue.prototype.$axios = request
 | 
			
		||||
import '@/styles/index.scss'
 | 
			
		||||
import Tinymce from "@/components/tinymce/index.vue";
 | 
			
		||||
Vue.component("tinymce", Tinymce);
 | 
			
		||||
import "@/assets/icons";
 | 
			
		||||
import request from "@/utils/request";
 | 
			
		||||
console.log(request);
 | 
			
		||||
Vue.prototype.$axios = request;
 | 
			
		||||
import "@/styles/index.scss";
 | 
			
		||||
 | 
			
		||||
// 默认点击背景不关闭弹窗
 | 
			
		||||
import ElementUI from 'element-ui'
 | 
			
		||||
ElementUI.Dialog.props.closeOnClickModal.default = false
 | 
			
		||||
import ElementUI from "element-ui";
 | 
			
		||||
ElementUI.Dialog.props.closeOnClickModal.default = false;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
Vue.config.productionTip = false
 | 
			
		||||
Vue.config.productionTip = false;
 | 
			
		||||
 | 
			
		||||
new Vue({
 | 
			
		||||
  el: '#app',
 | 
			
		||||
  el: "#app",
 | 
			
		||||
  router,
 | 
			
		||||
  store,
 | 
			
		||||
  render: h => h(App)
 | 
			
		||||
})
 | 
			
		||||
  render: (h) => h(App),
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 * @Author: zwq
 | 
			
		||||
 * @Date: 2022-08-24 11:19:43
 | 
			
		||||
 * @LastEditors: zwq
 | 
			
		||||
 * @LastEditTime: 2024-04-02 09:34:56
 | 
			
		||||
 * @LastEditTime: 2024-04-09 16:56:16
 | 
			
		||||
 * @Description:
 | 
			
		||||
 */
 | 
			
		||||
import { listData } from "@/api/system/dict/data"; //数据字典接口
 | 
			
		||||
@@ -14,7 +14,7 @@ export default {
 | 
			
		||||
        createURL: '', //新增接口
 | 
			
		||||
        updateURL: '', //编辑提交接口
 | 
			
		||||
        infoURL: '', //编辑时获取单条数据接口
 | 
			
		||||
        codeURL: '', //获取code接口(返回结果为dataForm.code字段)
 | 
			
		||||
        codeURL: null, //获取code接口(返回结果为dataForm.code字段)
 | 
			
		||||
        optionArrUrl: [], //需要获取下拉框的方法数组
 | 
			
		||||
        optionArr: {}, //需要获取下拉框的方法数组的返回结果
 | 
			
		||||
        dictNameList: [], //数据字典name数组
 | 
			
		||||
@@ -35,7 +35,7 @@ export default {
 | 
			
		||||
      if (this.urlOptions.optionArrUrl.length > 0) {
 | 
			
		||||
        this.getArr()
 | 
			
		||||
      }
 | 
			
		||||
      if (this.urlOptions.dictNameList > 0) {
 | 
			
		||||
      if (this.urlOptions.dictNameList.length > 0) {
 | 
			
		||||
        this.getDict()
 | 
			
		||||
      }
 | 
			
		||||
      this.$nextTick(() => {
 | 
			
		||||
@@ -78,7 +78,7 @@ export default {
 | 
			
		||||
    },
 | 
			
		||||
    /** 查询字典数据列表 */
 | 
			
		||||
    getDict() {
 | 
			
		||||
      this.dictNameList.forEach((item,index)=>{
 | 
			
		||||
      this.urlOptions.dictNameList.forEach((item,index)=>{
 | 
			
		||||
        const queryParams = {
 | 
			
		||||
          pageNo: 1,
 | 
			
		||||
          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,
 | 
			
		||||
  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
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ import tagsView from './modules/tagsView'
 | 
			
		||||
import permission from './modules/permission'
 | 
			
		||||
import settings from './modules/settings'
 | 
			
		||||
import dict from './modules/dict'
 | 
			
		||||
import copilot from './modules/home'
 | 
			
		||||
import getters from './getters'
 | 
			
		||||
 | 
			
		||||
Vue.use(Vuex)
 | 
			
		||||
@@ -17,7 +18,8 @@ const store = new Vuex.Store({
 | 
			
		||||
    tagsView,
 | 
			
		||||
    permission,
 | 
			
		||||
    settings,
 | 
			
		||||
    dict
 | 
			
		||||
    dict,
 | 
			
		||||
    copilot
 | 
			
		||||
  },
 | 
			
		||||
  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>
 | 
			
		||||
  <div class="dashboard-editor-container">
 | 
			
		||||
    <!-- 首页http://localhost:81/index 数据展示  -->
 | 
			
		||||
    <panel-group @handleSetLineChartData="handleSetLineChartData" />
 | 
			
		||||
 | 
			
		||||
    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
 | 
			
		||||
      <line-chart :chart-data="lineChartData" />
 | 
			
		||||
    </el-row>
 | 
			
		||||
 | 
			
		||||
    <el-row :gutter="32">
 | 
			
		||||
      <el-col :xs="24" :sm="24" :lg="8">
 | 
			
		||||
        <div class="chart-wrapper">
 | 
			
		||||
          <raddar-chart />
 | 
			
		||||
  <div class="dashboard-factory-all">
 | 
			
		||||
    <div id="map-container">
 | 
			
		||||
      <div class="databoard">
 | 
			
		||||
        <db-header class="db-header"></db-header>
 | 
			
		||||
        <div class="db-body">
 | 
			
		||||
          <div class="db-left">
 | 
			
		||||
            <db-container
 | 
			
		||||
              icon="cube"
 | 
			
		||||
              title="FTO投入"
 | 
			
		||||
              @refresh="() => (ftoKey = Math.random())"
 | 
			
		||||
            >
 | 
			
		||||
              <fto-chart :key="ftoKey" />
 | 
			
		||||
            </db-container>
 | 
			
		||||
            <db-container
 | 
			
		||||
              icon="chip2"
 | 
			
		||||
              title="芯片投入"
 | 
			
		||||
              @refresh="() => (chipInvestKey = Math.random())"
 | 
			
		||||
            >
 | 
			
		||||
              <chip-invest-chart :key="chipInvestKey" />
 | 
			
		||||
            </db-container>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="db-right">
 | 
			
		||||
            <db-container
 | 
			
		||||
              side="right"
 | 
			
		||||
              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">
 | 
			
		||||
          <pie-chart />
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <el-col :xs="24" :sm="24" :lg="8">
 | 
			
		||||
        <div class="chart-wrapper">
 | 
			
		||||
          <bar-chart />
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-col>
 | 
			
		||||
    </el-row>
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <company-info
 | 
			
		||||
      v-if="visible"
 | 
			
		||||
      :info="info"
 | 
			
		||||
      :position="hintPosition"
 | 
			
		||||
      @close="closeHint"
 | 
			
		||||
    />
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import PanelGroup from './dashboard/PanelGroup'
 | 
			
		||||
import LineChart from './dashboard/LineChart'
 | 
			
		||||
import RaddarChart from './dashboard/RaddarChart'
 | 
			
		||||
import PieChart from './dashboard/PieChart'
 | 
			
		||||
import BarChart from './dashboard/BarChart'
 | 
			
		||||
import store from "@/store";
 | 
			
		||||
import DashboardHeader from "./dashboard/components/Header.vue";
 | 
			
		||||
import CompanyInfo from "./dashboard/components/CompanyInfo.vue";
 | 
			
		||||
import Container from "./dashboard/components/Container.vue";
 | 
			
		||||
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 = {
 | 
			
		||||
  newVisitis: {
 | 
			
		||||
    expectedData: [100, 120, 161, 134, 105, 160, 165],
 | 
			
		||||
    actualData: [120, 82, 91, 154, 162, 140, 145]
 | 
			
		||||
  },
 | 
			
		||||
  messages: {
 | 
			
		||||
    expectedData: [200, 192, 120, 144, 160, 130, 140],
 | 
			
		||||
    actualData: [180, 160, 151, 106, 145, 150, 130]
 | 
			
		||||
  },
 | 
			
		||||
  purchases: {
 | 
			
		||||
    expectedData: [80, 100, 121, 104, 105, 90, 100],
 | 
			
		||||
    actualData: [120, 90, 100, 138, 142, 130, 130]
 | 
			
		||||
  },
 | 
			
		||||
  shoppings: {
 | 
			
		||||
    expectedData: [130, 140, 141, 142, 145, 150, 160],
 | 
			
		||||
    actualData: [120, 82, 91, 154, 162, 140, 130]
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
const LOCATIONS = [
 | 
			
		||||
  // 佳木斯
 | 
			
		||||
  { x: 67, y: 20 },
 | 
			
		||||
  // 成都
 | 
			
		||||
  { x: 46, y: 56 },
 | 
			
		||||
  // 蚌埠1
 | 
			
		||||
  { x: 60, y: 52 },
 | 
			
		||||
  // 蚌埠2
 | 
			
		||||
  { x: 61, y: 53 },
 | 
			
		||||
  // 江西 瑞昌
 | 
			
		||||
  { x: 60, y: 58 },
 | 
			
		||||
  // 湖南 株洲
 | 
			
		||||
  { x: 56, y: 60 },
 | 
			
		||||
  // 邯郸
 | 
			
		||||
  { x: 58, y: 45 },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: 'Index',
 | 
			
		||||
  name: "Index",
 | 
			
		||||
  components: {
 | 
			
		||||
    PanelGroup,
 | 
			
		||||
    LineChart,
 | 
			
		||||
    RaddarChart,
 | 
			
		||||
    PieChart,
 | 
			
		||||
    BarChart
 | 
			
		||||
    CompanyInfo,
 | 
			
		||||
    DbHeader: DashboardHeader,
 | 
			
		||||
    DbContainer: Container,
 | 
			
		||||
    FtoChart,
 | 
			
		||||
    ChipInvestChart,
 | 
			
		||||
    ChipYieldChart,
 | 
			
		||||
    BipvChart,
 | 
			
		||||
    StdChart,
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    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: {
 | 
			
		||||
    handleSetLineChartData(type) {
 | 
			
		||||
      this.lineChartData = lineChartData[type]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
    initPins() {
 | 
			
		||||
      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>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.dashboard-editor-container {
 | 
			
		||||
  padding: 32px;
 | 
			
		||||
  background-color: rgb(240, 242, 245);
 | 
			
		||||
  position: relative;
 | 
			
		||||
<style>
 | 
			
		||||
.hideSidebar.mobile .dashboard-factory-all {
 | 
			
		||||
  left: 0 !important;
 | 
			
		||||
  width: 100vw !important;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
  .chart-wrapper {
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    padding: 16px 16px 0;
 | 
			
		||||
    margin-bottom: 32px;
 | 
			
		||||
  }
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
.dashboard-factory-all {
 | 
			
		||||
  background: #151516;
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  top: 0;
 | 
			
		||||
  left: 54px;
 | 
			
		||||
  height: 100vh;
 | 
			
		||||
  width: calc(100vw - 54px);
 | 
			
		||||
  z-index: 1001;
 | 
			
		||||
  color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media (max-width:1024px) {
 | 
			
		||||
  .chart-wrapper {
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
#map-container {
 | 
			
		||||
  height: 100%;
 | 
			
		||||
  background: url(../assets/bgearth.png) no-repeat 0 0 / 100% 100%;
 | 
			
		||||
  position: relative;
 | 
			
		||||
 | 
			
		||||
  .databoard {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 0;
 | 
			
		||||
    left: 0;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 100%;
 | 
			
		||||
    z-index: 1;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .db-body {
 | 
			
		||||
    flex: 1;
 | 
			
		||||
    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>
 | 
			
		||||
.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:
 | 
			
		||||
    "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":
 | 
			
		||||
  "integrity" "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="
 | 
			
		||||
  "resolved" "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz"
 | 
			
		||||
  "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":
 | 
			
		||||
  "integrity" "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
 | 
			
		||||
  "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"
 | 
			
		||||
  "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":
 | 
			
		||||
  "integrity" "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="
 | 
			
		||||
  "resolved" "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz"
 | 
			
		||||
 
 | 
			
		||||