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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+ 新增
+ {{'导出'}}
+
+
+
+
+
+
+ {{scope.row[item.columnProp]}}
+
+
+
+
+
+ 编辑
+
+
+
+
+
+
+
+
+
+
+ 工厂编码
+ 工厂编码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 保存
+ 关闭
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
-
- {{buttons.search}}
- {{buttons.add}}
-
- {{ buttons.download }}
-
-
- {{ buttons.settingTable }}
+
+
+
+
+
+
+
+
+ {{buttons.search}}
+ {{buttons.add}}
+
+ {{buttons.download}}
+
+
+
-
-
- {{buttons.update}}
- {{buttons.companyInformation}}
-
-
- {{scope.row[item.columnProp]}}
-
+ {{scope.row[item.columnProp]}}
+
+
+
+
+
+ {{buttons.update}}
-
+
+
-
+
-
+
-
+
-
- {{labels.company}}
-
-
-
+
-
+
@@ -95,821 +96,538 @@
-
+
-
+
-
+
-
+
-
-
+
-
-
+
-
+
-
+
{{buttons.save}}
{{buttons.close}}
-
+
+
-
+
-