From 29286fa61e12e0920916ab7e791ee525de976ea5 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Thu, 31 Jul 2025 16:40:06 +0800 Subject: [PATCH] =?UTF-8?q?2025-07-31=20=E5=9F=BA=E7=A1=80=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/base/site.js | 6 + src/api/chooselist/chooselist.js | 5 +- src/utils/ajax.js | 65 + src/utils/excel-util.js | 159 ++ src/views/modules/base/buInformation.vue | 484 ++++++ src/views/modules/base/factoryInformation.vue | 1304 +++++++---------- src/views/modules/base/workCenter.vue | 525 +++---- src/views/modules/common/Chooselist_eam.vue | 2 +- .../productionLineOperatorRegistration.vue | 10 +- src/views/modules/sys/user.vue | 8 +- 10 files changed, 1513 insertions(+), 1055 deletions(-) create mode 100644 src/utils/ajax.js create mode 100644 src/utils/excel-util.js create mode 100644 src/views/modules/base/buInformation.vue diff --git a/src/api/base/site.js b/src/api/base/site.js index d99be43..57dff4f 100644 --- a/src/api/base/site.js +++ b/src/api/base/site.js @@ -179,3 +179,9 @@ export const uploadSOPFile= data => createAPI(`/base/uploadSOPFile`,'post',data) export const sopFileEdit= data => createAPI(`/base/sopFileEdit`,'post',data) export const getRoleUserList = data => createAPI(`/base/getRoleUserList`,'post',data) + +export const queryBuInformation = data => createAPI(`/base/queryBuInformation`,'post',data) + +export const buSave = data => createAPI(`/base/buSave`,'post',data) + +export const buEdit = data => createAPI(`/base/buEdit`,'post',data) diff --git a/src/api/chooselist/chooselist.js b/src/api/chooselist/chooselist.js index a4b6b50..d356aab 100644 --- a/src/api/chooselist/chooselist.js +++ b/src/api/chooselist/chooselist.js @@ -1,8 +1,11 @@ import { createAPI } from "@/utils/httpRequest.js"; - export const getChooselist = data => createAPI(`/chooselist/getChooselist/${data.tagNo}`,'get',data) + export const getChooselistData = data => createAPI(`/chooselist/getChooselistData`,'post',data) export const getChooselistEam = data => createAPI(`/chooselist/getChooselist/${data.tagNo}`,'get',data) + export const getChooselistDataEam = data => createAPI(`/chooselist/getChooselistData`,'post',data) + +export const verifyData = data => createAPI(`/chooselist/verifyData`,'post',data) diff --git a/src/utils/ajax.js b/src/utils/ajax.js new file mode 100644 index 0000000..da4c246 --- /dev/null +++ b/src/utils/ajax.js @@ -0,0 +1,65 @@ +import Vue from "vue"; +import axios from 'axios'; +const qs = require('qs'); +var apiServer = (process.env.NODE_ENV !== 'production' && process.env.OPEN_PROXY ? '/proxyApi/' : window.SITE_CONFIG.baseUrl); +var http = axios.create({ + timeout: 10000, + headers: {}, + transformRequest: data => { + if (typeof data === 'object') { + return qs.stringify(data, { arrayFormat: 'brackets' }); + } + return data; + } +}); +export default { + axios: http, + $post(url, data, callback, error) { + // 添加 headers 配置项 + const config = { + headers: { + 'Content-Type': 'application/json;charset=UTF-8', + 'token': Vue.cookie.get('token') + } + }; + let p = http.post(apiServer +url, JSON.stringify(data), config); + if (callback) { + p.then(res => { + callback(res); + }) + } + if (error) { + p.catch(err => { + error(err); + }); + } + return p; + }, + file:(url, data, succ, err )=>{ + let requestUrl = apiServer + url; + var xhr = new XMLHttpRequest(); + xhr.open('POST', requestUrl, true); + xhr.responseType = "blob"; + xhr.withCredentials = true; + xhr.setRequestHeader("X-API", "true"); + xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); + xhr.setRequestHeader("token", Vue.cookie.get('token') ); + xhr.onreadystatechange = function (e) { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + succ(xhr.response) + } else { + var fr = new FileReader(); + fr.onload = function(e) { + var text = fr.result; + console.log(text); + err ? err(text) : alert("请求发生错误:" + text) + }; + fr.readAsText(xhr.response); + } + } + }; + xhr.send(data); + }, + apiServer: apiServer +}; diff --git a/src/utils/excel-util.js b/src/utils/excel-util.js new file mode 100644 index 0000000..b266908 --- /dev/null +++ b/src/utils/excel-util.js @@ -0,0 +1,159 @@ +import XLSX from "xlsx"; +import ajax from '@/utils/ajax' +import { + Message +} from 'element-ui'; +const excelHeaderName = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; +/** + * excel导出默认选项 + */ +const exportOptionDefault = { + url: "",//*必填,导出请求地址 + tableRef: undefined,//#1组合必填 导出数据对应列信息,el-table引用 + columnMapping: undefined,//#1组合必填 自定义导出列映射 + fileName: "export.xlsx",//导出文件名 + params: {},//导出请求参数 + rowFetcher: res => {//从请求结果中获取导出行的方式,默认取请求结果中的data作为导出数据 + return (res || {data: []}).data; + }, + columnFormatter: [],//需要格式化的列 + mergeSetting: { + refs: [], //检测需要合并的数据列属性名 + columns: [] //检测需要合并后,要合并的列,以第一条数据为准合并 + }, + dropColumns: [],//导出时需要过滤掉的列 +}; +let HEADERS = []; +for (let i =0;i< 200;i++) { + let c = parseInt(i / 26); + let m = i % 26; + HEADERS.push((c > 0 ? excelHeaderName[c - 1] : "") + excelHeaderName[m]); +} +let validOption = opt => { + let option = Object.assign({}, opt); + if (!option.url) { + throw new Error("request url is required."); + } + if (!option.tableRef && !option.columnMapping) { + throw new Error("element table ref object or columnMapping is required."); + } + if (option.rowFetcher != undefined && typeof option.rowFetcher != "function") { + throw new Error("rowFetcher must be a function with one param."); + } +} + +let getMergeSetting = (data, s, allCols) => { + let refCols = s.refs; + let mcols = s.columns; + let mergeList = []; + + let refRow = data[0]; + let mergeSetting = { + s: 0, + e: 0 + }; + for (let i = 0; i < data.length; i++) { + let same = refCols.map(c => data[i][c] === refRow[c]).filter(r => !!r).length == refCols.length; + if (!same) { + mergeSetting.e > mergeSetting.s && (mergeList.push(mergeSetting)); + refRow = data[i]; + mergeSetting = { + s: i, + e: i + }; + } else { + i > mergeSetting.e && (mergeSetting.e = i); + i == data.length - 1 && (mergeList.push(mergeSetting)); + } + + } + + let setting = []; + mergeList.forEach(e => { + mcols.forEach(c => { + let ci = allCols.indexOf(c); + setting.push({ + s: { + r: e.s + 1, + c: ci + }, + e: { + r: e.e + 1, + c: ci + } + }); + }); + }); + return setting; +} + +let setStyle = (ws, s) => {} + +let getColSetting = (mapping,dropColums) => { + let columns = []; + for (let i = 0; i < mapping.length; i++) { + let c = mapping[i]; + if (dropColums.indexOf(c.columnProp) == -1) { + columns.push({ + property: c.columnProp || c.property, + label: c.columnLabel, + type: "default" + }); + } + } + return { + columns: columns + }; +} +let export2Excel = opt => { + validOption(opt); + let options = Object.assign({}, exportOptionDefault, opt); + let expColSetting = !!options.tableRef ? options.tableRef : getColSetting(options.columnMapping, options.dropColumns); + ajax.$post(options.url, options.params, resp => { + if (resp.status !== 200) { + Message.error({ + message: resp.description + }); + } + let rows = !!resp.data.rows?options.rowFetcher(resp).rows:resp.data.page.list; + var columns = [ + [] + ]; + var keys = []; + let formaters = new Array(); + expColSetting.columns.forEach(column => { + if (!!column.label && column.type === "default") { + columns[0].push(column.label); + keys.push(column.property); + let formater = options.columnFormatter.find(f => !!f[column.property] && typeof f[column.property] == 'function'); + !!formater && (formaters[column.property] = formater[column.property]); + } + }); + rows.forEach(o => { + let list = []; + keys.forEach(k => { + let formater = formaters[k]; + if (!!formater) { + list.push(formater(o[k])); + } else { + list.push(o[k]); + } + }); + columns.push(list); + }); + const ws = XLSX.utils.aoa_to_sheet(columns); + if (!!options.mergeSetting && !!options.mergeSetting.refs && options.mergeSetting.refs.length > 0) { + let merges = getMergeSetting(rows, options.mergeSetting, keys); + ws["!merges"] = merges; + setStyle(ws, merges); + } + // console.log(ws); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, ws, options.fileName.replace(/\.xlsx/, "")); + XLSX.writeFile(wb, options.fileName); + }); +} + +export default { + exportTable: export2Excel +} diff --git a/src/views/modules/base/buInformation.vue b/src/views/modules/base/buInformation.vue new file mode 100644 index 0000000..3286f3d --- /dev/null +++ b/src/views/modules/base/buInformation.vue @@ -0,0 +1,484 @@ + + + + + diff --git a/src/views/modules/base/factoryInformation.vue b/src/views/modules/base/factoryInformation.vue index 80d7bf2..9adb24a 100644 --- a/src/views/modules/base/factoryInformation.vue +++ b/src/views/modules/base/factoryInformation.vue @@ -1,42 +1,37 @@ -