明树Git Lab

Commit c4c723e5 authored by zfp1's avatar zfp1

update

parent b7ef98b1
......@@ -57,10 +57,11 @@ function thvc(a) {
sdsqjxjll.push(element.sdsqjxjll);
tzsds.push(element.tzsds);
sdshjxjll.push(element.sdshjxjll);
year.push(element.year);
// year.push(element.year);
}
return {xjlr, xjlc, sdsqjxjll, tzsds, sdshjxjll};
return [xjlr, xjlc, sdsqjxjll, tzsds, sdshjxjll];
}
console.log(thvc(a));
function cvht(obj) {
for (const key in obj) {
......@@ -104,6 +105,6 @@ const transformed = {
sdshjxjll: [500, 500, 501, 5003, 5004]
};
console.log(reverseTransform(transformed));
// console.log(reverseTransform(transformed));
// console.log(thvc(a));
\ No newline at end of file
......@@ -8,10 +8,10 @@
"excel": true
},
"mysql": {
"host": "localhost",
"host": "10.40.8.8",
"port": 3306,
"username": "root",
"password": "123456",
"password": "gzbjt@2025",
"database": "gzbjt",
"logging": true
},
......
......@@ -593,14 +593,6 @@ async function exportExcel(req, res, next) {
}
}
async function getExcelTemplate(req, res, next) {
try {
//
} catch (error) {
next(error);
}
}
module.exports = {
getProjectFields,
createProject,
......@@ -609,7 +601,6 @@ module.exports = {
deleteProject,
updateProject,
exportExcel,
getExcelTemplate,
preJugProject,
finalJugProject,
}
\ No newline at end of file
/**
* 项目相关excel文件处理:
* 1. 下载模板(携带当前数据,若无数据则为空)
* 2. 上传文件导入数据 解析数据并存入数据库
* 3.
*/
const errorMessage = require("../utils/errorMessage");
async function getExcelTemplate(req, res, next) {
try {
let { tampName, projectId, startYear, endYear } = req.body;
const workbook = new ExcelJS.Workbook();
if (tampName === 'xmtzzjll') { // 项目投资资金流量表
if (!startYear || !endYear) {
errorMessage.paramsError.message = "当前模板开始年份和结束年份不能为空";
return res.sendError(errorMessage.paramsError);
}
// 1. 读取空模板文件
const inputFilePath = path.join(__dirname, '../public/templates/项目投资资金流量表.xlsx');
// 2. 处理excel 文件,动态生成表格
await workbook.xlsx.readFile(inputFilePath);
const worksheet = await workbook.getWorksheet(1);
// 2.1 处理表头
let count = endYear - startYear;
let columns = [];
for (let index = 0; index <= count; index++) {
columns.push({ name: Number(startYear + index) });
}
// 2.2 处理数据
let rows = Array(5).fill([]); // 5 是模板有5行
if (!projectId) {
let tzzjlls = await ProjectTzzjll.findAll({
where: { projectId: projectId, del: 0 },
raw: true,
});
tzzjlls = _.sortBy(tzzjlls, 'year');
rows = thvc(tzzjlls);
}
console.log(rows, "=============")
// 使用addTable创建表格
worksheet.addTable({
name: 'FinancialData',
ref: 'D3',
headerRow: true,
totalsRow: false,
style: {
theme: null,
showRowStripes: false,
showColumnStripes: false,
},
columns: columns,
rows: rows
});
worksheet.mergeCells(2, 3, 2, (3 + columns.length))
worksheet.mergeCells(1, 1, 1, (3 + columns.length))
const BLACK_BORDER = {
top: { style: 'thin', color: { argb: 'FF000000' } },
left: { style: 'thin', color: { argb: 'FF000000' } },
bottom: { style: 'thin', color: { argb: 'FF000000' } },
right: { style: 'thin', color: { argb: 'FF000000' } }
};
// 遍历所有单元格添加边框
worksheet.eachRow((row, rowNumber) => {
row.eachCell((cell, colNumber) => {
if (rowNumber >= 4 && rowNumber <= 8 && colNumber >= 4 && colNumber <= (3 + columns.length)) {
cell.numFmt = '#,##0.00'; //数字格式
}
cell.alignment = {
horizontal: 'center',
vertical: 'middle', //垂直居中
wrapText: true
};
cell.border = BLACK_BORDER; //边框
});
});
// 3. 将处理后的文件发送给前端
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader('Content-Disposition', 'attachment; filename=' + encodeURIComponent('项目投资资金流量表.xlsx'));
const buffer = await workbook.xlsx.writeBuffer();
// 发送文件并结束响应
res.end(buffer);
}
else {
res.status(400).json({ message: '未知的模板名称' });
}
} catch (error) {
next(error);
}
}
//处理 项目投资资金流量表 以【数据项、年度】为【数据库表结构字段】 转化为excel行数据
function thvc(a) {
let xjlr = [], xjlc = [], sdsqjxjll = [], tzsds = [], sdshjxjll = [];
for (let index = 0; index < a.length; index++) {
const element = a[index];
xjlr.push(element.xjlr);
xjlc.push(element.xjlc);
sdsqjxjll.push(element.sdsqjxjll);
tzsds.push(element.tzsds);
sdshjxjll.push(element.sdshjxjll);
// year.push(element.year);
}
return [xjlr, xjlc, sdsqjxjll, tzsds, sdshjxjll];
}
async function importExcelTempData(req, res, next) {
try {
let { tampName, projectId } = req.body;
if (tampName == 'xmtzzjll') {
if (!projectId) {
errorMessage.paramsError.message = "项目ID不能为空";
return res.sendError(errorMessage.paramsError);
}
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.load(req.file.buffer);
const worksheet = await workbook.getWorksheet(1);
let years = [], data = [];
worksheet.eachRow((row, rowIndex) => {
if (rowIndex === 3) {
years = row.values.slice(4);
}
if (rowIndex > 3) {
data.push(row.values.slice(4));
}
});
const fieldMap = {
1: 'xjlr', // 现金流入
2: 'xjlc', // 现金流出
3: 'sdsqjxjll', // 所得税前净现金流量
4: 'tzsds', // 调整所得税
5: 'sdshjxjll' // 所得税后净现金流量
};
let retData = [];
years.map((year, yearIndex) => {
const yearData = { year };
for (let rowIndex = 1; rowIndex <= data.length; rowIndex++) {
const fieldKey = fieldMap[rowIndex];
if (fieldKey) {
const value = data[rowIndex - 1][yearIndex];
yearData[fieldKey] = parseFloat(value) || 0;
}
}
retData.push(yearData);
});
await ProjectTzzjll.destroy({
where: { projectId: projectId },
});
await ProjectTzzjll.bulkCreate(retData);
}
} catch (error) {
next(error)
}
}
module.exports = {
getExcelTemplate,
importExcelTempData,
}
\ No newline at end of file
const { DataTypes } = require('sequelize');
const sequelize = require('../index');
// 财务评价指标
const projectCwpjbjtj = sequelize.define('projectCwpjbjtj', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
bjtj: {
type: DataTypes.STRING,
comment: "指标名称"
},
jc: {
type: DataTypes.STRING,
comment: "决策"
},
xz: {
type: DataTypes.STRING,
comment: "现状"
},
zycysm: {
type: DataTypes.TEXT,
comment: "主要差异说明",
},
projectId: {
type: DataTypes.INTEGER,
comment: "所属项目ID",
},
}, {
tableName: 'jt_project_cwpjbjtj', // 指定表名(如果与模型名不同)
timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
projectCwpjbjtj.sync({
// force: false,
// force: true ,//会删除已存在表并重新创建
// alter: true
})
.then(() => {
console.log('projectCwpjbjtj 表同步成功');
});
module.exports = projectCwpjbjtj;
\ No newline at end of file
const { DataTypes } = require('sequelize');
const sequelize = require('../index');
//投资收益指标变化对比表
const ProjectTzsyzb = sequelize.define('ProjectTzsyzb', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
pjzb:{ type: DataTypes.STRING, allowNull: true, comment: "评价指标" },
jczb:{ type: DataTypes.STRING, comment: '决策指标'},
xzzb:{ type: DataTypes.STRING, comment: '现状指标'},
projectId: {
type: DataTypes.INTEGER,
comment: "所属项目ID",
},
del: {
type: DataTypes.INTEGER,
defaultValue: 0,
comment: "0 正常 1 删除"
},
}, {
tableName: 'jt_project_tzsyzb', // 指定表名(如果与模型名不同)
timestamps: true, // 是否自动添加 createdAt 和 updatedAt 字段(覆盖全局设置)
});
// 同步模型到数据库(创建表)
ProjectTzsyzb.sync({
force: false,
// force: true ,//会删除已存在表并重新创建
// alter: true
})
.then(() => {
console.log('ProjectTzsyzb 表同步成功');
});
module.exports = ProjectTzsyzb;
\ No newline at end of file
......@@ -10,10 +10,14 @@ router.use('/user', userRouter); // 用户 角色 菜单
router.use('/file', fileRouter); // 文件上传下载
router.use('/project', require('./projectRouter.js')); // 项目管理
router.use('/resource', require('./resourceRouter.js')); // 资源管理
router.use('/message', require('./messageRouter.js')); // 消息管理
router.use('/template', require('./tempRouter.js')); // excel相关
module.exports = router;
\ No newline at end of file
......@@ -17,8 +17,12 @@ router.post('/getProjectFields', projectController.getProjectFields);
router.post('/exportExcel', projectController.exportExcel);
router.post('/getExcelTemplate', projectController.getExcelTemplate);
router.post('/preJugProject', projectController.preJugProject); //初审
router.post('/finalJugProject', projectController.finalJugProject); //终审
module.exports = router;
\ No newline at end of file
const express = require('express');
const router = express.Router();
const multer = require('multer');
const templateController = require('../controller/templateController');
/**
* 获取项目相关excel 模板下载
*/
router.post('/getExcelTemplate', templateController.getExcelTemplate);
/**
* 导入excel 数据
*/
const storage = multer.memoryStorage();
const upload = multer({ storage });
router.post('/importExcelTempData', upload.single('file'), templateController.importExcelTempData);
module.exports = router;
\ No newline at end of file
const { param } = require("../router");
module.exports = {
loginError: {
code: 40001,
......@@ -11,6 +13,10 @@ module.exports = {
code: 40003,
message: "名称重复"
},
paramsError: {
code: 40004,
message: "参数错误"
},
databaseQueryError: {
......
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