Commit 137782ef authored by tangzhichun's avatar tangzhichun Committed by 刘_震

增加材料明细模版、中间工资汇总

parent 7c77feb6
import { setXRow } from "@/utils/tzc";
/**
* @function 林西矿工资数据处理
* @description
* @param jsonData 导入的数据
* @return 处理后的luckysheet的一维数组
* @author cwl 2024年6月17日11:37:45
*/
export function machLxGzdata(list, jsonData) {
var CompositeTable = jsonData;
//后台返回数据
CompositeTable[0].data = luckysheet.transToData(CompositeTable[0].celldata);
var dList = setXRow(CompositeTable[0].data); //汇总表中单位集合包含行数
list.forEach((item) => {
let dName = item.dep;
var r = dList[dName];
item.r = r;
item.v = item.value;
});
// 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
for (let i = 0; i < list.length; i++) {
if (
list[i].r == CompositeTable[0]["celldata"][k].r &&
list[i].c == CompositeTable[0]["celldata"][k].c
) {
// 如果相同,则进行替换
CompositeTable[0]["celldata"][k].v.v = list[i].v;
}
}
}
return CompositeTable;
}
// 电力汇总和转凭证接口
import request from "@/utils/request";
// 唐山电力数据文件导入
export function importTSExcel(data) {
return request({
url: "/power/dExcel",
method: "post",
headers: {
"Content-Type": "multipart/form-data",
},
data: data,
});
}
\ No newline at end of file
import request from '@/utils/request'
// 特殊表(填写数据)的导入接口
export function power(data) {
return request({
url: '/power',
method: 'post',
data: data
})
}
export function powerall(data) {
return request({
url: '/power/all',
method: 'post',
headers: {
"Content-Type": "application/json",
},
data: data
})
}
//展示前端所需要数据的接口
export function powerdata(data) {
return request({
url: `/power?mineId=${data.mineId} &date=${data.date}`,
method: 'get',
// params: data
})
}
// 电力表的对照表的导入接口
export function cExcel(data) {
return request({
url: '/power/cExcel',
method: 'post',
headers: {
"Content-Type": "multipart/form-data",
},
data: data
})
}
// 电力表的详细数据的导入接口
export function dExcel(data) {
return request({
url: '/power/dExcel',
method: 'post',
headers: {
"Content-Type": "multipart/form-data",
},
data: data
})
}
......@@ -325,3 +325,19 @@ export function listMyluckyexcel(query) {
// params: query
// })
// }
export function asiccData(data) {
return request({
url: 'asicc/getData',
method: "post",
data,
});
}
export function asmInfoSave(data) {
return request({
url: 'asmInfo/save',
method: "post",
data,
});
}
.mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.loading-spinner {
/* 添加你的加载动画样式 */
width: 40px;
height: 40px;
border-radius: 50%;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
\ No newline at end of file
import {
getSuppliesTemplate,
listSuppliesTemplate,
roleList,
templateListid
} from "@/api/ruoyi-myLuckyexcel/myluckyexcel";
import {cExcel,dExcel,power,powerdata} from "@/api/power/power.js";
import {
importTSExcel
} from "@/api/conversion/power";
// import luckysheet from 'luckysheet'
import LuckyExcel from "luckyexcel";
//导入库export.js 这个文件是es6的,不能在普通的HTML文件直接引入js文件(虽然都是js文件,但是有区别,具体请百度es6与es5)!需要把es6转es5才可以直接引入使用!
/*import {materialList} from "@/api/ruoyi-myLuckyexcel/myluckyexcel";*/
import { v4 as uuidv4 } from "uuid";
import { exportExcel } from "../../../../public/exportExcel";
import { jxdfxt,setTs } from "@/views/system/power/ass.js";
import { machGzdata } from "@/Wages/conversTsk.js";
import { machLxGzdata } from "@/Wages/conversLxk.js";
// import { config } from "vue/types/umd";
var fileName = "新建XLSX工作表"; //定义表名
var rule = [];
var tempId;
var uuid1;
var modify = false;
var that;
export default {
name: "Mymodule",
data() {
return {
wageMonth: "",
//汇总表数据
luckyrule:'',
//详细信息
phone: "",
//未导入成本材料表模板所有数据
jsondata: "",
//编码数据
showMask: false,
uuid: "",
selectedOption: "",
luckysheetData: "",
luckysheetDatas: "",
depss: [],
fileList: [],
VoucherForm: "",
all: "",
sum: [],
//后端要的数据
param:'',
// 查询参数
queryParams: {
status: 0,
},
mineId:'',//矿ID
};
},
created() {
that=this;
//刷新页面时进行的操作
this.getList();
},
mounted() {
this.init();
fileName = "新建XLSX工作表";
},
methods: {
//查询材料编码
//手机号
open() {
this.$prompt("请输入用友系统的用户名", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
inputPattern: /^(?:\+?86)?1[3-9]\d{9}$/,
inputErrorMessage: "手机号格式不正确",
})
.then(({ value }) => {
this.$message({
type: "success",
message: "你的用户名是: " + value,
});
this.phone = value;
this.zhuan();
})
.catch(() => {
this.$message({
type: "info",
message: "取消输入",
});
this.showMask = false;
});
},
/** 页面刷新时展示的数据*/
getList() {
listSuppliesTemplate(this.queryParams).then((response) => {
response.rows.forEach((row) => {
if (row.templateName.includes("六矿")) {
row.disabled = true;
}
});
this.depss = response.rows;
});
getSuppliesTemplate(1248).then((response) => {
const sysSupplies = response.rows;
this.luckysheetDatas = JSON.parse(
sysSupplies[0].templateContent
);
});
},
open4() {
this.$message.error("请仔细检查所导入表");
},
/** Luckyexcel文档 */
init() {
let options = {
container: "luckysheet", //luckysheet为容器id
title: "",
lang: "zh",
showinfobar: false,
data: [
{
name: "sheet1", //工作表名称
color: "", //工作表颜色
index: 0, //工作表索引
status: 1, //激活状态
order: 0, //工作表的下标
hide: 0, //是否隐藏
row: 50, //行数
column: 20, //列数
defaultRowHeight: 19, //自定义行高
defaultColWidth: 73, //自定义列宽
celldata: [], //初始化使用的单元格数据
config: {
merge: {}, //合并单元格
rowlen: {}, //表格行高
columnlen: {}, //表格列宽
rowhidden: {}, //隐藏行
colhidden: {}, //隐藏列
borderInfo: {}, //边框
authority: {}, //工作表保护
},
},
],
};
luckysheet.create(options);
},
handleSuccess(response, file, fileList) {
},
//电力数据后台导入成功后,数据展示到前台
loadTableData(evt) {
this.sum.push(evt);
if (modify) {
this.$confirm(
"再次导入将会清空表内数据,是否继续操作?",
"注意!!!",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(async () => {
// 确认继续后刷新页面返回模板
getSuppliesTemplate(this.selectedOption)
.then((response) => {
const sysSupplies = response.rows;
this.luckysheetData =
sysSupplies[0].templateContent;
let json_data = JSON.parse(
sysSupplies[0].templateContent
);
luckysheet.destroy();
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: fileName, // Excel 文件名
data: json_data, // Excel 数据
allowEdit: false, //作用:是否允许前台编辑
showinfobar: false, //是否显示顶部名称栏
lang: "zh",
});
modify = false;
this.open(this.sum);
})
.then(async () => {})
.catch(() => {});
})
.catch(() => {
// 用户点击了取消按钮
this.$message({
type: "info",
message: "操作已取消",
});
});
} else {
this.open(evt);
this.showMask = true;
LuckyExcel(evt, (exportJson) => {
//获取导入表格所有数据exportJson
this.open(exportJson)
.then(async () => {})
.catch((error) => {
this.$message({
message: error.message,
type: "error",
});
})
.finally(() => {
// 导入完成后关闭遮罩层
this.showMask = false;
});
});
}
},
async handleFileChange(evt) {
if (this.value.includes("凭证")) {
this.loadTableData(evt);
} else {
//组装后台接口数据
this.param = new FormData();
this.param.append("file", evt);
this.param.append("date", this.wageMonth);
this.param.append("mineId", this.mineId);
}
//前台加载数据
},
handleOptionChange(value,mine_id) {
templateListid(value).then((response) => {
this.luckyrule = JSON.parse(response.rows[0].templateContent);
this.luckyrule.forEach(item=>{
item.data=luckysheet.transToData(item.celldata)
})
});
that.mineId=mine_id.id
let lod = this.$loading({
lock: true,
text: "加载中",
background: "rgba(0, 0, 0, 0.7)",
});
//根据选中的下拉选项值获取相应的信息
getSuppliesTemplate(this.selectedOption)
.then((response) => {
lod.close();
modify = false;
tempId = this.selectedOption;
uuid1 = this.uuid = uuidv4().substring(0, 8);
const sysSupplies = response.rows;
this.luckysheetData = sysSupplies[0].templateContent;
var json_data = JSON.parse(sysSupplies[0].templateContent);
this.jsondata = json_data;
let suffixArr = sysSupplies[0].templateName.split(".");
fileName = suffixArr[0];
//luckysheet.destroy()
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: fileName, // Excel 文件名
data: json_data, // Excel 数据
showinfobar: false,
allowEdit: false, //是否显示顶部名称栏
lang: "zh",
index: "0", //工作表索引
status: "1", //激活状态
});
this.value = fileName;
})
.catch(() => {
lod.close();
// 处理错误逻辑,这里是一个空的错误处理函数
this.$message.error("查询失败,发生未知错误!");
});
},
//电力数据后台汇总完后,回显到前台
setLuckysheetData(CompositeTable,myCompositeTable){
CompositeTable[0].data = luckysheet.transToData(
myCompositeTable[0].celldata
);
CompositeTable[0].calcChain = [];
let as = CompositeTable[0].celldata.filter(
(item) => item.v.f
);
as.forEach((item) => {
let sum = {
index: CompositeTable[0].index,
r: item.r,
c: item.c,
};
CompositeTable[0].calcChain.push(sum);
});
CompositeTable[0].celldata[0].status = 1;
luckysheet.create({
forceCalculation: true,
container: "luckysheet",
title: fileName,
data: CompositeTable,
showinfobar: false,
lang: "zh",
});
let obj = {
yearMonth: this.wageMonth,
jsonData: JSON.stringify(CompositeTable),
value: jsonString,
mineId:that.mineId
};
modify = true;
that.showMask = false;
conversionSave(obj).then((response) => {});
},
//转换方法
zhuan() {
const promises = this.sum.map((item) => {
return new Promise((resolve, reject) => {
LuckyExcel.transformExcelToLucky(item, (lucksheetfile) => {
resolve(lucksheetfile);
});
});
});
Promise.all(promises).then((results) => {
let min={
date:this.wageMonth,
mineId:this.mineId
}
//唐山矿规则
let CConfig = {
'加收管理费': ['电费-基本'],
'照明电量': ["电量-峰", "电量-平", "电量-尖", "电量-谷", '电量-合计'],//前四个有就不填,都没有填电量-合计
'电光电费': ["电费-峰", "电费-平", "电费-尖", "电费-谷", '电费-合计'],
'峰段电量': ['电量-峰'],
'峰段金额': ['电费-峰'],
'平段电量': ['电量-平'],
'平段金额': ['电费-平'],
'谷段电量': ['电量-谷'],
'谷段金额': ['电费-谷'],
}
let itemConfig = {
'基本生产,原煤': ['原煤生产'],
'基本生产,洗煤': ['洗煤厂(高压)'],
'制造费用,原煤': ['矿井水净化', '地面维修', '联合建筑', '厂区服务', '供水供暖'],//todo 缺少
'管理用电': ['综合办', '工会楼', '小车房', '绿化保洁'],
'其他业务成本,住宿': ['住宿餐饮(集体宿舍)'],
'其他业务成本,餐饮': ['住宿餐饮(东门食堂)', ' 住宿餐饮(风井食堂)'],
'其他业务成本,厂区服务,集团大院': ['集团公司大院'],
}
let trans=jxdfxt(results[0].sheets)
// 后端数据要的数据 trans, this.param
setTs(TSdL, this.luckyrule, CConfig, itemConfig)
this.showMask=false
});
// .catch(error => {
// console.error("An error occurred while transforming Excel files:", error);
// // 处理错误情况
// });
},
//公式窗口关闭回调
handleExport: debounce(function () {
// handleExport
exportExcel(luckysheet.getAllSheets(), fileName);
}, 500),
},
};
// 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);
};
}
......@@ -10,6 +10,7 @@ export function MoneyMine(money, DepartmentColumns, name, materianame, c, Compos
k++;
}
}
// luckysheet.insertRow(5, { number: 6 });
//部门 因为部门再第0列 所以条件 obj.c不满足 需要单独写出来
let Department = c.flat().filter(obj => obj.c !== undefined && obj.c == DepartmentColumns && obj.r > headRow)
......
......@@ -9,20 +9,6 @@ export function Tangshan(money, c, name, CompositeTable, headRow, researchs) {
k++;
}
}
// let insi = CompositeTable[0].celldata.filter(obj => obj.v.v == '6.研发支出')[0].r
// CompositeTable[0].celldata.forEach(item=>{
// if(item.r && item.r>insi){
// item.r=item.r+researchs.length
// }
// })
// for (let i = 0, k = 0; i < CompositeTable[0].celldata.length && k < researchs.length; i++) {
// if (CompositeTable[0].celldata[i] && CompositeTable[0].celldata[i].r && CompositeTable[0].celldata[i].r >= insi + 1 && CompositeTable[0].celldata[i].r < insert + 4 && CompositeTable[0].celldata[i].c == 0) {
// CompositeTable[0].celldata[i].v.v = researchs[k];
// CompositeTable[0].celldata[i].v.m = researchs[k];
// k++;
// }
// }
function findValueInArray(arr, value) {
for (let obj of arr) {
if (JSON.stringify(obj).includes(value)) {
......@@ -60,6 +46,9 @@ export function Tangshan(money, c, name, CompositeTable, headRow, researchs) {
if (obj.v.name.includes('洗煤')) {
obj.v.name = '基本生产-洗煤'
}
if (obj.v.name=='办公费用') {
obj.v.name = '管理费用-'
}
if (obj.v.name == '其他业务成本') {
obj.v.name += '-厂区服务'
}
......
export function Tangshan(money, c, name, CompositeTable, headRow) {
//money 总金额 c导入表所有数据,name 来源类别,CompositeTable 材料汇总表数据, headRow 数据行
let results = ['金属厂']
let insert = CompositeTable[0].celldata.filter(obj => obj.v.v == '7.代付单位(XXX单位)')[0].r
for (let i = 0, k = 0; i < CompositeTable[0].celldata.length && k < results.length; i++) {
if (CompositeTable[0].celldata[i] && CompositeTable[0].celldata[i].r && CompositeTable[0].celldata[i].r >= insert + 1 && CompositeTable[0].celldata[i].r < insert + 4 && CompositeTable[0].celldata[i].c == 0) {
CompositeTable[0].celldata[i].v.v = results[k];
CompositeTable[0].celldata[i].v.m = results[k];
k++;
}
}
function findValueInArray(arr, value) {
for (let obj of arr) {
if (JSON.stringify(obj).includes(value)) {
return obj;
}
}
return null;
}
let targetValue = "器材大类";
let resultObject = findValueInArray(c, targetValue);
let material = c.flat().filter(obj => obj.c && obj.c == resultObject.c && obj.r > headRow)
money.forEach(entry => {
entry.department = '';
entry.v.name = '';
entry.v.material = '';
entry.index = entry.r
});
// 匹配赋值
for (let i = 0; i < money.length; i++) {
if (money[i].r == name[i].r) {
money[i].v.name = name[i].v.v;
}
if (money[i].r == material[i].r) {
money[i].v.material = material[i].v.v;
}
}
//对费用来源列和材料分类列进行处理
money.forEach(obj => {
if (!obj.v.material) {
obj.v.material = '其他材料'
}
if (obj.v.name == '基本生产' || obj.v.name == '制造费用') {
obj.v.name += '-原煤'
}
if (obj.v.name.includes('洗煤')) {
obj.v.name = '基本生产-洗煤'
}
if (obj.v.name == '其他业务成本') {
obj.v.name += '-厂区服务'
}
if (obj.v.name == '其他费用') {
obj.v.name = '代付单位(XXX单位)-金属厂'
}
// 如果不包含连字符,就在末尾添加一个连字符
if (obj.v.name.indexOf('-') === -1) {
obj.v.name += '-';
}
})
//材料分类列和汇总列数值一样的话,列数就一样
money.forEach(obj => {
CompositeTable[0].celldata.forEach(cell => {
if (obj.v.material == cell.v.v) {
obj.c = cell.c
}
})
})
money.forEach(item => {
if (item.v.name !== undefined) {
let index = item.v.name.indexOf("-");
if (index !== -1) {
let substrBeforeDash = item.v.name.slice(0, index);
let DepartColumns = CompositeTable[0]["celldata"].flat().filter(obj => {
if (obj.v && obj.v.v && typeof obj.v.v === 'string') {
return obj.v.v.includes(item.v.name.slice(0, index));
}
return false;
})[0];
if (DepartColumns && DepartColumns.r) {
let index = item.v.name.indexOf("-");
if (index !== -1) {
let substrAfterDash = item.v.name.slice(index + 1);
switch (substrAfterDash) {
case '':
item.r = DepartColumns.r;
break;
case '原煤':
item.r = DepartColumns.r + 1;
break;
case '洗煤':
item.r = DepartColumns.r + 2;
break;
case '选煤':
item.r = DepartColumns.r + 3;
break;
case '厂区服务':
item.r = DepartColumns.r + 1;
break;
case '加工修理':
item.r = DepartColumns.r + 4;
break;
case '金属厂':
item.r=DepartColumns.r+1
default:
// 默认情况
}
}
}
}
}
});
// 同一个单元格,金额相加
let seen = new Map();
let duplicateData = []
money.forEach((obj) => {
let key = obj.r + ',' + obj.c;
if (seen.has(key)) {
let existingObj = seen.get(key);
existingObj.v.v = Number(existingObj.v.v) + Number(obj.v.v);
existingObj.v.m = existingObj.v.v.toString();
existingObj.index.push(obj.index);
} else {
obj.index = [obj.index];
seen.set(key, obj);
}
});
seen.forEach(obj => {
if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
duplicateData.push(obj);
}
});
duplicateData = duplicateData.map(item => {
return {
...item,
v: {
...item.v,
v: isNaN(item.v.v) ? item.v.v : Number(item.v.v).toFixed(2),
m: Number(item.v.m).toFixed(2)
}
};
});
for (let i = 0; i < duplicateData.length; i++) {
// // 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
if (duplicateData[i].r === CompositeTable[0]["celldata"][k].r && duplicateData[i].c === CompositeTable[0]["celldata"][k].c) {
// 如果相同,则进行替换
CompositeTable[0]["celldata"][k] = duplicateData[i];
}
}
}
duplicateData.forEach(obj=>{
if(obj.r>8){
obj.c=10
}
})
let duplicateDatas = {
duplicateData: duplicateData,
CompositeTable: CompositeTable
}
return duplicateDatas
}
\ No newline at end of file
export function Tangshan(money,code,codess,CompositeTable,Department,classify,headRow) {
let newobj = []
//把这三个数组push到newobj里
newobj.unshift(money);
newobj.unshift(code);
newobj.unshift(Department);
//跟材料表的数据对比 如果编码一样 则把导入表的列数换成模板的列数
codess.forEach(c => {
let codeLength = String(c.code).length;
let codeToCompare = String(c.code).substring(0, codeLength);
newobj[1].forEach(column => {
let columnIdString = String(column.v.v);
let idToMatch = columnIdString.substring(0, codeLength);
if (idToMatch === codeToCompare) {
column.ccc = c.oneLevel * 1;
}
});
});
//按照部门划分,去找到他所在科室分类
newobj = newobj.map(subArr => {
return subArr.map(obj => {
let v = obj.v.v;
for (let key in classify) {
if (classify[key].includes(v)) {
obj.v.m = key;
obj.v.v = key;
obj.v.name = key
obj.whether = true
return obj;
}
}
obj.whether = false
return obj;
});
});
newobj[2].forEach((item, i) => {
if ('name' in newobj[0][i].v) {
item.v.name = newobj[0][i].v.name;
}
});
//直接luck表格初始化 替换数据
//找到所在的行数,按照 -的前后去找,前面是标题,后面是标题后的小分类,如选煤,洗煤等
CompositeTable[0].data = luckysheet.transToData(CompositeTable[0]["celldata"])
newobj[0].forEach((item) => {
if (item.v.m !== undefined) {
let index = item.v.m.indexOf("-");
if (index !== -1) {
let substrBeforeDash = item.v.m.slice(0, index);
let DepartColumns = CompositeTable[0]["celldata"].flat().find(obj =>
obj.v && obj.v.v && typeof obj.v.v === 'string' && obj.v.v.includes(item.v.m.slice(0, index))
);
if (DepartColumns && DepartColumns.r) {
let index = item.v.m.indexOf("-")
if (index !== -1) {
let substrAfterDash = item.v.m.slice(index + 1);
switch (substrAfterDash) {
case '':
item.r = DepartColumns.r;
break;
case '原煤':
item.r = DepartColumns.r + 1;
break;
case '洗煤':
item.r = DepartColumns.r + 2;
break;
case '选煤':
item.r = DepartColumns.r + 3;
break;
case '厂区服务':
item.r = DepartColumns.r + 1;
break;
default:
// 默认情况
}
}
}
}
}
});
//把原来分类找不到的放到其他数据类型中,最后一列其他列中
newobj[1].forEach((item, i) => {
if (item.ccc && newobj[0][i].r < 8) {
item.c = item.ccc;
delete item.ccc;
} else {
item.c = 10;
}
});
//金额列和行是原先导入表的行列 要替换掉模板表的行列
newobj[0].forEach((item, i) => {
if (item.whether) {
newobj[2][i].r = item.r;
newobj[2][i].c = newobj[1][i].c;
newobj[2][i].v.v = Number(newobj[2][i].v.v);
} else {
newobj[2][i].r = '';
newobj[2][i].c = '';
}
});
//同一个单元格的数据 金额相加。
let i = headRow - 1
let duplicateData=[]
let seen = new Map();
// 根据行列信息合并重复数据并记录索引
for (let obj of newobj[2]) {
i += 1;
let key = obj.r + ',' + obj.c;
if (seen.has(key)) {
let existingObj = seen.get(key);
existingObj.v.v += obj.v.v;
existingObj.v.m = (parseInt(existingObj.v.m) + parseInt(obj.v.m)).toString();
existingObj.index.push(newobj[1][i].r);
} else {
obj.index = [newobj[1][i].r];
seen.set(key, obj);
}
}
// 将合并后的数据放入 duplicateData 数组
for (let obj of seen.values()) {
if (obj.v.v > 0 || parseInt(obj.v.m) > 0) {
duplicateData.push(obj);
}
}
duplicateData = duplicateData.map(item => {
return {
...item,
v: {
...item.v,
v: isNaN(item.v.v) ? item.v.v : Number(item.v.v).toFixed(2)
}
};
});
// 替换金额所在列和行相同的模板表中的数据
//金额所在列和行,去模板表中查找,如果行列一致则替换
for (let i = 0; i < duplicateData.length; i++) {
// // 对比 c 和 r 是否与 CompositeTable[0]["celldata"] 中相应对象相同
for (let k = 0; k < CompositeTable[0]["celldata"].length; k++) {
if (duplicateData[i].r === CompositeTable[0]["celldata"][k].r && duplicateData[i].c === CompositeTable[0]["celldata"][k].c) {
// 如果相同,则进行替换
CompositeTable[0]["celldata"][k] = duplicateData[i];
}
}
}
let duplicateDatas={
duplicateData:duplicateData,
CompositeTable:CompositeTable
}
return duplicateDatas
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
//todo 各个矿需要那些凭证的配置
/*
todo 需要提取 {classary, money,name,}
{
classary: 凭证分录摘要 // todo 必须 用于classary
sheetsName: 在那个表里面取 //todo 必须
oldColumnName: 金额列是那一列 todo 用于开始行 金额列 必须 用于money
itemName: 项目名是那一列 todo 项目列 非必须 默认是项目 用于name
jishuhang:是number 代表第几个合计的,todo 用结束行 //非必需默认是0
isFilterStartsWith: 项目是否包含数字 // todo 默认过滤掉 布尔值 非必需
}
*/
const tsk = [
{ "classary": "转电力分配", "oldColumnName": "合计金额", "sheetsName": "3月" },
{
classary: '提取一孩补贴',
oldColumnName: '独生子女补贴',
sheetsName: '待分析工资明细表(也可作为提取一孩、班中餐等附件)',//从那个表里面取
jishuhang: 2, //结束行是第几个合计
},
{
classary: '提取班中餐',
oldColumnName: '班中餐',
sheetsName: '待分析工资明细表(也可作为提取一孩、班中餐等附件)',//从那个表里面取
jishuhang: 2, //结束行是第几个合计
},
{
classary: '提取基本养老保险',
oldColumnName: '金额',
sheetsName: '基本养老保险分配明细表',//从那个表里面取
},
{
classary: '提取补充养老保险',
oldColumnName: '金额',
sheetsName: '补充养老保险分配明细表',//从那个表里面取
},
{
classary: '提取包干工资',
oldColumnName: '金额',
sheetsName: '提取包干',//从那个表里面取
},
{
classary: '提取工伤保险',
oldColumnName: '金额',
sheetsName: '工伤保险',//从那个表里面取
},
{
classary: '提取补充医疗保险',
oldColumnName: '金额',
sheetsName: '补充医疗保险',//从那个表里面取
},
{
classary: '提取基本医疗保险',
oldColumnName: '金额',
sheetsName: '基本医疗保险',//从那个表里面取
},
{
classary: '提取工会经费',
oldColumnName: '工会经费',
sheetsName: '计提工会经费',//从那个表里面取
},
{
classary: '提取住房公积金',
oldColumnName: '金额',
sheetsName: '住房公积金',//从那个表里面取
},
{
classary: '提取职工教育经费',
oldColumnName: '职工教育经费',
sheetsName: '提职工教育经费',//从那个表里面取
},
{
classary: '提取失业保险',
oldColumnName: '金额',
sheetsName: '失业保险',//从那个表里面取
},
]
const lxk = [
{ "classary": "转电力分配", "oldColumnName": "电费", "sheetsName": "附件4-电力分配" ,isFilterStartsWith:false},
{ "classary": "基本养老保险费用结转待分析", "oldColumnName": "金额", "sheetsName": "分配养老保险" },
{ "classary": "补充养老保险结转待分析", "oldColumnName": "金额", "sheetsName": "分配年金" },
{ "classary": "计提基本养老保险", "oldColumnName": "金额", "sheetsName": "分配养老保险" },
{ "classary": "计提补充养老保险", "oldColumnName": "金额", "sheetsName": "分配年金" },
{
"classary": "工伤保险结转待分析",
"oldColumnName": "金额",
"sheetsName": "分配工伤保险"
},
{
"classary": "补充医疗保险结转待分析",
"oldColumnName": "金额",
"sheetsName": "分配补充医疗"
},
{
"classary": "基本医疗保险结转待分析",
"oldColumnName": "金额",
"sheetsName": "分配基本医疗"
},
{
"classary": "失业保险结转待分析",
"oldColumnName": "金额",
"sheetsName": "分配失业保险"
},
{
"classary": "计提工伤保险",
"oldColumnName": "金额",
"sheetsName": "分配工伤保险"
},
{
"classary": "计提补充医疗保险",
"oldColumnName": "金额",
"sheetsName": "分配补充医疗"
},
{
"classary": "计提失业保险",
"oldColumnName": "金额",
"sheetsName": "分配失业保险"
},
{
"classary": "计提基本医疗保险",
"oldColumnName": "金额",
"sheetsName": "分配基本医疗"
},
{
"classary": "应付包干工资结转包干工资",
isFilterStartsWith:false,
"oldColumnName": "工资",
"sheetsName": "工资-提取"
},
{
"classary": "计提职工教育经费",
"oldColumnName": "职工教育经费",
"sheetsName": "计提职教费"
},
{
"classary": "计提工会经费",
"oldColumnName": "工会经费",
"sheetsName": "计提工会经费"
},
{
"classary": "营养餐",
"oldColumnName": "营养餐",
"sheetsName": "待分析工资明细表"
},
{
"classary": "工资",
"oldColumnName": "工资",
"sheetsName": "待分析工资明细表"
},
{
"classary": "月票",
"oldColumnName": "月票",
"sheetsName": "待分析工资明细表"
},
{
"classary": "生日补贴",
"oldColumnName": "生日补贴",
"sheetsName": "待分析工资明细表"
},
{
"classary": "班中餐",
"oldColumnName": "班中餐",
"sheetsName": "待分析工资明细表"
},
{
"classary": "保健费",
"oldColumnName": "保健费",
"sheetsName": "待分析工资明细表"
},
{
"classary": "独生子女补贴",
"oldColumnName": "独生子女补贴",
"sheetsName": "待分析工资明细表"
},
{
"classary": "困补",
"oldColumnName": "困补",
"sheetsName": "待分析工资明细表"
},
{
"classary": "司机出车补助",
"oldColumnName": "司机出车补助",
"sheetsName": "待分析工资明细表"
},
{
"classary": "工资分配",
"oldColumnName": "合计",
"sheetsName": "工资分配明细表",
jishuhang: 1, //结束行是第几个合计
},
/* todo 特殊处理
{
"classary": "核销待分析工资明细",
"oldColumnName": "发放金额",
itemName:'发放项目',
"sheetsName": "核销劳保工资"
},
{ "classary": "计提补充养老保险(电厂转入人员)", "oldColumnName": "金额", "sheetsName": "没有不取" },
{
"classary": "伙食补贴",
"oldColumnName": "伙食补贴",
"sheetsName": "待分析工资明细表"
},
{
"classary": "2023年集团员工数学素养提升培训",
"sheetsName": "随资费用",
},
{
"classary": "自救器培训(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "入矿新工培训教师讲课费(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "基层区科班组群监员、急救员培训(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年安管人员培训(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年班组长培训(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年特种作业人员培训(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年12月女工协管员业务培训(安全)",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年度宣传报道先进单位、宣传报道积极分子、宣传报道先进个人表彰",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年岗位描述、手指口述比赛表彰",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "警示教育中心讲解费",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年度安全文化建设、精神文明创建评委会成员及工作人员表彰",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "《启明星》杂志第二十期稿费",
"oldColumnName": "金额",
"sheetsName": ""
},
{
"classary": "2023年四季度通讯稿、广播稿费",
"oldColumnName": "金额",
"sheetsName": ""
},
*/
]
const tsdl = [
{ "classary": "转电力分配", "oldColumnName": "合计金额", "sheetsName": "3月" },
]
const ALL = {
tsk,//唐山矿
lxk,//林西矿
tsdl//唐山电力
}
let kNameID = {
'010101':'tsk',
'011704':'lxk',
'010102':'tsdl',
}
export { kNameID }
export function getMineProofConfig (kName = 'tsk') {
return ALL[kName]
}
......@@ -164,7 +164,11 @@ export default {
{
name: '宏丰',
id: '011502'
}
},
{
name: '云飞',
id: '011504'
},
],
types: [
{
......
<template>
<div class="app-container">
<el-form ref="queryForm" size="small" :inline="true" label-width="68px">
<el-form-item label="模板" prop="name">
<el-select v-model="selectedOption" ref="mySelect" size="mini" filterable placeholder="请选择您要查看的模板"
@change="handleOptionChange($event, {
name: '林西矿',
id: '011704'
})">
<el-option v-for="item in depss.filter(item => [1248,1280].includes(item.id))" :key="item.id" :label="item.templateName" :value="item.id"
:disabled="item.disabled">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="时间" prop="wageMonth">
<el-date-picker v-model="wageMonth" value-format="yyyy-MM" type="month" placeholder="选择月">
</el-date-picker>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-upload2" size="mini" @click="handleExport">导出</el-button>
</el-col>
<el-col :span="1.5">
<el-upload type="file" name="file" ref="upload" :headers="{ 'Content-Type': 'multipart/form-data' }"
:before-upload="handleFileChange" action='' accept='.xlsx' :limit="3" multiple :file-list="fileList"
:show-file-list="false" :on-success="handleSuccess">
<el-button plain :disabled="!wageMonth || !jsondata" size="mini" icon="el-icon-download" type="primary">导入</el-button> </el-upload>
<el-button :plain="true" style="display: none;" @click="open4">错误</el-button>
</el-col>
</el-row>
<el-dialog title="取数规则" :visible.sync="dialogTableVisible" :close-on-click-modal="false" :show-close="false">
<el-form label-width="120px" >
<el-form-item v-for="(item, index) in jsonhead" :key="index" :label="`${item.label}`">
<el-input v-model="item.value"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose()">取 消</el-button>
<el-button type="primary" @click="initData()">确 定</el-button>
</span>
</el-dialog>
<!-- luckysheet容器 -->
<div id="luckysheet"
style="margin: 0px; padding: 0px; position: absolute; width: 100%; height:80vh; z-index: 0">
</div>
<div v-if="showMask" class="mask">
<div class="loading-spinner"></div>
</div>
</div>
</template>
<script src="@/Wages/convers"></script>
<style scoped src="./Wages.css"></style>
<template>
<div class="app-container">
<el-form ref="queryForm" size="small" :inline="true" label-width="68px">
<el-form-item label="单位" prop="name">
<el-select v-model="mineId" size="mini" filterable placeholder="请选择单位">
<el-option v-for="dict in deptOptions" :key="dict.dictValue" :label="dict.dictLabel"
:value="dict.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="类型" prop="name">
<el-select v-model="type" ref="mySelect" size="mini" filterable placeholder="请选择单位">
<el-option v-for="dict in typeOptions" :key="dict.dictValue" :label="dict.dictLabel"
:value="dict.dictValue"></el-option>
</el-select>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-upload type="file" name="file" ref="upload" :headers="{ 'Content-Type': 'multipart/form-data' }"
:before-upload="handleFileChange" action='' accept='.xlsx' :limit="3" multiple :file-list="fileList"
:show-file-list="false" :on-success="handleSuccess">
<el-button plain size="mini" icon="el-icon-download" type="primary">导入</el-button> </el-upload>
</el-col>
</el-row>
<div v-if="showMask" class="mask">
<div class="loading-spinner"></div>
</div>
<el-table v-loading="loading" :data="comList">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="单位" prop="mineId" :formatter="deptFormat" width="150">
</el-table-column>
<el-table-column label="类型" prop="type" :formatter="typeFormat" width="120" />
<el-table-column label="版本" prop="versionId" :show-overflow-tooltip="true" width="100" />
<el-table-column label="a1" prop="a1" :show-overflow-tooltip="true" width="150" />
<el-table-column label="a2" prop="a2" :show-overflow-tooltip="true" width="150" />
<el-table-column label="a3" prop="a3" :show-overflow-tooltip="true" width="150" />
<el-table-column label="a4" prop="a4" :show-overflow-tooltip="true" width="150" />
<el-table-column label="a5" prop="a5" :show-overflow-tooltip="true" width="150" />
</el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
</template>
<script>
import {
compilationExcel, getWagesCompilationList
} from "@/api/conversion/index";
var modify = false;
var that;
export default {
name: "Mymodule",
data() {
return {
// 遮罩层
loading: true,
// 导出遮罩层
exportLoading: false,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 对照表数据
comList: [],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
roleName: undefined,
roleKey: undefined,
status: undefined
},
// 表单参数
form: {},
comList: [],
mineId: '010101',
type: '0',
//单位数据字典
deptOptions: [{ dictLabel: '唐山矿', dictValue: '010101' }, { dictLabel: '林西矿', dictValue: '011704' }],
//单位数据字典
typeOptions: [{ dictLabel: '工资总表', dictValue: '0' }, { dictLabel: '财务用表', dictValue: '1' }, { dictLabel: '保险总表', dictValue: '2' }, { dictLabel: '保险研发表', dictValue: '3' }],
};
},
created() {
that = this;
this.getList();
},
methods: {
// 单位字典翻译
deptFormat(row, column) {
return this.selectDictLabel(this.deptOptions, row.mineId);
},
// 类型字典翻译
typeFormat(row, column) {
return this.selectDictLabel(this.typeOptions, row.type);
},
getList() {
this.loading = true;
getWagesCompilationList().then(
response => {
this.comList = response;
this.loading = false;
}
);
},
handleFileChange(evt) {
//组装后台接口数据
var param = new FormData();
param.append("file", evt);
param.append("mineId", this.mineId);//矿id
param.append("type", this.type);//类型
compilationExcel(param).then((res) => {
//导入成功
if (res.code == 200) {
that.getList();
this.$message.success("导入成功!");
} else {
this.$message.error("后台数据导入失败!");
}
});
}
}
};
</script>
// 给唐山汇总表放数据
function setDataV(itemName, CName, data, CConfig, itemConfig) {
let getValue = (arr, keys) => {
if (!arr || !keys){return null}
let shu = arr[0];
if(shu['类别'] === '合计'){
shu = arr.find((item) => item['编码'] === '50000')
}
if(!shu){return null}
let key = ''
if (keys.length === 1) {
key = keys[0]
} else if (keys.length > 1){
let flag = keys.slice(0, keys.length - 1).some((item) => shu[item])
if (!flag && shu[keys[keys.length - 1]]) {
key = keys[keys.length - 1];
}
}
if (shu && key && shu[key]) {
return shu[key]
} else { return null }
}
if (!CConfig[CName]) { return null }
let lastName = itemName.split(',')
lastName = lastName[lastName.length - 1]
// 特殊处理的 情况
if (itemConfig[itemName]) {
let sum = 0
itemConfig[itemName].forEach((item) => {
let funV = null;
if (data[item]) {
if(item === '合计'){
console.log(data[item],1111)
}
funV = getValue(data[item], CConfig[CName])
} else {
let obj = Object.entries(data).find(([key]) => {
if (key.includes(item)) {
return true
}
})
if (obj) { funV = getValue(obj[1], CConfig[CName]) }
}
if (funV) { sum = Number(sum) + Number(funV) }
})
if (sum > 0) {
return sum
} else { return null }
}
else if (data[itemName] || data[lastName]) {
return getValue(data[itemName] || data[lastName], CConfig[CName])
} else {
return null
}
}
export function setTs(TSdL, luckyData, CConfig, itemConfig) {
//第一步先处理后端返回的数据
let newData = {};
TSdL.data.forEach((item) => {
item.details.forEach(el => {
let obj = {}
Object.entries(el).forEach(([K, V]) => {
if (V) {
if (K.startsWith('a')) {
obj[item.datas[K] && item.datas[K].replace(',', '-').replace('', '-')] = V;
} else {
obj[K] = V;
}
}
})
if (obj['类别']) {
if (newData[obj['类别']]) {
newData[obj['类别']].push(obj)
} else {
newData[obj['类别']] = [obj]
}
}
});
})
let data = luckyData[0].data
for (let i = 2; i < data.length; i++) {
let itemName = data[i][0] && data[i][0].v && data[i][0].v.replaceAll(/\s+/g, "");
if(itemName === '合计'){break}
let row = data[i];
row.forEach((item, index) => {
let cName = data[1] && data[1][index] && data[1][index].v;
if (cName && itemName) {
let v = setDataV(itemName, cName, newData, CConfig, itemConfig)
if (v) {
data[i][index].bg = 'red'
v = Number(Number(v).toFixed(2))
data[i][index].v = v
data[i][index].m = v
}
}
})
}
luckysheet.destroy();
luckyData[0].celldata = luckysheet.transToCellData(data);
luckyData[0].calcChain = [];
let as = luckyData[0].celldata.filter(
(item) => item.v.f
);
as.forEach((item) => {
let sum = {
index: luckyData[0].index,
r: item.r,
c: item.c,
};
luckyData[0].calcChain.push(sum);
});
delete luckyData[0].data;
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
lang: 'zh',
data: luckyData, // Excel 数据
forceCalculation:true
});
// luckysheet.refreshFormula();
}
export function jxdfxt(luckysheets) {
let data = luckysheets.find(item => {
return ['填写数据'].includes(item.name)
})
data.data = luckysheet.transToData(data.celldata)
let arr = []
data.data.forEach(row => {
let obj = {}
row.forEach((ceil, i) => {
if (ceil && ceil.v) {
obj[i] = ceil.v
} else if (ceil && ceil.ct && ceil.ct.s) {
obj[i] = ceil.ct.s.map(item => item.v).join('')
}
})
if (Object.keys(obj).length) {
arr.push(obj)
}
})
let yiKey = {};
let erKey = {};
let newaasss = []
let shuju = []
let sj = (old, yi, er) => {
if (!old[1]) { old[1] = newaasss[newaasss.length - 1]['原始数据'][1] }
newaasss.push({ '原始数据': old, '第一级数据': yi, '第二级数据': er })
let obj = {}
Object.entries(old).forEach(([key, value]) => {
let yikey = yi[key];
let erkey = er[key];
if (yikey && erkey) {
let objkey = `${yikey}-${erkey}`
objkey = objkey.replaceAll('"', '').replace(/[\r\n]/g, "").replaceAll(" ", '')
obj[objkey] = value;
} else if (yikey && !erkey) {
yikey = yikey.replaceAll('"', '').replaceAll("", '').replaceAll(" ", '')
obj[yikey] = value;
} else if (erkey && !yikey) {
let xy = ''
for (let i = key; i > 0; i--) {
if (yi[i]) {
xy = `${yi[i]}`
break;
}
}
let objkey = ''
if (xy) {
objkey = `${xy}-${erkey}`
} else {
objkey = erkey
}
objkey = objkey.replaceAll('"', '').replace(/[\r\n]/g, "").replaceAll(" ", '')
obj[objkey] = value;
}
})
if (Object.keys(obj).length) {
shuju.push(obj)
}
}
for (let rowi = 3; rowi < arr.length; rowi++) {
let RowObj = arr[rowi];
if (RowObj[1] && RowObj[1] !== '项目') {
if (!arr[rowi - 2][0] || arr[rowi - 2][0] === '序号') {
yiKey = arr[rowi - 2];
}
erKey = arr[rowi - 1];
}
if (RowObj[0] !== '序号' && (RowObj[0] || RowObj[2])) {
sj(RowObj, yiKey, erKey)
}
}
let obj = {}
shuju.forEach(item => {
Object.keys(item).forEach(key => {
obj[key] = null
})
});
let zui = shuju.map(item => {
return Object.assign(JSON.parse(JSON.stringify(obj)), item)
})
let transformedJSON = {};
Object.keys(obj).forEach((key, index) => {
transformedJSON[key] = `a${index + 1}`;
});
let transformed = zui.map(el => {
return Object.fromEntries(Object.entries(el).map(([key, value]) => {
return [transformedJSON[key], value];
}))
})
let swapped = {};
for (const key in transformedJSON) {
swapped[transformedJSON[key]] = key;
}
let trans = {
transformedJSON: swapped,
transformed: transformed
}
return trans
}
<script>
import {
getSuppliesTemplate, getyy,
listSuppliesTemplate,
roleList,
templateListid
} from '@/api/ruoyi-myLuckyexcel/myluckyexcel'
import { powerall, powerdata } from "@/api/power/power.js";
import {
importTSExcel
} from "@/api/conversion/power";
// import luckysheet from 'luckysheet'
import LuckyExcel from "luckyexcel";
//导入库export.js 这个文件是es6的,不能在普通的HTML文件直接引入js文件(虽然都是js文件,但是有区别,具体请百度es6与es5)!需要把es6转es5才可以直接引入使用!
/*import {materialList} from "@/api/ruoyi-myLuckyexcel/myluckyexcel";*/
import { v4 as uuidv4 } from "uuid";
import { exportExcel } from "../../../../public/exportExcel";
import { jxdfxt, setTs } from "@/views/system/power/ass.js";
import { machGzdata } from "@/Wages/conversTsk.js";
import { machLxGzdata } from "@/Wages/conversLxk.js";
import { getyyData, transformJson, tzcCreateData } from '@/utils/tzc'
// import { config } from "vue/types/umd";
var fileName = "新建XLSX工作表"; //定义表名
var rule = [];
var tempId;
var uuid1;
var modify = false;
var that;
export default {
props: {
kobj: {
type: Object,
},
depssfilter: {
type: Array,
// 定义默认值
},
itemConfig: {
type: Object,
},
CConfig:{
type: Object,
}
},
name: "Mymodule",
data() {
return {
views:'汇总',
shuju:'',
wageMonth: "",
//汇总表数据 || 凭证数据
luckyrule: '',
//详细信息
phone: "",
//未导入成本材料表模板所有数据
jsondata: "",
//编码数据
showMask: false,
uuid: "",
selectedOption: "",
luckysheetData: "",
luckysheetDatas: "",
depss: [],
fileList: [],
VoucherForm: "",
all: "",
sum: [],
//后端要的数据
currfile: '',
// 查询参数
queryParams: {
status: 0,
},
mineId: '',//矿ID
};
},
created() {
that = this;
//刷新页面时进行的操作
this.getList();
},
mounted() {
this.init();
fileName = "新建XLSX工作表";
},
methods: {
huizi(){
console.log(this.shuju)
this.views = '汇总';
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: '汇总', // Excel 文件名
allowEdit: false, //作用:是否允许前台编辑
data: this.shuju, // Excel 数据
showinfobar: false, //是否显示顶部名称栏
lang: "zh",
});
this.shuju = null;
},
//查询材料编码
//手机号
open() {
this.$prompt("请输入用友系统的用户名", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
inputPattern: /^(?:\+?86)?1[3-9]\d{9}$/,
inputErrorMessage: "手机号格式不正确",
})
.then(({ value }) => {
this.$message({
type: "success",
message: "你的用户名是: " + value,
});
this.phone = value;
this.zhuan();
})
.catch(() => {
this.$message({
type: "info",
message: "取消输入",
});
this.showMask = false;
});
},
/** 页面刷新时展示的数据*/
getList() {
listSuppliesTemplate(this.queryParams).then((response) => {
response.rows.forEach((row) => {
if (row.templateName.includes("六矿")) {
row.disabled = true;
}
});
this.depss = response.rows;
});
getSuppliesTemplate(1248).then((response) => {
const sysSupplies = response.rows;
this.luckysheetDatas = JSON.parse(
sysSupplies[0].templateContent
);
});
},
open4() {
this.$message.error("请仔细检查所导入表");
},
/** Luckyexcel文档 */
init() {
let options = {
container: "luckysheet", //luckysheet为容器id
title: "",
lang: "zh",
showinfobar: false,
data: [
{
name: "sheet1", //工作表名称
color: "", //工作表颜色
index: 0, //工作表索引
status: 1, //激活状态
order: 0, //工作表的下标
hide: 0, //是否隐藏
row: 50, //行数
column: 20, //列数
defaultRowHeight: 19, //自定义行高
defaultColWidth: 73, //自定义列宽
celldata: [], //初始化使用的单元格数据
config: {
merge: {}, //合并单元格
rowlen: {}, //表格行高
columnlen: {}, //表格列宽
rowhidden: {}, //隐藏行
colhidden: {}, //隐藏列
borderInfo: {}, //边框
authority: {}, //工作表保护
},
},
],
};
luckysheet.create(options);
},
handleSuccess(response, file, fileList) {
},
//电力数据后台导入成功后,数据展示到前台
loadTableData(evt) {
this.sum.push(evt);
if (modify) {
this.$confirm(
"再次导入将会清空表内数据,是否继续操作?",
"注意!!!",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
.then(async () => {
// 确认继续后刷新页面返回模板
getSuppliesTemplate(this.selectedOption)
.then((response) => {
const sysSupplies = response.rows;
this.luckysheetData =
sysSupplies[0].templateContent;
let json_data = JSON.parse(
sysSupplies[0].templateContent
);
luckysheet.destroy();
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: fileName, // Excel 文件名
data: json_data, // Excel 数据
allowEdit: false, //作用:是否允许前台编辑
showinfobar: false, //是否显示顶部名称栏
lang: "zh",
});
modify = false;
this.open(this.sum);
})
.then(async () => { })
.catch(() => { });
})
.catch(() => {
// 用户点击了取消按钮
this.$message({
type: "info",
message: "操作已取消",
});
});
} else {
this.open(evt);
this.showMask = true;
LuckyExcel(evt, (exportJson) => {
//获取导入表格所有数据exportJson
this.open(exportJson)
.then(async () => { })
.catch((error) => {
this.$message({
message: error.message,
type: "error",
});
})
.finally(() => {
// 导入完成后关闭遮罩层
this.showMask = false;
});
});
}
},
async handleFileChange(evt) {
// if (!this.value.includes("凭证")) {
//组装后台接口数据
this.currfile = evt
// }
this.loadTableData(evt);
//前台加载数据
},
handleOptionChange(value, mine_id) {
templateListid(value).then((response) => {
this.luckyrule = JSON.parse(response.rows[0].templateContent);
this.luckyrule.forEach(item => {
item.data = luckysheet.transToData(item.celldata)
})
});
that.mineId = mine_id.id
let lod = this.$loading({
lock: true,
text: "加载中",
background: "rgba(0, 0, 0, 0.7)",
});
//根据选中的下拉选项值获取相应的信息
getSuppliesTemplate(this.selectedOption)
.then((response) => {
lod.close();
modify = false;
tempId = this.selectedOption;
uuid1 = this.uuid = uuidv4().substring(0, 8);
const sysSupplies = response.rows;
this.luckysheetData = sysSupplies[0].templateContent;
var json_data = JSON.parse(sysSupplies[0].templateContent);
this.jsondata = json_data;
let suffixArr = sysSupplies[0].templateName.split(".");
fileName = suffixArr[0];
//luckysheet.destroy()
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: fileName, // Excel 文件名
data: json_data, // Excel 数据
showinfobar: false,
allowEdit: false, //是否显示顶部名称栏
lang: "zh",
index: "0", //工作表索引
status: "1", //激活状态
});
this.value = fileName;
})
.catch(() => {
lod.close();
// 处理错误逻辑,这里是一个空的错误处理函数
this.$message.error("查询失败,发生未知错误!");
});
},
//转换方法
zhuan() {
const promises = this.sum.map((item) => {
return new Promise((resolve, reject) => {
LuckyExcel.transformExcelToLucky(item, (lucksheetfile) => {
resolve(lucksheetfile);
});
});
});
Promise.all(promises).then((results) => {
//唐山矿规则
let powerDAO = JSON.stringify({
mineId: that.mineId,
importTime: that.wageMonth,
type: 0,
powerDetails: [jxdfxt(results[0].sheets).transformedJSON]
})
let powerAllDAO = JSON.stringify({
mineId: that.mineId,
importTime: that.wageMonth,
type: 0,
powerDetails: jxdfxt(results[0].sheets).transformed
})
let form1 = new FormData()
form1.append("file", this.currfile);
form1.append("powerDAO", powerDAO);
form1.append("powerAllDAO", powerAllDAO);
powerall(form1).then(res => {
if(res.code==200){
setTs(res, this.luckyrule, this.CConfig, this.itemConfig)
}
})
this.showMask = false
});
},
handleExport: debounce(function () {
// handleExport
exportExcel(luckysheet.getAllSheets(), fileName);
}, 500),
async tsdlcrpz() {
this.views = '凭证';
this.shuju = luckysheet.getAllSheets();
// 第一步取数
let data = getyyData(luckysheet.getAllSheets(), '010101')
let objJson = {
borrow: data.map(item => { return { ...item, is_debit: 0, mining: '010101' } })
}
// 第二步调接口处理res
let res = await getyy(JSON.stringify(objJson))
let loan = [{
is_debit: 1,
money: 0,
name: '其他贷方金额',
account_code: '2241005',
classary: "转电力分配",
mining: "010101"
}]
res.data.borrow.forEach(item => {
if (item.account_code) {
loan[0].money = (Number(item.money) + Number(loan[0].money)).toFixed(2);
}
})
res.data.loan = loan;
// 第三步 生成凭证
let template = await getSuppliesTemplate(1248)
let createData = tzcCreateData(
JSON.parse(template.rows[0].templateContent)[0],
transformJson(res.data),
luckysheet,
this.phone ,
this.wageMonth
);
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: '凭证', // Excel 文件名
allowEdit: false, //作用:是否允许前台编辑
data: createData, // Excel 数据
showinfobar: false, //是否显示顶部名称栏
lang: "zh",
});
},
},
};
// 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>
<template>
<div class="app-container">
<el-form ref="queryForm" size="small" :inline="true" label-width="68px">
<el-form-item label="模板" prop="name">
<el-select v-model="selectedOption" ref="mySelect" size="mini" filterable placeholder="请选择您要查看的模板"
@change="handleOptionChange($event, kobj, depssfilter[0])">
<el-option v-for="item in depss.filter(item => depssfilter.includes(item.id))" :key="item.id"
:label="item.templateName" :value="item.id" :disabled="item.disabled">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="时间" prop="wageMonth">
<el-date-picker v-model="wageMonth" value-format="yyyy-MM" type="month" placeholder="选择月">
</el-date-picker>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-upload2" size="mini" @click="handleExport">导出</el-button>
</el-col>
<el-col :span="1.5"
v-if="views === '汇总'"
>
<el-upload type="file" name="file" ref="upload" :headers="{ 'Content-Type': 'multipart/form-data' }"
:before-upload="handleFileChange" action='' accept='.xlsx' :limit="3" multiple :file-list="fileList"
:show-file-list="false" :on-success="handleSuccess">
<el-button plain :disabled="!wageMonth || !jsondata"
size="mini" icon="el-icon-download"
type="primary">导入</el-button> </el-upload>
<el-button :plain="true" style="display: none;" @click="open4">错误</el-button>
</el-col>
<el-col :span="1.5" v-if="views === '汇总'">
<el-button size="mini" @click="tsdlcrpz">
生凭证
</el-button>
</el-col>
<el-col :span="1.5" v-else>
<el-button size="mini" @click="huizi">
返回汇总
</el-button>
</el-col>
</el-row>
<!-- luckysheet容器 -->
<div id="luckysheet"
style="margin: 0px; padding: 0px; position: absolute; width: 100%; height:80vh; z-index: 0">
</div>
<div v-if="showMask" class="mask">
<div class="loading-spinner"></div>
</div>
</div>
</template>
<style scoped src="@/assets/css/power/index.css"></style>
<template>
<testComponent
:kobj = ' { name: "林西矿", id: "011704" }'
:depssfilter = '[1282]'
></testComponent>
</template>
<script>
//1.先使用import导入你要在该组件中使用的子组件
import testComponent from './index.vue'
export default {
//2.然后,在components中写入子组件
components: {testComponent},
}
</script>
<template>
<testComponent :kobj='{ name: "唐山矿", id: "010101" }' :depssfilter='[1281]' :CConfig="CConfig" :itemConfig="itemConfig" ></testComponent>
</template>
<script>
//1.先使用import导入你要在该组件中使用的子组件
import testComponent from './index.vue'
export default {
//2.然后,在components中写入子组件
components: { testComponent },
data() {
return {
CConfig: {
'加收管理费': ['电费-基本'],
'照明电量': ["电量-峰", "电量-平", "电量-尖", "电量-谷", '电量-合计'],//前四个有就不填,都没有填电量-合计
'电光电费': ["电费-峰", "电费-平", "电费-尖", "电费-谷", '电费-合计'],
'峰段电量': ['电量-峰'],
'峰段金额': ['电费-峰'],
'平段电量': ['电量-平'],
'平段金额': ['电费-平'],
'谷段电量': ['电量-谷'],
'谷段金额': ['电费-谷'],
},
itemConfig : {
'基本生产,原煤': ['原煤生产'],
'基本生产,洗煤': ['洗煤厂(高压)'],
'制造费用,原煤': ['矿井水净化', '地面维修', '联合建筑', '厂区服务', '供水供暖'],//todo 缺少
'管理用电': ['综合办', '工会楼', '小车房', '绿化保洁'],
'其他业务成本,住宿': ['住宿餐饮(集体宿舍)'],
'其他业务成本,餐饮': ['住宿餐饮(东门食堂)', ' 住宿餐饮(风井食堂)'],
'其他业务成本,厂区服务,集团大院': ['集团公司大院'],
'内部结算单位,开滦宾馆': ['开滦宾馆高压'],
'金属加工厂': ['金属制修中心'],
'内部结算单位,社区': ['社区小车房', '离退科', '开滦实业公司'],
'内部结算单位,运输部': ['运输部'],
'外界电费,鲸喜惠(唐山永芊企业管理服务有限公司原唐山飞佳轩便利店)': ['鲸喜惠(唐山永芊企业管理服务有限公司'],
'劳服公司': ['合计'],
}
}
}
}
</script>
import {powerdata} from "@/api/power/power.js";
//celldata:表格的celldata的数据 electricity:后端返回的数据 expectedAttributes:需要的数据的中文名字 transform:哪些数据需要加起来
export function Summary(celldata,electricity,expectedAttributes,transform){
let obj = []
let newarray = []
// 每个属性名代表的意思
let keyobj = [
{
key: 'a11',
value: '加收管理费'
},
{
key: 'a10',
value: '照明电量'
},
{
key: 'a6',
value: '电光电费'
},
{
key: 'a7',
value: '峰段电量'
},
{
key: 'a13',
value: '峰段金额'
},
{
key: 'a8',
value: '平段电量'
},
{
key: 'a14',
value: '平段金额'
},
{
key: 'a9',
value: '谷段电量'
},
{
key: 'a15',
value: '谷段金额'
},
]
electricity.data.forEach(es => {
//第一步:把后端返回的数据的对照表的数据的-去除掉 并放入到 cleanedEsDatas中
let foundAttributes = [];
let cleanedEsDatas = {};
Object.entries(es.datas).forEach(([key, v]) => {
cleanedEsDatas[key] = v && v.replace && v.replace(/-/g, '')
});
//第二步:根据后端返回的类别名称跟cleanedEsDatas这个对应上 看中文的数据 在英文里叫什么名字 比如a1=类别
expectedAttributes.forEach((attrName, index) => {
let foundKey = Object.keys(cleanedEsDatas).find(key => cleanedEsDatas[key] === attrName);
if (foundKey) {
foundAttributes[index] = foundKey;
} else {
foundAttributes[index] = null;
}
});
//根据对应上的关系 取详细表所有数据取数并放到一个新数组obj中
es.details.forEach(element => {
let funct = {
key: element[foundAttributes[0]],
a11: element[foundAttributes[1]],
a10: element[foundAttributes[2]],
a16: element[foundAttributes[3]],
a7: element[foundAttributes[4]],
a13: element[foundAttributes[5]],
a8: element[foundAttributes[6]],
a14: element[foundAttributes[7]],
a9: element[foundAttributes[8]],
a15: element[foundAttributes[9]],
r: '',
}
//合并的单元格数据 这种格式 transform = [ {host: '管理部门', child: '综合办' }] key代表类别名称 如果他跟child一样 证明需要合并
transform.forEach(item => {
if (funct.key==item.child) {
funct.key = item.host;
}
});
obj.push(funct)
});
})
//先根据类别名称跟汇总表的项目挂上钩 找到r行,然后根据每个属性名代表的意思循环obj找到对应的列 创建一个新的数据 只包含了 行列和金额
keyobj.forEach(keycell => {
let couloum = celldata.filter(item => item.v && item.v.v && item.v.v == keycell.value)[0].c
obj.forEach(es => {
es.r = celldata.filter(item => item.v && item.v.v && item.v.v == es.key)[0]?.r
let flag1 = ['照明电量', '电光电费'].includes(keycell.value) && !(es.a7 && es.a8 && es.a9)
if (flag1 || !['照明电量', '电光电费'].includes(keycell.value)) {
let fun = {
r: es.r,
c: couloum,
value: es[keycell.key]
}
if (fun.r && fun.value && fun.value > 0) {
newarray.push(fun)
}
}
})
})
//把行,列代表k值 如果有重复的就加起来
let duplicateData = [];
let seen = new Map();
// // 根据行列信息合并重复数据并记录索引
for (let obj of newarray) {
let key = obj.r + ',' + obj.c;
if (seen.has(key)) {
let existingObj = seen.get(key);
existingObj.value= parseFloat(existingObj.value) + parseFloat(obj.value);
existingObj.value= (parseInt(existingObj.value) + parseInt(obj.value)).toString();
} else {
seen.set(key, obj);
}
}
// 将合并后的数据放入 duplicateData 数组
for (let obj of seen.values()) {
if (Math.abs(obj.value) > 0 || Math.abs(parseInt(obj.value)) > 0) {
duplicateData.push(obj);
}
}
//合并 把处理完的数据合并起来
celldata.forEach(item=>{
duplicateData.forEach(obj=>{
if(obj.r==item.r && obj.c== item.c){
item.v.v=obj.value
item.v.m=obj.value
}
})
})
return celldata
}
\ No newline at end of file
<script>
import {
getSuppliesTemplate,
} from "@/api/ruoyi-myLuckyexcel/myluckyexcel";
import { exportExcel } from "../../../../public/exportExcel";
var fileName = "新建XLSX工作表"; //定义表名
export default {
data() {
return {
mine:'',
date: '',
selectedOption: [
{
name: '东欢坨矿',
id: '010102'
},
{
name: '范各庄',
id: '011701'
},
{
name: '林西矿',
id: '011704'
},
{
name: '吕矿',
id: '011702'
},
{
name: '唐山矿',
id: '010101'
},
{
name: '单侯煤矿',
id: '011204'
},
{
name: '钱家营矿',
id: '010105'
},
{
name: '宏丰',
id: '011502'
},
{
name: '云飞',
id: '011504'
},
{
name: '中润',
id: '011706'
},
],
};
},
created() {
//刷新页面时进行的操作
this.getList();
},
mounted() {
this.init();
fileName = "新建XLSX工作表";
},
methods: {
/** 页面刷新时展示的数据*/
getList() {
getSuppliesTemplate('1285').then(response => {
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
title: fileName, // Excel 文件名
data: JSON.parse(response.rows[0].templateContent), // Excel 数据
showinfobar: false, //是否显示顶部名称栏
lang: "zh",
});
})
},
/** Luckyexcel文档 */
init() {
let options = {
container: "luckysheet", //luckysheet为容器id
title: "",
lang: "zh",
showinfobar: false,
data: [
{
name: "sheet1", //工作表名称
color: "", //工作表颜色
index: 0, //工作表索引
status: 1, //激活状态
order: 0, //工作表的下标
hide: 0, //是否隐藏
row: 50, //行数
column: 20, //列数
defaultRowHeight: 19, //自定义行高
defaultColWidth: 73, //自定义列宽
celldata: [], //初始化使用的单元格数据
config: {
merge: {}, //合并单元格
rowlen: {}, //表格行高
columnlen: {}, //表格列宽
rowhidden: {}, //隐藏行
colhidden: {}, //隐藏列
borderInfo: {}, //边框
authority: {}, //工作表保护
},
},
],
};
luckysheet.create(options);
},
handleSelectChange() {
console.log(this.date, this.mine)
},
handleExport: debounce(function () {
// 导出
exportExcel(luckysheet.getAllSheets(), fileName);
}, 500),
},
};
// 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>
<template>
<div class="app-container">
<el-form ref="queryForm" size="small" :inline="true" label-width="68px">
<el-form-item label="所属矿">
<el-select v-model="mine" placeholder="请选择">
<el-option v-for="item in selectedOption" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="时间" prop="date">
<el-date-picker v-model="date" value-format="yyyy-MM" type="month" placeholder="选择月">
</el-date-picker>
</el-form-item>
<el-button size="small" @click="handleSelectChange" :disabled="!date || !mine">确认</el-button>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="warning" plain icon="el-icon-upload2" size="mini" @click="handleExport">导出</el-button>
</el-col>
</el-row>
<!-- luckysheet容器 -->
<div id="luckysheet"
style="margin: 0px; padding: 0px; position: absolute; width: 100%; height:80vh; z-index: 0">
</div>
</div>
</template>
export function ex(luckysheet) {
let list = []
for (let index = 1; index < luckysheet.length; index++) {
let funct = {}
luckysheet[index].forEach((item, e) => {
if (item &&item.v && (e == 5 || e == 9 || e == 10)) {
let name = luckysheet[0][e].v;
funct[name] = item.v;
}
});
list.push(funct);
}
console.log(list)
}
\ No newline at end of file
<template>
<div class="box">
<div style="display: flex;padding-bottom:20px;align-items: center;justify-content: space-between;width: 100%">
<div>
<el-select v-model="rule" @change="handleChange" placeholder="选择导入规则" size="large" style="width: 240px">
<el-option v-for="item in rules" :key="item.id" :label="item.roleName" :value="item.id" />
</el-select>
<el-date-picker v-model="DateColumn" size="large" style="margin-left: 10px" value-format="yyyy-MM"
type="month" placeholder="选择月"></el-date-picker>
</div>
<div style="display: flex">
<el-button size="mini" @click="creathz" style="margin-right: 10px">生成{{ state }}</el-button>
<el-button size="mini" style="margin-right: 10px" @click="handleExport">导出</el-button>
<el-upload type="file" action="#" :before-upload="uploadFile" :show-file-list="false">
<el-button size="mini" :disabled="!rule || !DateColumn">导入</el-button>
</el-upload>
</div>
</div>
<div style="flex:1;" v-loading="loading">
<div id="luckysheet" style="height: 100%"></div>
</div>
</div>
</template>
<script>
//todo 吕家坨 和 钱家营规则和其他不一样
import { setXColumn } from '@/utils/tzc'
import { debounce } from '@/utils'
import { ex } from './index'
const Qjy = [
{
km: '坑木',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '木材',
},
{
km: '坑代',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '支护用品',
},
{
km: '国配,综配',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '配件',
},
{
km: '工具',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '专用工具',
},{
km: '劳保',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '劳保用品',
},
{
km: '建材',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '建工材料',
},
{
km: '化工',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '油脂及乳化液',
},
{
a2: '钢丝绳,钢轨,电缆,输送带,钢铁管',
a24: '支-生产-大型材料,支-生产-一般材料',
'费用来源': '基本生产原煤',
'一级材料类别': '大型材料',
},
{
a23: '机关',
'费用来源': '管理费用',
'一级材料类别': '其他材料',
},
{
a23: '洗煤厂',
km: '国配,综配,化工',
in:false,
'费用来源': '基本生产-洗煤',
'一级材料类别': '其他材料',
},
{
a23: '洗煤厂',
km: '国配,综配',
'费用来源': '基本生产-洗煤',
'一级材料类别': '配件',
},
{
a23: '洗煤厂',
km: '化工',
'费用来源': '基本生产-洗煤',
'一级材料类别': '油脂及乳化液',
},
{
a23: '煤质科',
a2: '柴油,乙醇汽油',
'费用来源': '其他业务成本-运输业务',
'一级材料类别': '其他材料',
},
{
a23: '水暖科',
a2: '醇基锅炉燃料(变性甲醇)',
'费用来源': '基本生产原煤',
'一级材料类别': '燃料',
},
{
a23: '煤质科',
'费用来源': '制造费用-原煤',
'一级材料类别': '其他材料',
},
{
a23: '水暖科',
'费用来源': '制造费用-原煤',
'一级材料类别': '其他材料',
},
]
let getQjy = (obj) => {
return Qjy.find(item=>{
let ina2 = item.a2 && item.a2.includes(obj.a2);
let ina23 = item.a23 && item.a23.includes(obj.a23);
let inkm = item.km && item.km.includes(obj.km);
let ina24 = item.a24 && item.a24.includes(obj.a24);
if (item.a23 && item.a2){
return ina2 && ina23;
}else if(item.a23 && item.km && item.in === false){
return !inkm && ina23
}
else if(item.a23 && item.km){
return ina23 && inkm
}else if(item.a24 && item.km){
return ina24 && inkm
}else if(item.a23){
return ina23
}
})
}
let selectedOption = [
{
"roleId": 83,
"name": "唐山矿",
"id": "010101"
},
{
"roleId": 84,
"name": "林西矿",
"id": "011704"
},
{
"roleId": 85,
"name": "吕家坨",
"id": "011702"
},
{
"roleId": 86,
"name": "范各庄",
"id": "011701"
},
{
"roleId": 87,
"name": "宏丰",
"id": "011502"
},
{
"roleId": 88,
"name": "云飞",
"id": "011504"
},
{
"roleId": 89,
"name": "单侯",
"id": "011204"
},
{
"roleId": 90,
"name": "东欢坨",
"id": "010102"
},
{
"roleId": 91,
"name": "钱家营",
"id": "010105"
}
]
import {
asiccData, asmInfoSave,
department,
listSuppliesTemplateId,
roleList,
roleListid
} from '@/api/ruoyi-myLuckyexcel/myluckyexcel'
import LuckyExcel from "luckyexcel";
import { exportExcel } from '../../../../../public/exportExcel'
export default {
name: 'index',
data() {
return {
state:'初始',
DateColumn:'',
loading: false,
listId:1283,
rules:[],
rule:'',
roleObj:{},
// 根据部门确定来源
classification:{},
// 当前选的规则
excelid:null,
codeduiyi:[],
transformJson:[],
}
},
methods: {
creathz(){
this.state = '凭证'
ex(luckysheet.getAllSheets()[0].data)
},
getCodeRule: function (codes,guze) {
let vm = this;
let obj = {
}
let newgets = (str) => {
let code = String(str)
if (['011502','011504'].includes(this.excelid.id) && code.startsWith('6601')){
return ['办公费用','']
}
for (let item of guze){
let [minCode,maxCode] = item;
if (minCode === maxCode){
if(code.startsWith(minCode)){
return [item.oneLevel,item.twoLevel]
}
}else {
let miml = String(minCode).length
let maxl = String(maxCode).length
let cumin = code.slice(0,miml)
let cumax = code.slice(0,maxl)
if (minCode >= cumin && cumax <= maxCode){
if(minCode[0] === '0' || maxCode[0] === '0'){
if(code[0] === '0'){
return [item.oneLevel,item.twoLevel]
}
}else {
return [item.oneLevel,item.twoLevel]
}
}
}
}
}
codes.forEach(code => {
if(!obj[code]){
let va = newgets(code);
obj[code] = va || ['','']
}
})
return obj;
},
handleExport: debounce(function () {
// handleExport
exportExcel(luckysheet.getAllSheets(), 'asd');
}, 500),
getqushuguze(data){
let vm = this;
let qushuguze = []
if (vm.rule*1 === 85){
for (let i = vm.roleObj.NumberColumn-1; i < data[0].length; i = i + 5){
let zhi = data && data[0] && data[0][i] && data[0][i].v
if(zhi){
qushuguze.push({
...vm.roleObj,
sourceColoumn:zhi && zhi.replace && zhi.replace('--',"-") || zhi,
NumberColumn:i+1,
MoneyColumn:i+2,
money:i+3,
})
}else {
break;
}
}
}else {
qushuguze = [this.roleObj]
}
return qushuguze
},
handleChange(e){
let vm = this;
if(e){
roleListid(this.rule).then(res => {
this.roleObj = JSON.parse(res.rows[0].detailContent)[0]
})
let excelid = selectedOption.find(item => item.roleId === e)
if(excelid){
this.excelid = excelid
this.classification = {}
department(excelid.id).then(res => {
if (Array.isArray(res)) {
this.classification = Object.fromEntries(res.map(item => [item.name, item.nameType]))
}
});
}
}
},
// 更改obj的来源
getsourceColoumn(obj,row){
// 唐山矿
if(this.excelid && this.excelid.id === '010101'){
const enumS = {
'基本生产': '基本生产-原煤',
'制造费用': '制造费用-原煤',
'洗煤费用': '基本生产-洗煤',
'其他费用': '其他业务支出',
}
enumS[obj.sourceColoumn] && (obj.sourceColoumn = enumS[obj.sourceColoumn])
}
// 林西矿
if(this.excelid && this.excelid.id === '011704'){
// 林西矿
// 类别名称 === ‘研发费用’ && 来源 = ‘研发费用’
// 类别名称 === ‘安全费用’ && 来源 = ‘安全费用’
// 其他的根据部门规则
let lbName = row && row[3] && row[3].v
if(lbName === '研发费用'){
obj.sourceColoumn = '研发费用'
}else if(lbName === '安全费用'){
obj.sourceColoumn = '安全费用'
}else {
obj.sourceColoumn = this.classification[obj.DepartmentColumn]
}
}
// 单侯
if(this.excelid && this.excelid.id === '011204'){
// 费用来源是生产成本按照部门划分
// 反之直接取费用来源列
if( obj.sourceColoumn === '生产成本' ){
obj.sourceColoumn = this.classification[obj.DepartmentColumn]
}
}
//宏丰\云飞
// 费用来源 === 成本费用的取部门
// 反之直接取费用来源列
if(this.excelid && ['011502','011504'].includes(this.excelid.id)){
if( obj.sourceColoumn === ' 成本费用' ){
obj.sourceColoumn = this.classification[obj.DepartmentColumn]
}
}
},
chuli(transformJson,olddata,obj){
olddata[transformJson.length] = [];
let arr = [
{ c:0, label:'物料名称',value:'NameColumn'},
{ c:1, label:'材料编码',value:'CodeColumn'},
{ c:2, label:'部门',value:'DepartmentColumn'},
{ c:3, label:'数量',value:'NumberColumn'},
{ c:4, label:'单价',value:'MoneyColumn'},
{ c:5, label:'总额',value:'money'},
{ c:6, label:'计量单位',value:'unit'},
{ c:7, label:'型号',value:'model'},
{ c:8, label:'所属矿',value:'mineName'},
{ c:9, label:'费用来源',value:'sourceColoumn'},
{ c:10, label:'一级材料类别',value:'oneLevel'},
{ c:11, label:'二级材料类别',value:'twoLevel'},
{ c:12, label:'日期',value:'DateColumn'},
]
arr.forEach((item) => {
if (obj[item.value]){
olddata[transformJson.length][item.c] = {ct: { fa: '@', t: 's' }, fc:"#000000",ff:"宋体",v:obj[item.value]}
}
});
},
uploadFile(file) {
let vm = this;
vm.loading = true;
LuckyExcel.transformExcelToLucky(file, async function (exportJson) {
let celldata = exportJson && exportJson.sheets && exportJson.sheets[0] && exportJson.sheets[0].celldata;
if (celldata){
let data = luckysheet.transToData(celldata);
let transformJson = [];
let updataSheetdata = luckysheet.getAllSheets();
let olddata = updataSheetdata[0].data;
let codeObj = {};
// 钱家营的单独设置,来源和一级分类,没有二级分类
if(vm.excelid.id !== '010105'){
let codeIndex = vm.roleObj && vm.roleObj.CodeColumn && (vm.roleObj.CodeColumn - 1)
let codes = []
if(codeIndex > -1){
codes = data.slice(vm.roleObj.HeaderRow-1).map(row => {
let codev = row && row[codeIndex] && (row[codeIndex].v + '')
return codev || '';
}).filter(item => item);
}
// codeObj = vm.getCodeRule(codes)
codes = Array.from(new Set(codes))
if (codes.length){
let rescodeObj = await asiccData({
codes:Array.from(new Set(codes)),
mineId : vm.excelid.id
})
if(rescodeObj.code === 200){
codeObj = rescodeObj.data
}else {
vm.loading = false;
}
}
}
// 钱家营
let headers = setXColumn(data)
data.slice(vm.roleObj.HeaderRow-1).map((row,rowIndex) => {
vm.getqushuguze(data).forEach(item => {
let obj = {}
// 通用规则设置obj
obj.mineName = vm.excelid.name;
obj.mineId = vm.excelid.id;
Object.entries(item).forEach(([key,v]) => {
if(vm.excelid.id === '011702' && key === 'sourceColoumn'){
obj[key] = v
} else if (v && row[v-1] && row[v-1].v && key !== 'HeaderRow'){
obj[key] = row[v-1].v
}
})
obj.DateColumn = vm.DateColumn;
// 钱家营单独修改来源和一级分类
if (vm.excelid.name === '钱家营'){
let etQ = getQjy({
a23: row[headers.a23].v,
a2: row[headers.a2].v,
km: row[headers.km].v,
a24: row[headers.a24].v,
})
obj.oneLevel = etQ && etQ['一级材料类别'] || '其他材料';
obj.sourceColoumn = etQ && etQ['费用来源'] || '基本生产原煤';
}
else if(codeObj && codeObj[obj.CodeColumn]) {
let codess = codeObj[obj.CodeColumn];
obj.oneLevel = (codess['一级分类'] && codess['一级分类'] !== 'null') ? codess['一级分类'] : ''
obj.twoLevel = (codess['二级分类'] && codess['二级分类'] !== 'null') ? codess['二级分类'] : ''
}
// 设置obj.sourceColoumn来源
vm.getsourceColoumn(obj,row)
// 生成 transformJson、olddata
if(obj && obj.CodeColumn && Math.abs(obj.money) > 0 ){
transformJson.push(obj)
vm.chuli(transformJson,olddata,obj)
}
})
})
vm.loading = false;
luckysheet.destroy();
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
lang: 'zh',
title:'材料明细模版表',
data: updataSheetdata
});
this.transformJson = transformJson;
asmInfoSave({
materials:transformJson
})
}
});
},
},
mounted() {
listSuppliesTemplateId(this.listId).then(res => {
luckysheet.destroy();
luckysheet.create({
container: "luckysheet", // Luckysheet 的容器元素 ID
lang: 'zh',
title:'材料明细模版表',
data: JSON.parse(res.rows[0].templateContent)
});
})
roleList(this.listId).then(res => {
this.rules = res.rows
})
},
}
</script>
<style scoped>
.box {
box-sizing: border-box;
padding: 20px;
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
display: flex;
flex-direction: column;
}
</style>
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="模板ID" prop="tempId">
<el-input
v-model="queryParams.tempId"
placeholder="请输入模板ID"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="规则名称" prop="roleName">
<el-input
v-model="queryParams.roleName"
placeholder="请输入规则名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
<el-option
v-for="dict in statusOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:suppliesrole:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:suppliesrole:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:suppliesrole:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:suppliesrole:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="suppliesroleList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="模板ID" align="center" prop="tempId" />
<el-table-column label="规则名称" align="center" prop="roleName" />
<el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:suppliesrole:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:suppliesrole:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改导入规则对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="模板ID" prop="tempId">
<el-select v-model="form.tempId" filterable placeholder="请选择关联项" >
<el-option
v-for="option in options"
:key="option.templateName"
:label="option.templateName"
:value="option.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="规则名称" prop="roleName">
<el-input v-model="form.roleName" placeholder="请输入规则名称" />
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.dictValue"
:label="parseInt(dict.dictValue)"
>{{dict.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listSuppliesrole, getSuppliesrole, delSuppliesrole, addSuppliesrole, updateSuppliesrole, exportSuppliesrole,saveSid } from "@/api/system/suppliesrole";
export default {
name: "Suppliesrole",
components: {
},
data() {
return {
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 显示搜索条件
showSearch: true,
// 总条数
total: 0,
// 导入规则表格数据
suppliesroleList: [],
options:[],
// 弹出层标题
title: "",
// 是否显示弹出层
open: false,
// 状态数据字典
statusOptions: [],
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 10,
tempId: null,
roleName: null,
status: null,
},
// 表单参数
form: {},
// 表单校验
rules: {
tempId: [
{ required: true, message: "关联id不能为空", trigger: "change" }
]
}
};
},
created() {
this.getList();
this.getnameid();
this.getDicts("sys_normal_disable").then(response => {
this.statusOptions = response.data;
});
},
methods: {
/** 查询上级id*/
getnameid(){
saveSid().then(response =>{
this.options = response.rows;
})
},
/** 查询导入规则列表 */
getList() {
this.loading = true;
listSuppliesrole(this.queryParams).then(response => {
this.suppliesroleList = response.rows;
this.total = response.total;
this.loading = false;
});
},
// 岗位状态字典翻译
statusFormat(row, column) {
return this.selectDictLabel(this.statusOptions, row.status);
},
// 取消按钮
cancel() {
this.open = false;
this.reset();
},
// 表单重置
reset() {
this.form = {
id: null,
tempId: null,
roleName: null,
status: 0,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加导入规则";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getSuppliesrole(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改导入规则";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateSuppliesrole(this.form).then(response => {
this.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addSuppliesrole(this.form).then(response => {
this.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$confirm('是否确认删除导入规则编号为"' + ids + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function() {
return delSuppliesrole(ids);
}).then(() => {
this.getList();
this.msgSuccess("删除成功");
})
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$confirm('是否确认导出所有导入规则数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function() {
return exportSuppliesrole(queryParams);
}).then(response => {
this.download(response.msg);
})
}
}
};
</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