test #47

Merged
gtz217 merged 273 commits from test into master 2023-10-17 08:53:54 +08:00
25 changed files with 1693 additions and 520 deletions
Showing only changes of commit eff5e0d1e1 - Show all commits

View File

@ -1,7 +1,7 @@
### ###
# @Author: Do not edit # @Author: Do not edit
# @Date: 2023-08-29 09:40:39 # @Date: 2023-08-29 09:40:39
# @LastEditTime: 2023-09-11 15:55:29 # @LastEditTime: 2023-09-16 09:41:07
# @LastEditors: DY # @LastEditors: DY
# @Description: # @Description:
### ###
@ -14,8 +14,13 @@ VUE_APP_TITLE = 芋道管理系统
# 芋道管理系统/开发环境 # 芋道管理系统/开发环境
# VUE_APP_BASE_API = 'http://192.168.1.49:48080' # VUE_APP_BASE_API = 'http://192.168.1.49:48080'
# VUE_APP_BASE_API = 'http://192.168.1.8:48080' # VUE_APP_BASE_API = 'http://192.168.1.8:48080'
<<<<<<< HEAD
VUE_APP_BASE_API = 'http://192.168.0.33:48080' VUE_APP_BASE_API = 'http://192.168.0.33:48080'
# VUE_APP_BASE_API = 'http://192.168.1.188:48080' # VUE_APP_BASE_API = 'http://192.168.1.188:48080'
=======
# VUE_APP_BASE_API = 'http://192.168.0.33:48080'
VUE_APP_BASE_API = 'http://192.168.1.188:48080'
>>>>>>> test
# 路由懒加载 # 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true VUE_CLI_BABEL_TRANSPILE_MODULES = true

View File

@ -8,7 +8,9 @@ VUE_APP_TITLE = 芋道管理系统
VUE_APP_BASE_API = '/prod-api' VUE_APP_BASE_API = '/prod-api'
# 根据服务器或域名修改 # 根据服务器或域名修改
PUBLIC_PATH = 'http://my-pi.com:8888/yudao-admin/' # PUBLIC_PATH = 'http://my-pi.com:8888/yudao-admin/'
PUBLIC_PATH = 'http://192.168.0.33:8888/'
# 二级部署路径 # 二级部署路径
VUE_APP_APP_NAME ='yudao-admin' VUE_APP_APP_NAME ='yudao-admin'

View File

@ -55,8 +55,10 @@
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"fuse.js": "6.6.2", "fuse.js": "6.6.2",
"highlight.js": "9.18.5", "highlight.js": "9.18.5",
"html2canvas": "^1.4.1",
"js-beautify": "1.13.0", "js-beautify": "1.13.0",
"jsencrypt": "3.3.1", "jsencrypt": "3.3.1",
"jspdf": "^2.5.1",
"min-dash": "3.5.2", "min-dash": "3.5.2",
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"moment": "^2.29.4", "moment": "^2.29.4",

View File

@ -0,0 +1,24 @@
/*
* @Author: zhp
* @Date: 2023-09-12 14:07:04
* @LastEditTime: 2023-09-13 09:53:45
* @LastEditors: zhp
* @Description:
*/
import request from '@/utils/request'
export function getYieldAnalysisPageData(data) {
return request({
url: '/analysis/production-analysis/getOutput',
method: 'post',
data: data
})
}
export function getCT(data) {
return request({
url: '/analysis/production-analysis/getCT',
method: 'post',
data: data
})
}

View File

@ -0,0 +1,25 @@
/*
* @Author: Do not edit
* @Date: 2023-09-12 09:44:53
* @LastEditTime: 2023-09-13 16:11:41
* @LastEditors: DY
* @Description:
*/
import request from '@/utils/request'
// 获得工厂分页
export function getPdlAutoReport(data) {
return request({
url: '/monitoring/production-monitor/getPdlAutoReport',
method: 'post',
data: data
})
}
// 获得所有工厂产线列表
export function getPdList() {
return request({
url: '/base/production-line/listAll',
method: 'get'
})
}

View File

@ -0,0 +1,25 @@
/*
* @Author: Do not edit
* @Date: 2023-09-12 09:44:53
* @LastEditTime: 2023-09-14 10:25:46
* @LastEditors: DY
* @Description:
*/
import request from '@/utils/request'
// 获得产线统计数据查询
export function getPdlDataSearch(data) {
return request({
url: '/monitoring/production-monitor/getPdlDataSearch',
method: 'post',
data: data
})
}
// 获得所有工厂产线列表
export function getPdList() {
return request({
url: '/base/production-line/listAll',
method: 'get'
})
}

View File

@ -0,0 +1,17 @@
/*
* @Author: Do not edit
* @Date: 2023-09-12 09:44:53
* @LastEditTime: 2023-09-15 14:12:26
* @LastEditors: DY
* @Description:
*/
import request from '@/utils/request'
// 获得近24小时产线生产数据
export function getPdlDataOneDay(data) {
return request({
url: '/monitoring/production-monitor/getPdlDataOneDay',
method: 'post',
data: data
})
}

View File

@ -0,0 +1,16 @@
/*
* @Author: zhp
* @Date: 2023-09-12 14:07:04
* @LastEditTime: 2023-09-13 09:46:44
* @LastEditors: zhp
* @Description:
*/
import request from '@/utils/request'
export function getSectionDataSearch(data) {
return request({
url: '/monitoring/production-monitor/getSectionDataSearch',
method: 'post',
data: data
})
}

View File

@ -0,0 +1,33 @@
/*
* @Author: Do not edit
* @Date: 2023-09-12 09:44:53
* @LastEditTime: 2023-09-14 14:01:12
* @LastEditors: DY
* @Description:
*/
import request from '@/utils/request'
// 获得工段自动统计数据查询
export function getSectionAutoReport(data) {
return request({
url: '/monitoring/production-monitor/getSectionAutoReport',
method: 'post',
data: data
})
}
// 获得所有工厂产线列表
export function getPdList() {
return request({
url: '/base/production-line/listAll',
method: 'get'
})
}
// 获得所有产线工段列表
export function getWorkshopSectionList() {
return request({
url: '/base/workshop-section/listAll',
method: 'get'
})
}

View File

@ -1 +1 @@
<svg t="1627279997305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11904" width="40" height="40"><path d="M938.7008 669.525333L938.7008 249.412267c0-90.555733-73.5232-164.078933-164.1472-164.078933L249.378133 85.333333c-90.555733 0-164.078933 73.48906699-164.078933 164.078933l0 525.2096c0 90.555733 73.454933 164.078933 164.07893301 164.078933l525.20959999 0c80.725333 0 147.8656-58.368 161.553067-135.099733-43.52-18.8416-232.106667-100.283733-330.376533-147.182933-74.786133 90.589867-153.088 144.930133-271.121067 144.930133s-196.81279999-72.704-187.357867-161.655467c6.2464-58.402133 46.2848-153.9072 220.296533-137.5232 91.682133 8.6016 133.666133 25.736533 208.418133 50.414933 19.3536-35.4304 35.4304-74.513067 47.616-116.0192L292.0448 436.565333l0-32.8704 164.0448 0 0-58.9824L256 344.712533l1e-8-36.181333 200.12373299 0L456.123733 223.3344c0 0 1.809067-13.312 16.520533-13.31200001l82.056533 1e-8 0 98.474667 213.333333 0 0 36.181333-213.333333 1e-8 0 58.98239999 174.045867 0c-16.00853301 65.1264-40.277333 124.962133-70.690133 177.220267C708.608 599.176533 938.7008 669.525333 938.7008 669.525333L938.7008 669.525333 938.7008 669.525333 938.7008 669.525333zM321.57013299 744.994133c-124.7232 0-144.452267-78.7456-137.83039999-111.65013299 6.5536-32.733867 42.666667-75.502933 112.0256-75.50293301 79.6672 0 151.04 20.445867 236.714667 62.088533C472.302933 698.333867 398.370133 744.994133 321.57013299 744.994133L321.57013299 744.994133 321.57013299 744.994133zM321.57013299 744.994133" fill="#1296db" p-id="11905"></path></svg> <svg t="1627279997305" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11904" width="40" height="40"><path d="M938.7008 669.525333L938.7008 249.412267c0-90.555733-73.5232-164.078933-164.1472-164.078933L249.378133 85.333333c-90.555733 0-164.078933 73.48906699-164.078933 164.078933l0 525.2096c0 90.555733 73.454933 164.078933 164.07893301 164.078933l525.20959999 0c80.725333 0 147.8656-58.368 161.553067-135.099733-43.52-18.8416-232.106667-100.283733-330.376533-147.182933-74.786133 90.589867-153.088 144.930133-271.121067 144.930133s-196.81279999-72.704-187.357867-161.655467c6.2464-58.402133 46.2848-153.9072 220.296533-137.5232 91.682133 8.6016 133.666133 25.736533 208.418133 50.414933 19.3536-35.4304 35.4304-74.513067 47.616-116.0192L292.0448 436.565333l0-32.8704 164.0448 0 0-58.9824L256 344.712533l1e-8-36.181333 200.12373299 0L456.123733 223.3344c0 0 1.809067-13.312 16.520533-13.31200001l82.056533 1e-8 0 98.474667 213.333333 0 0 36.181333-213.333333 1e-8 0 58.98239999 174.045867 0c-16.00853301 65.1264-40.277333 124.962133-70.690133 177.220267C708.608 599.176533 938.7008 669.525333 938.7008 669.525333L938.7008 669.525333 938.7008 669.525333 938.7008 669.525333zM321.57013299 744.994133c-124.7232 0-144.452267-78.7456-137.83039999-111.65013299 6.5536-32.733867 42.666667-75.502933 112.0256-75.50293301 79.6672 0 151.04 20.445867 236.714667 62.088533C472.302933 698.333867 398.370133 744.994133 321.57013299 744.994133L321.57013299 744.994133 321.57013299 744.994133zM321.57013299 744.994133" fill="#1296db" p-id="11905"></path></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -247,7 +247,7 @@ Router.prototype.push = function push(location) {
export default new Router({ export default new Router({
base: process.env.VUE_APP_APP_NAME ? process.env.VUE_APP_APP_NAME : "/", base: process.env.VUE_APP_APP_NAME ? process.env.VUE_APP_APP_NAME : "/",
mode: 'history', // 去掉url中的# mode: 'hash', // 去掉url中的#
scrollBehavior: () => ({y: 0}), scrollBehavior: () => ({y: 0}),
routes: constantRoutes routes: constantRoutes
}) })

View File

@ -0,0 +1,219 @@
<!--
filename: dialogForm.vue
author: liubin
date: 2023-09-11 15:55:13
description: DialogForm for equipmentBindSection only
-->
<template>
<el-form
ref="form"
:model="dataForm"
label-width="100px"
v-loading="formLoading">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item
label="产线"
prop="productionLineId"
:rules="[{ required: true, message: '不能为空', trigger: 'blur' }]">
<el-select
v-model="dataForm.productionLineId"
placeholder="请选择产线"
@change="handleProductlineChange">
<el-option
v-for="opt in productionLineList"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="工段"
prop="workshopSectionId"
:rules="[{ required: true, message: '不能为空', trigger: 'blur' }]">
<el-select
v-model="dataForm.workshopSectionId"
placeholder="请选择工段"
@change="$emit('update', dataForm)">
<el-option
v-for="opt in worksectionList"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item
label="设备"
prop="equipmentId"
:rules="[{ required: true, message: '不能为空', trigger: 'blur' }]">
<el-select
v-model="dataForm.equipmentId"
placeholder="请选择设备"
@change="$emit('update', dataForm)">
<el-option
v-for="opt in equipmentList"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工段排序" prop="sort">
<el-input
v-model="dataForm.sort"
@change="$emit('update', dataForm)"
placeholder="请输入工段排序" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="产线数据类型" prop="lineDataType">
<el-select
v-model="dataForm.lineDataType"
placeholder="请选择产线数据类型"
@change="$emit('update', dataForm)">
<el-option
v-for="opt in [
{ label: '无类型', value: 0 },
{ label: '进口统计', value: 1 },
{ label: '出口统计', value: 2 },
]"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工段数据类型" prop="sectionDataType">
<el-select
v-model="dataForm.sectionDataType"
placeholder="请选择工段数据类型"
@change="$emit('update', dataForm)">
<el-option
v-for="opt in [
{ label: '无类型', value: 0 },
{ label: '进口统计', value: 1 },
{ label: '出口统计', value: 2 },
]"
:key="opt.value"
:label="opt.label"
:value="opt.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script>
export default {
name: 'DialogForm',
model: {
prop: 'dataForm',
event: 'update',
},
emits: ['update'],
components: {},
props: {
dataForm: {
type: Object,
default: () => ({}),
},
},
data() {
return {
formLoading: true,
productionLineList: [],
equipmentList: [],
worksectionList: [],
dataFormCache: null,
};
},
mounted() {
Promise.all([this.getProductLineList(), this.getEquipmentList()]).then(
() => {
this.formLoading = false;
}
);
},
watch: {
'dataForm.productionLineId': {
handler: async function (plId) {
if (plId) await this.getWorksectionList(plId);
},
immediate: true,
},
},
methods: {
/** 模拟透传 ref */
validate(cb) {
return this.$refs.form.validate(cb);
},
resetFields(args) {
return this.$refs.form.resetFields(args);
},
async handleProductlineChange(id) {
await this.getWorksectionList(id);
this.dataForm.workshopSectionId = null;
this.$emit('update', this.dataForm);
},
// getCode
async getCode(url) {
const response = await this.$axios(url);
return response.data;
},
// 线
async getProductLineList() {
const response = await this.$axios('/base/production-line/listAll');
this.productionLineList = response.data.map((item) => ({
label: item.name,
value: item.id,
}));
},
//
async getEquipmentList() {
const response = await this.$axios(
'/base/equipment/page?pageNo=1&pageSize=100'
);
this.equipmentList = response.data.list.map((item) => ({
label: item.name,
value: item.id,
}));
},
//
async getWorksectionList(plId) {
const response = await this.$axios(
'/base/workshop-section/listByParentId',
{
params: {
id: plId,
},
}
);
this.worksectionList = response.data.map((item) => ({
label: item.name,
value: item.id,
}));
},
},
};
</script>
<style scoped lang="scss">
.el-date-editor,
.el-select {
width: 100%;
}
</style>

View File

