|
@@ -17,6 +17,8 @@ module.exports={
|
|
|
getShareInfoMap,
|
|
|
getRecentShareList,
|
|
|
getProjectShareList,
|
|
|
+ getShareTip,
|
|
|
+ getShareState,
|
|
|
moveProject:moveProject,
|
|
|
accessToCopyProject,
|
|
|
copyProject:copyProject,
|
|
@@ -105,7 +107,7 @@ import SectionTreeDao from '../../complementary_ration_lib/models/sectionTreeMod
|
|
|
let sectionTreeDao = new SectionTreeDao();
|
|
|
import CounterModel from "../../glj/models/counter_model";
|
|
|
import moment from 'moment-timezone';
|
|
|
-import billsFlags from '../../common/const/bills_fixed';
|
|
|
+const { fixedFlag } = require('../../../public/common_constants');
|
|
|
const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
|
|
|
import {
|
|
|
defaultDecimal,
|
|
@@ -268,26 +270,65 @@ async function getRecentShareList(userID, count) {
|
|
|
}
|
|
|
|
|
|
// 获取某项目的分享记录
|
|
|
-async function getProjectShareList(projectID) {
|
|
|
- const sharedList = await shareListModel.find({ projectID }).lean();
|
|
|
+async function getProjectShareList(projectID, limit = null) {
|
|
|
+ const sharedList = limit
|
|
|
+ ? await shareListModel.find({ projectID }).lean().sort({ shareDate: -1 }).limit(limit)
|
|
|
+ : await shareListModel.find({ projectID }).lean().sort({ shareDate: -1 });
|
|
|
const userIDs = [];
|
|
|
const userMap = {};
|
|
|
- sharedList.forEach(item => {
|
|
|
+ sharedList.forEach((item, index) => {
|
|
|
userIDs.push(item.receiver);
|
|
|
userMap[item.receiver] = item;
|
|
|
+ userMap[item.receiver].index = index;
|
|
|
});
|
|
|
const userObjectIDs = userIDs.map(userID => mongoose.Types.ObjectId(userID));
|
|
|
const users = await userModel.find({_id: {$in: userObjectIDs}}, 'real_name mobile company').lean();
|
|
|
users.forEach(user => {
|
|
|
const matched = userMap[user._id];
|
|
|
if (matched) {
|
|
|
+ user.index = matched.index;
|
|
|
user.allowCopy = matched.allowCopy;
|
|
|
user.allowCooperate = matched.allowCooperate;
|
|
|
}
|
|
|
});
|
|
|
+ users.sort((a, b) => a.index - b.index);
|
|
|
return users;
|
|
|
}
|
|
|
|
|
|
+// 获取分享的提示(造价书分享按钮tooltip使用)
|
|
|
+async function getShareTip(projectID, limit) {
|
|
|
+ const task = [
|
|
|
+ getProjectShareList(projectID, limit),
|
|
|
+ shareListModel.count({ projectID })
|
|
|
+ ];
|
|
|
+ const [users, count] = await Promise.all(task);
|
|
|
+ return users.reduce((acc, user, index) => {
|
|
|
+ if (index === 0) {
|
|
|
+ acc += '已分享给';
|
|
|
+ acc += user.real_name;
|
|
|
+ } else {
|
|
|
+ acc += ` ${user.real_name}`;
|
|
|
+ }
|
|
|
+ if (index === users.length - 1 && count > limit) {
|
|
|
+ acc += `等${count}人`;
|
|
|
+ }
|
|
|
+ return acc;
|
|
|
+ }, '');
|
|
|
+}
|
|
|
+
|
|
|
+// 获取项目的分享状态
|
|
|
+// 分享项目的拷贝和编辑性,需要参考父项
|
|
|
+// 以项目链上最新更新的分享数据为准
|
|
|
+async function getShareState(projectID, receiver) {
|
|
|
+ const projectIDs = await getUpChainIDs(projectID);
|
|
|
+ const shareList = await shareListModel.find({ projectID: { $in: projectIDs }, receiver }).lean();
|
|
|
+ shareList.sort((a, b) => Date.parse(b.updateDate) - Date.parse(a.updateDate));
|
|
|
+ return {
|
|
|
+ allowCopy: shareList[0] && shareList[0].allowCopy || false,
|
|
|
+ allowCooperate: shareList[0] && shareList[0].allowCooperate || false
|
|
|
+ };
|
|
|
+}
|
|
|
+
|
|
|
//拷贝例题项目
|
|
|
//@param {String}userID {Array}projIDs拷贝的例题项目ID(建设项目、文件夹)@return {Boolean}
|
|
|
async function copyExample(userID, compilation, projIDs){
|
|
@@ -1046,13 +1087,13 @@ async function getTendersFeeInfo(tenders) {
|
|
|
let IDMapping = {};
|
|
|
//固定清单类别与汇总金额字段映射
|
|
|
let flagFieldMapping = {};
|
|
|
- flagFieldMapping[billsFlags.ENGINEERINGCOST] = 'engineeringCost';
|
|
|
- flagFieldMapping[billsFlags.SUB_ENGINERRING] = 'subEngineering';
|
|
|
- flagFieldMapping[billsFlags.MEASURE] = 'measure';
|
|
|
- flagFieldMapping[billsFlags.SAFETY_CONSTRUCTION] = 'safetyConstruction';
|
|
|
- flagFieldMapping[billsFlags.OTHER] = 'other';
|
|
|
- flagFieldMapping[billsFlags.CHARGE] = 'charge';
|
|
|
- flagFieldMapping[billsFlags.TAX] = 'tax';
|
|
|
+ flagFieldMapping[fixedFlag.ENGINEERINGCOST] = 'engineeringCost';
|
|
|
+ flagFieldMapping[fixedFlag.SUB_ENGINERRING] = 'subEngineering';
|
|
|
+ flagFieldMapping[fixedFlag.MEASURE] = 'measure';
|
|
|
+ flagFieldMapping[fixedFlag.SAFETY_CONSTRUCTION] = 'safetyConstruction';
|
|
|
+ flagFieldMapping[fixedFlag.OTHER] = 'other';
|
|
|
+ flagFieldMapping[fixedFlag.CHARGE] = 'charge';
|
|
|
+ flagFieldMapping[fixedFlag.TAX] = 'tax';
|
|
|
let tenderIDs = [];
|
|
|
if(tenders.length > 0){
|
|
|
for(let tender of tenders){
|
|
@@ -1061,8 +1102,8 @@ async function getTendersFeeInfo(tenders) {
|
|
|
IDMapping[tender.ID]['buildingArea'] = '';
|
|
|
}
|
|
|
//需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金
|
|
|
- let needFlags = [billsFlags.ENGINEERINGCOST, billsFlags.SUB_ENGINERRING, billsFlags.MEASURE,
|
|
|
- billsFlags.SAFETY_CONSTRUCTION, billsFlags.CHARGE, billsFlags.OTHER, billsFlags.TAX];
|
|
|
+ let needFlags = [fixedFlag.ENGINEERINGCOST, fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE,
|
|
|
+ fixedFlag.SAFETY_CONSTRUCTION, fixedFlag.CHARGE, fixedFlag.OTHER, fixedFlag.TAX];
|
|
|
//获取单位工程汇总金额需要用到的所有清单
|
|
|
let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: notDeleted},
|
|
|
'-_id projectID fees flags');
|
|
@@ -1072,7 +1113,7 @@ async function getTendersFeeInfo(tenders) {
|
|
|
let costField = flagFieldMapping[billsFlag];
|
|
|
IDMapping[bills.projectID][costField] = getTotalFee(bills, 'common');
|
|
|
//暂估合价(工程造价暂估合价)
|
|
|
- if (billsFlag === billsFlags.ENGINEERINGCOST){
|
|
|
+ if (billsFlag === fixedFlag.ENGINEERINGCOST){
|
|
|
IDMapping[bills.projectID]['estimate'] = getTotalFee(bills, 'estimate');
|
|
|
}
|
|
|
}
|
|
@@ -1088,28 +1129,28 @@ async function getTendersFeeInfo(tenders) {
|
|
|
}
|
|
|
|
|
|
const defaultSummaryField = {
|
|
|
- [billsFlags.ENGINEERINGCOST]: {
|
|
|
+ [fixedFlag.ENGINEERINGCOST]: {
|
|
|
items: [
|
|
|
{ name: 'engineeringCost', feeName: 'common' },
|
|
|
{ name: 'estimate', feeName: 'estimate' }
|
|
|
]
|
|
|
},
|
|
|
- [billsFlags.SUB_ENGINERRING]: {
|
|
|
+ [fixedFlag.SUB_ENGINERRING]: {
|
|
|
items: [{ name: 'subEngineering', feeName: 'common' }]
|
|
|
},
|
|
|
- [billsFlags.MEASURE]: {
|
|
|
+ [fixedFlag.MEASURE]: {
|
|
|
items: [{ name: 'measure', feeName: 'common' }]
|
|
|
},
|
|
|
- [billsFlags.SAFETY_CONSTRUCTION]: {
|
|
|
+ [fixedFlag.SAFETY_CONSTRUCTION]: {
|
|
|
items: [{ name: 'safetyConstruction', feeName: 'common' }]
|
|
|
},
|
|
|
- [billsFlags.OTHER]: {
|
|
|
+ [fixedFlag.OTHER]: {
|
|
|
items: [{ name: 'other', feeName: 'common' }]
|
|
|
},
|
|
|
- [billsFlags.CHARGE]: {
|
|
|
+ [fixedFlag.CHARGE]: {
|
|
|
items: [{ name: 'charge', feeName: 'common' }]
|
|
|
},
|
|
|
- [billsFlags.TAX]: {
|
|
|
+ [fixedFlag.TAX]: {
|
|
|
items: [{ name: 'tax', feeName: 'common' }]
|
|
|
}
|
|
|
};
|
|
@@ -1260,13 +1301,13 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
|
|
|
}
|
|
|
if (!feeFields) {
|
|
|
feeFields = [
|
|
|
- {k: billsFlags.ENGINEERINGCOST, v: 'engineeringCost'},
|
|
|
- {k: billsFlags.SUB_ENGINERRING, v: 'subEngineering'},
|
|
|
- {k: billsFlags.MEASURE, v: 'measure'},
|
|
|
- {k: billsFlags.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
|
|
|
- {k: billsFlags.OTHER, v: 'other'},
|
|
|
- {k: billsFlags.CHARGE, v: 'charge'},
|
|
|
- {k: billsFlags.TAX, v: 'tax'}
|
|
|
+ {k: fixedFlag.ENGINEERINGCOST, v: 'engineeringCost'},
|
|
|
+ {k: fixedFlag.SUB_ENGINERRING, v: 'subEngineering'},
|
|
|
+ {k: fixedFlag.MEASURE, v: 'measure'},
|
|
|
+ {k: fixedFlag.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
|
|
|
+ {k: fixedFlag.OTHER, v: 'other'},
|
|
|
+ {k: fixedFlag.CHARGE, v: 'charge'},
|
|
|
+ {k: fixedFlag.TAX, v: 'tax'}
|
|
|
];
|
|
|
}
|
|
|
// 项目总造价的各个费用,k为汇总的字段,v为工程造价的费用字段
|
|
@@ -1336,7 +1377,7 @@ async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
|
|
|
let costField = flagFieldMapping[billsFlag];
|
|
|
IDMapping[bills.projectID][costField] = getTotalFee(bills, 'common');
|
|
|
// 工程造价各费用
|
|
|
- if (billsFlag === billsFlags.ENGINEERINGCOST){
|
|
|
+ if (billsFlag === fixedFlag.ENGINEERINGCOST){
|
|
|
engineeringCostFields.forEach(({k, v}) => {
|
|
|
IDMapping[bills.projectID][k] = getTotalFee(bills, v);
|
|
|
});
|
|
@@ -2402,10 +2443,19 @@ async function importProjects(data,req,updateData) {
|
|
|
|
|
|
|
|
|
async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgramFileIDMap){
|
|
|
- let bills = [],rations = [],projectGLJs = [],rationGLJs=[],rationCoes=[],quantityDetails=[],rationInstallations=[],rationTemplates=[],evaluateList=[],bidList=[],contractorList=[];
|
|
|
+ let bills = [],rations = [],projectGLJs = [],installationFees=[],rationGLJs=[],rationCoes=[],quantityDetails=[],rationInstallations=[],rationTemplates=[],evaluateList=[],bidList=[],contractorList=[];
|
|
|
let newProjectSetting =null,newCalcProgramsFile = null,newLabourCoe = null;
|
|
|
let billsIDMap = {},projectGLJIDMap={},rationIDMap = {};
|
|
|
let newProjectID = projectIDMap[data.projSetting.projectID];
|
|
|
+ //生成安装增加费设置
|
|
|
+ if(data.installationFees && data.installationFees.length > 0){
|
|
|
+ for(let ins of data.installationFees){
|
|
|
+ delete ins._id;
|
|
|
+ ins.ID = uuidV1();
|
|
|
+ ins.projectID = newProjectID;
|
|
|
+ installationFees.push(ins);
|
|
|
+ }
|
|
|
+ }
|
|
|
//生成新的清单;
|
|
|
if(data.bills && data.bills.length > 0){
|
|
|
for(let b of data.bills){
|
|
@@ -2479,6 +2529,7 @@ async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgra
|
|
|
if(newProjectSetting) await projectSettingModel.create(newProjectSetting);
|
|
|
if(bills.length > 0) await insertMany(bills,billsModel);
|
|
|
if(rations.length > 0) await insertMany(rations,rationModel);
|
|
|
+ if(installationFees.length > 0) await insertMany(installationFees,installationFeeModel);
|
|
|
if(projectGLJs.length > 0) await insertMany(projectGLJs,gljListModel);
|
|
|
if(rationGLJs.length > 0) await insertMany(rationGLJs,rationGLJModel);
|
|
|
if(rationCoes.length > 0) await insertMany(rationCoes,rationCoeModel);
|