fee_rates_facade.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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. const scMathUtil = require('../../../public/scMathUtil').getUtil();
  18. module.exports={
  19. save:save,
  20. getData:getData,
  21. getFeeRateStandardsByProjectID:getFeeRateStandardsByProjectID,
  22. changeFeeRateStandard:changeFeeRateStandard,
  23. checkFeeRateName:checkFeeRateName,
  24. getChangeInfo:getChangeInfo,
  25. changeFeeRateFileFromCurrent:changeFeeRateFileFromCurrent,
  26. changeFeeRateFileFromOthers:changeFeeRateFileFromOthers,
  27. newFeeRateFile:newFeeRateFile,
  28. getFeeRatesByProject:getFeeRatesByProject,
  29. getGCFeeRateFiles: getGCFeeRateFiles ,
  30. setFeeRateToBill:setFeeRateToBill,
  31. updateFeeRate:updateFeeRate,
  32. updateFeeRates:updateFeeRates,
  33. updateRates:update_rates,
  34. feeRateFileSaveAs:feeRateFileSaveAs,
  35. getFeeRateByID:getFeeRateByID,
  36. changeFeeRateFile:changeFeeRateFile
  37. };
  38. let operationMap={
  39. 'ut_create':create_fee_rate,
  40. 'ut_update':update_fee_rate,
  41. 'ut_delete':delete_fee_rate
  42. };
  43. let updateFunctionMap = {
  44. 'normalUpdate':normalUpdate,
  45. 'update_rates':update_rates,
  46. 'updateStatusBySelected':updateStatusBySelected,
  47. 'feeRateFileSaveAs':feeRateFileSaveAs
  48. }
  49. function create_fee_rate() {
  50. }
  51. function update_fee_rate(user_id,datas) {
  52. if(datas.updateFunction){
  53. return updateFunctionMap[datas.updateFunction](user_id,datas);
  54. }else {
  55. return normalUpdate(user_id,datas);
  56. }
  57. }
  58. function updateStatusBySelected(user_id,datas) {
  59. return function(callback){
  60. feeRateModel.bulkWrite(generateUpdateTaks(datas.tasks),function (err,data) {
  61. console.log(data);
  62. commonCallback(callback,data,err);
  63. })
  64. }
  65. }
  66. function feeRateFileSaveAs(user_id,datas) {
  67. return function(callback){
  68. let doc = datas.doc;
  69. let projectID=datas.query.projectID;
  70. let feeRate={
  71. ID:doc.feeRateID,
  72. rates:doc.rates
  73. };
  74. delete doc._id;
  75. delete doc.rates;
  76. creatFeeRateFile(doc,feeRate,projectID).then(function (result) {
  77. commonCallback(callback,result,result.err);
  78. })
  79. }
  80. }
  81. async function creatFeeRateFile(feeRateFile,feeRate,projectID) {//预留projectID
  82. let result={
  83. err:null
  84. }
  85. try {
  86. let feeFile={
  87. id:feeRateFile.ID,
  88. name:feeRateFile.name
  89. }
  90. await projectsModel.findOneAndUpdate({ID:projectID},{'property.feeFile':feeFile});
  91. await feeRateFileModel.create(feeRateFile);
  92. await feeRateModel.create(feeRate);
  93. }catch (err){
  94. console.log(err);
  95. result.err=err;
  96. }
  97. return result;
  98. }
  99. function normalUpdate(user_id,datas) {
  100. return function(callback){
  101. console.log(datas)
  102. callback(null,'');
  103. }
  104. }
  105. function generateUpdateTaks(updateTasks) {
  106. var tasks=[];
  107. for(let u of updateTasks){
  108. let t ={
  109. updateOne:{
  110. filter:u.query,
  111. update: u.doc
  112. }
  113. }
  114. tasks.push(t);
  115. }
  116. return tasks;
  117. }
  118. function update_rates(user_id,datas) {
  119. return function(callback){
  120. feeRateModel.findOne(datas.query,['rates'],function(err, data){
  121. let doc = datas.doc;
  122. if(_.isArray(doc)){
  123. _.forEach(doc,function (item) {
  124. data.rates[item.rateIndex]=item.rate;
  125. })
  126. }else {
  127. data.rates[doc.rateIndex]=doc.rate;
  128. }
  129. data.save(function (err) {
  130. commonCallback(callback,'',err);
  131. });
  132. })
  133. }
  134. }
  135. function delete_fee_rate() {
  136. }
  137. function save (user_id, datas, callback) {
  138. let operations=[];
  139. if(_.isArray(datas)){
  140. for(let i=0;i<datas.length;i++){
  141. operations.push(operationMap[datas[i].updateType](user_id,datas[i]));
  142. }
  143. }else {
  144. operations.push(operationMap[datas.updateType](user_id,datas));
  145. }
  146. async_n.parallel(operations,function (err,results) {
  147. if(err){
  148. callback(err,'');
  149. }else {
  150. if(results.length==1){
  151. callback(null,results[0])
  152. }else {
  153. callback(null,results)
  154. }
  155. }
  156. })
  157. }
  158. function getData(projectID, callback) {
  159. getFeeRateData(projectID).then(function (result) {
  160. if(result.err){
  161. callback(1, '', null);
  162. }else {
  163. //feeRateModel
  164. callback(0, consts.projectConst.FEERATE, result.datas);
  165. }
  166. })
  167. }
  168. async function getFeeRateData(projectID) {
  169. let result={
  170. err:null
  171. }
  172. try {
  173. //
  174. /* let getProjectGLJ = +new Date();
  175. console.log("取项目工料机数据-----"+(getProjectGLJ - getenderData));*/
  176. let project = await projectsModel.findOne({ID:projectID});
  177. if (project&&project.property&&project.property.feeFile){
  178. let feeRateData = await feeRateFileModel.findOne({'ID':project.property.feeFile.id,deleteInfo:null});
  179. if(feeRateData===null){
  180. result.datas=[];
  181. }else {
  182. let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
  183. feeRateData._doc.rates = feeRate?feeRate.rates:[];
  184. //
  185. feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
  186. result.datas = feeRateData;
  187. }
  188. }else {
  189. result.datas=[];
  190. }
  191. logger.info("get fee rate data");
  192. }catch (err){
  193. console.log(err);
  194. result.err=err;
  195. }
  196. return result;
  197. }
  198. async function getUsageProjects(feeRateID){
  199. let projects = await projectsModel.find({'property.feeFile.id':feeRateID,'deleteInfo':null});
  200. return projects;
  201. }
  202. function commonCallback(callback,result,err) {
  203. if(err){
  204. callback(err,'');
  205. }else {
  206. callback(null,result);
  207. }
  208. }
  209. async function getFeeRateStandardsByProjectID(projectID) {
  210. logger.info("get feeRate standard, projectID:" + projectID)
  211. let feeRateStandards = [];
  212. let project = await projectsModel.findOne({
  213. ID: projectID
  214. });
  215. //let temFee = await feeRateFileModel.findOne({ID:project.property.feeFile.id});
  216. //feeRateStandards.push({ID:temFee.libID,libName:temFee.libName});
  217. let engineeringLibModel = new EngineeringLibModel();
  218. let engineeringInfo = project !== null && project.property.engineering_id !== undefined ?
  219. await engineeringLibModel.getEngineering(project.property.engineering_id) : null;
  220. if (engineeringInfo != null) {
  221. for (let tax of engineeringInfo.tax_group) {
  222. if (tax.taxType == project.property.taxType) {
  223. let lib = tax.fee_lib;
  224. feeRateStandards.push({
  225. ID: lib.id,
  226. libName: lib.name
  227. });
  228. }
  229. }
  230. }
  231. return feeRateStandards;
  232. }
  233. async function changeFeeRateStandard(jdata){
  234. let data = JSON.parse(jdata);
  235. let template = await std_fee_rate_lib_model.findOne({"ID":data.newLibID});
  236. let newFeeRate = {};
  237. newFeeRate.ID =uuidV1();
  238. newFeeRate.rates=template.rates;
  239. //2019-02-25新需求,养护切换标准后还要设置旧的值到新的费率文件里
  240. let subMap = await getAllSubRatesMap(data.feeRateID);
  241. let [IDMap,childrenMap] = setRatesByMap(newFeeRate,subMap,data.decimal);
  242. sumParentRate(IDMap,childrenMap,data.decimal);
  243. await feeRateModel.create(newFeeRate);
  244. let doc={
  245. libID:data.newLibID,
  246. libName:template.libName,
  247. feeRateID: newFeeRate.ID
  248. };
  249. await feeRateFileModel.findOneAndUpdate({ID:data.feeRateFileID,deleteInfo:null},doc);
  250. await feeRateModel.deleteOne({ID:data.feeRateID});
  251. doc.rates=newFeeRate.rates;
  252. return doc;
  253. }
  254. async function getAllSubRatesMap(feeRateID){
  255. let subMap = {};
  256. let feeRate = await feeRateModel.findOne({ID:feeRateID});
  257. if(feeRate){
  258. let rates = feeRate.rates;
  259. for(let r of rates){
  260. if(r.subFeeRate){
  261. for(let p of r.subFeeRate.recodes){
  262. if(subMap[p.name]) continue;
  263. subMap[p.name] = p;
  264. }
  265. }
  266. }
  267. }
  268. return subMap;
  269. }
  270. function sumParentRate(IDMap,childrenMap,decimal){
  271. for(let ParentID in childrenMap){
  272. if(IDMap[ParentID] && IDMap[ParentID].sum !== true) continue;
  273. let childrenList = childrenMap[ParentID];
  274. let total = 0;
  275. for(let c of childrenList){
  276. let tem = c.rate?c.rate:0;
  277. tem = scMathUtil.roundForObj(tem,decimal);
  278. total = scMathUtil.roundForObj(tem + total,6);
  279. }
  280. total = scMathUtil.roundForObj(total,decimal);
  281. if(IDMap[ParentID])IDMap[ParentID].rate = total;
  282. }
  283. }
  284. function setRatesByMap(newFeeRate,subMap,decimal){
  285. let IDMap ={},childrenMap={};
  286. for(let r of newFeeRate.rates){
  287. IDMap[r.ID] = r;
  288. if(r.subFeeRate){
  289. for(let p of r.subFeeRate.recodes){
  290. let t_p = subMap[p.name];
  291. if(t_p){//找到同名的子项
  292. //获取选中的节点
  293. let selected = _.find(t_p.optionList, { "selected": true });
  294. let match = false;
  295. for (let s of p.optionList) {
  296. s.selected = false;
  297. if (selected && selected.name == s.name) {
  298. s.selected = true;//设置新费率的选中项
  299. match = true;
  300. }
  301. }
  302. if (selected && match == false) {
  303. //如果原来旧的有选中项,但是新的却没匹配上,说明没有对应的下拉框,选择默认第一个
  304. p.optionList[0].selected = true;
  305. selected = p.optionList[0];
  306. }
  307. if(selected){//如果有选中项,则从valueMap中找出值并设置到rate上// ;
  308. let map = _.find(r.subFeeRate.valueMaps,{ID:selected.name});
  309. if(map){
  310. r.rate = map.value;
  311. setSubValue(p,selected.name);
  312. }
  313. }else if(t_p.editable==true){//在原来的选项中没有选中节点则说明是自已输入的,同时要是可编辑的类型,用内插法算值
  314. let ltRate = null;//
  315. let gtRate = null;
  316. for(let v of r.subFeeRate.valueMaps){
  317. if(parseFloat(v.ID)<parseFloat(t_p.value)){
  318. ltRate = v;
  319. }else if( gtRate==null && parseFloat(v.ID)>parseFloat(t_p.value)){
  320. gtRate = v;
  321. }
  322. }
  323. if(ltRate!=null&&gtRate!=null){//已经找到前后的值了
  324. let step = scMathUtil.roundForObj(gtRate.value - ltRate.value,6);
  325. let total = parseFloat(gtRate.ID) - parseFloat(ltRate.ID);
  326. r.rate =getRateByStep(ltRate.value,total,parseFloat(t_p.value) - parseFloat(ltRate.ID),step,decimal);
  327. }else if(ltRate!=null&&gtRate == null){//说明是超出了选项的最大值
  328. let share = parseFloat(t_p.value) - parseFloat(ltRate.ID);//超出了多少
  329. r.rate = getRateByStep(ltRate.value,p.step,share,p.amount,decimal)
  330. }else if(gtRate!=null&&ltRate==null){//说明是只有一个选项,且这个选项比输入的值大
  331. let step = parseFloat(gtRate.value)- 0;
  332. r.rate = getRateByStep(0,gtRate.value,parseFloat(t_p.value),step,decimal)
  333. }
  334. if(r.rate!=undefined && r.rate != null){
  335. p.value = t_p.value;
  336. setSubValue(p,t_p.value);
  337. }
  338. }
  339. }
  340. }
  341. }
  342. if(r.ParentID&&r.ParentID!=""){
  343. childrenMap[r.ParentID]?childrenMap[r.ParentID].push(r):childrenMap[r.ParentID]=[r];
  344. }
  345. }
  346. return [IDMap,childrenMap]
  347. }
  348. function getRateByStep(ltValue,total,share,step,decimal) { //min值 ,计算值的总区间, 区间中占比,步长--前端也要用到
  349. let p = scMathUtil.roundForObj(share/total,6);
  350. let a = scMathUtil.roundForObj(step * p,6) ;
  351. return scMathUtil.roundForObj(ltValue + a,decimal)
  352. }
  353. function setSubValue(p,name) {//设置综合理程的树节点的子节点的值
  354. if(p.subList && p.subList.length > 0){
  355. for(let s of p.subList){
  356. s.value = Number(name);
  357. }
  358. }
  359. }
  360. async function newFeeRateFile(userId, updateData){
  361. if(updateData.property !== null){
  362. let property = updateData.property;
  363. logger.info("Create new feeRate file for project :"+updateData.ID);
  364. let feeFile = property.feeFile;
  365. let rootProjectID = property.rootProjectID;
  366. let name = updateData.name;
  367. let newFeeRate = {};
  368. if(feeFile.id.indexOf("newFeeRate")!=-1){
  369. let temFee = await feeRateFileModel.findOne({rootProjectID:rootProjectID,name:name,deleteInfo:null});
  370. if(temFee){
  371. newFeeRate.id=temFee.ID;
  372. newFeeRate.name = temFee.name;
  373. return newFeeRate;
  374. }
  375. let temA = feeFile.id.split("@@");
  376. let libID = temA[1];
  377. let doc={
  378. userID: userId,
  379. rootProjectID:rootProjectID,
  380. name:name
  381. };
  382. if(libID!== ''){
  383. let template = await std_fee_rate_lib_model.findOne({"ID":libID});
  384. let newFeeRate = {};
  385. newFeeRate.ID =uuidV1();
  386. newFeeRate.rates=template.rates;
  387. (newFeeRate.rates || []).forEach(item => item.originalRate = item.rate);
  388. await feeRateModel.create(newFeeRate);
  389. doc.libID = libID;
  390. doc.libName = template.libName;
  391. doc.feeRateID = newFeeRate.ID;
  392. }
  393. doc.ID = uuidV1();
  394. await feeRateFileModel.create(doc);
  395. newFeeRate.id = doc.ID;
  396. newFeeRate.name =doc.name;
  397. return newFeeRate;
  398. }else {
  399. return feeFile
  400. }
  401. }
  402. return null;
  403. }
  404. async function checkFeeRateName(jdata) {
  405. let data = JSON.parse(jdata);
  406. let count = await feeRateFileModel.count({rootProjectID:data.rootProjectID,name:data.name,deleteInfo:null});
  407. if(count>0){
  408. return true;
  409. }
  410. return false;
  411. }
  412. async function getChangeInfo(jdata,compilation){
  413. let data = JSON.parse(jdata);
  414. //{ rootProjectID: 99, user_id: '76075' }
  415. const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted':false}];
  416. let result={};
  417. let treeData = [];
  418. let currentProject = await projectsModel.findOne({'ID':data.rootProjectID},['ID','NextSiblingID','ParentID','name']); //{projectID:99,name:'建设项目1'};//dummy 数据
  419. let currentTender = await projectsModel.findOne({ID: data.projectID, $or: notDeleted});
  420. if(currentProject){
  421. //剔除自身
  422. let currentFeeFile = await getFeeRatesByProject(data.rootProjectID);
  423. let currentUsedFF = currentTender.property.feeFile.id;
  424. currentProject._doc.currentOptions = _.filter(currentFeeFile, function (ff) {
  425. return ff.ID !== currentUsedFF;
  426. });
  427. }
  428. //根据用户ID 找除了当前项目的其它建设项目;
  429. let others =await projectsModel.find({'$and': [
  430. {'$or':[{'userID': data.user_id,'compilation': compilation,'projType':'Project', 'deleteInfo': null}, {'userID': data.user_id,'compilation': compilation,'projType':'Project', 'deleteInfo.deleted': {'$in': [null, false]}}]},
  431. { 'ID':{'$nin':[data.rootProjectID]}}
  432. ]},['ID','NextSiblingID','ParentID','name']);
  433. for(let o of others){
  434. o._doc.optionList = await getFeeRatesByProject(o.ID);
  435. }
  436. //获取对应用户所有文件夹
  437. let folders = await projectsModel.find({userID: data.user_id, $or: notDeleted, projType: 'Folder'}, ['ID','NextSiblingID','ParentID','name']);
  438. treeData = treeData.concat(currentProject);
  439. treeData = treeData.concat(others);
  440. treeData = treeData.concat(folders);
  441. result.currentProject=currentProject;
  442. result.others = others;
  443. result.treeData = treeData;
  444. return result;
  445. }
  446. async function getFeeRatesByProject(rootProjectID) {
  447. let feeRates = await feeRateFileModel.find({rootProjectID:rootProjectID,deleteInfo:null},['ID','name']);
  448. return feeRates;
  449. }
  450. async function setFeeRateToBill(data){
  451. data=JSON.parse(data);
  452. if(data.hasOwnProperty('bills')){
  453. await billModel.model.findOneAndUpdate(data.bills.query,data.bills.doc);
  454. }
  455. if(data.hasOwnProperty('feeRate')){
  456. await feeRateModel.findOneAndUpdate(data.feeRate.query,data.feeRate.doc);
  457. }
  458. return "ok";
  459. }
  460. async function updateFeeRate(data) {
  461. data=JSON.parse(data);
  462. return await feeRateModel.findOneAndUpdate(data.query,data.doc);
  463. }
  464. async function updateFeeRates(datas){//批量更新费率
  465. datas = JSON.parse(datas);
  466. let tasks = [];
  467. for(let d of datas){
  468. let task = {
  469. updateOne:{
  470. filter:d.query,
  471. update:d.doc
  472. }
  473. }
  474. tasks.push(task);
  475. }
  476. tasks.length > 0 ? await feeRateModel.bulkWrite(tasks) : '';
  477. return 'OK';
  478. }
  479. async function changeFeeRateFileFromCurrent(jdata){
  480. let data = JSON.parse(jdata);
  481. let newFeeRateFile=data.newFeeRateFile;
  482. await changeFeeRateFile(data,newFeeRateFile,0);
  483. let feeRateData = await feeRateFileModel.findOne({'ID':newFeeRateFile.id});
  484. if(feeRateData!==null){
  485. let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
  486. feeRateData._doc.rates = feeRate.rates;
  487. }
  488. //
  489. feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
  490. return feeRateData;
  491. }
  492. async function changeFeeRateFile(projectData,feeRateFile,type,userID) {
  493. let temFile=null,newFeeRateFile = {};
  494. if(type == 0){//从本建设项目中替换,直接赋值
  495. temFile = feeRateFile
  496. }else if(type == 1) {//从其它建设项目中复制
  497. let oldFeeRateFile = await feeRateFileModel.findOne({'ID':feeRateFile.id});
  498. let feeRate = await feeRateModel.findOne({ID:oldFeeRateFile.feeRateID});
  499. let newFeeRate={};
  500. if(! feeRate){
  501. throw '不存在对应费率文件';
  502. }
  503. newFeeRate.ID=uuidV1();
  504. newFeeRate.rates =feeRate.rates;
  505. newFeeRateFile.ID = uuidV1();
  506. newFeeRateFile.name = feeRateFile.name;
  507. newFeeRateFile.userID = userID;
  508. newFeeRateFile.libName = oldFeeRateFile.libName;
  509. newFeeRateFile.libID=oldFeeRateFile.libID;
  510. newFeeRateFile.rootProjectID = projectData.rootProjectID;
  511. newFeeRateFile.feeRateID =newFeeRate.ID;
  512. await feeRateModel.create(newFeeRate);
  513. await feeRateFileModel.create(newFeeRateFile);
  514. temFile={
  515. id:newFeeRateFile.ID,
  516. name:feeRateFile.name
  517. };
  518. newFeeRateFile.rates=newFeeRate.rates;//构建返回数据
  519. }
  520. await projectsModel.findOneAndUpdate({ID:projectData.projectID},{'property.feeFile':temFile});
  521. return newFeeRateFile
  522. }
  523. async function changeFeeRateFileFromOthers(jdata) {
  524. let data = JSON.parse(jdata);
  525. let newFeeRateFile = await changeFeeRateFile(data,{id:data.feeRateFileID,name:data.name},1,data.userID);
  526. /* let feeRateFile = await feeRateFileModel.findOne({'ID':data.feeRateFileID});
  527. let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID});
  528. let newFeeRate={};
  529. newFeeRate.ID=uuidV1();
  530. newFeeRate.rates =feeRate.rates;
  531. let newFeeRateFile = {};
  532. newFeeRateFile.ID = uuidV1();
  533. newFeeRateFile.name = data.name;
  534. newFeeRateFile.userID = data.userID;
  535. newFeeRateFile.libName = feeRateFile.libName;
  536. newFeeRateFile.libID=feeRateFile.libID;
  537. newFeeRateFile.rootProjectID = data.rootProjectID;
  538. newFeeRateFile.feeRateID =newFeeRate.ID;
  539. await feeRateModel.create(newFeeRate);
  540. await feeRateFileModel.create(newFeeRateFile);
  541. let feeFile={
  542. id:newFeeRateFile.ID,
  543. name:data.name
  544. }
  545. await projectsModel.findOneAndUpdate({ID:data.projectID},{'property.feeFile':feeFile});
  546. newFeeRateFile.rates=newFeeRate.rates;*/
  547. newFeeRateFile.usageProjects=await getUsageProjects(newFeeRateFile.ID);
  548. return newFeeRateFile;
  549. }
  550. async function getGCFeeRateFiles(userID){
  551. return await feeRateFileModel.find({userID: userID, 'deleteInfo.deleted': true, '$or': [{'deleteInfo.completeDeleted': false}, {'deleteInfo.completeDeleted': null}]});
  552. }
  553. async function getFeeRateByID(ID) {
  554. let feeRateFile = await feeRateFileModel.findOne({'ID':ID}, '-_id');
  555. let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID}, '-_id');
  556. return [feeRateFile,feeRate]
  557. }