明树Git Lab

Commit 000f0274 authored by zfp1's avatar zfp1

Merge branch 'dev'

parents ec2e8323 28250989
Pipeline #104128 passed with stage
in 3 seconds
...@@ -136,4 +136,27 @@ console.log(flattenTree(complexForest, 'xh', 'parentXh')); ...@@ -136,4 +136,27 @@ console.log(flattenTree(complexForest, 'xh', 'parentXh'));
// ], 'xh', 'parentXh'))) // ], 'xh', 'parentXh')))
// [{ "xh": "1", "zb": "项目资本金", "dw": "万元", "parentXh": null, "children": [{ "xh": "1.1", "zb": "能建方出资", "dw": "万元", "parentXh": "1", "children": [] }, { "xh": "1.2", "zb": "外部股东", "dw": "万元", "parentXh": "1", "children": [] }] }, { "xh": "2", "zb": "贷款", "dw": "万元", "parentXh": null, "children": [{ "xh": "2.1", "zb": "其中:并非表项目我方贷款/投保额", "dw": "万元", "parentXh": "2", "children": [] }] }, { "xh": "3", "zb": "其他出资", "dw": "万元", "parentXh": null, "children": [{ "xh": "3.1", "zb": "其中:能建方出资", "dw": "万元", "parentXh": "3", "children": [] }] }, { "xh": "", "zb": "批复总出资", "dw": "万元", "parentXh": null, "children": [] }] // [{ "xh": "1", "zb": "项目资本金", "dw": "万元", "parentXh": null, "children": [{ "xh": "1.1", "zb": "能建方出资", "dw": "万元", "parentXh": "1", "children": [] }, { "xh": "1.2", "zb": "外部股东", "dw": "万元", "parentXh": "1", "children": [] }] }, { "xh": "2", "zb": "贷款", "dw": "万元", "parentXh": null, "children": [{ "xh": "2.1", "zb": "其中:并非表项目我方贷款/投保额", "dw": "万元", "parentXh": "2", "children": [] }] }, { "xh": "3", "zb": "其他出资", "dw": "万元", "parentXh": null, "children": [{ "xh": "3.1", "zb": "其中:能建方出资", "dw": "万元", "parentXh": "3", "children": [] }] }, { "xh": "", "zb": "批复总出资", "dw": "万元", "parentXh": null, "children": [] }]
\ No newline at end of file
function disTree(tree) {
let parallel = [];
function addToParallel(nodes) {
nodes.forEach(node => {
parallel.push({
...node,
children: undefined
});
if (node.children && node.children.length) {
addToParallel(node.children);
}
});
}
addToParallel(tree)
return parallel
}
console.log(disTree( [
1,2,3
]))
\ No newline at end of file
...@@ -10,22 +10,8 @@ async function getProjectFields(req, res, next) { ...@@ -10,22 +10,8 @@ async function getProjectFields(req, res, next) {
try { try {
let rawAttributes = _.cloneDeep(DB.Project.rawAttributes); let rawAttributes = _.cloneDeep(DB.Project.rawAttributes);
let obj = { let obj = {
xmjbxx: '项目基本信息', lixiang: '立项',
// jcpfxx: '决策及批复信息', juece: '决策',
// xmgslspfxx: '项目公司落实批复信息',
// xmfhhgxffj: '项目合法合规性附件',
// qshmkchw: '全生命周期策划文件',
// xmjxxpj: '项目绩效评价',
// mbzrskh: '目标责任书考核',
// hpj: '后评价',
// zdsxsb: '重大事项上报',
// tzfx: '投资分析',
// tzjc: '投资检查',
// tzhs: '投资核算',
// system: '系统字段',
// glfsj: '管理费上缴',
// pppzgfa: 'PPP资格认定方案',
// xmjs: '项目结束/暂停(备案资料)',
}; };
for (const key in rawAttributes) { for (const key in rawAttributes) {
let element = _.pick(rawAttributes[key], ['comment', '_mark', 'fieldName']); let element = _.pick(rawAttributes[key], ['comment', '_mark', 'fieldName']);
...@@ -47,8 +33,9 @@ async function getProjectFields(req, res, next) { ...@@ -47,8 +33,9 @@ async function getProjectFields(req, res, next) {
next(error); next(error);
} }
} }
/** /**
* 创建提交 创建 * 创建时候保存项目
* @param {*} req * @param {*} req
* @param {*} res * @param {*} res
* @param {*} next * @param {*} next
...@@ -64,12 +51,12 @@ async function createProject(req, res, next) { ...@@ -64,12 +51,12 @@ async function createProject(req, res, next) {
projectXmtzzes :关联项目投资额表 projectXmtzzes :关联项目投资额表
projectBjtjs :关联项目核心边界条件表 projectBjtjs :关联项目核心边界条件表
projectSpyjs :关联审批意见表 projectSpyjs :关联审批意见表
projectFxgls: 关联 风险管理 // projectFxgls: 关联 风险管理
projectTzzts: 关联 投资主体审核 // projectTzzts: 关联 投资主体审核
ProjectJczts: 关联 决策主体审核 // ProjectJczts: 关联 决策主体审核
// projectZqrzs: 关联 债权融资 // // projectZqrzs: 关联 债权融资
projectCwpjzbs: 关联 财务评价指标 projectCwpjzbs: 关联 财务评价指标
ProjectLcbjds: 关联 里程碑节点 // ProjectLcbjds: 关联 里程碑节点
lxzl :关联projectFiles-File文件表 lxzl :关联projectFiles-File文件表
lxpfwj :关联projectFiles-File文件表 lxpfwj :关联projectFiles-File文件表
xgshcl :关联projectFiles-File文件表 xgshcl :关联projectFiles-File文件表
...@@ -80,7 +67,9 @@ async function createProject(req, res, next) { ...@@ -80,7 +67,9 @@ async function createProject(req, res, next) {
'projectSpyjs', 'projectFxgls', 'projectTzzts', 'projectJczts', 'projectZqrzs', 'projectCwpjzbs', 'projectLcbjds', 'projectSpyjs', 'projectFxgls', 'projectTzzts', 'projectJczts', 'projectZqrzs', 'projectCwpjzbs', 'projectLcbjds',
'lxzl', 'lxpfwj', 'xgshcl']); 'lxzl', 'lxpfwj', 'xgshcl']);
projectInfo.projectCreator = req.user.id; projectInfo.projectCreator = req.user.id;
projectInfo.projectLiuZhuanType = 1; // 草稿状态
projectInfo.projectLzType = 1; // 草稿状态
let project = await DB.Project.create(projectInfo); let project = await DB.Project.create(projectInfo);
project = project.toJSON(); project = project.toJSON();
// 处理 projectJsgms // 处理 projectJsgms
...@@ -100,18 +89,18 @@ async function createProject(req, res, next) { ...@@ -100,18 +89,18 @@ async function createProject(req, res, next) {
let projectBjtjs = body.projectBjtjs || []; let projectBjtjs = body.projectBjtjs || [];
projectBjtjs = projectBjtjs.map(o => { o.projectId = project.id; return o }); projectBjtjs = projectBjtjs.map(o => { o.projectId = project.id; return o });
await DB.ProjectBjtj.bulkCreate(projectBjtjs); await DB.ProjectBjtj.bulkCreate(projectBjtjs);
// 处理 projectFxgl // // 处理 projectFxgl
let projectFxgls = body.projectFxgls || []; // let projectFxgls = body.projectFxgls || [];
projectFxgls = projectFxgls.map(o => { o.projectId = project.id; return o }); // projectFxgls = projectFxgls.map(o => { o.projectId = project.id; return o });
await DB.ProjectFxgl.bulkCreate(projectFxgls); // await DB.ProjectFxgl.bulkCreate(projectFxgls);
// 处理 ProjectTzzt // 处理 ProjectTzzt
let projectTzzts = body.projectTzzts || []; // let projectTzzts = body.projectTzzts || [];
projectTzzts = projectTzzts.map(o => { o.projectId = project.id; return o }); // projectTzzts = projectTzzts.map(o => { o.projectId = project.id; return o });
await DB.ProjectTzzt.bulkCreate(projectTzzts); // await DB.ProjectTzzt.bulkCreate(projectTzzts);
// 处理 ProjectJczt // // 处理 ProjectJczt
let projectJczts = body.projectJczts || []; // let projectJczts = body.projectJczts || [];
projectJczts = projectJczts.map(o => { o.projectId = project.id; return o }); // projectJczts = projectJczts.map(o => { o.projectId = project.id; return o });
await DB.ProjectJczt.bulkCreate(projectJczts); // await DB.ProjectJczt.bulkCreate(projectJczts);
// // 处理 projectZqrz // // 处理 projectZqrz
// let projectZqrzs = body.projectZqrzs || []; // let projectZqrzs = body.projectZqrzs || [];
// projectZqrzs = projectZqrzs.map(o => { o.projectId = project.id; return o }); // projectZqrzs = projectZqrzs.map(o => { o.projectId = project.id; return o });
...@@ -144,36 +133,32 @@ async function createProject(req, res, next) { ...@@ -144,36 +133,32 @@ async function createProject(req, res, next) {
console.log(proFiles, "=================") console.log(proFiles, "=================")
await DB.ProjectFile.bulkCreate(proFiles); await DB.ProjectFile.bulkCreate(proFiles);
/**
* 处理项目审批及消息 依靠项目状态流转 await DB.FlowRecord.create({
* 1. 发起人角色为项目公司项目发起人 xmgs_xmfqr; userId: req.user.id,
* 2. 流转状态为 1待处理 actionName: '创建项目',
* 3. 消息发送给 项目公司项目审批人 xmgs_xmspr,需要写一个审批接口 :项目基本信息不变,状态需要改为 2 项目公司初审:通过则变为3,不通过则变为1; projectId: project.id,
* 4. 若是投管部门自主创建项目,则项目状态直接到 5 待投管审核---退回则到1 });
* 5. 投管后续立项推送、决策推送状态再行处理 // if (req.body.buttonType === 'submit') {
*/ // await DB.FlowRecord.create({
//B. 找到本公司审批人员发送消息-- 如果找不到人 则提示项目已保存,联系管理员添加【项目公司项目审批人】角色 // userId: req.user.id,
//A. 创建发起记录 // actionName: '发起项目立项',
if (req.body.buttonType === 'submit') { // projectId: project.id,
await DB.FlowRecord.create({ // });
userId: req.user.id, // // let approvers = await userModule.getProjectApprover(req.user.id, 'xmgs_xmspr');
actionName: '发起项目初审', // // if (!(approvers && approvers.length > 0)) {
projectId: project.id, // // return res.sendError({ code: '60001', msg: '项目已保存,请联系管理员为本公司添加【项目初审】角色人员' });
}); // // }
let approvers = await userModule.getProjectApprover(req.user.id, 'xmgs_xmspr'); // // await DB.Message.create({
if (!(approvers && approvers.length > 0)) { // // projectId: project.id,
return res.sendError({ code: '60001', msg: '项目已保存,请联系管理员为本公司添加【项目初审】角色人员' }); // // creator: req.user.id,
} // // receivers: approvers.map(o => o.id),
await DB.Message.create({ // // type: 2,
projectId: project.id, // // title: `项目【${project.name}】已发起,请尽快处理!`,
creator: req.user.id, // // content: `项目【${project.name}】已发起,请尽快处理!`
receivers: approvers.map(o => o.id), // // });
type: 2, // await DB.Project.update({ projectLzType: 3 }, { where: { id: project.id } });
title: `项目【${project.name}】已发起,请尽快处理!`, // }
content: `项目【${project.name}】已发起,请尽快处理!`
});
await DB.Project.update({ projectLiuZhuanType: 3 }, { where: { id: project.id } });
}
console.log(project) console.log(project)
return res.sendData(project); return res.sendData(project);
} catch (error) { } catch (error) {
...@@ -182,101 +167,63 @@ async function createProject(req, res, next) { ...@@ -182,101 +167,63 @@ async function createProject(req, res, next) {
} }
/** async function xiangmulixianggengxin(project, projectLzType) {
* 更新提交 更新
* @param {*} req
* @param {*} res
* @param {*} next
* @returns
*/
async function updateProject(req, res, next) {
try { try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
// 1. 处理项目 // 1. 处理项目
let project = body; // let project = body;
let projectInfo = _.omit(body, ['projectJsgms', 'projectGdxxs', 'projectXmtzzes', 'projectBjtjs', let projectInfo = _.omit(body, ['projectJsgms', 'projectGdxxs', 'projectXmtzzes', 'projectBjtjs',
'projectSpyjs', 'projectFxgls', 'projectTzzts', 'projectJczts', 'projectZqrzs', 'projectCwpjzbs', 'projectLcbjds', 'projectSpyjs', 'projectFxgls', 'projectTzzts', 'projectJczts', 'projectZqrzs', 'projectCwpjzbs', 'projectLcbjds',
'lxzl', 'lxpfwj', 'xgshcl']); 'lxzl', 'lxpfwj', 'xgshcl']);
// 处理 projectJsgms // 处理 projectJsgms
let projectJsgms = body.projectJsgms || []; let projectJsgms = body.projectJsgms || [];
let pnids1 = [], pns1 = [], newprojectJsgms = []; let pnids1 = [], pns1 = [], newprojectJsgms = [];
projectJsgms.map(o => { if (!o.id) { if(!_.isEmpty(o)){o.projectId = project.id; newprojectJsgms.push(o);} } else { pnids1.push(o.id); pns1.push(o); } return o }); projectJsgms.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectJsgms.push(o); } } else { pnids1.push(o.id); pns1.push(o); } return o });
await DB.ProjectJsgm.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids1 } } }); await DB.ProjectJsgm.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids1 } } });
await DB.ProjectJsgm.bulkCreate(newprojectJsgms); await DB.ProjectJsgm.bulkCreate(newprojectJsgms);
await Promise.all(pns1.map(item => {DB.ProjectJsgm.update(item, {where: {id: item.id}})})); await Promise.all(pns1.map(item => { DB.ProjectJsgm.update(item, { where: { id: item.id } }) }));
// 处理 projectGdxxs // 处理 projectGdxxs
let projectGdxxs = body.projectGdxxs || []; let projectGdxxs = body.projectGdxxs || [];
let pnids2 = [], pns2 = [], newprojectGdxxs = []; let pnids2 = [], pns2 = [], newprojectGdxxs = [];
projectGdxxs.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectGdxxs.push(o);} } else { pnids2.push(o.id); pns2.push(o); } return o }); projectGdxxs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectGdxxs.push(o); } } else { pnids2.push(o.id); pns2.push(o); } return o });
await DB.ProjectGdxx.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids2 } } }); await DB.ProjectGdxx.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids2 } } });
await DB.ProjectGdxx.bulkCreate(newprojectGdxxs); await DB.ProjectGdxx.bulkCreate(newprojectGdxxs);
await Promise.all(pns2.map(item => {DB.ProjectGdxx.update(item, {where: {id: item.id}})})); await Promise.all(pns2.map(item => { DB.ProjectGdxx.update(item, { where: { id: item.id } }) }));
// 处理 projectXmtzzes // 处理 projectXmtzzes
let projectXmtzzes = body.projectXmtzzes || []; let projectXmtzzes = body.projectXmtzzes || [];
projectXmtzzes = utils.flattenTree(projectXmtzzes, 'xh', 'parentXh'); projectXmtzzes = utils.flattenTree(projectXmtzzes, 'xh', 'parentXh');
let pnids3 = [], pns3 = [], newprojectXmtzzes = []; let pnids3 = [], pns3 = [], newprojectXmtzzes = [];
projectXmtzzes.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectXmtzzes.push(o);} } else { pnids3.push(o.id); pns3.push(o); } return o }); projectXmtzzes.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectXmtzzes.push(o); } } else { pnids3.push(o.id); pns3.push(o); } return o });
await DB.ProjectXmtzze.bulkCreate(newprojectXmtzzes); await DB.ProjectXmtzze.bulkCreate(newprojectXmtzzes);
await Promise.all(pns3.map(item => {DB.ProjectXmtzze.update(item, {where: {id: item.id}})})); await Promise.all(pns3.map(item => { DB.ProjectXmtzze.update(item, { where: { id: item.id } }) }));
// 处理 projectBjtjs // 处理 projectBjtjs
let projectBjtjs = body.projectBjtjs || []; let projectBjtjs = body.projectBjtjs || [];
let pnids4 = [],pns4 = [], newprojectBjtjs = []; let pnids4 = [], pns4 = [], newprojectBjtjs = [];
projectBjtjs.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectBjtjs.push(o);} } else { pnids4.push(o.id);pns4.push(o); } return o }); projectBjtjs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectBjtjs.push(o); } } else { pnids4.push(o.id); pns4.push(o); } return o });
await DB.ProjectBjtj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids4 } } }); await DB.ProjectBjtj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids4 } } });
await DB.ProjectBjtj.bulkCreate(newprojectBjtjs); await DB.ProjectBjtj.bulkCreate(newprojectBjtjs);
await Promise.all(pns4.map(item => {DB.ProjectBjtj.update(item, {where: {id: item.id}})})); await Promise.all(pns4.map(item => { DB.ProjectBjtj.update(item, { where: { id: item.id } }) }));
// 处理 projectFxgl
let projectFxgls = body.projectFxgls || [];
let pnids5 = [], pns5 =[], newprojectFxgls = [];
projectFxgls.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectFxgls.push(o);} } else { pnids5.push(o.id); pns5.push(o); } return o });
await DB.ProjectFxgl.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids5 } } });
await DB.ProjectFxgl.bulkCreate(newprojectFxgls);
await Promise.all(pns5.map(item => {DB.ProjectFxgl.update(item, {where: {id: item.id}})}));
// 处理 ProjectTzzt
let projectTzzts = body.projectTzzts || [];
let pnids6 = [], pns6 =[],newprojectTzzts = [];
projectTzzts.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectTzzts.push(o);} } else { pnids6.push(o.id); pns6.push(o); } return o });
await DB.ProjectTzzt.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids6 } } });
await DB.ProjectTzzt.bulkCreate(newprojectTzzts);
await Promise.all(pns6.map(item => {DB.ProjectTzzt.update(item, {where: {id: item.id}})}));
// 处理 ProjectJczt
let projectJczts = body.projectJczts || [];
let pnids7 = [], pns7=[], newprojectJczts = [];
projectJczts.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectJczts.push(o);} } else { pnids7.push(o.id); pns7.push(o); } return o });
await DB.ProjectJczt.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids7 } } });
await DB.ProjectJczt.bulkCreate(newprojectJczts);
await Promise.all(pns7.map(item => {DB.ProjectJczt.update(item, {where: {id: item.id}})}));
// // 处理 projectZqrz
// let projectZqrzs = body.projectZqrzs || [];
// let pnids8 = [], newprojectZqrzs = [];
// projectZqrzs.map(o => { if (!o.id) { o.projectId = project.id; newprojectZqrzs.push(o); } else { pnids8.push(o.id) } return o });
// await DB.ProjectZqrz.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids8 } } });
// await DB.ProjectZqrz.bulkCreate(newprojectZqrzs);
// 处理 projectSpyjs // 处理 projectSpyjs
let projectSpyjs = body.projectSpyjs || []; let projectSpyjs = body.projectSpyjs || [];
let pnids9 = [],pns9=[], newprojectSpyjs = []; let pnids9 = [], pns9 = [], newprojectSpyjs = [];
projectSpyjs.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectSpyjs.push(o);} } else { pnids9.push(o.id);pns9.push(o); } return o }); projectSpyjs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectSpyjs.push(o); } } else { pnids9.push(o.id); pns9.push(o); } return o });
await DB.ProjectSpyj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids9 } } }); await DB.ProjectSpyj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids9 } } });
await DB.ProjectSpyj.bulkCreate(newprojectSpyjs); await DB.ProjectSpyj.bulkCreate(newprojectSpyjs);
await Promise.all(pns9.map(item => {DB.ProjectSpyj.update(item, {where: {id: item.id}})})); await Promise.all(pns9.map(item => { DB.ProjectSpyj.update(item, { where: { id: item.id } }) }));
// 处理 projectCwpjzb // 处理 projectCwpjzb
let projectCwpjzbs = body.projectCwpjzbs || []; let projectCwpjzbs = body.projectCwpjzbs || [];
let pnids10 = [], pns10 = [],newprojectCwpjzbs = []; let pnids10 = [], pns10 = [], newprojectCwpjzbs = [];
projectCwpjzbs.map(o => { if (!o.id) { if(!_.isEmpty()) {o.projectId = project.id; newprojectCwpjzbs.push(o); }} else { pnids10.push(o.id);pns10.push(o); } return o }); projectCwpjzbs.map(o => { if (!o.id) { if (!_.isEmpty()) { o.projectId = project.id; newprojectCwpjzbs.push(o); } } else { pnids10.push(o.id); pns10.push(o); } return o });
await DB.ProjectCwpjzb.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids10 } } }); await DB.ProjectCwpjzb.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids10 } } });
await DB.ProjectCwpjzb.bulkCreate(newprojectCwpjzbs); await DB.ProjectCwpjzb.bulkCreate(newprojectCwpjzbs);
await Promise.all(pns10.map(item => {DB.ProjectCwpjzb.update(item, {where: {id: item.id}})})); await Promise.all(pns10.map(item => { DB.ProjectCwpjzb.update(item, { where: { id: item.id } }) }));
// 处理 ProjectLcbjd // 处理 ProjectLcbjd
let projectLcbjds = body.projectLcbjds || []; let projectLcbjds = body.projectLcbjds || [];
let pnids11 = [], pns11 = [],newprojectLcbjds = []; let pnids11 = [], pns11 = [], newprojectLcbjds = [];
projectLcbjds.map(o => { if (!o.id) { if(!_.isEmpty(o)) {o.projectId = project.id; newprojectLcbjds.push(o); }} else { pnids11.push(o.id); pns11.push(o); } return o }); projectLcbjds.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectLcbjds.push(o); } } else { pnids11.push(o.id); pns11.push(o); } return o });
await DB.ProjectLcbjd.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids11 } } }); await DB.ProjectLcbjd.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids11 } } });
await DB.ProjectLcbjd.bulkCreate(newprojectLcbjds); await DB.ProjectLcbjd.bulkCreate(newprojectLcbjds);
await Promise.all(pns11.map(item => {DB.ProjectLcbjd.update(item, {where: {id: item.id}})})); await Promise.all(pns11.map(item => { DB.ProjectLcbjd.update(item, { where: { id: item.id } }) }));
// 处理 projectTzzjll----- // 处理 projectTzzjll-----
...@@ -303,34 +250,373 @@ async function updateProject(req, res, next) { ...@@ -303,34 +250,373 @@ async function updateProject(req, res, next) {
let creProFiles = createIds.map(o => { return { projectId: project.id, fileId: o.id, proFieldKey: o.proFieldKey } }); let creProFiles = createIds.map(o => { return { projectId: project.id, fileId: o.id, proFieldKey: o.proFieldKey } });
await DB.ProjectFile.bulkCreate(creProFiles); await DB.ProjectFile.bulkCreate(creProFiles);
} }
/** if (projectLzType) {
* 根据前端加入的参数区分按钮 更新草稿并提交 更新草稿 TODO: projectInfo.projectLzType = projectLzType;
*/
if (req.body.buttonType === 'submit') {
await DB.FlowRecord.create({
userId: req.user.id,
actionName: '发起项目初审',
projectId: project.id,
});
let approvers = await userModule.getProjectApprover(req.user.id, 'xmgs_xmspr');
if (!(approvers && approvers.length > 0)) {
return res.sendError('项目已保存,请联系管理员为本公司添加【项目初审】角色人员');
}
await DB.Message.create({
projectId: project.id,
creator: req.user.id,
receivers: approvers.map(o => o.id),
type: 2,
content: `项目【${project.name}】已发起初审,请尽快处理!`
});
projectInfo.projectLiuZhuanType = 3; // 待初审
} }
const ret = await DB.Project.update(projectInfo, { where: { id: body.id } }); const ret = await DB.Project.update(projectInfo, { where: { id: body.id } });
return ret;
} catch (error) {
throw error;
}
}
/**
* 立项之前保存
*/
async function saveProjectPreLixiang(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
let ret = await xiangmulixianggengxin(body);
return res.sendData(ret);
} catch (error) {
}
}
/**
* 发起立项
*/
async function startLixiang(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
//记录操作
await DB.FlowRecord.create({
userId: req.user.id,
actionName: '发起项目立项审批',
projectId: project.id,
});
//更新信息和状态
let ret = await xiangmulixianggengxin(body, 3); //状态 3 -- 显示立项审批中
return res.sendData(ret); return res.sendData(ret);
} catch (error) { } catch (error) {
next(error); next(error);
} }
}
async function xiangmujuecegengxin(project, projectLzType) {
// 1. 处理项目
let projectInfo = _.omit(body, ['projectJsgms', 'projectGdxxs', 'projectXmtzzes', 'projectBjtjs',
'projectSpyjs', 'projectFxgls', 'projectTzzts', 'projectJczts', 'projectZqrzs', 'projectCwpjzbs', 'projectLcbjds',
'lxzl', 'lxpfwj', 'xgshcl']);
// 处理 projectJsgms
let projectJsgms = body.projectJsgms || [];
let pnids1 = [], pns1 = [], newprojectJsgms = [];
projectJsgms.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectJsgms.push(o); } } else { pnids1.push(o.id); pns1.push(o); } return o });
await DB.ProjectJsgm.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids1 } } });
await DB.ProjectJsgm.bulkCreate(newprojectJsgms);
await Promise.all(pns1.map(item => { DB.ProjectJsgm.update(item, { where: { id: item.id } }) }));
// 处理 projectGdxxs
let projectGdxxs = body.projectGdxxs || [];
let pnids2 = [], pns2 = [], newprojectGdxxs = [];
projectGdxxs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectGdxxs.push(o); } } else { pnids2.push(o.id); pns2.push(o); } return o });
await DB.ProjectGdxx.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids2 } } });
await DB.ProjectGdxx.bulkCreate(newprojectGdxxs);
await Promise.all(pns2.map(item => { DB.ProjectGdxx.update(item, { where: { id: item.id } }) }));
// 处理 projectXmtzzes
let projectXmtzzes = body.projectXmtzzes || [];
projectXmtzzes = utils.flattenTree(projectXmtzzes, 'xh', 'parentXh');
let pnids3 = [], pns3 = [], newprojectXmtzzes = [];
projectXmtzzes.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectXmtzzes.push(o); } } else { pnids3.push(o.id); pns3.push(o); } return o });
await DB.ProjectXmtzze.bulkCreate(newprojectXmtzzes);
await Promise.all(pns3.map(item => { DB.ProjectXmtzze.update(item, { where: { id: item.id } }) }));
// 处理 projectBjtjs
let projectBjtjs = body.projectBjtjs || [];
let pnids4 = [], pns4 = [], newprojectBjtjs = [];
projectBjtjs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectBjtjs.push(o); } } else { pnids4.push(o.id); pns4.push(o); } return o });
await DB.ProjectBjtj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids4 } } });
await DB.ProjectBjtj.bulkCreate(newprojectBjtjs);
await Promise.all(pns4.map(item => { DB.ProjectBjtj.update(item, { where: { id: item.id } }) }));
// 处理 projectFxgl
let projectFxgls = body.projectFxgls || [];
let pnids5 = [], pns5 = [], newprojectFxgls = [];
projectFxgls.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectFxgls.push(o); } } else { pnids5.push(o.id); pns5.push(o); } return o });
await DB.ProjectFxgl.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids5 } } });
await DB.ProjectFxgl.bulkCreate(newprojectFxgls);
await Promise.all(pns5.map(item => { DB.ProjectFxgl.update(item, { where: { id: item.id } }) }));
// 处理 ProjectTzzt
let projectTzzts = body.projectTzzts || [];
let pnids6 = [], pns6 = [], newprojectTzzts = [];
projectTzzts.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectTzzts.push(o); } } else { pnids6.push(o.id); pns6.push(o); } return o });
await DB.ProjectTzzt.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids6 } } });
await DB.ProjectTzzt.bulkCreate(newprojectTzzts);
await Promise.all(pns6.map(item => { DB.ProjectTzzt.update(item, { where: { id: item.id } }) }));
// 处理 ProjectJczt
let projectJczts = body.projectJczts || [];
let pnids7 = [], pns7 = [], newprojectJczts = [];
projectJczts.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectJczts.push(o); } } else { pnids7.push(o.id); pns7.push(o); } return o });
await DB.ProjectJczt.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids7 } } });
await DB.ProjectJczt.bulkCreate(newprojectJczts);
await Promise.all(pns7.map(item => { DB.ProjectJczt.update(item, { where: { id: item.id } }) }));
let projectSpyjs = body.projectSpyjs || [];
let pnids9 = [], pns9 = [], newprojectSpyjs = [];
projectSpyjs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectSpyjs.push(o); } } else { pnids9.push(o.id); pns9.push(o); } return o });
await DB.ProjectSpyj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids9 } } });
await DB.ProjectSpyj.bulkCreate(newprojectSpyjs);
await Promise.all(pns9.map(item => { DB.ProjectSpyj.update(item, { where: { id: item.id } }) }));
// 处理 projectCwpjzb
let projectCwpjzbs = body.projectCwpjzbs || [];
let pnids10 = [], pns10 = [], newprojectCwpjzbs = [];
projectCwpjzbs.map(o => { if (!o.id) { if (!_.isEmpty()) { o.projectId = project.id; newprojectCwpjzbs.push(o); } } else { pnids10.push(o.id); pns10.push(o); } return o });
await DB.ProjectCwpjzb.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids10 } } });
await DB.ProjectCwpjzb.bulkCreate(newprojectCwpjzbs);
await Promise.all(pns10.map(item => { DB.ProjectCwpjzb.update(item, { where: { id: item.id } }) }));
// 处理 ProjectLcbjd
let projectLcbjds = body.projectLcbjds || [];
let pnids11 = [], pns11 = [], newprojectLcbjds = [];
projectLcbjds.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectLcbjds.push(o); } } else { pnids11.push(o.id); pns11.push(o); } return o });
await DB.ProjectLcbjd.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids11 } } });
await DB.ProjectLcbjd.bulkCreate(newprojectLcbjds);
await Promise.all(pns11.map(item => { DB.ProjectLcbjd.update(item, { where: { id: item.id } }) }));
// 立项资料
let lxzl = body.lxzl || [];
let needIds = []; let createIds = [];
lxzl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'lxzl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'lxzl' } });
// 立项批复文件
let lxpfwj = body.lxpfwj || [];
lxpfwj.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'lxpfwj' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'lxpfwj' } });
// 相关上会材料
let xgshcl = body.xgshcl || [];
xgshcl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'xgshcl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'xgshcl' } });
// 可研材料
let kycl = body.kycl || [];
kycl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'kycl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'kycl' } });
// 经济指标初步测算材料
let jjzbcbcscl = body.jjzbcbcscl || [];
jjzbcbcscl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'jjzbcbcscl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'jjzbcbcscl' } });
// 补充相关支撑材料
let bcxgzccl = body.bcxgzccl || [];
bcxgzccl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'bcxgzccl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'bcxgzccl' } });
// 其他相关支撑材料
let qtxgzccl = body.qtxgzccl || [];
qtxgzccl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'qtxgzccl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'qtxgzccl' } });
// 上会议案
let shya = body.shya || [];
shya.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'shya' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'shya' } });
// 处理文件
//1. 删除
await DB.ProjectFile.destroy({
where: {
projectId: project.id,
fileId: { [Op.notIn]: needIds }
}
});
//2. 创建
if (createIds.length) {
let creProFiles = createIds.map(o => { return { projectId: project.id, fileId: o.id, proFieldKey: o.proFieldKey } });
await DB.ProjectFile.bulkCreate(creProFiles);
}
if(projectLzType) {
projectInfo.projectLzType = projectLzType;
}
const ret = await DB.Project.update(projectInfo, { where: { id: body.id } });
return ret;
}
/**
* 决策保存
*/
async function saveJuece(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
await xiangmujuecegengxin(body);
return res.sendData(ret);
} catch (error) {
next(error);
}
}
async function startJuece(req, res, next) {
try {
let body = req.body;
if (!body.id) {
return res.sendError(errorMessage.resourceNotFound)
}
await DB.FlowRecord.create({
userId: req.user.id,
actionName: '发起项目决策审批',
projectId: project.id,
});
let ret = await xiangmujuecegengxin(body, 7);
return ret;
} catch (error) {
next(error);
}
}
/**
* 更新提交 更新
* @param {*} req
* @param {*} res
* @param {*} next
* @returns
*/
async function updateProject(req, res, next) {
// try {
// let body = req.body;
// if (!body.id) {
// return res.sendError(errorMessage.resourceNotFound)
// }
// // 1. 处理项目
// let project = body;
// let projectInfo = _.omit(body, ['projectJsgms', 'projectGdxxs', 'projectXmtzzes', 'projectBjtjs',
// 'projectSpyjs', 'projectFxgls', 'projectTzzts', 'projectJczts', 'projectZqrzs', 'projectCwpjzbs', 'projectLcbjds',
// 'lxzl', 'lxpfwj', 'xgshcl']);
// // 处理 projectJsgms
// let projectJsgms = body.projectJsgms || [];
// let pnids1 = [], pns1 = [], newprojectJsgms = [];
// projectJsgms.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectJsgms.push(o); } } else { pnids1.push(o.id); pns1.push(o); } return o });
// await DB.ProjectJsgm.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids1 } } });
// await DB.ProjectJsgm.bulkCreate(newprojectJsgms);
// await Promise.all(pns1.map(item => { DB.ProjectJsgm.update(item, { where: { id: item.id } }) }));
// // 处理 projectGdxxs
// let projectGdxxs = body.projectGdxxs || [];
// let pnids2 = [], pns2 = [], newprojectGdxxs = [];
// projectGdxxs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectGdxxs.push(o); } } else { pnids2.push(o.id); pns2.push(o); } return o });
// await DB.ProjectGdxx.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids2 } } });
// await DB.ProjectGdxx.bulkCreate(newprojectGdxxs);
// await Promise.all(pns2.map(item => { DB.ProjectGdxx.update(item, { where: { id: item.id } }) }));
// // 处理 projectXmtzzes
// let projectXmtzzes = body.projectXmtzzes || [];
// projectXmtzzes = utils.flattenTree(projectXmtzzes, 'xh', 'parentXh');
// let pnids3 = [], pns3 = [], newprojectXmtzzes = [];
// projectXmtzzes.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectXmtzzes.push(o); } } else { pnids3.push(o.id); pns3.push(o); } return o });
// await DB.ProjectXmtzze.bulkCreate(newprojectXmtzzes);
// await Promise.all(pns3.map(item => { DB.ProjectXmtzze.update(item, { where: { id: item.id } }) }));
// // 处理 projectBjtjs
// let projectBjtjs = body.projectBjtjs || [];
// let pnids4 = [], pns4 = [], newprojectBjtjs = [];
// projectBjtjs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectBjtjs.push(o); } } else { pnids4.push(o.id); pns4.push(o); } return o });
// await DB.ProjectBjtj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids4 } } });
// await DB.ProjectBjtj.bulkCreate(newprojectBjtjs);
// await Promise.all(pns4.map(item => { DB.ProjectBjtj.update(item, { where: { id: item.id } }) }));
// // 处理 projectFxgl
// let projectFxgls = body.projectFxgls || [];
// let pnids5 = [], pns5 = [], newprojectFxgls = [];
// projectFxgls.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectFxgls.push(o); } } else { pnids5.push(o.id); pns5.push(o); } return o });
// await DB.ProjectFxgl.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids5 } } });
// await DB.ProjectFxgl.bulkCreate(newprojectFxgls);
// await Promise.all(pns5.map(item => { DB.ProjectFxgl.update(item, { where: { id: item.id } }) }));
// // 处理 ProjectTzzt
// let projectTzzts = body.projectTzzts || [];
// let pnids6 = [], pns6 = [], newprojectTzzts = [];
// projectTzzts.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectTzzts.push(o); } } else { pnids6.push(o.id); pns6.push(o); } return o });
// await DB.ProjectTzzt.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids6 } } });
// await DB.ProjectTzzt.bulkCreate(newprojectTzzts);
// await Promise.all(pns6.map(item => { DB.ProjectTzzt.update(item, { where: { id: item.id } }) }));
// // 处理 ProjectJczt
// let projectJczts = body.projectJczts || [];
// let pnids7 = [], pns7 = [], newprojectJczts = [];
// projectJczts.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectJczts.push(o); } } else { pnids7.push(o.id); pns7.push(o); } return o });
// await DB.ProjectJczt.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids7 } } });
// await DB.ProjectJczt.bulkCreate(newprojectJczts);
// await Promise.all(pns7.map(item => { DB.ProjectJczt.update(item, { where: { id: item.id } }) }));
// // // 处理 projectZqrz
// // let projectZqrzs = body.projectZqrzs || [];
// // let pnids8 = [], newprojectZqrzs = [];
// // projectZqrzs.map(o => { if (!o.id) { o.projectId = project.id; newprojectZqrzs.push(o); } else { pnids8.push(o.id) } return o });
// // await DB.ProjectZqrz.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids8 } } });
// // await DB.ProjectZqrz.bulkCreate(newprojectZqrzs);
// // 处理 projectSpyjs
// let projectSpyjs = body.projectSpyjs || [];
// let pnids9 = [], pns9 = [], newprojectSpyjs = [];
// projectSpyjs.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectSpyjs.push(o); } } else { pnids9.push(o.id); pns9.push(o); } return o });
// await DB.ProjectSpyj.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids9 } } });
// await DB.ProjectSpyj.bulkCreate(newprojectSpyjs);
// await Promise.all(pns9.map(item => { DB.ProjectSpyj.update(item, { where: { id: item.id } }) }));
// // 处理 projectCwpjzb
// let projectCwpjzbs = body.projectCwpjzbs || [];
// let pnids10 = [], pns10 = [], newprojectCwpjzbs = [];
// projectCwpjzbs.map(o => { if (!o.id) { if (!_.isEmpty()) { o.projectId = project.id; newprojectCwpjzbs.push(o); } } else { pnids10.push(o.id); pns10.push(o); } return o });
// await DB.ProjectCwpjzb.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids10 } } });
// await DB.ProjectCwpjzb.bulkCreate(newprojectCwpjzbs);
// await Promise.all(pns10.map(item => { DB.ProjectCwpjzb.update(item, { where: { id: item.id } }) }));
// // 处理 ProjectLcbjd
// let projectLcbjds = body.projectLcbjds || [];
// let pnids11 = [], pns11 = [], newprojectLcbjds = [];
// projectLcbjds.map(o => { if (!o.id) { if (!_.isEmpty(o)) { o.projectId = project.id; newprojectLcbjds.push(o); } } else { pnids11.push(o.id); pns11.push(o); } return o });
// await DB.ProjectLcbjd.destroy({ where: { projectId: project.id, id: { [Op.notIn]: pnids11 } } });
// await DB.ProjectLcbjd.bulkCreate(newprojectLcbjds);
// await Promise.all(pns11.map(item => { DB.ProjectLcbjd.update(item, { where: { id: item.id } }) }));
// // 处理 projectTzzjll-----
// // 立项资料
// let lxzl = body.lxzl || [];
// let needIds = []; let createIds = [];
// lxzl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'lxzl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'lxzl' } });
// // 立项批复文件
// let lxpfwj = body.lxpfwj || [];
// lxpfwj.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'lxpfwj' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'lxpfwj' } });
// // 相关上会材料
// let xgshcl = body.xgshcl || [];
// xgshcl.map(o => { if (!o.proFieldKey) { createIds.push({ id: o.id, proFieldKey: 'xgshcl' }) } else { needIds.push(o.id) }; return { fileId: o.id, projectId: project.id, proFieldKey: 'xgshcl' } });
// // 处理文件
// //1. 删除
// await DB.ProjectFile.destroy({
// where: {
// projectId: project.id,
// fileId: { [Op.notIn]: needIds }
// }
// });
// //2. 创建
// if (createIds.length) {
// let creProFiles = createIds.map(o => { return { projectId: project.id, fileId: o.id, proFieldKey: o.proFieldKey } });
// await DB.ProjectFile.bulkCreate(creProFiles);
// }
// /**
// * 根据前端加入的参数区分按钮 更新草稿并提交 更新草稿 TODO:
// */
// if (req.body.buttonType === 'submit') {
// await DB.FlowRecord.create({
// userId: req.user.id,
// actionName: '发起项目初审',
// projectId: project.id,
// });
// let approvers = await userModule.getProjectApprover(req.user.id, 'xmgs_xmspr');
// if (!(approvers && approvers.length > 0)) {
// return res.sendError('项目已保存,请联系管理员为本公司添加【项目初审】角色人员');
// }
// await DB.Message.create({
// projectId: project.id,
// creator: req.user.id,
// receivers: approvers.map(o => o.id),
// type: 2,
// content: `项目【${project.name}】已发起初审,请尽快处理!`
// });
// projectInfo.projectLiuZhuanType = 3; // 待初审
// }
// const ret = await DB.Project.update(projectInfo, { where: { id: body.id } });
// return res.sendData(ret);
// } catch (error) {
// next(error);
// }
} }
...@@ -343,53 +629,53 @@ async function updateProject(req, res, next) { ...@@ -343,53 +629,53 @@ async function updateProject(req, res, next) {
*/ */
async function preJugProject(req, res, next) { async function preJugProject(req, res, next) {
try { try {
let { id } = req.body; // let { id } = req.body;
if (!id) { // if (!id) {
return res.sendError(errorMessage.resourceNotFound) // return res.sendError(errorMessage.resourceNotFound)
} // }
let project = await DB.Project.findOne({ where: { id } }); // let project = await DB.Project.findOne({ where: { id } });
if (!project) { // if (!project) {
return res.sendError(errorMessage.resourceNotFound) // return res.sendError(errorMessage.resourceNotFound)
} // }
/** // /**
* 1. 更新项目状态 5 初审通过 初审不通过则回到状态1 // * 1. 更新项目状态 5 初审通过 初审不通过则回到状态1
*/ // */
if (req.body.buttonType === 'approve') { // if (req.body.buttonType === 'approve') {
await DB.Project.update({ projectLiuZhuanType: 5 }, { where: { id } }); // await DB.Project.update({ projectLiuZhuanType: 5 }, { where: { id } });
//处理项目流转记录 及消息发送TODO: // //处理项目流转记录 及消息发送TODO:
await DB.FlowRecord.create({ // await DB.FlowRecord.create({
userId: req.user.id, // userId: req.user.id,
actionName: '项目初审通过,提交终审', // actionName: '项目初审通过,提交终审',
projectId: project.id, // projectId: project.id,
}); // });
let approvers = await userModule.getProjectApprover(req.user.id, 'jt_xmzs'); // let approvers = await userModule.getProjectApprover(req.user.id, 'jt_xmzs');
if (!(approvers && approvers.length > 0)) { // if (!(approvers && approvers.length > 0)) {
return res.sendError('项目已保存,请联系管理员为本公司添加【项目初审】角色人员'); // return res.sendError('项目已保存,请联系管理员为本公司添加【项目初审】角色人员');
} // }
await DB.Message.create({ // await DB.Message.create({
projectId: project.id, // projectId: project.id,
creator: req.user.id, // creator: req.user.id,
receivers: approvers.map(o => o.id), // receivers: approvers.map(o => o.id),
type: 2, // type: 2,
content: `项目【${project.name}】已发起终审,请尽快处理!` // content: `项目【${project.name}】已发起终审,请尽快处理!`
}); // });
} else { // } else {
await DB.Project.update({ projectLiuZhuanType: 1 }, { where: { id } }); // await DB.Project.update({ projectLiuZhuanType: 1 }, { where: { id } });
//处理项目流转记录 及消息发送TODO: // //处理项目流转记录 及消息发送TODO:
await DB.FlowRecord.create({ // await DB.FlowRecord.create({
userId: req.user.id, // userId: req.user.id,
actionName: '项目初审不通过,退回处理', // actionName: '项目初审不通过,退回处理',
projectId: project.id, // projectId: project.id,
}); // });
let approvers = [project.projectCreator] // let approvers = [project.projectCreator]
await DB.Message.create({ // await DB.Message.create({
projectId: project.id, // projectId: project.id,
creator: req.user.id, // creator: req.user.id,
receivers: approvers.map(o => o.id), // receivers: approvers.map(o => o.id),
type: 2, // type: 2,
content: `项目【${project.name}】已退回,请尽快处理!` // content: `项目【${project.name}】已退回,请尽快处理!`
}); // });
} // }
return res.sendData(); return res.sendData();
} catch (error) { } catch (error) {
...@@ -520,7 +806,7 @@ async function getProjectInfo(req, res, next) { ...@@ -520,7 +806,7 @@ async function getProjectInfo(req, res, next) {
}); });
project = project.toJSON(); project = project.toJSON();
project.projectXmtzzes = utils.buildTree2(project.projectXmtzzes, 'xh', 'parentXh'); project.projectXmtzzes = utils.buildTree2(project.projectXmtzzes, 'xh', 'parentXh');
//处理文件 还原成项目各个字段拥有的文件 //处理文件 还原成项目各个字段拥有的文件
let files = project.files || []; let files = project.files || [];
files = files.map(o => { o.proFieldKey = o.jt_project_file && o.jt_project_file.proFieldKey; delete o.jt_project_file; return o; }); files = files.map(o => { o.proFieldKey = o.jt_project_file && o.jt_project_file.proFieldKey; delete o.jt_project_file; return o; });
...@@ -565,7 +851,7 @@ async function listProject(req, res, next) { ...@@ -565,7 +851,7 @@ async function listProject(req, res, next) {
} }
search.limit = limit; search.limit = limit;
search.offset = offset; search.offset = offset;
if(req.body.attributes && req.body.attributes.length) { if (req.body.attributes && req.body.attributes.length) {
search.attributes = req.body.attributes; search.attributes = req.body.attributes;
} }
let ret = await DB.Project.findAndCountAll(search); let ret = await DB.Project.findAndCountAll(search);
...@@ -673,13 +959,13 @@ async function getOwnProjects(req, res, next) { ...@@ -673,13 +959,13 @@ async function getOwnProjects(req, res, next) {
attributes: ['projectId'], attributes: ['projectId'],
raw: true raw: true
}); });
console.log(messs) // console.log(messs)
let projectIds = messs.map(o => { return o && o.projectId }); let projectIds = messs.map(o => { return o && o.projectId });
// //
let cArr = [ let cArr = [
{ projectCreator: req.user.id }, { projectCreator: req.user.id },
] ]
if(projectIds.length > 0) { if (projectIds.length > 0) {
cArr.push({ id: { [Op.in]: projectIds } }) cArr.push({ id: { [Op.in]: projectIds } })
} }
if (req.body.projectName) { if (req.body.projectName) {
...@@ -695,9 +981,11 @@ async function getOwnProjects(req, res, next) { ...@@ -695,9 +981,11 @@ async function getOwnProjects(req, res, next) {
if (req.body.attributes && req.body.attributes.length) { if (req.body.attributes && req.body.attributes.length) {
search.attributes = req.body.attributes; search.attributes = req.body.attributes;
} }
search.raw = true;
console.log(JSON.stringify(search), "-==") console.log(JSON.stringify(search), "-==")
let ret = await DB.Project.findAndCountAll(search); let ret = await DB.Project.findAndCountAll(search);
return res.sendData(ret); let lastRet = await projectModule.handleProjectData(ret, search.attributes);
return res.sendData(lastRet);
} catch (error) { } catch (error) {
next(error); next(error);
} }
...@@ -714,4 +1002,8 @@ module.exports = { ...@@ -714,4 +1002,8 @@ module.exports = {
preJugProject, preJugProject,
finalJugProject, finalJugProject,
getOwnProjects, getOwnProjects,
startLixiang,
saveJuece,
startJuece,
saveProjectPreLixiang,
} }
\ No newline at end of file
...@@ -182,5 +182,5 @@ Project.hasMany(ProjectXmtzze, { foreignKey: 'projectId', as: 'projectXmtzzes' } ...@@ -182,5 +182,5 @@ Project.hasMany(ProjectXmtzze, { foreignKey: 'projectId', as: 'projectXmtzzes' }
ProjectXmtzze.belongsTo(Project, { foreignKey: 'projectId' }); ProjectXmtzze.belongsTo(Project, { foreignKey: 'projectId' });
/**项目-项目流转记录 */ /**项目-项目流转记录 */
Project.hasMany(FlowRecord, { foreignKey: 'projectId', as: 'flowRecords' }); // Project.hasMany(FlowRecord, { foreignKey: 'projectId', as: 'flowRecords' });
FlowRecord.belongsTo(Project, { foreignKey: 'projectId' }); // FlowRecord.belongsTo(Project, { foreignKey: 'projectId' });
\ No newline at end of file \ No newline at end of file
...@@ -6,4 +6,16 @@ ...@@ -6,4 +6,16 @@
项目公司人员 -- 看见本公司所有项目 项目公司人员 -- 看见本公司所有项目
投管项目审批人员 -- 看见所有项目公司人员 投管项目审批人员 -- 看见所有项目公司人员
1.2 投管新建项目 --- 投管 1.2 投管新建项目 --- 投管
同步发起 一个startFlow 流程记录 发起人 发起时间 项目状态(待审批-已审批) 同步发起 一个startFlow 流程记录 发起人 发起时间 项目状态(待审批-已审批)
\ No newline at end of file
/**
* 处理项目审批及消息 依靠项目状态流转
* 1. 发起人角色为项目公司项目发起人 xmgs_xmfqr;
* 2. 流转状态为 1待处理
* 3. 消息发送给 项目公司项目审批人 xmgs_xmspr,需要写一个审批接口 :项目基本信息不变,状态需要改为 2 项目公司初审:通过则变为3,不通过则变为1;
* 4. 若是投管部门自主创建项目,则项目状态直接到 5 待投管审核---退回则到1
* 5. 投管后续立项推送、决策推送状态再行处理
*/
//B. 找到本公司审批人员发送消息-- 如果找不到人 则提示项目已保存,联系管理员添加【项目公司项目审批人】角色
//A. 创建发起记录
\ No newline at end of file
...@@ -5,7 +5,9 @@ const moment = require('moment') ...@@ -5,7 +5,9 @@ const moment = require('moment')
const User = require('../system/user'); const User = require('../system/user');
const Project = sequelize.define('Project', { const Project = sequelize.define('Project', {
// 定义字段 /**
* 系统基本字段
*/
id: { id: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
primaryKey: true, primaryKey: true,
...@@ -21,161 +23,259 @@ const Project = sequelize.define('Project', { ...@@ -21,161 +23,259 @@ const Project = sequelize.define('Project', {
key: 'id', key: 'id',
}, },
}, },
projectLiuZhuanType: { projectLzType: {
type: DataTypes.STRING, type: DataTypes.INTEGER,
comment: "项目流转状态 1. 待提交、3 待初审、1初审退回、5待终审、1终审退回、7待立项审批、立项审批退回、已立项、已暂停、已结束等", comment: "项目流转状态: 1. 待立项(保存), 3. 立项审批中, 5. 已立项, 7. 决策审批中, 9. 已决策 ",
}, },
projectLiuZhuanTypeDes: { del: {
type: DataTypes.STRING, type: DataTypes.INTEGER,
comment: "项目流转状态说明 待提交 待初审 初审退回 待终审 终审退回 待立项审批 立项审批退回 已立项 已结束等", defaultValue: 0,
comment1: "0 正常 1 删除",
}, },
/**
* 项目基本信息
*/
/** /**
* 决策及批复信息 * 立项字段
*/ */
/**
* 立项字段
*/
//项目基本信息
projectName: { type: DataTypes.STRING, allowNull: true, comment: "项目名称", _mark: "lixiang" },
projectCode: { type: DataTypes.STRING, allowNull: true, comment: "项目编号", _mark: "lixiang" },
sfzjc: { type: DataTypes.INTEGER, allowNull: true, comment: "是否再决策", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" }, // 1是 2 否
projectForeignName: { type: DataTypes.STRING, allowNull: true, comment: "项目外文名称", _mark: "lixiang" },
sfnjlhtxm: { type: DataTypes.INTEGER, allowNull: true, comment: "是否能建联合体项目", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" }, // 1是 2 否
tzzt: { type: DataTypes.STRING, allowNull: true, comment: "投资主体", zjType: 'danxuan', _mark: "lixiang" },
zyfzy: { type: DataTypes.STRING, allowNull: true, comment: "主业/非主业", zjType: 'danxuan', _mark: "lixiang" },
zsqy: { type: DataTypes.STRING, allowNull: true, comment: "直属企业", zjType: 'danxuan', _mark: "lixiang" },
sfnjzdhzytz: { type: DataTypes.INTEGER, allowNull: true, comment: "是否能建重大或重要投资", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
sfzzjc: { type: DataTypes.INTEGER, allowNull: true, comment: "是否自主决策", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
cwbblx: { type: DataTypes.STRING, allowNull: true, comment: "财务报表类型", zjType: 'danxuan', _mark: "lixiang" },
zfsphzbajb: { type: DataTypes.STRING, allowNull: true, comment: "政府审批(核准、备案)级别", zjType: 'danxuan', _mark: "lixiang" },
sflxbqyscx: { type: DataTypes.INTEGER, allowNull: true, comment: "是否履行标前预审程序", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
//项目所在地
jnw: { type: DataTypes.STRING, allowNull: true, comment: "境内/外", zjType: 'danxuan', _mark: "lixiang" },
sjnzjjw: { type: DataTypes.STRING, allowNull: true, comment: "省(境内)/洲际(境外)", zjType: 'danxuan', _mark: "lixiang" },
dsjngjjw: { type: DataTypes.STRING, allowNull: true, comment: "地市(境内)/国家(境外)", zjType: 'danxuan', _mark: "lixiang" },
qxjngjjw: { type: DataTypes.STRING, allowNull: true, comment: "区县(境内)/国家(境外)", zjType: 'danxuan', _mark: "lixiang" },
xmqy: { type: DataTypes.STRING, allowNull: true, comment: "项目区域", zjType: 'danxuan', _mark: "lixiang" },
sfydylyxgj: { type: DataTypes.INTEGER, allowNull: true, comment: "是否一带一路沿线国家", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
/** //计量币种
* 项目公司落实批复信息 bizhong: { type: DataTypes.STRING, allowNull: true, comment: "币种", zjType: 'danxuan', _mark: "lixiang" },
*/ huilv: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "汇率", _mark: "lixiang" },
//实施时间
xmjsqy: { type: DataTypes.STRING, allowNull: true, comment: "项目建设期(月)", _mark: "lixiang" },
yynxn: { type: DataTypes.STRING, allowNull: true, comment: "运营年限(年)", _mark: "lixiang" },
xmhzqn: { type: DataTypes.STRING, allowNull: true, comment: "项目合作期(月)", _mark: "lixiang" },
xmkgsjyj: { type: DataTypes.DATE, allowNull: true, comment: "项目开工时间(预计)", _mark: "lixiang" },
xmjgsjyj: { type: DataTypes.DATE, allowNull: true, comment: "项目交工时间(预计)", _mark: "lixiang" },
//投资分类---投资属性
tzsxyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资属性的一级分类", zjType: 'danxuan', _mark: "lixiang" },
tzsxejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资属性的二级分类", zjType: 'danxuan', _mark: "lixiang" },
tzbk: { type: DataTypes.STRING, allowNull: true, comment: "投资板块", zjType: 'danxuan', _mark: "lixiang" },
subsector: { type: DataTypes.STRING, allowNull: true, comment: "细分板块", zjType: 'danxuan', _mark: "lixiang" },
//投资分类---投资目的
tzmdyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资目的一级分类", zjType: 'danxuan', _mark: "lixiang" },
tzmdejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资目的二级分类", zjType: 'danxuan', _mark: "lixiang" },
sxfl: { type: DataTypes.STRING, allowNull: true, comment: "四新分类", zjType: 'danxuan', _mark: "lixiang" },
//投资分类---投资指南
tzznyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资指南一级分类", zjType: 'danxuan', _mark: "lixiang" },
tzznejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资指南二级分类", zjType: 'danxuan', _mark: "lixiang" },
tzznflgs: { type: DataTypes.STRING, allowNull: true, comment: "投资指南分类概述", _mark: "lixiang" },
gmjjhy: { type: DataTypes.STRING, allowNull: true, comment: "国民经济行业", zjType: 'danxuan', _mark: "lixiang" },
/** //特别关注、特别监管类等信息
* 项目合法合规性附件 sfxbgjfzggwhswbhz: { type: DataTypes.INTEGER, allowNull: true, comment: "是否需报国家发展改革委和商务部核准", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
*/ sfgjldjq: { type: DataTypes.INTEGER, allowNull: true, comment: "是否国家领导见签", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
sfjntbjgl: { type: DataTypes.INTEGER, allowNull: true, comment: "是否境内特别监管类", zjType: 'danxuan', zjKey: 'sf', _mark: "lixiang" },
//建设规模(实物量指标)(表)
/** //股东信息(表)
* 全生命周期策划文件
*/
//项目必要性及可行性
jsnrjgm: { type: DataTypes.TEXT, allowNull: true, comment: "建设内容及规模", _mark: "lixiang" },
xmbyx: { type: DataTypes.TEXT, allowNull: true, comment: "项目必要性", _mark: "lixiang" },
xmkxx: { type: DataTypes.TEXT, allowNull: true, comment: "项目可行性", _mark: "lixiang" },
/** //立项资料 -------- 项目表关联材料表 使用中间表
* 项目绩效评价
*/
// 项目总投资总额(全口径)(表)
/** // 财务评价指标(表)
* 目标责任书考核
*/
//核心边界条件
/** //项目立项信息
* 后评价 qthysyqk: { type: DataTypes.TEXT, allowNull: true, comment: "其他会议审议情况", _mark: "lixiang" },
*/ lxzzpfyj: { type: DataTypes.STRING, allowNull: true, comment: "立项最终批复意见", zjType: 'danxuan', _mark: "lixiang" },
lxxmpfsj: { type: DataTypes.DATE, allowNull: true, comment: "立项项目批复时间", _mark: "lixiang" },
lxxmpfwh: { type: DataTypes.STRING, allowNull: true, comment: "立项项目批复文号", _mark: "lixiang" },
wtgzyyyyyq: { type: DataTypes.TEXT, allowNull: true, comment: "未通过主要原因与要求", _mark: "lixiang" },
// lxpfwj: { type: DataTypes.STRING, allowNull: true, comment: "立项批复文件" },项目表关联材料表 使用中间表
//审批意见 (表 TODO: 看是否分立项、决策两种情况)
/** /**
* 重大事项上报 * 决策字段
*/ */
// projectName: { type: DataTypes.STRING, allowNull: true, comment: "项目名称", _mark: "lixiang" },
// projectForeignName: { type: DataTypes.STRING, allowNull: true, comment: "项目外文名称", },
cym: { type: DataTypes.STRING, allowNull: true, comment: "曾用名", _mark: 'juece' },
// projectCode: { type: DataTypes.STRING, allowNull: true, comment: "项目编号", },
sbdw: { type: DataTypes.STRING, allowNull: true, comment: "申报单位", _mark: 'juece' }, //TODO:下拉选择公司名称,这个需要公司管理的数据
sbdwqygg: { type: DataTypes.STRING, allowNull: true, comment: "申报单位企业规格", _mark: 'juece', zjType: 'danxuan' },
xmztz: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目总投资", _mark: 'juece' },
// zsqy: { type: DataTypes.STRING, allowNull: true, comment: "直属企业", },
glzt: { type: DataTypes.STRING, allowNull: true, comment: "管理主体", _mark: 'juece', zjType: 'danxuan' },
// xmqy: { type: DataTypes.STRING, allowNull: true, comment: "项目区域", zjType: 'danxuan' },
// jnw: { type: DataTypes.STRING, allowNull: true, comment: "境内/外", zjType: 'danxuan' },
// sjnzjjw: { type: DataTypes.STRING, allowNull: true, comment: "省(境内)/洲际(境外)", zjType: 'danxuan' },
// dsjngjjw: { type: DataTypes.STRING, allowNull: true, comment: "地市(境内)/国家(境外)", zjType: 'danxuan' },
// qxjngjjw: { type: DataTypes.STRING, allowNull: true, comment: "区县(境内)/国家(境外)", zjType: 'danxuan' },
// bizhong: { type: DataTypes.STRING, allowNull: true, comment: "币种", zjType: 'danxuan' },
// huilv: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "汇率" },
tzms: { type: DataTypes.STRING, allowNull: true, comment: "投资模式", _mark: 'juece' },
dwqypp: { type: DataTypes.STRING, allowNull: true, comment: "对外签约品牌", _mark: 'juece' },
// sfnjzdhzytz: { type: DataTypes.INTEGER, allowNull: true, comment: "是否能建重大或重要投资", zjType: 'danxuan', zjKey: 'sf', },
xmzjly: { type: DataTypes.STRING, allowNull: true, comment: "项目资金来源", _mark: 'juece', zjType: 'duoxuan' },
// swbxmlx: { type: DataTypes.STRING, allowNull: true, comment: "商务部项目类型", zjType: 'danxuan', },
// gmjjhy: { type: DataTypes.STRING, allowNull: true, comment: "国民经济行业" },
// sfzzjc: { type: DataTypes.INTEGER, allowNull: true, comment: "是否自主决策", },
// cwbblx: { type: DataTypes.STRING, allowNull: true, comment: "财务报表类型", zjType: 'danxuan', },
// xmlx: { type: DataTypes.STRING, allowNull: true, comment: "项目类型", zjType: 'danxuan', },
// yynxn: { type: DataTypes.STRING, allowNull: true, comment: "运营年限(年)" },
// zyfzy: { type: DataTypes.STRING, allowNull: true, comment: "主业/非主业", zjType: 'danxuan', },
// xmhzqn: { type: DataTypes.STRING, allowNull: true, comment: "项目合作期(月)" },
njzgb: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "能建占股比", _mark: 'juece' },
// xmjsqy: { type: DataTypes.STRING, allowNull: true, comment: "项目建设期(月)" },
// xmkgsjyj: { type: DataTypes.DATE, allowNull: true, comment: "项目开工时间(预计)" },
// xmjgsjyj: { type: DataTypes.DATE, allowNull: true, comment: "项目交工时间(预计)" },
// sfnjlhtxm: { type: DataTypes.INTEGER, allowNull: true, comment: "是否能建联合体项目", zjType: 'danxuan', zjKey: 'sf', }, // 1是 2 否
sfyjlx: { type: DataTypes.INTEGER, allowNull: true, comment: "是否已经立项", _mark: 'juece', zjType: 'danxuan', zjKey: 'sf', },
sfzdqy: { type: DataTypes.INTEGER, allowNull: true, comment: "是否重点区域", _mark: 'juece', zjType: 'danxuan', zjKey: 'sf' }, //1是 2否
zdqy: { type: DataTypes.STRING, allowNull: true, comment: "重点区域", _mark: 'juece', zjType: 'danxuan', },//下拉
// jsnrjgm: { type: DataTypes.TEXT, allowNull: true, comment: "建设内容及规模" },
glxm: { type: DataTypes.STRING, allowNull: true, comment: "关联项目", _mark: 'juece', },//TODO:关联项目 关联关系
lxr: { type: DataTypes.STRING, allowNull: true, comment: "联系人", _mark: 'juece', },
lxrdh: { type: DataTypes.STRING, allowNull: true, comment: "联系人电话", _mark: 'juece', },
tzhsfs: { type: DataTypes.STRING, allowNull: true, comment: "投资回收方式", _mark: 'juece', zjType: 'danxuan', },
cblrl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "成本利润率", _mark: 'juece', },
// wtgzyyyyyq: { type: DataTypes.TEXT, allowNull: true, comment: "未通过主要原因与要求" },
// tzsxyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资属性的一级分类" },
// tzsxejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资属性的二级分类" },
// tzbk: { type: DataTypes.STRING, allowNull: true, comment: "投资板块" },
// subsector: { type: DataTypes.STRING, allowNull: true, comment: "细分板块" },
// tzmdyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资目的一级分类" },
// tzmdejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资目的二级分类" },
// sxfl: { type: DataTypes.STRING, allowNull: true, comment: "四新分类" },
// tzznyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资指南一级分类" },
// tzznejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资指南二级分类" },
// tzznflgs: { type: DataTypes.STRING, allowNull: true, comment: "投资指南分类概述" },
// sfzjc: { type: DataTypes.INTEGER, allowNull: true, comment: "是否再决策", zjType: 'danxuan', zjKey: 'sf', }, // 1是 2 否
sfnrbtml: { type: DataTypes.STRING, allowNull: true, comment: "是否纳入补贴目录", _mark: 'juece', zjType: 'danxuan', zjKey: 'sf' },
// sfxbgjfzggwhswbhz: { type: DataTypes.INTEGER, allowNull: true, comment: "是否需报国家发展改革委和商务部核准" },
// sfgjldjq: { type: DataTypes.INTEGER, allowNull: true, comment: "是否国家领导见签" },
// sfjntbjgl: { type: DataTypes.INTEGER, allowNull: true, comment: "是否境内特别监管类" },
// sfydylyxgj: { type: DataTypes.INTEGER, allowNull: true, comment: "是否一带一路沿线国家" },
//建设规模(实物量指标)---立项表格
gsgllc: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "高速公路里程", _mark: 'juece' },
qtsfgllc: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "其他收费公路里程", _mark: 'juece' },
//政府审批(核准、备案)文件
sfyjzfsp: { type: DataTypes.INTEGER, allowNull: true, comment: "是否已经政府审批", _mark: 'juece', zjType: 'danxuan', zjKey: 'sf' }, //1是 2否
spdwmc: { type: DataTypes.STRING, allowNull: true, comment: "审批单位名称(全称)" , _mark: 'juece', },
pwwh: { type: DataTypes.STRING, allowNull: true, comment: "批文文号" , _mark: 'juece', },
// spjb: { type: DataTypes.STRING, allowNull: true, comment: "审批级别" }, //TODO:下拉
spje: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "审批金额(万元)" , _mark: 'juece', },
spsj: { type: DataTypes.DATE, allowNull: true, comment: "审批时间" , _mark: 'juece', },
//股东信息 ---立项表格 --TODO:需要按照股东类型计算合计,再计算总合计
wfczrjcgbl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "我方出资人及持股比例" , _mark: 'juece', },
sjnjfsgdw: { type: DataTypes.STRING, allowNull: true, comment: "涉及能建方施工单位" , _mark: 'juece', },
// 我方担保及股权融资情况
wffzdgqrzjewy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "我方负责的股权融资金额(万元)" , _mark: 'juece', },
rzcbgq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "融资成本股权" , _mark: 'juece', },
qxgq: { type: DataTypes.INTEGER, allowNull: true, comment: "期限股权", _mark: 'juece', },
dbje: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "担保金额" , _mark: 'juece', },
//我方担保及债权融资情况
wffzdzqrzjewy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "我方负责的债权融资金额(万元)" , _mark: 'juece', },
rzcbzq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "融资成本债权", _mark: 'juece', },
qxzq: { type: DataTypes.INTEGER, allowNull: true, comment: "期限债权" , _mark: 'juece', },
yjldsjzq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "预计落地时间债权" , _mark: 'juece', },
//工程带动情况
ddgchte: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "带动工程合同额" , _mark: 'juece', },
tzddb: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "投资带动比", _mark: 'juece', },
gclrwy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "工程利润(万元)" , _mark: 'juece', },
gclrl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "工程利润率(%)" , _mark: 'juece', },
xmbyx: { type: DataTypes.TEXT, allowNull: true, comment: "项目必要性" , _mark: 'juece', },
qtsm: { type: DataTypes.TEXT, allowNull: true, comment: "其他说明" , _mark: 'juece', },
//风险管理---立项已经建表TODO: 是否区分决策
//里程碑节点 --同上
//里程碑计划审批表 关联projectFile ---- lcbjhspb
//投评决策资料(以下都是 关联projectFile ---- )
// kycl: { type: DataTypes.STRING, allowNull: true, comment: "可研材料" },
// jjzbcbcscl: { type: DataTypes.STRING, allowNull: true, comment: "经济指标初步测算材料" },
// bcxgzccl: { type: DataTypes.STRING, allowNull: true, comment: "补充相关支撑材料" },
// qtxgzccl: { type: DataTypes.STRING, allowNull: true, comment: "其他相关支撑材料" },
// shya: { type: DataTypes.STRING, allowNull: true, comment: "上会议案" },
// 财务指标 ---暂时搁置
// 投决计划 ---暂时搁置
// 项目投资总额--有增加
// 财务评价指标--有增加
//核心边界条件--不变
// 决策主体审核情况 -- 立项已经建表
// 投资主体审核情况 -- 立项已经建表
// qthysyqk: { type: DataTypes.TEXT, allowNull: true, comment: "其他会议审议情况" },
jcqthysyqk: { type: DataTypes.TEXT, allowNull: true, comment: "决策-其他会议审议情况" , _mark: 'juece',},
jczzpfyj: { type: DataTypes.STRING, allowNull: true, comment: "决策-最终批复意见", _mark: 'juece', },
jcxmpfsj: { type: DataTypes.DATE, allowNull: true, comment: "决策-项目批复时间" , _mark: 'juece',},
jcxmpfwh: { type: DataTypes.STRING, allowNull: true, comment: "决策-项目批复文号" , _mark: 'juece',},
jcwtgzyyyyyq: { type: DataTypes.TEXT, allowNull: true, comment: "决策-未通过主要原因与要求" , _mark: 'juece',},
// jcspyj 审批意见 -- 立项已经建表 --- 是否按照决策区分
tzztscsbsj: { type: DataTypes.DATE, allowNull: true, comment: " 申报时间" , _mark: 'juece',},
hqwcsj: { type: DataTypes.DATE, allowNull: true, comment: "会签完成时间", _mark: 'juece', },
scfhsj: { type: DataTypes.DATE, allowNull: true, comment: "首次发函时间" , _mark: 'juece',},
bczlsj: { type: DataTypes.DATE, allowNull: true, comment: "补充资料时间" , _mark: 'juece',},
shr: { type: DataTypes.STRING, allowNull: true, comment: "审核人" , _mark: 'juece',},
//申请报告---暂时搁置
/**
* 投资分析
*/
/** /**------------------------------------------------------------------------------------------------ */
* 投资检查
*/
/**
* 投资回收
*/
/**
* 管理费上缴
*/
/**
* PPP整改方案
*/
/**
* 项目结束/暂停(备案资料)
*/
del: {
type: DataTypes.INTEGER,
defaultValue: 0,
comment1: "0 正常 1 删除",
},
/*------------------------------------------------------- */
//项目基本信息
projectName: { type: DataTypes.STRING, allowNull: true, comment: "项目名称", _mark: "xmjbxx" },
projectCode: { type: DataTypes.STRING, allowNull: true, comment: "项目编号", _mark: "xmjbxx" },
cym: { type: DataTypes.STRING, allowNull: true, comment: "曾用名", _mark: "xmjbxx" },
sfzjc: { type: DataTypes.INTEGER, allowNull: true, comment: "是否再决策", zjType: 'danxuan', zjKey: 'sf', _mark: "xmjbxx" }, // 1是 2 否
projectForeignName: { type: DataTypes.STRING, allowNull: true, comment: "项目外文名称", _mark: "xmjbxx" },
sfnjlhtxm: { type: DataTypes.INTEGER, allowNull: true, comment: "是否能建联合体项目", zjType: 'danxuan', zjKey: 'sf', _mark: "xmjbxx" }, // 1是 2 否
applicationUnit: { type: DataTypes.STRING, allowNull: true, comment: "申报单位", _mark: "xmjbxx" },
zyfzy: { type: DataTypes.STRING, allowNull: true, comment: "主业/非主业", zjType: 'danxuan', _mark: "xmjbxx" }, //TODO:下拉
zsqy: { type: DataTypes.STRING, allowNull: true, comment: "直属企业", _mark: "xmjbxx" },
sfnjzdhzytz: { type: DataTypes.INTEGER, allowNull: true, comment: "是否能建重大或重要投资", zjType: 'danxuan', zjKey: 'sf', _mark: "xmjbxx" },
sfzzjc: { type: DataTypes.INTEGER, allowNull: true, comment: "是否自主决策", _mark: "xmjbxx" },
cwbblx: { type: DataTypes.STRING, allowNull: true, comment: "财务报表类型", zjType: 'danxuan', _mark: "xmjbxx" }, //TODO:下拉
zfsphzbajb: { type: DataTypes.STRING, allowNull: true, comment: "政府审批(核准、备案)级别", zjType: 'danxuan', _mark: "xmjbxx" }, //TODO:下拉
sflxbqyscx: { type: DataTypes.INTEGER, allowNull: true, comment: "是否履行标前预审程序", zjType: 'danxuan', zjKey: 'sf', _mark: "xmjbxx" },
xmztz: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目总投资", _mark: "xmjbxx" },
glzt: { type: DataTypes.STRING, allowNull: true, comment: "管理主体", _mark: "xmjbxx" },
tzms: { type: DataTypes.STRING, allowNull: true, comment: "投资模式", _mark: "xmjbxx" },
dwqypp: { type: DataTypes.STRING, allowNull: true, comment: "对外签约品牌", _mark: "xmjbxx" },
xmzjly: { type: DataTypes.STRING, allowNull: true, comment: "项目资金来源", _mark: "xmjbxx" },
swbxmlx: { type: DataTypes.STRING, allowNull: true, comment: "商务部项目类型", zjType: 'danxuan', _mark: "xmjbxx" }, //TODO:下拉
xmlx: { type: DataTypes.STRING, allowNull: true, comment: "项目类型", zjType: 'danxuan', _mark: "xmjbxx" }, //TODO:下拉
sfpppxm: { type: DataTypes.INTEGER, allowNull: true, comment: "是否PPP项目", zjType: 'danxuan', zjKey: 'sf', _mark: "xmjbxx" },
//项目所在地
jnw: { type: DataTypes.STRING, allowNull: true, comment: "境内/外", zjType: 'danxuan' },//TODO:下拉
sjnzjjw: { type: DataTypes.STRING, allowNull: true, comment: "省(境内)/洲际(境外)", zjType: 'danxuan' },//TODO:下拉
dsjngjjw: { type: DataTypes.STRING, allowNull: true, comment: "地市(境内)/国家(境外)", zjType: 'danxuan' },//TODO:下拉
qxjngjjw: { type: DataTypes.STRING, allowNull: true, comment: "区县(境内)/国家(境外)", zjType: 'danxuan' },//TODO:下拉
xmqy: { type: DataTypes.STRING, allowNull: true, comment: "项目区域", zjType: 'danxuan' },//TODO:下拉
sfydylyxgj: { type: DataTypes.INTEGER, allowNull: true, comment: "是否一带一路沿线国家", zjType: 'danxuan', zjKey: 'sf' },
//计量币种
bizhong: { type: DataTypes.STRING, allowNull: true, comment: "币种", zjType: 'danxuan' },//TODO:下拉
huilv: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "汇率" },
//实施时间
xmjsqy: { type: DataTypes.STRING, allowNull: true, comment: "项目建设期(月)" },
yynxn: { type: DataTypes.STRING, allowNull: true, comment: "运营年限(年)" },
xmhzqn: { type: DataTypes.STRING, allowNull: true, comment: "项目合作期(月)" },
xmkgsjyj: { type: DataTypes.DATE, allowNull: true, comment: "项目开工时间(预计)" },
xmjgsjyj: { type: DataTypes.DATE, allowNull: true, comment: "项目交工时间(预计)" },
//投资分类
tzsxyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资属性的一级分类" },//TODO:下拉
tzsxejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资属性的二级分类" },//TODO:下拉
tzbk: { type: DataTypes.STRING, allowNull: true, comment: "投资板块" },//TODO:下拉
subsector: { type: DataTypes.STRING, allowNull: true, comment: "细分板块" },//TODO:下拉
tzmdyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资目的一级分类" },//TODO:下拉
tzmdejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资目的二级分类" },//TODO:下拉
sxfl: { type: DataTypes.STRING, allowNull: true, comment: "四新分类" },//TODO:下拉
tzznyjfl: { type: DataTypes.STRING, allowNull: true, comment: "投资指南一级分类" },//TODO:下拉
tzznejfl: { type: DataTypes.STRING, allowNull: true, comment: "投资指南二级分类" },//TODO:下拉
tzznflgs: { type: DataTypes.STRING, allowNull: true, comment: "投资指南分类概述" },
gmjjhy: { type: DataTypes.STRING, allowNull: true, comment: "国民经济行业" },//TODO:下拉
sfnrbtml: { type: DataTypes.STRING, allowNull: true, comment: "是否纳入补贴目录" },
njsfqtf: { type: DataTypes.INTEGER, allowNull: true, comment: "能建是否牵头方" }, //1是 2否
sfylx: { type: DataTypes.INTEGER, allowNull: true, comment: "是否已立项" }, //1是 2否
sfzdqy: { type: DataTypes.INTEGER, allowNull: true, comment: "是否重点区域" }, //1是 2否
zdqy: { type: DataTypes.STRING, allowNull: true, comment: "重点区域" },//下拉
// 特别关注、特别监管类等信息
sfxbgjfzggwhswbhz: { type: DataTypes.INTEGER, allowNull: true, comment: "是否需报国家发展改革委和商务部核准" },//TODO:下拉
sfgjldjq: { type: DataTypes.INTEGER, allowNull: true, comment: "是否国家领导见签" },//TODO:下拉
sfjntbjgl: { type: DataTypes.INTEGER, allowNull: true, comment: "是否境内特别监管类" },//TODO:下拉
//建设规模(实物量指标)
//股东信息
//项目必要性及可行性
jsnrjgm: { type: DataTypes.TEXT, allowNull: true, comment: "建设内容及规模" },
xmbyx: { type: DataTypes.TEXT, allowNull: true, comment: "项目必要性" },
xmkxx: { type: DataTypes.TEXT, allowNull: true, comment: "项目可行性" },
qtsm: { type: DataTypes.STRING, allowNull: true, comment: "其他说明" },
//立项资料 -------- 项目表关联材料表 使用中间表
// 项目投资总额
// xmzbjwy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金(万元)" },
//
wfczrjcgbl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "我方出资人及持股比例" },
sjnjfsgdw: { type: DataTypes.STRING, allowNull: true, comment: "涉及能建方施工单位" },
// 财务评价指标(表)
// 财务评价指标(表)
// xmtznbsylsq: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "项目投资内部收益率(税前)" }, // xmtznbsylsq: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "项目投资内部收益率(税前)" },
// xmtznbsylsh: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "项目投资内部收益率(税后)" }, // xmtznbsylsh: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "项目投资内部收益率(税后)" },
// xmzbjnbsyl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "项目资本金内部收益率" }, // xmzbjnbsyl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "项目资本金内部收益率" },
...@@ -192,74 +292,25 @@ const Project = sequelize.define('Project', { ...@@ -192,74 +292,25 @@ const Project = sequelize.define('Project', {
/** /**
* 项目投资总额(全口径) * 项目投资总额(全口径)
*/ */
xmzjgcjasbfrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_建安设备费(人民币/外币)" }, // xmzjgcjasbfrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_建安设备费(人民币/外币)" },
xmzjgcqtfyrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_其他费用(人民币/外币)" }, // xmzjgcqtfyrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_其他费用(人民币/外币)" },
xmzjgcqztdxgfyrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_其中:土地相关费用(人民币/外币)" }, // xmzjgcqztdxgfyrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_其中:土地相关费用(人民币/外币)" },
xmzjgcjbybfrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_基本预备费(人民币/外币)" }, // xmzjgcjbybfrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_基本预备费(人民币/外币)" },
xmzjgcjsqlxrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_建设期利息(人民币/外币)" }, // xmzjgcjsqlxrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目造价构成_建设期利息(人民币/外币)" },
// xmztzrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目总投资(人民币/外币)" }, // // xmztzrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目总投资(人民币/外币)" },
xmzbjrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金(人民币/外币)" }, // xmzbjrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金(人民币/外币)" },
xmzbjnjfczrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金_能建方出资(人民币/外币)" }, // xmzbjnjfczrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金_能建方出资(人民币/外币)" },
xmzbjwbgdrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金_外部股东(人民币/外币)" }, // xmzbjwbgdrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目资本金_外部股东(人民币/外币)" },
dkrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "贷款(人民币/外币)" }, // dkrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "贷款(人民币/外币)" },
dkqzfbbxmwfdkdbermbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "贷款_其中:非并表项目我方贷款/担保额(人民币/外币)" }, // dkqzfbbxmwfdkdbermbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "贷款_其中:非并表项目我方贷款/担保额(人民币/外币)" },
qtczrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "其他出资(人民币/外币)" }, // qtczrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "其他出资(人民币/外币)" },
qtczqznjfczrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "其他出资_其中:能建方出资(人民币/外币)" }, // qtczqznjfczrmbwb: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "其他出资_其中:能建方出资(人民币/外币)" },
pfztz: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "批复总投资" }, // pfztz: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "批复总投资" },
//特别关注、特别监管类等信息
sfydylyxgj: { type: DataTypes.INTEGER, allowNull: true, comment: "是否一带一路沿线国家" },
//核心边界与条件
//项目立项信息
qthysyqk: { type: DataTypes.TEXT, allowNull: true, comment: "其他会议审议情况" },
lxzzpfyj: { type: DataTypes.STRING, allowNull: true, comment: "立项最终批复意见" },
lxxmpfsj: { type: DataTypes.DATE, allowNull: true, comment: "立项项目批复时间" },
lxxmpfwh: { type: DataTypes.STRING, allowNull: true, comment: "立项项目批复文号" },
wtgzyyyyyq: { type: DataTypes.TEXT, allowNull: true, comment: "未通过主要原因与要求" },
// lxpfwj: { type: DataTypes.STRING, allowNull: true, comment: "立项批复文件" },项目表关联材料表 使用中间表
//审批意见 (表 TODO: 看是否分立项、决策两种情况)
// 我方担保及股权融资情况
wffzdgqrzjewy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "我方负责的股权融资金额(万元)" },
rzcbgq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "融资成本股权" },
qxgq: { type: DataTypes.INTEGER, allowNull: true, comment: "期限股权" },
dbje: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "担保金额" },
//我方担保及债权融资情况
wffzdzqrzjewy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "我方负责的债权融资金额(万元)" },
rzcbzq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "融资成本债权" },
qxzq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "期限债权" },
yjldsjzq: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "预计落地时间债权" },
// 带动情况
ddgchte: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "带动工程合同额" },
tzddb: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "投资带动比" },
gclrwy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "工程利润(万元)" },
gclrl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "工程利润率(%)" },
tzztscsbsj: { type: DataTypes.DATE, allowNull: true, comment: "投资主体首次申报时间" },
hqwcsj: { type: DataTypes.DATE, allowNull: true, comment: "会签完成时间" },
scfhsj: { type: DataTypes.DATE, allowNull: true, comment: "首次发函时间" },
bczlsj: { type: DataTypes.DATE, allowNull: true, comment: "补充资料时间" },
shr: { type: DataTypes.STRING, allowNull: true, comment: "审核人" },
jcqthysyqk: { type: DataTypes.TEXT, allowNull: true, comment: "决策-其他会议审议情况" },
jczzpfyj: { type: DataTypes.STRING, allowNull: true, comment: "决策-最终批复意见" },
jcxmpfsj: { type: DataTypes.DATE, allowNull: true, comment: "决策-项目批复时间" },
jcxmpfwh: { type: DataTypes.STRING, allowNull: true, comment: "决策-项目批复文号" },
jcwtgzyyyyyq: { type: DataTypes.TEXT, allowNull: true, comment: "决策-未通过主要原因与要求" },
//政府审批(核准、备案)文件
sfyjzfsp: { type: DataTypes.INTEGER, allowNull: true, comment: "是否已经政府审批" }, //1是 2否
spdwmc: { type: DataTypes.STRING, allowNull: true, comment: "审批单位名称(全称)" },
pwwh: { type: DataTypes.STRING, allowNull: true, comment: "批文文号" },
spjb: { type: DataTypes.STRING, allowNull: true, comment: "审批级别" }, //TODO:下拉
spje: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "审批金额(万元)" },
spsj: { type: DataTypes.DATE, allowNull: true, comment: "审批时间" },
//里程碑计划审批表文件
// //
// ---从此往下待确定--- // // ---从此往下待确定--- //
...@@ -623,7 +674,7 @@ const Project = sequelize.define('Project', { ...@@ -623,7 +674,7 @@ const Project = sequelize.define('Project', {
// sbdwjcsj: { type: DataTypes.DATE, allowNull: true, comment: "申报单位决策时间" }, // sbdwjcsj: { type: DataTypes.DATE, allowNull: true, comment: "申报单位决策时间" },
// //
// syly: { type: DataTypes.STRING, allowNull: true, comment: "收益来源" }, // syly: { type: DataTypes.STRING, allowNull: true, comment: "收益来源" },
// njzgb: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "能建占股比" }, //
// cblrl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "成本利润率" }, // cblrl: { type: DataTypes.DECIMAL(3, 2), allowNull: true, comment: "成本利润率" },
// zqqx: { type: DataTypes.STRING, allowNull: true, comment: "债权期限" }, // zqqx: { type: DataTypes.STRING, allowNull: true, comment: "债权期限" },
// zbjtzdthsq: { type: DataTypes.DATE, allowNull: true, comment: "资本金投资动态回收期" }, // zbjtzdthsq: { type: DataTypes.DATE, allowNull: true, comment: "资本金投资动态回收期" },
...@@ -735,7 +786,7 @@ const Project = sequelize.define('Project', { ...@@ -735,7 +786,7 @@ const Project = sequelize.define('Project', {
// xscbxsfy2: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "销售成本(销售费用)" }, // xscbxsfy2: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "销售成本(销售费用)" },
// zbsjx: { type: DataTypes.STRING, allowNull: true, comment: "指标数据项" }, // zbsjx: { type: DataTypes.STRING, allowNull: true, comment: "指标数据项" },
// sjzb: { type: DataTypes.STRING, allowNull: true, comment: "实际指标" }, // sjzb: { type: DataTypes.STRING, allowNull: true, comment: "实际指标" },
// xmztz: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "项目总投资" }, //
// jaf: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "建安费" }, // jaf: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "建安费" },
// sbjgjgzf: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "设备及工具购置费" }, // sbjgjgzf: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "设备及工具购置费" },
// tdxgfy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "土地相关费用" }, // tdxgfy: { type: DataTypes.DECIMAL(19, 8), allowNull: true, comment: "土地相关费用" },
...@@ -1506,12 +1557,9 @@ const Project = sequelize.define('Project', { ...@@ -1506,12 +1557,9 @@ const Project = sequelize.define('Project', {
/* ----------------------------- */ /* ----------------------------- */
// fxgl: { type: DataTypes.STRING, allowNull: true, comment: "风险管理" }, // fxgl: { type: DataTypes.STRING, allowNull: true, comment: "风险管理" },
// lcbjd: { type: DataTypes.STRING, allowNull: true, comment: "里程碑节点" }, // lcbjd: { type: DataTypes.STRING, allowNull: true, comment: "里程碑节点" },
// 里程碑计划审批表 //
// kycl: { type: DataTypes.STRING, allowNull: true, comment: "可研材料" },
// jjzbcbcscl: { type: DataTypes.STRING, allowNull: true, comment: "经济指标初步测算材料" }, //
// bcxgzccl: { type: DataTypes.STRING, allowNull: true, comment: "补充相关支撑材料" },
// qtxgzccl: { type: DataTypes.STRING, allowNull: true, comment: "其他相关支撑材料" },
// shya: { type: DataTypes.STRING, allowNull: true, comment: "上会议案" },
/* ----------------------------- */ /* ----------------------------- */
...@@ -1768,8 +1816,7 @@ const Project = sequelize.define('Project', { ...@@ -1768,8 +1816,7 @@ const Project = sequelize.define('Project', {
get() { get() {
const rawValue = this.getDataValue('createdAt'); const rawValue = this.getDataValue('createdAt');
return rawValue ? moment(rawValue).format('YYYY-MM-DD HH:mm:ss') : ''; return rawValue ? moment(rawValue).format('YYYY-MM-DD HH:mm:ss') : '';
}, }
_mark: 'xmjbxx'
}, },
updatedAt: { // 同样处理 updatedAt updatedAt: { // 同样处理 updatedAt
type: DataTypes.DATE, type: DataTypes.DATE,
......
...@@ -5,8 +5,6 @@ const _ = require("lodash"); ...@@ -5,8 +5,6 @@ const _ = require("lodash");
const { Op } = require('sequelize'); const { Op } = require('sequelize');
const sequelize = require('sequelize'); const sequelize = require('sequelize');
const moment = require('moment'); const moment = require('moment');
const userModule = require('../module/userModule');
const projectModule = require('../module/projectModule');
...@@ -14,18 +12,63 @@ const projectModule = require('../module/projectModule'); ...@@ -14,18 +12,63 @@ const projectModule = require('../module/projectModule');
async function handleProjectData(ret, queryAttrs) { async function handleProjectData(ret, queryAttrs) {
let rawAttributes = DB.Project.rawAttributes; let rawAttributes = _.cloneDeep(DB.Project.rawAttributes);
console.log(rawAttributes, "====") console.log(ret, "====")
let queryRawAtr = []; let queryRawAtr = [], resourceKeys = [];
for (let index = 0; index < queryAttrs.length; index++) { for (let index = 0; index < queryAttrs.length; index++) {
const element = queryAttrs[index]; const element = queryAttrs[index];
if(rawAttributes[element]) { if (rawAttributes[element]) {
queryRawAtr.push(rawAttributes[element]); queryRawAtr.push(rawAttributes[element]); //查询得所有字段
if (['danxuan'].includes(rawAttributes[element] && rawAttributes[element].zjType)) { //其中需要处理的资源库字段,单选、
resourceKeys.push(element);
}
} }
} }
console.log(queryRawAtr); let resources = await getResourceByKeys(resourceKeys);
let groupAttr = _.groupBy(queryRawAtr, 'zjType');
return groupAttr; let newRet = [];
for (let index = 0; index < ret.rows.length; index++) {
const element = ret.rows[index];
console.log(element);
for (const key in element) {
if(!_.isEmpty(resources[key])) {
element[key] = resources[key][element[key]]
}
}
newRet.push(element);
}
//获取对应得资源库说明
ret.rows = newRet;
return ret;
}
async function getResourceByKeys(keys) {
if (!(keys && keys.length)) {
return {};
}
let ret = await DB.Resources.findAll({
where: { key: { [Op.in]: keys } ,del: 0},
include: [
{
model: DB.ResourcesInfo,
as: 'resourcesInfos',
}
]
});
let obj = {};
for (let index = 0; index < ret.length; index++) {
const element = ret[index];
element.resourcesInfos = element.resourcesInfos || [];
let oobj = {};
for (let i = 0; i < element.resourcesInfos.length; i++) {
const e = element.resourcesInfos[i];
oobj[e.key] = e.value;
}
obj[element.key] = oobj;
}
return obj;
} }
......
...@@ -8,12 +8,25 @@ const projectController = require('../controller/projectController'); ...@@ -8,12 +8,25 @@ const projectController = require('../controller/projectController');
/** /**
* 项目相关 * 项目相关
*/ */
router.post('/createProject', projectController.createProject);
//获取项目可选字段--字符串 数值 单选 多选 //表格字段不能导出,可以rongyu存储到表内再行导出
router.post('/getProjectFields', projectController.getProjectFields);
router.post('/createProject', projectController.createProject); //创建项目
router.post('/saveProjectPreLixiang', projectController.saveProjectPreLixiang); //保存项目
router.post('/startLixiang', projectController.startLixiang);//发起立项审批----TODO:待完成与能建对接
// -----------------------接收能建立项结果信息,更新立项批复信息等字段------------------------------------------
router.post('/saveJuece', projectController.saveJuece); //决策保存
router.post('/startJuece', projectController.startJuece);
router.post('/updateProject', projectController.updateProject); router.post('/updateProject', projectController.updateProject);
router.post('/deleteProject', projectController.deleteProject); router.post('/deleteProject', projectController.deleteProject);
router.post('/listProject', projectController.listProject); router.post('/listProject', projectController.listProject);
router.post('/getProjectInfo', projectController.getProjectInfo); router.post('/getProjectInfo', projectController.getProjectInfo);
router.post('/getProjectFields', projectController.getProjectFields);
router.post('/exportExcel', projectController.exportExcel); router.post('/exportExcel', projectController.exportExcel);
......
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