fee_rates_facade.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. /**
  2. * Created by chen on 2017/8/2.
  3. */
  4. let async_n = require("async");
  5. let mongoose = require('mongoose');
  6. let feeRateModel = mongoose.model('fee_rates');
  7. let feeRateFileModel = mongoose.model('fee_rate_file');
  8. let std_fee_rate_lib_model = mongoose.model('std_fee_rate_libs');
  9. let billModel=require('../../main/models/bills');//mongoose.model('bills');
  10. let projectsModel = mongoose.model('projects');
  11. let consts = require('../../main/models/project_consts');
  12. let _=require("lodash");
  13. let template = require('../controllers/feerate_template');
  14. let logger = require("../../../logs/log_helper").logger;
  15. const uuidV1 = require('uuid/v1');
  16. let EngineeringLibModel = require("../../users/models/engineering_lib_model");
  17. module.exports={
  18. save:save,
  19. getData:getData,
  20. getFeeRateStandardsByProjectID:getFeeRateStandardsByProjectID,
  21. changeFeeRateStandard:changeFeeRateStandard,
  22. checkFeeRateName:checkFeeRateName,
  23. getChangeInfo:getChangeInfo,
  24. changeFeeRateFileFromCurrent:changeFeeRateFileFromCurrent,
  25. changeFeeRateFileFromOthers:changeFeeRateFileFromOthers,
  26. newFeeRateFile:newFeeRateFile,
  27. getFeeRatesByProject:getFeeRatesByProject,
  28. getGCFeeRateFiles: getGCFeeRateFiles ,
  29. setFeeRateToBill:setFeeRateToBill,
  30. updateFeeRate:updateFeeRate,
  31. updateFeeRates:updateFeeRates,
  32. updateRates:update_rates,
  33. feeRateFileSaveAs:feeRateFileSaveAs,
  34. getFeeRateByID:getFeeRateByID,
  35. changeFeeRateFile:changeFeeRateFile
  36. };
  37. let operationMap={
  38. 'ut_create':create_fee_rate,
  39. 'ut_update':update_fee_rate,
  40. 'ut_delete':delete_fee_rate
  41. };
  42. let updateFunctionMap = {
  43. 'normalUpdate':normalUpdate,
  44. 'update_rates':update_rates,
  45. 'updateStatusBySelected':updateStatusBySelected,
  46. 'feeRateFileSaveAs':feeRateFileSaveAs
  47. }
  48. function create_fee_rate() {
  49. }
  50. function update_fee_rate(user_id,datas) {
  51. if(datas.updateFunction){
  52. return updateFunctionMap[datas.updateFunction](user_id,datas);
  53. }else {
  54. return normalUpdate(user_id,datas);
  55. }
  56. }
  57. function updateStatusBySelected(user_id,datas) {
  58. return function(callback){
  59. feeRateModel.bulkWrite(generateUpdateTaks(datas.tasks),function (err,data) {
  60. console.log(data);
  61. commonCallback(callback,data,err);
  62. })
  63. }
  64. }
  65. function feeRateFileSaveAs(user_id,datas) {
  66. return function(callback){
  67. let doc = datas.doc;
  68. let projectID=datas.query.projectID;
  69. let feeRate={
  70. ID:doc.feeRateID,
  71. rates:doc.rates
  72. };
  73. delete doc._id;
  74. delete doc.rates;
  75. creatFeeRateFile(doc,feeRate,projectID).then(function (result) {
  76. commonCallback(callback,result,result.err);
  77. })
  78. }
  79. }
  80. async function creatFeeRateFile(feeRateFile,feeRate,projectID) {//预留projectID
  81. let result={
  82. err:null
  83. }
  84. try {
  85. let feeFile={
  86. id:feeRateFile.ID,
  87. name:feeRateFile.name
  88. }
  89. await projectsModel.findOneAndUpdate({ID:projectID},{'property.feeFile':feeFile});
  90. await feeRateFileModel.create(feeRateFile);
  91. await feeRateModel.create(feeRate);
  92. }catch (err){
  93. console.log(err);
  94. result.err=err;
  95. }
  96. return result;
  97. }
  98. function normalUpdate(user_id,datas) {
  99. return function(callback){
  100. console.log(datas)
  101. callback(null,'');
  102. }
  103. }
  104. function generateUpdateTaks(updateTasks) {
  105. var tasks=[];
  106. for(let u of updateTasks){
  107. let t ={
  108. updateOne:{
  109. filter:u.query,
  110. update: u.doc
  111. }
  112. }
  113. tasks.push(t);
  114. }
  115. return tasks;
  116. }
  117. function update_rates(user_id,datas) {
  118. return function(callback){
  119. feeRateModel.findOne(datas.query,['rates'],function(err, data){
  120. let doc = datas.doc;
  121. if(_.isArray(doc)){
  122. _.forEach(doc,function (item) {
  123. data.rates[item.rateIndex]=item.rate;
  124. })
  125. }else {
  126. data.rates[doc.rateIndex]=doc.rate;
  127. }
  128. data.save(function (err) {
  129. commonCallback(callback,'',err);
  130. });
  131. })
  132. }
  133. }
  134. function delete_fee_rate() {
  135. }
  136. function save (user_id, datas, callback) {
  137. let operations=[];
  138. if(_.isArray(datas)){
  139. for(let i=0;i<datas.length;i++){
  140. operations.push(operationMap[datas[i].updateType](user_id,datas[i]));
  141. }
  142. }else {
  143. operations.push(operationMap[datas.updateType](user_id,datas));
  144. }
  145. async_n.parallel(operations,function (err,results) {
  146. if(err){
  147. callback(err,'');
  148. }else {
  149. if(results.length==1){
  150. callback(null,results[0])
  151. }else {
  152. callback(null,results)
  153. }
  154. }
  155. })
  156. }
  157. function getData(projectID, callback) {
  158. getFeeRateData(projectID).then(function (result) {
  159. if(result.err){
  160. callback(1, '', null);
  161. }else {
  162. //feeRateModel
  163. callback(0, consts.projectConst.FEERATE, result.datas);
  164. }
  165. })
  166. }
  167. async function getFeeRateData(projectID) {
  168. let result={
  169. err:null
  170. }
  171. try {
  172. //
  173. /* let getProjectGLJ = +new Date();
  174. console.log("取项目工料机数据-----"+(getProjectGLJ - getenderData));*/
  175. let project = await projectsModel.findOne({ID:projectID});
  176. if (project&&project.property&&project.property.feeFile){
  177. let feeRateData = await feeRateFileModel.findOne({'ID':project.property.feeFile.id,deleteInfo:null});
  178. if(feeRateData===null){
  179. result.datas=[];
  180. }else {
  181. let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
  182. feeRateData._doc.rates = feeRate?feeRate.rates:[];
  183. //
  184. feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
  185. result.datas = feeRateData;
  186. }
  187. }else {
  188. result.datas=[];
  189. }
  190. logger.info("get fee rate data");
  191. }catch (err){
  192. console.log(err);
  193. result.err=err;
  194. }
  195. return result;
  196. }
  197. async function getUsageProjects(feeRateID){
  198. let projects = await projectsModel.find({'property.feeFile.id':feeRateID,'deleteInfo':null});
  199. return projects;
  200. }
  201. function commonCallback(callback,result,err) {
  202. if(err){
  203. callback(err,'');
  204. }else {
  205. callback(null,result);
  206. }
  207. }
  208. async function getFeeRateStandardsByProjectID(projectID) {
  209. logger.info("get feeRate standard, projectID:"+projectID)
  210. let feeRateStandards=[];
  211. let project = await projectsModel.findOne({ID:projectID});
  212. let temFee = await feeRateFileModel.findOne({ID:project.property.feeFile.id});
  213. feeRateStandards.push({ID:temFee.libID,libName:temFee.libName});
  214. /* let engineeringLibModel = new EngineeringLibModel();
  215. let engineeringInfo = project !== null && project.property.engineering_id !== undefined ?
  216. await engineeringLibModel.getEngineering(project.property.engineering_id) : null;
  217. if(engineeringInfo!=null){
  218. let fee_lib = engineeringInfo.fee_lib;
  219. for(let lib of fee_lib){
  220. feeRateStandards.push({ID:lib.id,libName:lib.name});
  221. }
  222. }*/
  223. return feeRateStandards;
  224. }
  225. async function changeFeeRateStandard(jdata){
  226. let data = JSON.parse(jdata);
  227. let template = await std_fee_rate_lib_model.findOne({"ID":data.newLibID});
  228. let newFeeRate = {};
  229. newFeeRate.ID =uuidV1();
  230. newFeeRate.rates=template.rates;
  231. (newFeeRate.rates || []).forEach(item => item.originalRate = item.rate);
  232. await feeRateModel.create(newFeeRate);
  233. let doc={
  234. libID:data.newLibID,
  235. libName:template.libName,
  236. feeRateID: newFeeRate.ID
  237. };
  238. await feeRateFileModel.findOneAndUpdate({ID:data.feeRateFileID,deleteInfo:null},doc);
  239. await feeRateModel.deleteOne({ID:data.feeRateID});
  240. doc.rates=newFeeRate.rates;
  241. return doc;
  242. }
  243. async function newFeeRateFile(userId, updateData){
  244. if(updateData.property !== null){
  245. let property = updateData.property;
  246. logger.info("Create new feeRate file for project :"+updateData.ID);
  247. let feeFile = property.feeFile;
  248. let rootProjectID = property.rootProjectID;
  249. let name = updateData.name;
  250. let newFeeRate = {};
  251. if(feeFile.id.indexOf("newFeeRate")!=-1){
  252. let temFee = await feeRateFileModel.findOne({rootProjectID:rootProjectID,name:name,deleteInfo:null});
  253. if(temFee){
  254. newFeeRate.id=temFee.ID;
  255. newFeeRate.name = temFee.name;
  256. return newFeeRate;
  257. }
  258. let temA = feeFile.id.split("@@");
  259. let libID = temA[1];
  260. let doc={
  261. userID: userId,
  262. rootProjectID:rootProjectID,
  263. name:name
  264. };
  265. if(libID!== ''){
  266. let template = await std_fee_rate_lib_model.findOne({"ID":libID});
  267. let newFeeRate = {};
  268. newFeeRate.ID =uuidV1();
  269. newFeeRate.rates=template.rates;
  270. (newFeeRate.rates || []).forEach(item => item.originalRate = item.rate);
  271. await feeRateModel.create(newFeeRate);
  272. doc.libID = libID;
  273. doc.libName = template.libName;
  274. doc.feeRateID = newFeeRate.ID;
  275. }
  276. doc.ID = uuidV1();
  277. await feeRateFileModel.create(doc);
  278. newFeeRate.id = doc.ID;
  279. newFeeRate.name =doc.name;
  280. return newFeeRate;
  281. }else {
  282. return feeFile
  283. }
  284. }
  285. return null;
  286. }
  287. async function checkFeeRateName(jdata) {
  288. let data = JSON.parse(jdata);
  289. let count = await feeRateFileModel.count({rootProjectID:data.rootProjectID,name:data.name,deleteInfo:null});
  290. if(count>0){
  291. return true;
  292. }
  293. return false;
  294. }
  295. async function getChangeInfo(jdata,compilation){
  296. let data = JSON.parse(jdata);
  297. //{ rootProjectID: 99, user_id: '76075' }
  298. const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted':false}];
  299. let result={};
  300. let treeData = [];
  301. let currentProject = await projectsModel.findOne({'ID':data.rootProjectID},['ID','NextSiblingID','ParentID','name']); //{projectID:99,name:'建设项目1'};//dummy 数据
  302. let currentTender = await projectsModel.findOne({ID: data.projectID, $or: notDeleted});
  303. if(currentProject){
  304. //剔除自身
  305. let currentFeeFile = await getFeeRatesByProject(data.rootProjectID);
  306. let currentUsedFF = currentTender.property.feeFile.id;
  307. currentProject._doc.currentOptions = _.filter(currentFeeFile, function (ff) {
  308. return ff.ID !== currentUsedFF;
  309. });
  310. }
  311. //根据用户ID 找除了当前项目的其它建设项目;
  312. let others =await projectsModel.find({'$and': [
  313. {'$or':[{'userID': data.user_id,'compilation': compilation,'projType':'Project', 'deleteInfo': null}, {'userID': data.user_id,'compilation': compilation,'projType':'Project', 'deleteInfo.deleted': {'$in': [null, false]}}]},
  314. { 'ID':{'$nin':[data.rootProjectID]}}
  315. ]},['ID','NextSiblingID','ParentID','name']);
  316. for(let o of others){
  317. o._doc.optionList = await getFeeRatesByProject(o.ID);
  318. }
  319. //获取对应用户所有文件夹
  320. let folders = await projectsModel.find({userID: data.user_id, $or: notDeleted, projType: 'Folder'}, ['ID','NextSiblingID','ParentID','name']);
  321. treeData = treeData.concat(currentProject);
  322. treeData = treeData.concat(others);
  323. treeData = treeData.concat(folders);
  324. result.currentProject=currentProject;
  325. result.others = others;
  326. result.treeData = treeData;
  327. return result;
  328. }
  329. async function getFeeRatesByProject(rootProjectID) {
  330. let feeRates = await feeRateFileModel.find({rootProjectID:rootProjectID,deleteInfo:null},['ID','name']);
  331. return feeRates;
  332. }
  333. async function setFeeRateToBill(data){
  334. data=JSON.parse(data);
  335. if(data.hasOwnProperty('bills')){
  336. await billModel.model.findOneAndUpdate(data.bills.query,data.bills.doc);
  337. }
  338. if(data.hasOwnProperty('feeRate')){
  339. await feeRateModel.findOneAndUpdate(data.feeRate.query,data.feeRate.doc);
  340. }
  341. return "ok";
  342. }
  343. async function updateFeeRate(data) {
  344. data=JSON.parse(data);
  345. return await feeRateModel.findOneAndUpdate(data.query,data.doc);
  346. }
  347. async function updateFeeRates(datas){//批量更新费率
  348. datas = JSON.parse(datas);
  349. let tasks = [];
  350. for(let d of datas){
  351. let task = {
  352. updateOne:{
  353. filter:d.query,
  354. update:d.doc
  355. }
  356. }
  357. tasks.push(task);
  358. }
  359. tasks.length > 0 ? await feeRateModel.bulkWrite(tasks) : '';
  360. return 'OK';
  361. }
  362. async function changeFeeRateFileFromCurrent(jdata){
  363. let data = JSON.parse(jdata);
  364. let newFeeRateFile=data.newFeeRateFile;
  365. await changeFeeRateFile(data,newFeeRateFile,0);
  366. let feeRateData = await feeRateFileModel.findOne({'ID':newFeeRateFile.id});
  367. if(feeRateData!==null){
  368. let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
  369. feeRateData._doc.rates = feeRate.rates;
  370. }
  371. //
  372. feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
  373. return feeRateData;
  374. }
  375. async function changeFeeRateFile(projectData,feeRateFile,type,userID) {
  376. let temFile=null,newFeeRateFile = {};
  377. if(type == 0){//从本建设项目中替换,直接赋值
  378. temFile = feeRateFile
  379. }else if(type == 1) {//从其它建设项目中复制
  380. let oldFeeRateFile = await feeRateFileModel.findOne({'ID':feeRateFile.id});
  381. let feeRate = await feeRateModel.findOne({ID:oldFeeRateFile.feeRateID});
  382. let newFeeRate={};
  383. if(! feeRate){
  384. throw '不存在对应费率文件';
  385. }
  386. newFeeRate.ID=uuidV1();
  387. newFeeRate.rates =feeRate.rates;
  388. newFeeRateFile.ID = uuidV1();
  389. newFeeRateFile.name = feeRateFile.name;
  390. newFeeRateFile.userID = userID;
  391. newFeeRateFile.libName = oldFeeRateFile.libName;
  392. newFeeRateFile.libID=oldFeeRateFile.libID;
  393. newFeeRateFile.rootProjectID = projectData.rootProjectID;
  394. newFeeRateFile.feeRateID =newFeeRate.ID;
  395. await feeRateModel.create(newFeeRate);
  396. await feeRateFileModel.create(newFeeRateFile);
  397. temFile={
  398. id:newFeeRateFile.ID,
  399. name:feeRateFile.name
  400. };
  401. newFeeRateFile.rates=newFeeRate.rates;//构建返回数据
  402. }
  403. await projectsModel.findOneAndUpdate({ID:projectData.projectID},{'property.feeFile':temFile});
  404. return newFeeRateFile
  405. }
  406. async function changeFeeRateFileFromOthers(jdata) {
  407. let data = JSON.parse(jdata);
  408. let newFeeRateFile = await changeFeeRateFile(data,{id:data.feeRateFileID,name:data.name},1,data.userID);
  409. /* let feeRateFile = await feeRateFileModel.findOne({'ID':data.feeRateFileID});
  410. let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID});
  411. let newFeeRate={};
  412. newFeeRate.ID=uuidV1();
  413. newFeeRate.rates =feeRate.rates;
  414. let newFeeRateFile = {};
  415. newFeeRateFile.ID = uuidV1();
  416. newFeeRateFile.name = data.name;
  417. newFeeRateFile.userID = data.userID;
  418. newFeeRateFile.libName = feeRateFile.libName;
  419. newFeeRateFile.libID=feeRateFile.libID;
  420. newFeeRateFile.rootProjectID = data.rootProjectID;
  421. newFeeRateFile.feeRateID =newFeeRate.ID;
  422. await feeRateModel.create(newFeeRate);
  423. await feeRateFileModel.create(newFeeRateFile);
  424. let feeFile={
  425. id:newFeeRateFile.ID,
  426. name:data.name
  427. }
  428. await projectsModel.findOneAndUpdate({ID:data.projectID},{'property.feeFile':feeFile});
  429. newFeeRateFile.rates=newFeeRate.rates;*/
  430. newFeeRateFile.usageProjects=await getUsageProjects(newFeeRateFile.ID);
  431. return newFeeRateFile;
  432. }
  433. async function getGCFeeRateFiles(userID){
  434. return await feeRateFileModel.find({userID: userID, 'deleteInfo.deleted': true, '$or': [{'deleteInfo.completeDeleted': false}, {'deleteInfo.completeDeleted': null}]});
  435. }
  436. async function getFeeRateByID(ID) {
  437. let feeRateFile = await feeRateFileModel.findOne({'ID':ID}, '-_id');
  438. let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID}, '-_id');
  439. return [feeRateFile,feeRate]
  440. }