Commit 4081e0b3 authored by xiangjiaojunxp's avatar xiangjiaojunxp

物料转换页面修改,导入对比页面修改,批量对比修改

parent 24fa7fd9
......@@ -262,9 +262,7 @@ export default {
const exportJson = await cons;
await this.summary(exportJson);
console.log('summary 执行完毕');
// 导入完成后关闭遮罩层
this.showMask = false;
this.submit(exportJson);
//this.submit(exportJson);
} catch (Error) {
this.$message({
......@@ -272,6 +270,9 @@ export default {
type: "error"});
console.log(Error.message);
console.log("这里是最外面的地方");
}finally {
// 导入完成后关闭遮罩层
this.showMask = false;
}
},
/** 物料转换汇总到页面*/
......@@ -588,6 +589,7 @@ export default {
case 1: {
let map = new Map();
let smallMat = [];
try{
for (let i = parseInt(sysRulez[0].re) + 1; i < data.length; i++) {
if (data[i][key_i] != null) {
let num = data[i][key_i].m;
......@@ -604,6 +606,9 @@ export default {
smallMat.push(null);
}
}
}catch(err){
throw new Error("导入失败,导入文件与模板规则不匹");
}
//console.log(smallMat);
asyncTasks.push(
new Promise((innerResolve, innerReject) => {
......@@ -653,10 +658,20 @@ export default {
let row;
let con;
let warn=0;
console.log(map);
//console.log(map);
map.forEach((value,key)=>{
let searchResult;
searchResult= luckysheet.find(key);
if( searchResult==undefined ||searchResult.length === 0 || key === null){
warn++;
}
})
if (warn === map.size) {
throw new Error("导入文件与所选模板规则不匹配");
}
for (let i = 0; i < sysRules.length; i++) {
map.forEach((value, key) => {
let matchingCells = [];
let name = data[sysRules[i].re][sysRules[i].ce].m
if (name.includes("洗煤")) {
......@@ -669,7 +684,6 @@ export default {
for (; row <= con; row++) {
let cellValue = luckysheet.getCellValue(row, parseInt(sysRulez[0].ct));
if (cellValue === null) {
warn++
} else {
if (cellValue.includes(key)) {
luckysheet.setCellValue(row, sysRules[i].ct, value[i]);
......@@ -724,17 +738,33 @@ export default {
if (map2.size === 0) {
throw new Error("导入失败,导入文件错误");
}
//console.log(map2);
map2.forEach((value, key) => {
let searchResult;
searchResult= luckysheet.find(key);
if( searchResult!==undefined && searchResult.length !== 0 || key !== null){
for (let i = 0; i < value.length; i++) {
luckysheet.setCellValue(sysConver[i].rt, sysConver[i].ct, value[i]);
luckysheet.setCellValue(sysConver[i].rt, sysConver[i].ct, {
luckysheet.setCellValue(searchResult[0].row, sysConver[i].ct, value[i]);
luckysheet.setCellValue(searchResult[0].row, sysConver[i].ct, {
"ct": {
"fa": "General",
"t": "n"
}
});
}
}else{
warn++;
}
})
if (warn === map.size+map2.size) {
throw new Error("导入文件与所选模板规则不匹配");
} else if (warn > 0) {
this.$message({
message: "还有"+warn+"条大类未能匹配到",
type: "warning"});
}
resolve(response.rows);
innerResolve(); // 标记当前异步任务完成
}).catch(Error => {
console.log("这里是单个异步请求出错处");
//必须加,不能删除
......@@ -747,23 +777,21 @@ export default {
let map = new Map();
let smallMat = [];
let deps = [];
try {
for (let i = parseFloat(sysRulez[0].re) + 1; i < data.length; i++) {
if (data[i][sysRulez[1].ce]!= null && data[i][key_i]!= null ) {
if (data[i][sysRulez[1].ce] != null && data[i][key_i] != null) {
let num = data[i][key_i].m;
let dep = data[i][sysRulez[1].ce].m;
if(dep){
smallMat.push(null);
deps.push(null);
}else{
smallMat.push(num);
deps.push(dep);
}
} else {
smallMat.push(null);
deps.push(null);
}
}
console.log(deps);
}catch(err){
throw new Error("导入失败,导入文件与模板规则不匹");
}
asyncTasks.push(
new Promise((innerResolve, innerReject) => {
const allNull = smallMat.every(item =>item===null);
......@@ -809,11 +837,7 @@ export default {
//循环得到汇总结果
console.log(map);
if (map.size === 0) {
this.$message({
message: "导入失败,导入文件错误",
type: "error"
});
innerReject(error); // 异步请求出错
throw new Error("导入失败,导入文件错误");
}
//返回单元格第二行的数据
//let celn=luckysheet.getcellvalue(1);
......@@ -839,8 +863,8 @@ export default {
const suffixArr = key.split('/'), mat = suffixArr[0], depp = suffixArr[1];
//console.log(mat);console.log(depp);
let searchResult = luckysheet.find(mat);
rowws = searchResult[0].row;
if (searchResult.length != 0 && key != null) {
rowws = searchResult[0].row;
luckysheet.insertRow(rowws + 1);
//输出部门数量金额
luckysheet.setCellValue(rowws + 1, sysRulez[1].ct, depp);
......@@ -863,20 +887,27 @@ export default {
"t": "n"
}
});*/
} else{
warn++;
}
config = luckysheet.getConfig(0);
bord.range[0].row = [rowws + 1, rowws + 1];
bord.range[0].column = [0, sysRules[sysRules.length - 1].ct];
config.borderInfo.push(bord);
luckysheet.setConfig(config);
} else{
warn++;
}
});
console.log(warn);
if (warn === map.size) {
throw new Error("导入文件与所选模板规则不匹配");
} else if (warn > 0) {
this.$message({
message: "还有"+warn+"条大类未能匹配到",
type: "warning"});
}
resolve(response.rows);
innerResolve(); // 标记当前异步任务完成
/*let find1 = luckysheet.find("合计");
let number = parseInt(find1[0].row)-1;
luckysheet.setCellValue(find1[0].row, sysRules[sysRules.length-1].ct, "=SUM(F2:F"+number+")")*/
}).catch(Error => {
console.log("这里是单个异步请求出错处");
//必须加,不能删除
......@@ -950,7 +981,7 @@ export default {
map.forEach((value, key) => {
let searchResult;
searchResult= luckysheet.find(key);
if (searchResult && searchResult.length !== 0 && key != null) {
if (searchResult!==undefined && searchResult.length !== 0 && key != null) {
rowws = searchResult[0].row;
luckysheet.setCellValue(rowws, sysRules[i].ct, value[i]);
luckysheet.setCellValue(rowws, sysRules[i].ct, {
......
......@@ -349,6 +349,7 @@ export default {
let cell=(c1<=c2)?c1:c2;
let array=[];
let r=this.row-1;
try{
for(let i=r;i<row;i++) {
for (let j = 0; j <cell; j++) {
//第一个表的单元格为null直接跳出
......@@ -436,7 +437,11 @@ export default {
message: "导入完成,本次导入未发现不同数据",
type: "success"});
}
}catch (err){
this.$message({
message: "导入失败,导入文件与对比文件有所不匹",
type: "error"});
}
})
},
......
......@@ -337,8 +337,6 @@ export default {
type: "error"});
}
}
)
},
......
<template>
<div class="app-container">
<el-form ref="queryForm" size="small" :inline="true" >
<el-form-item>
<el-checkbox v-model="numm">是否只比较数值</el-checkbox>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
v-if="isluckysheet"
type="warning"
plain
icon="el-icon-upload2"
size="mini"
@click="handleExport"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-if="isluckysheet" icon="el-icon-s-opportunity" size="mini" @click="addToMap">生成</el-button>
</el-col>
<el-button type="primary" v-if="isDivVisible" @click="uploadFolder">上传旗舰文件夹</el-button>
<input ref="folderInput" type="file" style="display: none;" multiple @change="handleFolderSelect">
<el-button type="primary" v-if="isDivVisible" @click="uploadFolder2">上传浪潮文件夹</el-button>
<input ref="folderInput2" type="file" style="display: none;" multiple @change="handleFolderSelect2">
<el-button type="primary" @click="testdb">开始对比</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery" class="right-float">重置</el-button>
</el-row>
<!-- luckysheet容器 -->
<div
id="luckysheet" v-if="isluckysheet"
style="margin: 0px; padding: 0px; position: absolute; width: 100%;left: 0px; top: 105px; height: 75vh; z-index: 0"
></div>
<div v-if="isDivVisible" style="display: flex;">
<el-table :data="fileName1" style="flex-basis: 50%;">
<el-table-column prop="name" label="旗舰版文件名称" width="300">
<template slot-scope="scope">
<div>{{ scope.row.name }}</div>
<div>
<el-button type="text" @click="moveUp(scope.$index)" :disabled="scope.$index === 0">上移</el-button>
<el-button type="text" @click="moveDown(scope.$index)" :disabled="scope.$index === fileName1.length - 1">下移</el-button>
<el-button type="text" @click="duplicate(scope.$index)">复制</el-button>
<el-button type="text" @click="deleteFile(scope.$index)">删除</el-button>
</div>
</template>
</el-table-column>
</el-table>
<el-table :data="fileName2" style="flex-basis: 50%;">
<el-table-column prop="name" label="旗舰版文件名称" width="300">
<template slot-scope="scope">
<div>{{ scope.row.name }}</div>
<div>
<el-button type="text" @click="moveUp2(scope.$index)" :disabled="scope.$index === 0">上移</el-button>
<el-button type="text" @click="moveDown2(scope.$index)" :disabled="scope.$index === fileName2.length - 1">下移</el-button>
<el-button type="text" @click="duplicate2(scope.$index)">复制</el-button>
<el-button type="text" @click="deleteFile2(scope.$index)">删除</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<style>
.right-float {
float: right;
}
</style>
<script>
/*import luckysheet from 'luckysheet'*/
import LuckyExcel from 'luckyexcel'
//导入库export.js 这个文件是es6的,不能在普通的HTML文件直接引入js文件(虽然都是js文件,但是有区别,具体请百度es6与es5)!需要把es6转es5才可以直接引入使用!
import { exportExcel } from '../../../../public/exportExcel';
import {vueScript} from "@/utils/generator/html";
var fileName="新建XLSX工作表"; //定义表名
var data1;
var name1;
var datast;
var namest;
var map=new Map();
var maper=new Map();
export default {
name: "Mymodule",
data() {
return {
fileName1:[],
fileName2:[],
isDivVisible:true,
isluckysheet:false,
row:1,
numm:false,
//弹出页面的表名
// 是否显示弹出层
fileList:[],
disableNextButton: true,
// 查询参数
queryParams: {
status:0
},
};
},
created() {
},
mounted() {
fileName="新建XLSX工作表";
},
methods:{
uploadFolder() {
this.$refs.folderInput.click();
},
handleFolderSelect(event) {
const files = event.target.files;
for(let i = 0; i < files.length; i++){
this.fileName1.push({name: files[i].name, data: files[i]});
}
},
moveUp(index) {
if (index > 0) {
const temp = this.fileName1[index];
this.fileName1.splice(index, 1);
this.fileName1.splice(index - 1, 0, temp);
}
},
moveDown(index) {
if (index < this.fileName1.length - 1) {
const temp = this.fileName1[index];
this.fileName1.splice(index, 1);
this.fileName1.splice(index + 1, 0, temp);
}
},
deleteFile(index) {
this.fileName1.splice(index, 1);
},
isFileNameExists(name) {
return this.fileName1.some(item => item.name === name);
},
// 复制
duplicate(index) {
const item = Object.assign({}, this.fileName1[index]);
const originalName = item.name;
let newName = originalName;
let count = 1;
// 检查是否存在同名文件,如果存在则进行递增命名
while (this.isFileNameExists(newName)) {
const dotIndex = originalName.lastIndexOf('.');
if (dotIndex !== -1) {
newName = originalName.slice(0, dotIndex) + ` (${count})` + originalName.slice(dotIndex);
} else {
newName = originalName + ` (${count})`;
}
count++;
}
item.name = newName;
this.fileName1.splice(index + 1, 0, item);
},
uploadFolder2() {
this.$refs.folderInput2.click();
},
handleFolderSelect2(event) {
const files = event.target.files;
for(let i = 0; i < files.length; i++){
this.fileName2.push({name: files[i].name, data: files[i]});
}
},
moveUp2(index) {
if (index > 0) {
const temp = this.fileName2[index];
this.fileName2.splice(index, 1);
this.fileName2.splice(index - 1, 0, temp);
}
},
moveDown2(index) {
if (index < this.fileName2.length - 1) {
const temp = this.fileName2[index];
this.fileName2.splice(index, 1);
this.fileName2.splice(index + 1, 0, temp);
}
},
deleteFile2(index) {
this.fileName2.splice(index, 1);
},
isFileNameExists2(name) {
return this.fileName2.some(item => item.name === name);
},
duplicate2(index) {
const item = Object.assign({}, this.fileName2[index]);
const originalName = item.name;
let newName = originalName;
let count = 1;
// 检查是否存在同名文件,如果存在则进行递增命名
while (this.isFileNameExists2(newName)) {
const dotIndex = originalName.lastIndexOf('.');
if (dotIndex !== -1) {
newName = originalName.slice(0, dotIndex) + ` (${count})` + originalName.slice(dotIndex);
} else {
newName = originalName + ` (${count})`;
}
count++;
}
item.name = newName;
this.fileName2.splice(index + 1, 0, item);
},
/** 回车事件和保存提交绑定 */
handleEnter(event) {
if (event.keyCode === 13) {
event.preventDefault(); // 阻止默认的回车事件
// 触发确定操作
this.testdb();
}
},
/** 重置按钮操作 */
resetQuery() {
this.isDivVisible = true;
luckysheet.destroy();
this.isluckysheet = false;
fileName="新建XLSX工作表";
this.disableNextButton='';
this.fileName1=[];
this.fileName2=[];
this.row=1;
datast='';
namest='';
map.clear();
maper.clear();
this.numm=false;
},
/** 生成标签*/
addToMap(){
map.forEach((value,key)=>{
for(let i=0;i<value.length;i++){
let row=parseInt(value[i][0])-1;
let cell=this.stringTonum(value[i][1])-1;
//let row=value[i][0]-1,cell=value[i][1]-1;
let sd=luckysheet.getCellValue(row,cell,{type:"bg"});
//用批注进行比较的时候把下面的!==判断去掉
//let sd=luckysheet.getCellValue(row,cell,{type:"ps"});
if(sd===null || sd!=="#e85f61"){
luckysheet.setCellValue(row, cell, {bg: "#e85f61"})
luckysheet.setCellValue(row, cell, {bg: "#e85f61"})
/* luckysheet.setCellValue(row, cell, {
ps: { //批注
"left": 92, //批注框左边距
"top": 10, //批注框上边距
"width": 91, //批注框宽度
"height": 48, //批注框高度
"value": key+"表有误", //批准内容
"isshow": false //批注框为显示状态
}
})*/
maper.set("("+(row+1)+","+value[i][1]+")",1);
}else{
//let sd=luckysheet.getCellValue(row,cell,{type:"ps"}).value;
/*luckysheet.setCellValue(row, cell, {
ps: { //批注
"left": 92, //批注框左边距
"top": 10, //批注框上边距
"width": 91, //批注框宽度
"height": 48, //批注框高度
"value": sd+'\n;'+key+"表有误", //批准内容
"isshow": false //批注框为显示状态
}
})*/
maper.set("("+(row+1)+","+value[i][1]+")",maper.get("("+(row+1)+","+value[i][1]+")")+1);
}
}
})
let row;
let num=luckysheet.getSheet().data.length;
let data=luckysheet.getSheet().data;
for(let i=0;i<num;i++){
if(data[i][0]===null){
row=i;
break;
}
}
if (row === undefined){
row = num;
}
//生成多少条数据添加多少行
let asd=maper.size+map.size;
if(row+asd>=num){
for (let i=0;i<=row+asd-num;i++){
luckysheet.insertRow(row + 1);
}
luckysheet.insertRow(row + 1);
}
row=row+1;
let k=0;
for (let [key,value] of map.entries()) {
let a="("+value.join("),(")+")";
luckysheet.setCellValue(row+k,0,key);
luckysheet.setCellValue(row+k,1 ,a);
k++
}
let froms = Array.from(maper);
froms.sort((a, b) => {
return b[1] - a[1];
});
for (let i=0;i<froms.length;i++){
luckysheet.setCellValue(row+k,0,froms[i][0]);
luckysheet.setCellValue(row+k,1 ,froms[i][1]);
k++;
}
},
/** 开始对比功能 */
async testdb(){
if(this.fileName1.length!==0 && this.fileName2.length!==0){
if ( this.fileName1.length === this.fileName2.length ){
this.isDivVisible=false;
this.isluckysheet = true;
for (let i =0;i<this.fileName1.length;i++){
await this.handleFileChange(this.fileName1[i].data);
await this.handleFileChange1(this.fileName2[i].data);
}
luckysheet.create({
container: 'luckysheet', //luckysheet is the container id
title: namest,
lang: 'zh', // 设定表格语言
showinfobar: false,
data: datast,
});
}else {
this.msgError("旗舰版文件与浪潮文件数量不匹配,请检查后在对比");
}
}else{
this.msgError("请先上传对比文件!!!");
return;
}
},
/** 导入事件*/
handleFileChange(evt) {
this.disableNextButton=false;
let name = evt.name
let suffixArr = name.split('.'),
suffix = suffixArr[suffixArr.length - 1]
if (suffix !== 'xlsx') {
this.$message({
message: "上传格式不正确,请上传xlsx格式文件",
type: "warning"});
return
}
let exx;
return new Promise((resolve, reject) => {
LuckyExcel.transformExcelToLucky(
evt,
(exportJson)=> {
if (exportJson.sheets === null || exportJson.sheets.length === 0) {
this.$message({
message: "导入失败,请检查上传的文件是否正确",
type: "warning"
});
return
}
data1=exportJson.sheets[0];
name1=exportJson.sheets[0].name;
datast=exportJson.sheets;
namest=exportJson.info.name;
let suffixArr = exportJson.info.name.split('.');
fileName = suffixArr[0];
exx=exportJson.sheets;
resolve(exx);
})
});
},
handleFileChange1(evt) {
let name = evt.name
let suffixArr = name.split('.'),
suffix = suffixArr[suffixArr.length - 1];
name=suffixArr[0]
if (suffix !== 'xlsx') {
this.$message({
message: "上传格式不正确,请上传xlsx格式文件",
type: "warning"});
return
}
return new Promise((resolve, reject) => {
LuckyExcel.transformExcelToLucky(
evt,
(exportJson) => {
if (exportJson.sheets === null || exportJson.sheets.length === 0) {
this.$message({
message: "导入失败,请检查上传的文件是否正确",
type: "warning"
});
return
}
let ddd = data1;
let as = 0;
let d1 = window.luckysheet.transToData(ddd.celldata);
let d2 = window.luckysheet.transToData(exportJson.sheets[0].celldata);
let r1 = d1.length, r2 = d2.length, c1 = d1[0].length, c2 = d2[0].length;
let row = (r1 <= r2) ? r1 : r2;
let cell = (c1 <= c2) ? c1 : c2;
let array = [];
let r = this.row - 1;
for (let i = r; i < row; i++) {
for (let j = 0; j < cell; j++) {
//第一个表的单元格为null直接跳出
if (d1[i][j] == null) {
continue
}
//第二个表的单元格为null直接跳出
if (d2[i][j] == null) {
continue
}
//第一个表内数据为0 且 第二个表只有样式内部为空
if (d2[i][j].v == 0 && d1[i][j].v == undefined) {
continue
}
//第一个表内数据为0 且 第二个表只有样式内部为空
if (d1[i][j].v == 0 && d2[i][j].v == undefined) {
continue
}
// 第一个表内数据为string型 且 第二个表只有样式内部为空
/*if((typeof(d1[i][j].v)=="string" && d2[i][j].v==undefined)){
continue
}*/
//第一个表为合并单元格 且第二个内没有值
if (d1[i][j].mc != undefined && d2[i][j].v == undefined) {
continue
}
//第二个表为合并单元格 且第一个内没有值
if (d2[i][j].mc != undefined && d1[i][j].v == undefined) {
continue
}
if ((isNaN(d1[i][j].v) && d2[i][j].v == undefined)) {
}
// 第二个表内数据为string型 且 第一个表只有样式内部为空
if (isNaN(d2[i][j].v) && d1[i][j].v == undefined) {
}
// 没有选只比较数值 且 第一个表内数据为string型 且 第二个表内数据位string型
if (this.numm != false && (isNaN(d1[i][j].v) && isNaN(d2[i][j].v))) {
continue;
}
// 两个表的值都是0
if (d1[i][j].v == 0 && d2[i][j].v == 0) {
continue
}
// 两个表都是只有样式没有数据
if (d1[i][j].v == undefined && d2[i][j].v == undefined) {
} else if (d1[i][j].v == undefined || d2[i][j].v == undefined) {
as++
let s = this.numToString(j + 1);
array.push([i + 1, s]);
//array.push([i+1,j+1]);
} else {
if (d1[i][j].v != d2[i][j].v) {
as++
let s = this.numToString(j + 1);
array.push([i + 1, s]);
}
}
}
}
map.set(name1, array);
if (as > 0) {
this.$message({
message: "导入完成,本次导入共发现" + as + "条不同数据",
type: "warning"
});
} else {
this.$message({
message: "导入完成,本次导入未发现不同数据",
type: "success"
});
}
data1 = '';
ddd = '';
resolve(data1);
})
});
},
/** 导出设置 */
handleExport: debounce(function() {
// 处理点击事件
exportExcel(luckysheet.getSheet(),fileName+"(对比后数据)")
}, 500), // 设置延迟时间,单位为毫秒
numToString(numm){
let char=[];
char.length = 0;
let numToStringAction = function(nnum){
let num = nnum - 1;
let a = parseInt(num / 26);
let b = num % 26;
char.push(String.fromCharCode(64 + parseInt(b+1)));
if(a>0){
numToStringAction(a);
}
}
numToStringAction(numm);
return char.reverse().join("");
},
stringTonum(a) {
var str = a.toLowerCase().split("");
var num = 0;
var al = str.length;
var getCharNumber = function (charx) {
return charx.charCodeAt() - 96;
};
var numout = 0;
var charnum = 0;
for (var i = 0; i < al; i++) {
charnum = getCharNumber(str[i]);
numout += charnum * Math.pow(26, al - i - 1);
}
;
return numout;
},
}
// 配置项111
};
// debounce函数定义
function debounce(func, delay) {
let timer;
return function () {
const context = this;
const args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
func.apply(context, args);
}, delay);
};
}
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment