diff --git a/package.json b/package.json index 94e48996..c2af3a1a 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "clipboard": "2.0.8", "core-js": "3.25.3", "echarts": "5.4.0", + "echarts-gl": "^2.0.9", "element-ui": "2.15.12", "file-saver": "2.0.5", "fuse.js": "6.4.3", diff --git a/src/api/kanban/dailyoutput.js b/src/api/kanban/dailyoutput.js new file mode 100644 index 00000000..0ad62c06 --- /dev/null +++ b/src/api/kanban/dailyoutput.js @@ -0,0 +1,18 @@ +import request from '@/utils/request' + +// 获取工厂下拉列表 +export function getBoardFactory(data) { + return request({ + url: '/mes/wcsInterface/getBoardFactory', + method: 'post', + data: data + }); +} +// 获取产量数据 +export function getMesBoardEquProductionToday(data) { + return request({ + url: '/mes/wcsInterface/getMesBoardEquProductionToday', + method: 'post', + data: data + }); +} diff --git a/src/assets/images/bg- border1.png b/src/assets/images/bg- border1.png new file mode 100644 index 00000000..18aa20a5 Binary files /dev/null and b/src/assets/images/bg- border1.png differ diff --git a/src/assets/images/bg-body.png b/src/assets/images/bg-body.png new file mode 100644 index 00000000..8b1428f4 Binary files /dev/null and b/src/assets/images/bg-body.png differ diff --git a/src/assets/images/bg-border2.png b/src/assets/images/bg-border2.png new file mode 100644 index 00000000..36bb5795 Binary files /dev/null and b/src/assets/images/bg-border2.png differ diff --git a/src/assets/images/bg-border3.png b/src/assets/images/bg-border3.png new file mode 100644 index 00000000..364ab700 Binary files /dev/null and b/src/assets/images/bg-border3.png differ diff --git a/src/assets/images/bg-head.png b/src/assets/images/bg-head.png new file mode 100644 index 00000000..648b4bd9 Binary files /dev/null and b/src/assets/images/bg-head.png differ diff --git a/src/assets/images/bg-title.png b/src/assets/images/bg-title.png new file mode 100644 index 00000000..5d71143d Binary files /dev/null and b/src/assets/images/bg-title.png differ diff --git a/src/assets/images/bg-zongchaliang.png b/src/assets/images/bg-zongchaliang.png new file mode 100644 index 00000000..05aa78f2 Binary files /dev/null and b/src/assets/images/bg-zongchaliang.png differ diff --git a/src/assets/images/icon-xiala.png b/src/assets/images/icon-xiala.png new file mode 100644 index 00000000..73630d4d Binary files /dev/null and b/src/assets/images/icon-xiala.png differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 00000000..d7e34684 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/xiala.png b/src/assets/images/xiala.png new file mode 100644 index 00000000..3db97bbc Binary files /dev/null and b/src/assets/images/xiala.png differ diff --git a/src/assets/images/地图组(1).png b/src/assets/images/地图组(1).png new file mode 100644 index 00000000..3dee2819 Binary files /dev/null and b/src/assets/images/地图组(1).png differ diff --git a/src/assets/images/地图组.png b/src/assets/images/地图组.png new file mode 100644 index 00000000..3dee2819 Binary files /dev/null and b/src/assets/images/地图组.png differ diff --git a/src/assets/images/路径.png b/src/assets/images/路径.png new file mode 100644 index 00000000..3db97bbc Binary files /dev/null and b/src/assets/images/路径.png differ diff --git a/src/components/itemSelect/single.vue b/src/components/itemSelect/single.vue index 65fec357..90a39d05 100644 --- a/src/components/itemSelect/single.vue +++ b/src/components/itemSelect/single.vue @@ -215,7 +215,7 @@ export default { }, // 单选选中数据 handleRowChange(row) { - debugger; + // debugger; if(row){ this.selectedRows = row; } diff --git a/src/main.js b/src/main.js index d8a35224..73204644 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,9 @@ import Cookies from 'js-cookie' import Element from 'element-ui' import './assets/styles/element-variables.scss' - +import * as echarts from 'echarts' +import 'echarts-gl' // 3d图表库 + import '@/assets/styles/index.scss' // global css import '@/assets/styles/open-platform.scss' // OpenPlatform css import App from './App' @@ -41,6 +43,7 @@ import DictData from '@/components/DictData' import Print from 'print-js' // 全局方法挂载 +Vue.prototype.$echarts = echarts Vue.prototype.getDicts = getDicts Vue.prototype.getConfigKey = getConfigKey Vue.prototype.parseTime = parseTime diff --git a/src/router/index.js b/src/router/index.js index 894e5792..a5828770 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -87,7 +87,19 @@ export const constantRoutes = [ meta: { title: '个人中心', icon: 'user' } } ] - } + }, + // 看板路由 + { + path: "/kanban/dailyoutput", + component: () => import("@/views/kanban/dailyoutput/index"), + hidden: true, + }, + // 看板路由 + { + path: "/kanban/3decharts", + component: () => import("@/views/kanban/3decharts/index"), + hidden: true, + }, ] // 动态路由,基于用户权限动态去加载 diff --git a/src/utils/echart.js b/src/utils/echart.js new file mode 100644 index 00000000..1e059a0b --- /dev/null +++ b/src/utils/echart.js @@ -0,0 +1,280 @@ +/** + * 绘制3d图 + * @param pieData 总数据 + * @param internalDiameterRatio:透明的空心占比 + * @param distance 视角到主体的距离 + * @param alpha 旋转角度 + * @param pieHeight 立体的高度 + * @param opacity 饼或者环的透明度 + */ +const getPie3D = (pieData, internalDiameterRatio, distance, alpha, pieHeight, opacity = 1) => { + if(pieData.length <0){ + return + } + console.log(pieData) + const series = [] + let sumValue = 0 + let startValue = 0 + let endValue = 0 + let legendData = [] + let legendBfb = [] + const k = 1 - internalDiameterRatio + pieData.sort((a, b) => { + return b.value - a.value + }) + // 为每一个饼图数据,生成一个 series-surface 配置 + for (let i = 0; i < pieData.length; i++) { + sumValue += pieData[i].value + const seriesItem = { + name: + typeof pieData[i].name === 'undefined' + ? `series${i}` + : pieData[i].name, + type: 'surface', + parametric: true, + wireframe: { + show: false + }, + pieData: pieData[i], + pieStatus: { + selected: false, + hovered: false, + k: k + }, + center: ['10%', '50%'] + } + if (typeof pieData[i].itemStyle !== 'undefined') { + const itemStyle = {} + itemStyle.color = + typeof pieData[i].itemStyle.color !== 'undefined' + ? pieData[i].itemStyle.color + : opacity + itemStyle.opacity = + typeof pieData[i].itemStyle.opacity !== 'undefined' + ? pieData[i].itemStyle.opacity + : opacity + seriesItem.itemStyle = itemStyle + } + series.push(seriesItem) + } + + // 使用上一次遍历时,计算出的数据和 sumValue,调用 getParametricEquation 函数, + // 向每个 series-surface 传入不同的参数方程 series-surface.parametricEquation,也就是实现每一个扇形。 + legendData = [] + legendBfb = [] + for (let i = 0; i < series.length; i++) { + endValue = startValue + series[i].pieData.value + series[i].pieData.startRatio = startValue / sumValue + series[i].pieData.endRatio = endValue / sumValue + series[i].parametricEquation = getParametricEquation( + series[i].pieData.startRatio, + series[i].pieData.endRatio, + false, + false, + k, + series[i].pieData.value + ) + startValue = endValue + const bfb = fomatFloat(series[i].pieData.value / sumValue, 4) + legendData.push({ + name: series[i].name, + value: bfb + }) + legendBfb.push({ + name: series[i].name, + value: bfb + }) + } + const boxHeight = getHeight3D(series, pieHeight) // 通过pieHeight设定3d饼/环的高度,单位是px + // 准备待返回的配置项,把准备好的 legendData、series 传入。 + const option = { + legend: { + show: false, + data: legendData, + orient: 'vertical', + left: 10, + top: 10, + itemGap: 10, + textStyle: { + color: '#A1E2FF' + }, + icon: 'circle', + formatter: function (param) { + const item = legendBfb.filter(item => item.name === param)[0] + const bfs = fomatFloat(item.value * 100, 2) + '%' + return `${item.name} ${bfs}` + } + + }, + labelLine: { + show: true, + lineStyle: { + color: '#fff' + } + }, + label: { + show: true, + position: 'outside', + formatter: '{b} \n{c} {d}%' + }, + tooltip: { + backgroundColor: '#033b77', + borderColor: '#21f2c4', + textStyle: { + color: '#fff', + fontSize: 13 + }, + formatter: params => { + if ( + params.seriesName !== 'mouseoutSeries' && + params.seriesName !== 'pie2d' + ) { + const bfb = ( + (option.series[params.seriesIndex].pieData.endRatio - + option.series[params.seriesIndex].pieData.startRatio) * + 100 + ).toFixed(2) + return ( + `${params.seriesName}
` + + `` + + `${bfb}%` + ) + } + } + }, + xAxis3D: { + min: -1, + max: 1 + }, + yAxis3D: { + min: -1, + max: 1 + }, + zAxis3D: { + min: -1, + max: 1 + }, + grid3D: { + show: false, + boxHeight: boxHeight, + // boxWidth:180, // 圆环的高度 + viewControl: { + // 3d效果可以放大、旋转等,请自己去查看官方配置 + alpha, // 角度 + distance, // 调整视角到主体的距离,类似调整zoom + rotateSensitivity: 0, // 设置为0无法旋转 + zoomSensitivity: 0, // 设置为0无法缩放 + panSensitivity: 0, // 设置为0无法平移 + autoRotate: false // 自动旋转 + } + }, + series: series + } + return option +} + +/** + * 生成扇形的曲面参数方程,用于 series-surface.parametricEquation + */ +const getParametricEquation = (startRatio, endRatio, isSelected, isHovered, k, h) => { + // 计算 + const midRatio = (startRatio + endRatio) / 2 + const startRadian = startRatio * Math.PI * 2 + const endRadian = endRatio * Math.PI * 2 + const midRadian = midRatio * Math.PI * 2 + // 如果只有一个扇形,则不实现选中效果。 + if (startRatio === 0 && endRatio === 1) { + isSelected = false + } + // 通过扇形内径/外径的值,换算出辅助参数 k(默认值 1/3) + k = typeof k !== 'undefined' ? k : 1 / 3 + // 计算选中效果分别在 x 轴、y 轴方向上的位移(未选中,则位移均为 0) + const offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0 + const offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0 + // 计算高亮效果的放大比例(未高亮,则比例为 1) + const hoverRate = isHovered ? 1.05 : 1 + // 返回曲面参数方程 + return { + u: { + min: -Math.PI, + max: Math.PI * 3, + step: Math.PI / 32 + }, + v: { + min: 0, + max: Math.PI * 2, + step: Math.PI / 20 + }, + x: function (u, v) { + if (u < startRadian) { + return ( + offsetX + + Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate + ) + } + if (u > endRadian) { + return ( + offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate + ) + } + return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate + }, + y: function (u, v) { + if (u < startRadian) { + return ( + offsetY + + Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate + ) + } + if (u > endRadian) { + return ( + offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate + ) + } + return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate + }, + z: function (u, v) { + if (u < -Math.PI * 0.5) { + return Math.sin(u) + } + if (u > Math.PI * 2.5) { + return Math.sin(u) * h * 0.1 + } + return Math.sin(v) > 0 ? 1 * h * 0.1 : -1 + } + } +} + +/** + * 获取3d丙图的最高扇区的高度 + */ +const getHeight3D = (series, height) => { + series.sort((a, b) => { + return b.pieData.value - a.pieData.value + }) + return (height * 25) / series[0].pieData.value +} + +/** + * 格式化浮点数 + */ +const fomatFloat = (num, n) => { + let f = parseFloat(num) + if (isNaN(f)) { + return false + } + f = Math.round(num * Math.pow(10, n)) / Math.pow(10, n) // n 幂 + let s = f.toString() + let rs = s.indexOf('.') + // 判定如果是整数,增加小数点再补0 + if (rs < 0) { + rs = s.length + s += '.' + } + while (s.length <= rs + n) { + s += '0' + } + return s +} + +export { getPie3D, getParametricEquation } \ No newline at end of file diff --git a/src/utils/request.js b/src/utils/request.js index 0be18a41..884f139f 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -56,7 +56,7 @@ service.interceptors.request.use(config => { if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { const message = '数据正在处理,请勿重复提交'; console.warn(`[${s_url}]: ` + message) - return Promise.reject(new Error(message)) + // return Promise.reject(new Error(message)) } else { cache.session.setJSON('sessionObj', requestObj) } @@ -93,7 +93,7 @@ service.interceptors.response.use(res => { return Promise.reject('无效的会话,或者会话已过期,请重新登录。') } else if (code === 500) { Message({ message: msg, type: 'error' }) - return Promise.reject(new Error(msg)) + // return Promise.reject(new Error(msg)) } else if (code === 601) { Message({ message: msg, type: 'warning' }) return Promise.reject('error') diff --git a/src/views/dashboard/LineChart.vue b/src/views/dashboard/LineChart.vue index c075bfbc..129f9e1d 100644 --- a/src/views/dashboard/LineChart.vue +++ b/src/views/dashboard/LineChart.vue @@ -53,7 +53,7 @@ } }, mounted() { - debugger + // debugger this.$nextTick(() => { this.initChart() }) diff --git a/src/views/kanban/3decharts/index.vue b/src/views/kanban/3decharts/index.vue new file mode 100644 index 00000000..1134c249 --- /dev/null +++ b/src/views/kanban/3decharts/index.vue @@ -0,0 +1,543 @@ + + + \ No newline at end of file diff --git a/src/views/kanban/dailyoutput/echarts3d.vue b/src/views/kanban/dailyoutput/echarts3d.vue new file mode 100644 index 00000000..80de67d3 --- /dev/null +++ b/src/views/kanban/dailyoutput/echarts3d.vue @@ -0,0 +1,334 @@ + + + + + \ No newline at end of file diff --git a/src/views/kanban/dailyoutput/echarts3d2.vue b/src/views/kanban/dailyoutput/echarts3d2.vue new file mode 100644 index 00000000..4fa5992f --- /dev/null +++ b/src/views/kanban/dailyoutput/echarts3d2.vue @@ -0,0 +1,540 @@ + + + \ No newline at end of file diff --git a/src/views/kanban/dailyoutput/index.vue b/src/views/kanban/dailyoutput/index.vue new file mode 100644 index 00000000..dfe280ea --- /dev/null +++ b/src/views/kanban/dailyoutput/index.vue @@ -0,0 +1,1800 @@ + + + + \ No newline at end of file diff --git a/src/views/system/datasource/index.vue b/src/views/system/datasource/index.vue index d3e30687..dd099782 100644 --- a/src/views/system/datasource/index.vue +++ b/src/views/system/datasource/index.vue @@ -371,7 +371,7 @@ export default { /** 分配用户操作 */ handleAuthUser: function(row) { const datasourceId = row.id; - debugger + // debugger this.$router.push("/system/datasource-auth/user/" + datasourceId); }, /** 查询部门下拉树结构 */ diff --git a/src/views/technology/process/content.vue b/src/views/technology/process/content.vue index 8d77f609..1bef5e14 100644 --- a/src/views/technology/process/content.vue +++ b/src/views/technology/process/content.vue @@ -328,7 +328,7 @@ export default { }, /** 提交按钮 */ submitForm() { - debugger + // debugger this.$refs["form"].validate(valid => { if (valid) { if (this.form.contentId != null) { diff --git a/src/views/technology/recipe/content.vue b/src/views/technology/recipe/content.vue index 04362862..df3f4950 100644 --- a/src/views/technology/recipe/content.vue +++ b/src/views/technology/recipe/content.vue @@ -292,7 +292,7 @@ export default { }, /** 提交按钮 */ submitForm() { - debugger + // debugger this.$refs["form"].validate(valid => { if (valid) { if (this.form.contentId != null) { diff --git a/vue.config.js b/vue.config.js index 54e5272f..98b467d1 100644 --- a/vue.config.js +++ b/vue.config.js @@ -35,7 +35,7 @@ module.exports = { proxy: { // detail: https://cli.vuejs.org/config/#devserver-proxy [process.env.VUE_APP_BASE_API]: { - target: `http://localhost:8080`, + target: `http://192.168.3.93:8080`, changeOrigin: true, pathRewrite: { ['^' + process.env.VUE_APP_BASE_API]: ''