@ -37,7 +37,7 @@
@close="cancel" @close="cancel"
@cancel="cancel" @cancel="cancel"
@confirm="submitForm"> @confirm="submitForm">
<DialogForm v-if="open" ref="form" :dataForm="form" :rows="rows" /> <DialogForm v-if="open" ref="form" v-model="form" :rows="rows" />
</base-dialog> </base-dialog>
</div> </div>
</template> </template>
@ -53,10 +53,10 @@ import {
} from '@/api/base/equipmentBindSection'; } from '@/api/base/equipmentBindSection';
import moment from 'moment'; import moment from 'moment';
import basicPageMixin from '@/mixins/lb/basicPageMixin'; import basicPageMixin from '@/mixins/lb/basicPageMixin';
import DialogForm from './dialogForm.vue';
export default { export default {
name: 'EquipmentBindSection', name: 'EquipmentBindSection',
components: {}, components: { DialogForm },
mixins: [basicPageMixin], mixins: [basicPageMixin],
data() { data() {
return { return {
@ -181,8 +181,8 @@ export default {
select: true, select: true,
label: '工段', label: '工段',
url: '/base/workshop-section/listByParentId', // 线 url: '/base/workshop-section/listByParentId', // 线
// depends: '__product_line', // 线 // depends: '__product_line', // 线
depends: 'productionLineId', depends: 'productionLineId',
prop: 'workshopSectionId', prop: 'workshopSectionId',
rules: [{ required: true, message: '不能为空', trigger: 'blur' }], rules: [{ required: true, message: '不能为空', trigger: 'blur' }],
}, },

View File

@ -1,6 +1,13 @@
/*
* @Author: zhp
* @Date: 2023-09-11 16:18:44
* @LastEditTime: 2023-09-12 14:25:01
* @LastEditors: zhp
* @Description:
*/
import Mock from 'mockjs'; import Mock from 'mockjs';
const baseURL = 'http://192.168.1.49:48080/admin-api'; const baseURL = 'http://192.168.1.188:48080/admin-api';
Mock.setup({ Mock.setup({
timeout: 200, timeout: 200,

View File

@ -0,0 +1,93 @@
<!--
* @Author: zhp
* @Date: 2023-09-13 09:02:25
* @LastEditTime: 2023-09-13 10:33:20
* @LastEditors: zhp
* @Description:
-->
<template>
<div :class="className" :style="{height:height,width:width}" />
</template>
<script>
import * as echarts from 'echarts'
require('echarts/theme/macarons') // echarts theme
// import resize from './mixins/resize'
export default {
// mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '350px'
},
// autoResize: {
// type: Boolean,
// default: true
// }
},
data() {
return {
chart: null
}
},
// watch: {
// chartData: {
// deep: true,
// handler(val) {
// this.setOptions(val)
// }
// }
// },
mounted() {
// this.$nextTick(() => {
// this.initChart()
// })
},
// beforeDestroy() {
// if (!this.chart) {
// return
// }
// this.chart.dispose()
// this.chart = null
// },
methods: {
initChart(xData, yData,lineName) {
console.log(xData,yData);
this.chart = echarts.init(this.$el, 'macarons')
this.setOptions(xData, yData, lineName)
},
setOptions(xData, yData, lineName) {
let seriesData = []
lineName.forEach((item,index) => {
seriesData.push({
name: item,
data: yData[index],
type: 'line',
})
})
this.chart.setOption({
xAxis: {
type: 'category',
data: xData
},
legend: {
data:lineName
},
yAxis: {
type: 'value'
},
series: seriesData
})
}
}
}
</script>

View File

@ -1,159 +1,245 @@
<!--
* @Author: zhp
* @Date: 2023-09-11 14:21:21
* @LastEditTime: 2023-09-11 14:26:04
* @LastEditors: zhp
* @Description:
-->
<template> <template>
<div class="app-container"> <div class="app-container">
<search-bar <search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
:formConfigs="formConfig" <base-table v-loading="dataListLoading" :span-method="mergeColumnHandler" :table-props="tableProps" :table-data="tableData" />
ref="searchBarForm" <line-chart ref="lineChart" />
@headBtnClick="buttonClick" /> <!-- <pagination
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData" />
<pagination
:limit.sync="listQuery.pageSize" :limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo" :page.sync="listQuery.pageNo"
:total="listQuery.total" :total="listQuery.total"
@pagination="getDataList" /> @pagination="getDataList" /> -->
</div> </div>
</template> </template>
<script> <script>
import basicPage from '../../mixins/basic-page'; // import basicPage from '../../mixins/basic-page';
import { parseTime } from '../../mixins/code-filter'; import { parseTime } from '../../mixins/code-filter';
import { getLineBindProductLogPage } from '@/api/core/base/lineBindProductLog'; import { getCT } from '@/api/core/analysis/index';
import { getProductionLinePage } from '@/api/core/base/productionLine'; import { getProductionLinePage } from '@/api/core/base/productionLine';
import { getWorkshopSectionPage } from '@/api/core/base/workshopSection'; import lineChart from '../LineChart'
import { time } from 'echarts';
// import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
const tableProps = [ // const tableProps = [
{ // // {
prop: 'productionLineName', // // prop: 'lineName',
label: '产线名称', // // label: '线',
align: 'center', // // align: 'center',
}, // // },
{ // // {
prop: '', // // prop: 'sum',
label: '工段名称', // // label: '',
align: 'center', // // align: 'center',
}, // // },
{ // // {
prop: '', // // prop: 'dynamicValue',
label: '进片数量/片', // // label: 'dynamicName',
align: 'center', // // align: 'center',
}, // // children:[
{
prop: '', // // ]
label: '出片数量/片', // // }
align: 'center', // ];
},
{
prop: '',
label: '损耗数量/片',
align: 'center',
},
{
prop: '',
label: '损耗面积/m²',
align: 'center',
},
{
prop: '',
label: '损耗比例/%',
align: 'center',
}
];
export default { export default {
mixins: [basicPage], components: {
data() { lineChart,
return { },
urlOptions: { // mixins: [basicPage],
getDataListURL: getLineBindProductLogPage, data() {
}, return {
tableProps, urlOptions: {
tableData: [], getDataListURL: getCT,
optionArrUrl: [getProductionLinePage, getWorkshopSectionPage], },
formConfig: [ tableProps: [],
{ dataListLoading: false,
type: 'select', tableData: [],
label: '产线', listQuery: {
selectOptions: [], // time: ''
param: 'productionLineId', endTime: undefined,
defaultSelect: '', lineId:undefined,
filterable: true, startTime:undefined
}, },
{ timeList: [],
type: 'datePicker', spanArr: [],
label: '时间', xData: [],
dateType: 'daterange', yData: [],
format: 'yyyy-MM-dd', optionArrUrl: [getProductionLinePage],
valueFormat: 'yyyy-MM-dd HH:mm:ss', formConfig: [
rangeSeparator: '-', {
startPlaceholder: '开始时间', type: 'select',
endPlaceholder: '结束时间', label: '产线',
param: 'createTime', selectOptions: [],
}, param: 'lineIds',
{ defaultSelect: '',
type: 'button', multiple: false,
btnName: '搜索', filterable: true,
name: 'search', },
color: 'primary', {
}, type: 'datePicker',
{ label: '时间',
type: 'button', dateType: 'datetimerange',
btnName: '导出', format: 'yyyy-MM-dd',
name: 'export', valueFormat: 'yyyy-MM-dd HH:mm:ss',
}, rangeSeparator: '-',
], startPlaceholder: '开始时间',
}; endPlaceholder: '结束时间',
}, width: 350,
components: { param: 'time',
}, },
created() { {
this.getArr(); type: 'button',
}, btnName: '搜索',
methods: { name: 'search',
getArr() { color: 'primary',
const params = { }
page: 1, ],
limit: 500, };
}; },
this.optionArrUrl.forEach((item, index) => { created() {
item(params).then((response) => { this.getArr();
this.formConfig[index].selectOptions = response.data.list; },
}); methods: {
}); getArr() {
}, const params = {
buttonClick(val) { page: 1,
switch (val.btnName) { limit: 500,
case 'search': };
this.listQuery.pageNo = 1; this.optionArrUrl.forEach((item, index) => {
this.listQuery.pageSize = 10; item(params).then((response) => {
this.listQuery.productionLineId = val.productionLineId; this.formConfig[index].selectOptions = response.data.list
this.listQuery.productId = val.productId; });
this.listQuery.createTime = val.createTime; });
this.getDataList(); },
break; setRowSpan(arr) {
case 'reset': let count = 0
this.$refs.searchBarForm.resetForm(); arr.forEach((item, index) => {
this.listQuery = { if(index === 0) {
pageSize: 10, this.spanArr.push(1)
pageNo: 1, } else {
total: 1, if (item === arr[index - 1]) {
}; this.spanArr[count] += 1
this.getDataList(); this.spanArr.push(0)
break; } else {
default: count = index
console.log(val); this.spanArr.push(1)
}
}
})
console.log('打印数组长度', this.spanArr)
},
/** 合并table列的规则 */
mergeColumnHandler({ row, column, rowIndex, columnIndex }) {
if (columnIndex == 0) {
if (this.spanArr[rowIndex]) {
return [
this.spanArr[rowIndex], // row span
1, // col span
];
} else {
return [0, 0];
}
} }
}, },
}, getData() {
// this.listQuery.lineId = '1672847052717821953'
// this.listQuery.startTime = '1693497600000';
// this.listQuery.endTime = '1693843200000';
this.urlOptions.getDataListURL(this.listQuery).then(res => {
console.log(res)
let arr = [
{
prop: 'sectionName',
label: '工段',
align: 'center',
},
{
prop: 'equName',
label: '设备',
align: 'center',
}
]
let sectionArr= []
res.data.data.forEach((ele, index) => {
let tempData = []
ele.data.forEach(item => {
item.children.forEach(params => {
if (params.dynamicName === '设备CT') {
tempData[item.dynamicName + '_eq'] = params.dynamicValue
} else {
tempData[item.dynamicName + '_pl'] = params.dynamicValue
}
})
})
tempData['equName'] = ele.equName
tempData['sectionName'] = ele.sectionName
this.tableData.push(tempData)
const { sectionName } = tempData
sectionArr.push(sectionName)
})
this.setRowSpan(sectionArr)
console.log('工段名称列表', sectionArr)
res.data.nameData.forEach(item => {
this.timeList.push(item.name)
})
const timeArray = Array.from(new Set(this.timeList))
for (const times of timeArray) {
if (times !== '设备CT' && times !== '产线CT') {
const subprop = {
label: times,
align: 'center',
children: [
{ prop: times + '_eq', label: '设备CT', align: 'center' },
{ prop: times + '_pl', label: '产线CT', align: 'center' }
]
}
arr.push(subprop)
}
}
this.tableProps = arr
let xData = []
res.data.nameData.forEach(item => {
xData.push(item.name)
// arr[2].children.push(props)
})
let yData = []
res.data.data[0].data[0].children.forEach((item, index) => {
// console.log(item)
yData.push(item.dynamicValue)
// let data = 'data' + Number(index+1)
// obj['' + item.dynamicName + ''] = item.dynamicValue
})
console.log(this.yData)
this.$refs.lineChart.initChart(xData, yData)
// this.total = response.data.total;
// this.dataListLoading = false;
});
},
buttonClick(val) {
// console.log(val)
switch (val.btnName) {
case 'search':
// this.listQuery.pageNo = 1;
// this.listQuery.pageSize = 10;
this.listQuery.lineId = val.lineIds
this.listQuery.startTime = val.time ? String(new Date(val.time[0]).getTime()) : undefined;
this.listQuery.endTime = val.time ? String(new Date(val.time[1]).getTime()) : undefined;
this.getData()
break;
case 'reset':
this.$refs.searchBarForm.resetForm();
this.listQuery = {
pageSize: 10,
pageNo: 1,
total: 1,
};
this.getDataList();
break;
default:
console.log(val);
}
},
},
}; };
</script> </script>

View File

@ -1,114 +1,95 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<search-bar <search-bar :formConfigs="formConfig" ref="searchBarForm" @headBtnClick="buttonClick" />
:formConfigs="formConfig" <base-table v-loading="dataListLoading" :table-props="tableProps" :table-data="tableData" />
ref="searchBarForm" <line-chart ref="lineChart" />
@headBtnClick="buttonClick" /> <!-- <pagination
<base-table
v-loading="dataListLoading"
:table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData" />
<pagination
:limit.sync="listQuery.pageSize" :limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo" :page.sync="listQuery.pageNo"
:total="listQuery.total" :total="listQuery.total"
@pagination="getDataList" /> @pagination="getDataList" /> -->
</div> </div>
</template> </template>
<script> <script>
import basicPage from '../../mixins/basic-page'; // import basicPage from '../../mixins/basic-page';
import { parseTime } from '../../mixins/code-filter'; import { parseTime } from '../../mixins/code-filter';
import { getLineBindProductLogPage } from '@/api/core/base/lineBindProductLog'; import { getYieldAnalysisPageData } from '@/api/core/analysis/index';
import { getProductionLinePage } from '@/api/core/base/productionLine'; import { getProductionLinePage } from '@/api/core/base/productionLine';
import { getWorkshopSectionPage } from '@/api/core/base/workshopSection'; import lineChart from '../LineChart'
// import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
const tableProps = [ // const tableProps = [
{ // // {
prop: 'productionLineName', // // prop: 'lineName',
label: '产线', // // label: '线',
align: 'center', // // align: 'center',
}, // // },
{ // // {
prop: '', // // prop: 'sum',
label: '合计', // // label: '',
align: 'center', // // align: 'center',
}, // // },
{ // // {
prop: '', // // prop: 'dynamicValue',
label: '进片数量/片', // // label: 'dynamicName',
align: 'center', // // align: 'center',
}, // // children:[
{
prop: '', // // ]
label: '出片数量/片', // // }
align: 'center', // ];
},
{
prop: '',
label: '损耗数量/片',
align: 'center',
},
{
prop: '',
label: '损耗面积/m²',
align: 'center',
},
{
prop: '',
label: '损耗比例/%',
align: 'center',
}
];
export default { export default {
mixins: [basicPage], components: {
lineChart,
},
// mixins: [basicPage],
data() { data() {
return { return {
urlOptions: { urlOptions: {
getDataListURL: getLineBindProductLogPage, getDataListURL: getYieldAnalysisPageData,
}, },
tableProps, tableProps:[],
tableData: [], dataListLoading:false,
optionArrUrl: [getProductionLinePage, getWorkshopSectionPage], tableData: [],
listQuery: {
lineIds: [],
time: ''
},
xData: [],
yData:[],
optionArrUrl: [getProductionLinePage ],
formConfig: [ formConfig: [
{ {
type: 'select', type: 'select',
label: '产线', label: '产线',
selectOptions: [], selectOptions: [],
param: 'productionLineId', param: 'lineIds',
defaultSelect: '', defaultSelect: '',
multiple:true,
filterable: true, filterable: true,
}, },
{ {
type: 'datePicker', type: 'datePicker',
label: '时间', label: '时间',
dateType: 'daterange', dateType: 'datetime',
format: 'yyyy-MM-dd', format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd HH:mm:ss', valueFormat: 'yyyy-MM-dd HH:mm:ss',
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',
param: 'createTime', param: 'time',
}, },
{ {
type: 'button', type: 'button',
btnName: '搜索', btnName: '搜索',
name: 'search', name: 'search',
color: 'primary', color: 'primary',
}, }
{
type: 'button',
btnName: '导出',
name: 'export',
},
], ],
}; };
}, },
components: {
},
created() { created() {
this.getArr(); this.getArr();
}, },
@ -120,19 +101,109 @@ export default {
}; };
this.optionArrUrl.forEach((item, index) => { this.optionArrUrl.forEach((item, index) => {
item(params).then((response) => { item(params).then((response) => {
this.formConfig[index].selectOptions = response.data.list; this.formConfig[index].selectOptions = response.data.list
}); });
}); });
}, },
buttonClick(val) { getData() {
// this.listQuery.lineIds = ['1672847052717821953']
// this.listQuery.productId = val.productId;
// this.listQuery.time = '1694486098000';
this.urlOptions.getDataListURL(this.listQuery).then(res => {
let arr = [
{
prop: 'lineName',
label: '产线',
align: 'center',
},
{
prop: 'sum',
label: '合计',
align: 'center',
},
{
prop: res.data.nameData[0].name,
label: res.data.nameData[0].name,
align: 'center',
children:[
]
}
]
console.log(res.data.nameData.slice(1))
res.data.nameData.slice(1).forEach(item => {
const props = {
'prop': item.name,
'label': item.name,
'align': 'center'
}
arr[2].children.push(props)
})
let tableDataArr =[]
res.data.data.forEach(item => {
let obj = {}
obj.lineName= item.lineName,
obj.sum= item.sum,
item.data.forEach((ele, index) => {
// console.log(ele)
ele.children.forEach((e) => {
console.log(e.dynamicName)
obj['' + e.dynamicName + ''] = e.dynamicValue
console.log(obj['' + e.dynamicName + '']);
})
})
tableDataArr.push(obj)
});
this.tableData = tableDataArr
console.log(this.tableData)
console.log(arr)
this.tableProps = arr
let xData = []
res.data.nameData.slice(1).forEach(item => {
xData.push(item.name)
// arr[2].children.push(props)
})
let yAllData = []
let lineName = []
res.data.data.forEach(item => {
let yData = []
lineName.push(item.lineName)
// let obj = {}
// obj.lineName = item.lineName,
// obj.sum = item.sum,
item.data.forEach((ele, index) => {
// console.log(ele)
ele.children.forEach((e) => {
// let yData = []
yData.push(e.dynamicValue)
})
})
yAllData.push(yData)
});
console.log(lineName)
// res.data.data[0].data[0].children.forEach((item, index) => {
// // console.log(item)
// yData.push(item.dynamicValue)
// // let data = 'data' + Number(index+1)
// // obj['' + item.dynamicName + ''] = item.dynamicValue
// })
// console.log(this.yData)
this.$refs.lineChart.initChart(xData, yAllData, lineName)
// this.total = response.data.total;
// this.dataListLoading = false;
});
},
buttonClick(val) {
// console.log(val)
switch (val.btnName) { switch (val.btnName) {
case 'search': case 'search':
this.listQuery.pageNo = 1; this.listQuery.lineIds = val.lineIds ? val.lineIds :undefined
this.listQuery.pageSize = 10; // this.listQuery.productId = val.productId;
this.listQuery.productionLineId = val.productionLineId; this.listQuery.time = val.time ? new Date(val.time).getTime() : undefined
this.listQuery.productId = val.productId; // this.listQuery.pageNo = 1;
this.listQuery.createTime = val.createTime; // this.listQuery.pageSize = 10;
this.getDataList(); this.getData()
break; break;
case 'reset': case 'reset':
this.$refs.searchBarForm.resetForm(); this.$refs.searchBarForm.resetForm();

View File

@ -1,8 +1,8 @@
/* /*
* @Date: 2020-12-29 16:49:28 * @Date: 2020-12-29 16:49:28
* @LastEditors: zwq * @LastEditors: DY
* @LastEditTime: 2023-08-01 11:10:04 * @LastEditTime: 2023-09-12 11:13:34
* @FilePath: \basic-admin\src\filters\basicData\index.js * @FilePath: \basic-admin\src\filters\basicData\index.js
* @Description: * @Description:
*/ */
@ -13,6 +13,11 @@ const table = {
2: '停止', 2: '停止',
3: '未知', 3: '未知',
}, },
reportType: {
1: '日',
2: '周',
3: '月'
}
} }
// 日期格式化 // 日期格式化

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: Do not edit * @Author: Do not edit
* @Date: 2023-08-29 14:59:29 * @Date: 2023-08-29 14:59:29
* @LastEditTime: 2023-09-11 15:52:20 * @LastEditTime: 2023-09-16 17:34:17
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
@ -32,100 +32,104 @@
:limit.sync="listQuery.pageSize" :limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo" :page.sync="listQuery.pageNo"
:total="listQuery.total" :total="listQuery.total"
@pagination="getDataList" /> @pagination="getDataList"
<!-- <div> />
<el-button @click="down()">1111</el-button> <!-- <div v-show="false" ref="pdf">
<el-table :data="tableData1" stripe style="width: 100%"> <base-table
<el-table-column prop="date" label="日期" width="180" /> v-loading="dataListLoading"
<el-table-column prop="name" label="姓名" /> :table-props="tableProps"
<el-table-column prop="address" label="地址" /> :page="listQuery.pageNo"
</el-table> :limit="listQuery.pageSize"
:table-data="selectedList"
/>
</div> --> </div> -->
<div ref="pdf" v-show="false">
<el-table :data="selectedList" stripe border style="width: 100%">
<el-table-column prop="reportType" label="报表类型" />
<el-table-column prop="reportStartTime" label="统计开始时间" />
<el-table-column prop="reportEndTime" label="统计结束时间" />
<el-table-column prop="proLineName" label="产线名称" />
<el-table-column prop="inputNum" label="投入数量/片" />
<el-table-column prop="outputNum" label="产出数量/片" />
<el-table-column prop="outputArea" label="产出面积/㎡" />
<el-table-column prop="lossArea" label="损耗面积/㎡" />
<el-table-column prop="lossRatio" label="损耗比例%" />
</el-table>
</div>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose">
<el-button type="primary" @click="exportXlsx">xlsx</el-button>
<el-button type="success" @click="exportPdf">pdf</el-button>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="dialogVisible = false"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { parseTime } from '../../mixins/code-filter'; import { parseTime } from '../../mixins/code-filter';
import { import { getPdlAutoReport, getPdList } from '@/api/core/monitoring/auto'
getFactoryPage, // import jsPDF from 'jspdf'
exportFactoryExcel, // import html2canvas from 'html2canvas'
} from '@/api/core/base/factory'; // import codeFilter from '../../mixins/code-filter'
import * as XLSX from 'xlsx' import * as XLSX from 'xlsx'
import FileSaver from 'file-saver' import FileSaver from 'file-saver'
const tableData1 = [
{
date: '2016-05-03',
name: 'fom',
address: 'No'
},
{
date: '2016-05-02',
name: 'fom',
address: '189'
},
{
date: '2016-0225-03',
name: 'fom',
address: 'Ndddo'
},
{
date: '2016-04445-02',
name: 'fom',
address: '18edd9'
}
]
const tableProps = [ const tableProps = [
{ {
prop: 'code', prop: 'reportType',
label: '报表类型', label: '报表类型',
align: 'center', align: 'center'
}, },
{ {
prop: 'createTime', prop: 'reportStartTime',
label: '统计开始时间', label: '统计开始时间',
align: 'center', align: 'center',
filter: parseTime, filter: parseTime,
}, },
{ {
prop: 'createTime3', prop: 'reportEndTime',
label: '统计结束时间', label: '统计结束时间',
align: 'center', align: 'center',
filter: parseTime, filter: parseTime,
}, },
{ {
prop: 'name', prop: 'proLineName',
label: '产线名称', label: '产线名称',
align: 'center', align: 'center',
}, },
{ {
prop: 'address', prop: 'inputNum',
label: '投入数量/片', label: '投入数量/片',
align: 'center', align: 'center',
}, },
{ {
prop: 'remark44', prop: 'outputNum',
label: '产出数量/片', label: '产出数量/片',
align: 'center', align: 'center',
}, },
{ {
prop: 'remark23', prop: 'outputArea',
label: '产出面积/㎡', label: '产出面积/㎡',
align: 'center', align: 'center',
}, },
{ {
prop: 'remark145', prop: 'lossNum',
label: '损耗数量/片', label: '损耗数量/片',
align: 'center', align: 'center',
}, },
{ {
prop: 'remark22', prop: 'lossArea',
label: '损耗面积/㎡', label: '损耗面积/㎡',
align: 'center', align: 'center',
}, },
{ {
prop: 'remark1', prop: 'lossRatio',
label: '损耗比例%', label: '损耗比例%',
align: 'center', align: 'center',
} }
@ -135,16 +139,8 @@ export default {
data() { data() {
return { return {
urlOptions: { urlOptions: {
getDataListURL: getFactoryPage, getDataListURL: getPdlAutoReport
exportURL: exportFactoryExcel,
}, },
urlOptions: {
getDataListURL: '',
deleteURL: '',
statusUrl: '',
exportURL: ''
},
tableData1,
listQuery: { listQuery: {
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1,
@ -152,10 +148,12 @@ export default {
}, },
exportLoading: false, exportLoading: false,
dataListLoading: false, dataListLoading: false,
dialogVisible: false,
addOrEditTitle: '', addOrEditTitle: '',
addOrUpdateVisible: false, addOrUpdateVisible: false,
tableProps, tableProps,
tableBtn: [], tableBtn: [],
selectedList: [],
// tableBtn: [ // tableBtn: [
// this.$auth.hasPermi(`base:factory:update`) // this.$auth.hasPermi(`base:factory:update`)
// ? { // ? {
@ -181,8 +179,21 @@ export default {
{ {
type: 'select', type: 'select',
label: '报表类型', label: '报表类型',
selectOptions: [], selectOptions: [
param: 'name', {
id: 1,
name: '日'
},
{
id: 2,
name: '周'
},
{
id: 3,
name: '月'
}
],
param: 'reportType',
}, },
{ {
type: 'datePicker', type: 'datePicker',
@ -216,16 +227,63 @@ export default {
], ],
}; };
}, },
created() {}, created() {
this.getDataList()
this.getPdLineList()
},
methods: { methods: {
exportPdf() {
this.pdf()
this.dialogVisible = false
},
exportXlsx() {
this.down()
this.dialogVisible = false
},
// imgDownload() {
// let that = this
// let img = this.$refs['pdf']
// //
// var w = parseInt(window.getComputedStyle(img).width)
// //
// var h = parseInt(window.getComputedStyle(img).height)
// //
// window.pageYOffset = 0
// html2canvas(img).then(function(canvas) {
// })
// },
pdf() {
// console.log('[df]')
// const pdf = new jsPDF()
// const content = this.$refs.pdf.innerHTML
// console.log('', content)
// pdf.text(content, 15, 15)
// // pdf.text('Hello world!', 10, 10)
// pdf.save('test.pdf')
// console.log('', pdf)
const printWindow = window.open('', '_blank')
const temp = this.$refs.pdf.innerHTML
console.log(temp)
printWindow.document.body.innerHTML = temp
printWindow.focus()
// printWindow.document.writeln(this.$refs.pdf.innerHTML)
printWindow.document.close()
printWindow.print()
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {});
},
down() { down() {
// //
const selectedData = this.tableData1.slice(0, 2)
console.log('你好', selectedData, this.tableData1)
// //
const exportData = [ const exportData = [
{date: '日期', name: '姓名', address: '地址'}, {reportType: '报表类型', reportStartTime: '统计开始时间', reportEndTime: '统计结束时间', proLineName: '产线名称', inputNum: '投入数量/片', outputNum: '产出数量/片', outputArea: '产出面积/㎡', lossNum: '损耗数量/片', lossArea: '损耗面积/㎡', lossRatio: '损耗比例%' },
...selectedData ...this.selectedList
] ]
//id dom //id dom
const worksheet = XLSX.utils.json_to_sheet(exportData, { skipHeader: true }) const worksheet = XLSX.utils.json_to_sheet(exportData, { skipHeader: true })
@ -233,7 +291,7 @@ export default {
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1") XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
const workbookOutput = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }) const workbookOutput = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })
try { try {
FileSaver.saveAs(new Blob([workbookOutput], { type: 'application/octet-stream' }), 'hihi.xlsx') FileSaver.saveAs(new Blob([workbookOutput], { type: 'application/octet-stream' }), '产线统计自动报表.xlsx')
} catch (e) { } catch (e) {
console.log(e) console.log(e)
} }
@ -241,14 +299,22 @@ export default {
selectChange(val) { selectChange(val) {
console.log(val) console.log(val)
this.selectedList = val this.selectedList = val
console.log('勾选数据', this.selectedList)
}, },
getPdLineList() {
getPdList().then((res) => {
this.formConfig[0].selectOptions = res.data || []
})
},
buttonClick(val) { buttonClick(val) {
switch (val.btnName) { switch (val.btnName) {
case 'search': case 'search':
this.listQuery.pageNo = 1; this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10; this.listQuery.pageSize = 10;
this.listQuery.name = val.name; this.listQuery.lineId = val.line ? val.line : undefined;
this.listQuery.code = val.code; this.listQuery.reportType = val.reportType ? val.reportType : undefined;
this.listQuery.reportStartTime = [new Date(val.timeVal[0]).getTime()];
this.listQuery.reportEndTime = [new Date(val.timeVal[1]).getTime()];
this.getDataList(); this.getDataList();
break; break;
case 'export': case 'export':
@ -262,7 +328,10 @@ export default {
getDataList() { getDataList() {
this.dataListLoading = true; this.dataListLoading = true;
this.urlOptions.getDataListURL(this.listQuery).then(response => { this.urlOptions.getDataListURL(this.listQuery).then(response => {
this.tableData = response.data.list; this.tableData = response.data.list.map(item => {
item.reportType = item.reportType === 1 ? '日' : item.reportType === 2 ? '周' : '月'
return item
});
this.total = response.data.total; this.total = response.data.total;
this.dataListLoading = false; this.dataListLoading = false;
}); });
@ -279,17 +348,15 @@ export default {
this.getDataList(); this.getDataList();
}, },
handleExport() { handleExport() {
// if (this.selectedList.length === 0) {
let params = { ...this.queryParams }; this.selectedList = this.tableData
params.pageNo = undefined; }
params.pageSize = undefined; this.dialogVisible = true
this.$modal.confirm('是否确认导出所有数据项?').then(() => { // this.$modal.confirm('?').then(() => {
this.exportLoading = true; // this.exportLoading = true;
return this.urlOptions.exportURL(params); // // this.down()
}).then(response => { // this.pdf()
this.$download.excel(response, '工厂.xls'); // }).catch(() => { });
this.exportLoading = false;
}).catch(() => { });
} }
}, },
}; };

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: Do not edit * @Author: Do not edit
* @Date: 2023-08-29 14:59:29 * @Date: 2023-08-29 14:59:29
* @LastEditTime: 2023-08-31 15:15:31 * @LastEditTime: 2023-09-16 17:42:37
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
@ -33,50 +33,65 @@
:page.sync="listQuery.pageNo" :page.sync="listQuery.pageNo"
:total="listQuery.total" :total="listQuery.total"
@pagination="getDataList" /> @pagination="getDataList" />
<div ref="pdf" v-show="false">
<el-table :data="selectedList" stripe border style="width: 100%">
<el-table-column prop="proLineName" label="产线名称" />
<el-table-column prop="inputNum" label="投入数量/片" />
<el-table-column prop="outputNum" label="产出数量/片" />
<el-table-column prop="outputArea" label="产出面积/㎡" />
<el-table-column prop="lossNum" label="损耗数量/片" />
<el-table-column prop="lossArea" label="损耗面积/㎡" />
<el-table-column prop="lossRatio" label="损耗比例%" />
</el-table>
</div>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose">
<el-button type="primary" @click="exportXlsx">xlsx</el-button>
<el-button type="success" @click="exportPdf">pdf</el-button>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="dialogVisible = false"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { import { getPdlDataSearch, getPdList } from '@/api/core/monitoring/data'
getFactoryPage, import * as XLSX from 'xlsx'
exportFactoryExcel, import FileSaver from 'file-saver'
} from '@/api/core/base/factory';
const tableProps = [ const tableProps = [
{ {
prop: 'name', prop: 'proLineName',
label: '产线名称', label: '产线名称'
align: 'center',
}, },
{ {
prop: 'address', prop: 'inputNum',
label: '投入数量/片', label: '投入数量/片'
align: 'center',
}, },
{ {
prop: 'remark44', prop: 'outputNum',
label: '产出数量/片', label: '产出数量/片'
align: 'center',
}, },
{ {
prop: 'remark23', prop: 'outputArea',
label: '产出面积/㎡', label: '产出面积/㎡'
align: 'center',
}, },
{ {
prop: 'remark145', prop: 'lossNum',
label: '损耗数量/片', label: '损耗数量/片'
align: 'center',
}, },
{ {
prop: 'remark22', prop: 'lossArea',
label: '损耗面积/㎡', label: '损耗面积/㎡'
align: 'center',
}, },
{ {
prop: 'remark1', prop: 'lossRate',
label: '损耗比例%', label: '损耗比例%'
align: 'center',
} }
]; ];
@ -84,28 +99,24 @@ export default {
data() { data() {
return { return {
urlOptions: { urlOptions: {
getDataListURL: getFactoryPage, getDataListURL: getPdlDataSearch
exportURL: exportFactoryExcel,
}, },
urlOptions: {
getDataListURL: '',
deleteURL: '',
statusUrl: '',
exportURL: ''
},
tableData: [], tableData: [],
listQuery: { listQuery: {
pageSize: 10, pageSize: 10,
pageNo: 1, pageNo: 1,
total: 1, total: 1,
proLineId: undefined
}, },
exportLoading: false, exportLoading: false,
dataListLoading: false, dataListLoading: false,
dialogVisible: false,
addOrEditTitle: '', addOrEditTitle: '',
addOrUpdateVisible: false, addOrUpdateVisible: false,
tableProps, tableProps,
tableBtn: [], tableBtn: [],
tableData: [], tableData: [],
selectedList: [],
formConfig: [ formConfig: [
{ {
type: 'select', type: 'select',
@ -145,8 +156,57 @@ export default {
], ],
}; };
}, },
created() {}, created() {
this.getDataList()
this.getPdLineList()
},
methods: { methods: {
exportPdf() {
this.pdf()
this.dialogVisible = false
},
exportXlsx() {
this.down()
this.dialogVisible = false
},
pdf() {
const printWindow = window.open('', '_blank')
const temp = this.$refs.pdf.innerHTML
console.log(temp)
printWindow.document.body.innerHTML = temp
printWindow.document.close()
printWindow.print()
},
down() {
//
//
const exportData = [
{proLineName: '产线名称', inputNum: '投入数量/片', outputNum: '产出数量/片', outputArea: '产出面积/㎡', lossNum: '损耗数量/片', lossArea: '损耗面积/㎡', lossRatio: '损耗比例%' },
...this.selectedList
]
//id dom
const worksheet = XLSX.utils.json_to_sheet(exportData, { skipHeader: true })
const workbook = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
const workbookOutput = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })
try {
FileSaver.saveAs(new Blob([workbookOutput], { type: 'application/octet-stream' }), '产线统计数据查询.xlsx')
} catch (e) {
console.log(e)
}
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {});
},
getPdLineList() {
getPdList().then((res) => {
this.formConfig[0].selectOptions = res.data || []
})
},
selectChange(val) { selectChange(val) {
console.log(val) console.log(val)
this.selectedList = val this.selectedList = val
@ -156,8 +216,9 @@ export default {
case 'search': case 'search':
this.listQuery.pageNo = 1; this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10; this.listQuery.pageSize = 10;
this.listQuery.name = val.name; this.listQuery.proLineId = val.line ? val.line : undefined;
this.listQuery.code = val.code; this.listQuery.startTime = val.timeVal ? new Date(val.timeVal[0]).getTime() : undefined;
this.listQuery.endTime = val.timeVal ? new Date(val.timeVal[1]).getTime() : undefined;
this.getDataList(); this.getDataList();
break; break;
case 'export': case 'export':
@ -171,7 +232,7 @@ export default {
getDataList() { getDataList() {
this.dataListLoading = true; this.dataListLoading = true;
this.urlOptions.getDataListURL(this.listQuery).then(response => { this.urlOptions.getDataListURL(this.listQuery).then(response => {
this.tableData = response.data.list; this.tableData = response.data;
this.total = response.data.total; this.total = response.data.total;
this.dataListLoading = false; this.dataListLoading = false;
}); });
@ -188,17 +249,21 @@ export default {
this.getDataList(); this.getDataList();
}, },
handleExport() { handleExport() {
if (this.selectedList.length === 0) {
this.selectedList = this.tableData
}
this.dialogVisible = true
// //
let params = { ...this.queryParams }; // let params = { ...this.queryParams };
params.pageNo = undefined; // params.pageNo = undefined;
params.pageSize = undefined; // params.pageSize = undefined;
this.$modal.confirm('是否确认导出所有数据项?').then(() => { // this.$modal.confirm('?').then(() => {
this.exportLoading = true; // this.exportLoading = true;
return this.urlOptions.exportURL(params); // return this.urlOptions.exportURL(params);
}).then(response => { // }).then(response => {
this.$download.excel(response, '工厂.xls'); // this.$download.excel(response, '.xls');
this.exportLoading = false; // this.exportLoading = false;
}).catch(() => { }); // }).catch(() => { });
} }
}, },
}; };

View File

@ -0,0 +1,207 @@
<!--
filename: index.vue
author: liubin
date: 2023-08-04 14:44:58
description: 设备24小时生产记录
-->
<template>
<div class="app-container">
<SearchBar
:formConfigs="[{ label: '设备近24小时产线生产数据', type: 'title' }]"
ref="search-bar" />
<el-skeleton v-if="initing" :rows="6" animated />
<base-table
v-else
:span-method="mergeColumnHandler"
:table-props="tableProps"
:table-data="tableData"
@emitFun="handleEmitFun"></base-table>
<!-- :page="queryParams.pageNo"
:limit="queryParams.pageSize" -->
</div>
</template>
<script>
import { getPdlDataOneDay } from '@/api/core/monitoring/data24'
export default {
name: 'productionLineData24',
components: {},
props: {},
data() {
return {
urlOptions: {
getDataListURL: getPdlDataOneDay
},
initing: false,
queryParams: {
pageNo: 1,
pageSize: 10,
},
list: [],
arr: [],
spanArr: [],
timeList: [],
tableData: [],
tableProps: [],
spanInfo: {},
};
},
computed: {},
mounted() {
this.getList();
},
methods: {
/** 构建tableProps - 依据第一个元素所提供的信息 */
buildProps(plData) {
plData.forEach(item => {
this.timeList.push(item.name)
})
const timeArray = Array.from(new Set(this.timeList))
console.log('nihc', timeArray)
for (const times of timeArray) {
if (times !== '投入数量' && times !== '产出数量' && times !== '报废数量' && times !== '产出面积') {
const subprop = {
label: times,
align: 'center',
children: [
{ prop: times + '_in', label: '投入数量', align: 'center' },
{ prop: times + '_out', label: '产出数量', align: 'center' },
{ prop: times + '_junk', label: '报废数量', align: 'center' },
{ prop: times + '_area', label: '产出面积', align: 'center' }
]
}
this.arr.push(subprop)
}
}
this.tableProps = this.arr
},
setRowSpan(arr) {
let count = 0
arr.forEach((item, index) => {
if(index === 0) {
this.spanArr.push(1)
} else {
if (item === arr[index - 1]) {
this.spanArr[count] += 1
this.spanArr.push(0)
} else {
count = index
this.spanArr.push(1)
}
}
})
console.log('打印数组长度', this.spanArr)
},
/** 把 list 里的数据转换成 tableProps 对应的格式 */
convertList(list) {
let sectionArr= []
console.log('打印看下数据list', list)
list.forEach((ele, index) => {
let tempData = []
ele.data.forEach(item => {
item.children.forEach(params => {
if (params.dynamicName === '投入数量') {
tempData[item.dynamicName + '_in'] = params.dynamicValue
} else if (params.dynamicName === '产出数量') {
tempData[item.dynamicName + '_out'] = params.dynamicValue
} else if (params.dynamicName === '报废数量') {
tempData[item.dynamicName + '_junk'] = params.dynamicValue
} else {
tempData[item.dynamicName + '_area'] = params.dynamicValue
}
})
})
tempData['proLineName'] = ele.proLineName
tempData['spec'] = ele.spec
this.tableData.push(tempData)
console.log('看看数据', this.tableData, tempData)
const { sectionName } = tempData
sectionArr.push(sectionName)
})
this.setRowSpan(sectionArr)
console.log('工段名称列表', sectionArr)
},
buildData(data) {
this.convertList(data);
},
/** 合并table列的规则 */
mergeColumnHandler({ row, column, rowIndex, columnIndex }) {
if (columnIndex == 0) {
if (this.spanArr[rowIndex]) {
return [
this.spanArr[rowIndex], // row span
1, // col span
];
} else {
return [0, 0];
}
}
},
async getList() {
this.urlOptions.getDataListURL().then(res => {
console.log('看看数据', res)
this.arr = [
{
prop: 'proLineName',
label: '生产线',
align: 'center',
},
{
prop: 'spec',
label: '产品规格',
align: 'center',
}
]
this.buildProps(res.data.nameData);
this.buildData(res.data.data);
})
// // const data = this.res.data;
// // console.log('recent-24', data);
// this.initing = true;
// this.queryParams.pageSize = this.list.length;
// setTimeout(() => {
// this.initing = false;
// }, 1000);
},
handleEmitFun(payload) {
console.log('payload', payload);
},
},
};
</script>
<style scoped lang="scss">
::-webkit-scrollbar {
display: none;
}
pre {
margin: 10px;
background: #f6f8faf6;
border: 1px solid #e1e4e8;
padding: 12px;
border-radius: 12px;
position: fixed;
// top: 15vh;
top: 10vh;
left: 0;
max-height: 80vh;
overflow-y: auto;
z-index: 100000;
box-shadow: 0 0 32px 12px #0001;
}
code {
font-family: 'IntelOne Mono', 'Ubuntu', 'Courier New', Courier, monospace;
}
</style>

View File

@ -1,7 +1,7 @@
<!-- <!--
* @Author: Do not edit * @Author: Do not edit
* @Date: 2023-08-29 14:59:29 * @Date: 2023-08-29 14:59:29
* @LastEditTime: 2023-08-31 15:31:40 * @LastEditTime: 2023-09-16 17:41:53
* @LastEditors: DY * @LastEditors: DY
* @Description: * @Description:
--> -->
@ -9,6 +9,7 @@
<div class="app-container"> <div class="app-container">
<search-bar <search-bar
:formConfigs="formConfig" :formConfigs="formConfig"
:isFold="true"
ref="searchBarForm" ref="searchBarForm"
@headBtnClick="buttonClick" /> @headBtnClick="buttonClick" />
<base-table <base-table
@ -33,73 +34,88 @@
:page.sync="listQuery.pageNo" :page.sync="listQuery.pageNo"
:total="listQuery.total" :total="listQuery.total"
@pagination="getDataList" /> @pagination="getDataList" />
<div ref="pdf" v-show="false">
<el-table :data="selectedList" stripe border style="width: 100%">
<el-table-column prop="reportType" label="产线类型" />
<el-table-column prop="reportStartTime" label="统计开始时间" />
<el-table-column prop="reportEndTime" label="统计结束时间" />
<el-table-column prop="proLineName" label="产线名称" />
<el-table-column prop="sectionName" label="工段名称" />
<el-table-column prop="inputNum" label="投入数量/片" />
<el-table-column prop="outputNum" label="产出数量/片" />
<el-table-column prop="outputArea" label="产出面积/㎡" />
<el-table-column prop="lossNum" label="损耗数量/片" />
<el-table-column prop="lossArea" label="损耗面积/㎡" />
<el-table-column prop="lossRatio" label="损耗比例%" />
</el-table>
</div>
<el-dialog
title="提示"
:visible.sync="dialogVisible"
width="30%"
:before-close="handleClose">
<el-button type="primary" @click="exportXlsx">xlsx</el-button>
<el-button type="success" @click="exportPdf">pdf</el-button>
<span slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary" @click="dialogVisible = false"> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { parseTime } from '../../mixins/code-filter'; import { parseTime } from '../../mixins/code-filter';
import { import { getWorkshopSectionList, getPdList, getSectionAutoReport } from '@/api/core/monitoring/sectionStatistics'
getFactoryPage, import * as XLSX from 'xlsx'
exportFactoryExcel, import FileSaver from 'file-saver'
} from '@/api/core/base/factory';
const tableProps = [ const tableProps = [
{ {
prop: 'code', prop: 'reportType',
label: '产线类型', label: '产线类型'
align: 'center',
}, },
{ {
prop: 'createTime', prop: 'reportStartTime',
label: '统计开始时间', label: '统计开始时间',
align: 'center',
filter: parseTime, filter: parseTime,
}, },
{ {
prop: 'createTime3', prop: 'reportEndTime',
label: '统计结束时间', label: '统计结束时间',
align: 'center',
filter: parseTime, filter: parseTime,
}, },
{ {
prop: 'name', prop: 'lineName',
label: '产线名称', label: '产线名称'
align: 'center',
}, },
{ {
prop: 'name1', prop: 'sectionName',
label: '工段名称', label: '工段名称'
align: 'center',
}, },
{ {
prop: 'address', prop: 'inputNum',
label: '投入数量/片', label: '投入数量/片'
align: 'center',
}, },
{ {
prop: 'remark44', prop: 'outputNum',
label: '产出数量/片', label: '产出数量/片'
align: 'center',
}, },
{ {
prop: 'remark23', prop: 'outputArea',
label: '产出面积/㎡', label: '产出面积/㎡'
align: 'center',
}, },
{ {
prop: 'remark145', prop: 'lossNum',
label: '损耗数量/片', label: '损耗数量/片'
align: 'center',
}, },
{ {
prop: 'remark22', prop: 'lossArea',
label: '损耗面积/㎡', label: '损耗面积/㎡'
align: 'center',
}, },
{ {
prop: 'remark1', prop: 'lossRatio',
label: '损耗比例%', label: '损耗比例%'
align: 'center',
} }
]; ];
@ -107,15 +123,8 @@ export default {
data() { data() {
return { return {
urlOptions: { urlOptions: {
getDataListURL: getFactoryPage, getDataListURL: getSectionAutoReport
exportURL: exportFactoryExcel,
}, },
urlOptions: {
getDataListURL: '',
deleteURL: '',
statusUrl: '',
exportURL: ''
},
tableData: [], tableData: [],
listQuery: { listQuery: {
pageSize: 10, pageSize: 10,
@ -124,6 +133,8 @@ export default {
}, },
exportLoading: false, exportLoading: false,
dataListLoading: false, dataListLoading: false,
selectedList: [],
dialogVisible: false,
addOrEditTitle: '', addOrEditTitle: '',
addOrUpdateVisible: false, addOrUpdateVisible: false,
tableProps, tableProps,
@ -145,8 +156,21 @@ export default {
{ {
type: 'select', type: 'select',
label: '报表类型', label: '报表类型',
selectOptions: [], selectOptions: [
param: 'name', {
id: 1,
name: '日'
},
{
id: 2,
name: '周'
},
{
id: 3,
name: '月'
}
],
param: 'reportType',
}, },
{ {
type: 'datePicker', type: 'datePicker',
@ -158,8 +182,7 @@ export default {
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',
param: 'timeVal', param: 'timeVal',
defaultSelect: [], defaultSelect: []
width: 350
}, },
{ {
type: 'button', type: 'button',
@ -180,8 +203,61 @@ export default {
], ],
}; };
}, },
created() {}, created() {
this.getDataList()
this.getPdLineList()
},
methods: { methods: {
exportPdf() {
this.pdf()
this.dialogVisible = false
},
exportXlsx() {
this.down()
this.dialogVisible = false
},
pdf() {
const printWindow = window.open('', '_blank')
const temp = this.$refs.pdf.innerHTML
console.log(temp)
printWindow.document.body.innerHTML = temp
printWindow.document.close()
printWindow.print()
},
down() {
//
//
const exportData = [
{reportType: '产线类型', reportStartTime: '统计开始时间', reportEndTime: '统计结束时间', lineName: '产线名称', sectionName: '工段名称', inputNum: '投入数量/片', outputNum: '产出数量/片', outputArea: '产出面积/㎡', lossNum: '损耗数量/片', lossArea: '损耗面积/㎡', lossRatio: '损耗比例%' },
...this.selectedList
]
//id dom
const worksheet = XLSX.utils.json_to_sheet(exportData, { skipHeader: true })
const workbook = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1")
const workbookOutput = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })
try {
FileSaver.saveAs(new Blob([workbookOutput], { type: 'application/octet-stream' }), '工段统计自动报表.xlsx')
} catch (e) {
console.log(e)
}
},
handleClose(done) {
this.$confirm('确认关闭?')
.then(_ => {
done();
})
.catch(_ => {});
},
getPdLineList() {
getPdList().then((res) => {
this.formConfig[0].selectOptions = res.data || []
})
// list
getWorkshopSectionList().then((res) => {
this.formConfig[1].selectOptions = res.data || []
})
},
selectChange(val) { selectChange(val) {
console.log(val) console.log(val)
this.selectedList = val this.selectedList = val
@ -191,8 +267,11 @@ export default {
case 'search': case 'search':
this.listQuery.pageNo = 1; this.listQuery.pageNo = 1;
this.listQuery.pageSize = 10; this.listQuery.pageSize = 10;
this.listQuery.name = val.name; this.listQuery.lineId = val.line ? val.line : undefined;
this.listQuery.code = val.code; this.listQuery.sectionId = val.section ? val.section : undefined;
this.listQuery.reportType = val.reportType ? val.reportType : undefined;
this.listQuery.reportStartTime = [new Date(val.timeVal[0]).getTime()];
this.listQuery.reportEndTime = [new Date(val.timeVal[1]).getTime()];
this.getDataList(); this.getDataList();
break; break;
case 'export': case 'export':
@ -206,7 +285,10 @@ export default {
getDataList() { getDataList() {
this.dataListLoading = true; this.dataListLoading = true;
this.urlOptions.getDataListURL(this.listQuery).then(response => { this.urlOptions.getDataListURL(this.listQuery).then(response => {
this.tableData = response.data.list; this.tableData = response.data.list.map(item => {
item.reportType = item.reportType === 1 ? '日' : item.reportType === 2 ? '周' : '月'
return item
});
this.total = response.data.total; this.total = response.data.total;
this.dataListLoading = false; this.dataListLoading = false;
}); });
@ -223,17 +305,21 @@ export default {
this.getDataList(); this.getDataList();
}, },
handleExport() { handleExport() {
if (this.selectedList.length === 0) {
this.selectedList = this.tableData
}
this.dialogVisible = true
// //
let params = { ...this.queryParams }; // let params = { ...this.queryParams };
params.pageNo = undefined; // params.pageNo = undefined;
params.pageSize = undefined; // params.pageSize = undefined;
this.$modal.confirm('是否确认导出所有数据项?').then(() => { // this.$modal.confirm('?').then(() => {
this.exportLoading = true; // this.exportLoading = true;
return this.urlOptions.exportURL(params); // return this.urlOptions.exportURL(params);
}).then(response => { // }).then(response => {
this.$download.excel(response, '工厂.xls'); // this.$download.excel(response, '.xls');
this.exportLoading = false; // this.exportLoading = false;
}).catch(() => { }); // }).catch(() => { });
} }
}, },
}; };

View File

@ -7,78 +7,82 @@
<base-table <base-table
v-loading="dataListLoading" v-loading="dataListLoading"
:table-props="tableProps" :table-props="tableProps"
:page="listQuery.pageNo"
:limit="listQuery.pageSize"
:table-data="tableData" /> :table-data="tableData" />
<pagination <!-- <pagination
:limit.sync="listQuery.pageSize" :limit.sync="listQuery.pageSize"
:page.sync="listQuery.pageNo" :page.sync="listQuery.pageNo"
:total="listQuery.total" :total="listQuery.total"
@pagination="getDataList" /> @pagination="getDataList" /> -->
</div> </div>
</template> </template>
<script> <script>
import basicPage from '../../mixins/basic-page'; // import basicPage from '../../mixins/basic-page';
import { parseTime } from '../../mixins/code-filter'; import { parseTime } from '../../mixins/code-filter';
import { getLineBindProductLogPage } from '@/api/core/base/lineBindProductLog'; import { getSectionDataSearch } from '@/api/core/monitoring';
import { getProductionLinePage } from '@/api/core/base/productionLine'; import { getProductionLinePage } from '@/api/core/base/productionLine';
import { getWorkshopSectionPage } from '@/api/core/base/workshopSection'; import { getWorkshopSectionPage } from '@/api/core/base/workshopSection';
const tableProps = [ const tableProps = [
{ {
prop: 'productionLineName', prop: 'proLineName',
label: '产线名称', label: '产线名称',
align: 'center', align: 'center',
}, },
{ {
prop: '', prop: 'sectionName',
label: '工段名称', label: '工段名称',
align: 'center', align: 'center',
}, },
{ {
prop: '', prop: 'inputNum',
label: '进片数量/片', label: '进片数量/片',
align: 'center', align: 'center',
}, },
{ {
prop: '', prop: 'outputNum',
label: '出片数量/片', label: '出片数量/片',
align: 'center', align: 'center',
}, },
{ {
prop: '', prop: 'lossNum',
label: '损耗数量/片', label: '损耗数量/片',
align: 'center', align: 'center',
}, },
{ {
prop: '', prop: 'lossArea',
label: '损耗面积/m²', label: '损耗面积/m²',
align: 'center', align: 'center',
}, },
{ {
prop: '', prop: 'lossRate',
label: '损耗比例/%', label: '损耗比例/%',
align: 'center', align: 'center',
} }
]; ];
export default { export default {
mixins: [basicPage], // mixins: [basicPage],
data() { data() {
return { return {
urlOptions: { urlOptions: {
getDataListURL: getLineBindProductLogPage, getDataListURL: getSectionDataSearch,
}, },
tableProps, tableProps,
tableData: [], tableData: [],
listQuery: {
proLineId:undefined,
sectionId: undefined,
startTime: undefined,
endTime: undefined,
},
optionArrUrl: [getProductionLinePage, getWorkshopSectionPage], optionArrUrl: [getProductionLinePage, getWorkshopSectionPage],
formConfig: [ formConfig: [
{ {
type: 'select', type: 'select',
label: '产线', label: '产线',
selectOptions: [], selectOptions: [],
param: 'productionLineId', param: 'proLineId',
defaultSelect: '', defaultSelect: '',
filterable: true, filterable: true,
}, },
@ -86,7 +90,7 @@ export default {
type: 'select', type: 'select',
label: '工段', label: '工段',
selectOptions: [], selectOptions: [],
param: 'productId', param: 'sectionId',
defaultSelect: '', defaultSelect: '',
filterable: true, filterable: true,
}, },
@ -99,7 +103,7 @@ export default {
rangeSeparator: '-', rangeSeparator: '-',
startPlaceholder: '开始时间', startPlaceholder: '开始时间',
endPlaceholder: '结束时间', endPlaceholder: '结束时间',
param: 'createTime', param: 'timeSlot',
}, },
{ {
type: 'button', type: 'button',
@ -118,7 +122,8 @@ export default {
components: { components: {
}, },
created() { created() {
this.getArr(); this.getArr();
this.getDataList()
}, },
methods: { methods: {
getArr() { getArr() {
@ -131,16 +136,30 @@ export default {
this.formConfig[index].selectOptions = response.data.list; this.formConfig[index].selectOptions = response.data.list;
}); });
}); });
}, },
buttonClick(val) { getDataList() {
switch (val.btnName) { // this.listQuery.proLineId = '1672847052717821953';
case 'search': // this.listQuery.startTime = '1690626657000'
this.listQuery.pageNo = 1; // this.listQuery.endTime = '1693564257000'
this.listQuery.pageSize = 10; this.urlOptions.getDataListURL(this.listQuery).then(res => {
this.listQuery.productionLineId = val.productionLineId; this.tableData = res.data
this.listQuery.productId = val.productId; // this.total = response.data.total;
this.listQuery.createTime = val.createTime; this.dataListLoading = false;
this.getDataList(); });
},
buttonClick(val) {
console.log(val)
switch (val.btnName) {
case 'search':
console.log(val.timeSlot);
// this.listQuery.pageNo = 1;
// this.listQuery.pageSize = 10;
this.listQuery.proLineId = val.proLineId ? val.proLineId : undefined
this.listQuery.sectionId = val.sectionId ? val.sectionId : undefined
this.listQuery.startTime = val.timeSlot ? new Date(val.timeSlot[0]).getTime() : undefined
this.listQuery.endTime = val.timeSlot ? new Date(val.timeSlot[1]).getTime() : undefined
this.getDataList();
break; break;
case 'reset': case 'reset':
this.$refs.searchBarForm.resetForm(); this.$refs.searchBarForm.resetForm();

View File

@ -12,31 +12,7 @@
ref="search-bar" ref="search-bar"
@headBtnClick="handleSearchBarBtnClick" /> @headBtnClick="handleSearchBarBtnClick" />
<!-- <base-table <div v-if="tableList.length" class="tables">
:table-props="[
{ type: 'index', label: '序号' },
{ prop: 'name', label: '设备名称', align: 'center' },
{ prop: 'code', label: '设备代码', align: 'center' },
{ prop: 'time', label: '时间', align: 'center' },
]"
:table-data="[
{ index: 1, name: '1', code: 'c1', time: '2021-08-31 09:14:19' },
{ index: 2, name: '2', code: 'c2', time: '2021-08-31 09:14:19' },
{ index: 3, name: '3', code: 'c3', time: '2021-08-31 09:14:19' },
{ index: 4, name: '4', code: 'c4', time: '2021-08-31 09:14:19' },
{ index: 5, name: '5', code: 'c5', time: '2021-08-31 09:14:19' },
]"
:span-method="
({ rowIndex, columnIndex }) => {
if (rowIndex == 1 && columnIndex == 0) {
return [1, 3];
}
return [1, 1];
}
"
@emitFun="(val) => handleEmitFun(table, val)"></base-table> -->
<div class="tables">
<div class="custom-table" v-for="table in tableList" :key="table.key"> <div class="custom-table" v-for="table in tableList" :key="table.key">
<!-- {{ JSON.stringify(spanMethod) }} --> <!-- {{ JSON.stringify(spanMethod) }} -->
<base-table <base-table
@ -58,16 +34,14 @@
getListFor(table, { page, limit, current }) getListFor(table, { page, limit, current })
" /> " />
</div> </div>
<!-- v-show="table.dataManager?.total > 0"
:total="table.dataManager?.total || 0" -->
<!-- @size-change="($event) => handleSizeChange(table, $event)" -->
</div> </div>
<div v-else style="margin-top: 20px; color: #c7c7c7; text-align: center;">暂无数据</div>
</div> </div>
</template> </template>
<script> <script>
import LocalDataManager from './utils/local-data-manager'; import LocalDataManager from './utils/local-data-manager';
import response from './response'; // import response from './response';
import moment from 'moment'; import moment from 'moment';
export default { export default {
@ -123,14 +97,14 @@ export default {
time: [new Date(aWeekAgo), new Date(today)], time: [new Date(aWeekAgo), new Date(today)],
}, },
tableList: [ tableList: [
{ // {
key: 'base-table__key__1', // key: 'base-table__key__1',
tableProps: [], // tableProps: [],
list: [], // list: [],
pageNo: 1, // pageNo: 1,
pageSize: 3, // pageSize: 3,
total: 0, // total: 0,
}, // },
], ],
}; };
}, },
@ -152,7 +126,7 @@ export default {
if (this.name) if (this.name)
this.$set(this.searchBarFormConfig[1], 'defaultSelect', this.name); this.$set(this.searchBarFormConfig[1], 'defaultSelect', this.name);
this.handleResponse(); // this.handleResponse();
}, },
methods: { methods: {
buildProps(table) { buildProps(table) {
@ -199,11 +173,9 @@ export default {
return { props, firstLineData }; return { props, firstLineData };
}, },
handleResponse() { handleResponse(response) {
const { code, data } = response; const { code, data } = response;
if (code == 0) { if (code == 0) {
console.log('response', code, data);
// //
data.forEach((table, index) => { data.forEach((table, index) => {
console.log('handle index:', index, table); console.log('handle index:', index, table);
@ -220,26 +192,28 @@ export default {
// //
const { data } = table; const { data } = table;
data.forEach((row, idx) => { if (data) {
const listItem = { data.forEach((row, idx) => {
index: idx + 1, const listItem = {
time: moment(+row.time).format('YYYY-MM-DD HH:mm:ss'), index: idx + 1,
plcCode: row.plcCode, time: moment(+row.time).format('YYYY-MM-DD HH:mm:ss'),
}; plcCode: row.plcCode,
row.data.forEach((column) => { };
listItem[column.dynamicName] = column.dynamicValue; row.data.forEach((column) => {
listItem[column.dynamicName] = column.dynamicValue;
});
this.tableList[index].list.push(listItem);
this.tableList[index].total++;
}); });
this.tableList[index].list.push(listItem);
this.tableList[index].total++;
});
// //
const { pageNo, pageSize, list } = this.tableList[index]; const { pageNo, pageSize, list } = this.tableList[index];
this.tableList[index].dataManager = new LocalDataManager( this.tableList[index].dataManager = new LocalDataManager(
list, list,
pageNo, pageNo,
pageSize pageSize
); );
}
}); });
} }
}, },
@ -255,12 +229,13 @@ export default {
/** 查询 */ /** 查询 */
async handleQuery() { async handleQuery() {
const { data } = this.$axios({ this.handleResponse(
url: '/monitoring/equipment-monitor/runLog', await this.$axios({
method: 'get', url: '/monitoring/equipment-monitor/runLog',
params: this.queryParams, method: 'get',
}); params: this.queryParams,
console.log('data', data); })
);
}, },
async handleSearchBarBtnClick({ btnName, timeVal }) { async handleSearchBarBtnClick({ btnName, timeVal }) {

124
yarn.lock
View File

@ -1937,6 +1937,7 @@
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz" "resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz"
"version" "8.10.0" "version" "8.10.0"
<<<<<<< HEAD
"acorn@^8.9.0": "acorn@^8.9.0":
"integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" "integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
"resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz" "resolved" "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz"
@ -1956,6 +1957,17 @@
"integrity" "sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ==" "integrity" "sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ=="
"resolved" "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-1.0.3.tgz" "resolved" "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-1.0.3.tgz"
"version" "1.0.3" "version" "1.0.3"
=======
adler-32@~1.3.0:
version "1.3.1"
resolved "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
aes-decrypter@1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/aes-decrypter/-/aes-decrypter-1.0.3.tgz"
integrity sha512-rsx8pfx7wJsn+ziYbpJ8XA5c93hKAtBCrfydxJqJCMT+qfjipd/B5wC2xHtBcoxyvlqJcpeAo3K55t0lXOn9yQ==
>>>>>>> test
dependencies: dependencies:
"pkcs7" "^0.2.3" "pkcs7" "^0.2.3"
@ -2889,10 +2901,25 @@
"resolved" "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz" "resolved" "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz"
"version" "0.12.0" "version" "0.12.0"
<<<<<<< HEAD
"cfb@~1.2.1": "cfb@~1.2.1":
"integrity" "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==" "integrity" "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA=="
"resolved" "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz" "resolved" "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz"
"version" "1.2.2" "version" "1.2.2"
=======
cfb@~1.2.1:
version "1.2.2"
resolved "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
dependencies:
adler-32 "~1.3.0"
crc-32 "~1.2.0"
chalk@2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/chalk/-/chalk-2.3.0.tgz"
integrity sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==
>>>>>>> test
dependencies: dependencies:
"adler-32" "~1.3.0" "adler-32" "~1.3.0"
"crc-32" "~1.2.0" "crc-32" "~1.2.0"
@ -3184,6 +3211,7 @@
"resolved" "https://registry.npmmirror.com/code-brick-zj/-/code-brick-zj-1.0.2.tgz" "resolved" "https://registry.npmmirror.com/code-brick-zj/-/code-brick-zj-1.0.2.tgz"
"version" "1.0.2" "version" "1.0.2"
<<<<<<< HEAD
"codepage@~1.15.0": "codepage@~1.15.0":
"integrity" "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==" "integrity" "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
"resolved" "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz" "resolved" "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz"
@ -3193,6 +3221,17 @@
"integrity" "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==" "integrity" "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw=="
"resolved" "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz" "resolved" "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz"
"version" "1.0.0" "version" "1.0.0"
=======
codepage@~1.15.0:
version "1.15.0"
resolved "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab"
integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==
collection-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz"
integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
>>>>>>> test
dependencies: dependencies:
"map-visit" "^1.0.0" "map-visit" "^1.0.0"
"object-visit" "^1.0.0" "object-visit" "^1.0.0"
@ -3509,6 +3548,7 @@
"js-yaml" "^3.13.1" "js-yaml" "^3.13.1"
"parse-json" "^4.0.0" "parse-json" "^4.0.0"
<<<<<<< HEAD
"crc-32@~1.2.0", "crc-32@~1.2.1": "crc-32@~1.2.0", "crc-32@~1.2.1":
"integrity" "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" "integrity" "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
"resolved" "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz" "resolved" "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz"
@ -3518,6 +3558,17 @@
"integrity" "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==" "integrity" "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A=="
"resolved" "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz" "resolved" "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz"
"version" "4.0.4" "version" "4.0.4"
=======
crc-32@~1.2.0, crc-32@~1.2.1:
version "1.2.2"
resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
create-ecdh@^4.0.0:
version "4.0.4"
resolved "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz"
integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
>>>>>>> test
dependencies: dependencies:
"bn.js" "^4.1.0" "bn.js" "^4.1.0"
"elliptic" "^6.5.3" "elliptic" "^6.5.3"
@ -5101,10 +5152,27 @@
"combined-stream" "^1.0.8" "combined-stream" "^1.0.8"
"mime-types" "^2.1.12" "mime-types" "^2.1.12"
<<<<<<< HEAD
"form-data@~2.3.2": "form-data@~2.3.2":
"integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="
"resolved" "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz" "resolved" "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz"
"version" "2.3.3" "version" "2.3.3"
=======
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz"
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
frac@~1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
fragment-cache@^0.2.1:
version "0.2.1"
resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz"
integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
>>>>>>> test
dependencies: dependencies:
"asynckit" "^0.4.0" "asynckit" "^0.4.0"
"combined-stream" "^1.0.6" "combined-stream" "^1.0.6"
@ -9650,10 +9718,24 @@
"resolved" "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" "resolved" "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz"
"version" "3.0.13" "version" "3.0.13"
<<<<<<< HEAD
"spdy-transport@^3.0.0": "spdy-transport@^3.0.0":
"integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==" "integrity" "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw=="
"resolved" "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz" "resolved" "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz"
"version" "3.0.0" "version" "3.0.0"
=======
ssf@~0.11.2:
version "0.11.2"
resolved "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c"
integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
dependencies:
frac "~1.1.2"
sshpk@^1.7.0:
version "1.17.0"
resolved "https://registry.npmmirror.com/sshpk/-/sshpk-1.17.0.tgz"
integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
>>>>>>> test
dependencies: dependencies:
"debug" "^4.1.0" "debug" "^4.1.0"
"detect-node" "^2.0.4" "detect-node" "^2.0.4"
@ -11112,10 +11194,32 @@
dependencies: dependencies:
"isexe" "^2.0.0" "isexe" "^2.0.0"
<<<<<<< HEAD
"which@^2.0.1": "which@^2.0.1":
"integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
"resolved" "https://registry.npmmirror.com/which/-/which-2.0.2.tgz" "resolved" "https://registry.npmmirror.com/which/-/which-2.0.2.tgz"
"version" "2.0.2" "version" "2.0.2"
=======
wmf@~1.0.1:
version "1.0.2"
resolved "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
word-wrap@^1.2.3:
version "1.2.3"
resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
word@~0.3.0:
version "0.3.0"
resolved "https://registry.npmmirror.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"
integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
worker-farm@^1.7.0:
version "1.7.0"
resolved "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz"
integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
>>>>>>> test
dependencies: dependencies:
"isexe" "^2.0.0" "isexe" "^2.0.0"
@ -11175,10 +11279,30 @@
dependencies: dependencies:
"async-limiter" "~1.0.0" "async-limiter" "~1.0.0"
<<<<<<< HEAD
"xhr@2.4.0": "xhr@2.4.0":
"integrity" "sha512-TUbBsdAuJbX8olk9hsDwGK8P1ri1XlV+PdEWkYw+HQQbpkiBR8PLgD1F3kQDPBs9l4Px34hP9rCYAZOCCAENbw==" "integrity" "sha512-TUbBsdAuJbX8olk9hsDwGK8P1ri1XlV+PdEWkYw+HQQbpkiBR8PLgD1F3kQDPBs9l4Px34hP9rCYAZOCCAENbw=="
"resolved" "https://registry.npmmirror.com/xhr/-/xhr-2.4.0.tgz" "resolved" "https://registry.npmmirror.com/xhr/-/xhr-2.4.0.tgz"
"version" "2.4.0" "version" "2.4.0"
=======
xlsx@^0.18.5:
version "0.18.5"
resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0"
integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==
dependencies:
adler-32 "~1.3.0"
cfb "~1.2.1"
codepage "~1.15.0"
crc-32 "~1.2.1"
ssf "~0.11.2"
wmf "~1.0.1"
word "~0.3.0"
xml-js@1.6.11:
version "1.6.11"
resolved "https://registry.npmmirror.com/xml-js/-/xml-js-1.6.11.tgz"
integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==
>>>>>>> test
dependencies: dependencies:
"global" "~4.3.0" "global" "~4.3.0"
"is-function" "^1.0.1" "is-function" "^1.0.1"