fee_rates_facade.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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 project_feerate_temp = mongoose.model('project_feerate_temp');
  10. let projectsModel = require("../../pm/models/project_schema");
  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. };
  28. let operationMap={
  29. 'ut_create':create_fee_rate,
  30. 'ut_update':update_fee_rate,
  31. 'ut_delete':delete_fee_rate
  32. };
  33. let updateFunctionMap = {
  34. 'normalUpdate':normalUpdate,
  35. 'update_rates':update_rates,
  36. 'updateStatusBySelected':updateStatusBySelected,
  37. 'feeRateFileSaveAs':feeRateFileSaveAs
  38. }
  39. //测试数据 key projectID, value feeRateFileID
  40. let project_feeRateF_map={
  41. 99:'da059df1-7c18-11e7-9e2f-1390b52643b4'
  42. }
  43. function create_fee_rate() {
  44. }
  45. function update_fee_rate(user_id,datas) {
  46. if(datas.updateFunction){
  47. return updateFunctionMap[datas.updateFunction](user_id,datas);
  48. }else {
  49. return normalUpdate(user_id,datas);
  50. }
  51. }
  52. function updateStatusBySelected(user_id,datas) {
  53. return function(callback){
  54. feeRateModel.bulkWrite(generateUpdateTaks(datas.tasks),function (err,data) {
  55. console.log(data);
  56. commonCallback(callback,data,err);
  57. })
  58. }
  59. }
  60. function feeRateFileSaveAs(user_id,datas) {
  61. return function(callback){
  62. let doc = datas.doc;
  63. let projectID=datas.query.projectID;
  64. let feeRate={
  65. ID:doc.feeRateID,
  66. rates:doc.rates
  67. };
  68. delete doc._id;
  69. delete doc.rates;
  70. creatFeeRateFile(doc,feeRate,projectID).then(function (result) {
  71. commonCallback(callback,result,result.err);
  72. })
  73. }
  74. }
  75. async function creatFeeRateFile(feeRateFile,feeRate,projectID) {//预留projectID
  76. let result={
  77. err:null
  78. }
  79. try {
  80. await project_feerate_temp.findOneAndUpdate({projectID:projectID},{feeRateFileID:feeRateFile.ID});
  81. await feeRateFileModel.create(feeRateFile);
  82. await feeRateModel.create(feeRate);
  83. }catch (err){
  84. console.log(err);
  85. result.err=err;
  86. }
  87. return result;
  88. }
  89. function normalUpdate(user_id,datas) {
  90. return function(callback){
  91. console.log(datas)
  92. callback(null,'');
  93. }
  94. }
  95. function generateUpdateTaks(updateTasks) {
  96. var tasks=[];
  97. for(let u of updateTasks){
  98. let t ={
  99. updateOne:{
  100. filter:u.query,
  101. update: u.doc
  102. }
  103. }
  104. tasks.push(t);
  105. }
  106. return tasks;
  107. }
  108. function update_rates(user_id,datas) {
  109. return function(callback){
  110. feeRateModel.findOne(datas.query,['rates'],function(err, data){
  111. let doc = datas.doc;
  112. if(_.isArray(doc)){
  113. _.forEach(doc,function (item) {
  114. data.rates[item.rateIndex]=item.rate;
  115. })
  116. }else {
  117. data.rates[doc.rateIndex]=doc.rate;
  118. }
  119. data.save(function (err) {
  120. commonCallback(callback,'',err);
  121. });
  122. })
  123. }
  124. }
  125. function delete_fee_rate() {
  126. }
  127. function save (user_id, datas, callback) {
  128. let operations=[];
  129. if(_.isArray(datas)){
  130. for(let i=0;i<datas.length;i++){
  131. operations.push(operationMap[datas[i].updateType](user_id,datas[i]));
  132. }
  133. }else {
  134. operations.push(operationMap[datas.updateType](user_id,datas));
  135. }
  136. async_n.parallel(operations,function (err,results) {
  137. if(err){
  138. callback(err,'');
  139. }else {
  140. if(results.length==1){
  141. callback(null,results[0])
  142. }else {
  143. callback(null,results)
  144. }
  145. }
  146. })
  147. }
  148. function getData(projectID, callback) {
  149. getFeeRateData(projectID).then(function (result) {
  150. if(result.err){
  151. callback(1, '', null);
  152. }else {
  153. //feeRateModel
  154. callback(0, consts.projectConst.FEERATE, result.datas);
  155. }
  156. })
  157. }
  158. async function getFeeRateData(projectID) {
  159. // to do 需根据projectID查找对应的费率文件
  160. let result={
  161. err:null
  162. }
  163. try {
  164. //
  165. let project = await projectsModel.findOne({ID:projectID});
  166. if (project&&project.property&&project.property.feeFile){
  167. let feeRateData = await feeRateFileModel.findOne({'ID':project.property.feeFile,deleteInfo:null});
  168. if(feeRateData===null){
  169. result.datas=[];
  170. }else {
  171. let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
  172. feeRateData._doc.rates = feeRate?feeRate.rates:[];
  173. //
  174. feeRateData._doc.usageProjects=await getUsageProjects(feeRateData.ID);
  175. result.datas = feeRateData;
  176. }
  177. }else {
  178. result.datas=[];
  179. }
  180. logger.info("get fee rate data");
  181. }catch (err){
  182. console.log(err);
  183. result.err=err;
  184. }
  185. return result;
  186. }
  187. async function getUsageProjects(feeRateID){
  188. let projects = await projectsModel.find({'property.feeFile':feeRateID,'deleteInfo':null});
  189. return projects;
  190. }
  191. function commonCallback(callback,result,err) {
  192. if(err){
  193. callback(err,'');
  194. }else {
  195. callback(null,result);
  196. }
  197. }
  198. async function getFeeRateStandardsByProjectID(projectID) {
  199. logger.info("get feeRate standard, projectID:"+projectID)
  200. let feeRateStandards=[];
  201. let project = await projectsModel.findOne({ID:projectID});
  202. let engineeringLibModel = new EngineeringLibModel();
  203. let engineeringInfo = project !== null && project.property.engineering_id !== undefined ?
  204. await engineeringLibModel.getEngineering(project.property.engineering_id) : null;
  205. if(engineeringInfo!=null){
  206. let fee_lib = engineeringInfo.fee_lib;
  207. for(let lib of fee_lib){
  208. feeRateStandards.push({ID:lib.id,libName:lib.name});
  209. }
  210. }
  211. return feeRateStandards;
  212. }
  213. async function changeFeeRateStandard(jdata){
  214. let data = JSON.parse(jdata);
  215. let template = await std_fee_rate_lib_model.findOne({"ID":data.newLibID});
  216. let newFeeRate = {};
  217. newFeeRate.ID =uuidV1();
  218. newFeeRate.rates=template.rates;
  219. await feeRateModel.create(newFeeRate);
  220. let doc={
  221. libID:data.newLibID,
  222. libName:template.libName,
  223. feeRateID: newFeeRate.ID
  224. };
  225. let deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: data.user_id};
  226. await feeRateFileModel.findOneAndUpdate({ID:data.feeRateFileID,deleteInfo:null},doc);
  227. await feeRateModel.findOneAndUpdate({ID:data.feeRateID},{deleteInfo:deleteInfo});
  228. doc.rates=newFeeRate.rates;
  229. return doc;
  230. }
  231. async function newFeeRateFile(updateData){
  232. if(updateData.property !== null){
  233. let property = updateData.property;
  234. logger.info("Create new feeRate file for project :"+updateData.ID);
  235. let libID = property.feeFile;
  236. let rootProjectID = property.rootProjectID;
  237. let name = updateData.name;
  238. let doc={
  239. rootProjectID:rootProjectID,
  240. name:name
  241. };
  242. if(libID!== ''){
  243. let template = await std_fee_rate_lib_model.findOne({"ID":libID});
  244. let newFeeRate = {};
  245. newFeeRate.ID =uuidV1();
  246. newFeeRate.rates=template.rates;
  247. await feeRateModel.create(newFeeRate);
  248. doc.libID = libID;
  249. doc.libName = template.libName;
  250. doc.feeRateID = newFeeRate.ID;
  251. }
  252. doc.ID = uuidV1();
  253. await feeRateFileModel.create(doc);
  254. return doc.ID;
  255. }
  256. return null;
  257. }
  258. async function checkFeeRateName(jdata) {
  259. let data = JSON.parse(jdata);
  260. let count = await feeRateFileModel.count({rootProjectID:data.rootProjectID,name:data.name,deleteInfo:null});
  261. if(count>0){
  262. return true;
  263. }
  264. return false;
  265. }
  266. async function getChangeInfo(jdata){
  267. let data = JSON.parse(jdata);
  268. //{ projectID: 99, user_id: '76075' }
  269. let result={};
  270. let currentProject = {projectID:99,name:'建设项目1'};//dummy 数据
  271. currentProject.currentOptions=await feeRateFileModel.find({rootProjectID:data.projectID,deleteInfo:null},['ID','name']);
  272. //根据用户ID 找除了当前项目的其它建设项目;
  273. let others = [
  274. {projectID:100,name:'建设项目2',optionList:[
  275. {ID:'590cf860-7d99-11e7-90b0-e3a3dfdb2116',name:'2-test另存'},
  276. {ID:'c55718d0-7d98-11e7-b3b4-cfc9038d29b0',name:'2-费率B'},
  277. {ID:'da059df1-7c18-11e7-9e2f-1390b52643b4',name:'2-费率A'}
  278. ] },
  279. {projectID:101,name:'建设项目3',optionList:currentProject.currentOptions },
  280. {projectID:102,name:'建设项目4',optionList:currentProject.currentOptions },
  281. ]
  282. result.currentProject=currentProject;
  283. result.others = others;
  284. return result;
  285. }
  286. async function changeFeeRateFileFromCurrent(jdata){
  287. let data = JSON.parse(jdata);
  288. let result = await project_feerate_temp.findOneAndUpdate({projectID:data.projectID},{feeRateFileID:data.newFeeRateFileID});
  289. let feeRateData = await feeRateFileModel.findOne({'ID':data.newFeeRateFileID});
  290. let feeRate = await feeRateModel.findOne({ID:feeRateData.feeRateID});
  291. feeRateData._doc.rates = feeRate.rates;
  292. //
  293. feeRateData._doc.usageProjects=getUsageProjects(feeRateData.ID);
  294. return feeRateData;
  295. }
  296. async function changeFeeRateFileFromOthers(jdata) {
  297. let data = JSON.parse(jdata);
  298. console.log(data);
  299. let feeRateFile = await feeRateFileModel.findOne({'ID':data.feeRateFileID});
  300. let feeRate = await feeRateModel.findOne({ID:feeRateFile.feeRateID});
  301. let newFeeRate={};
  302. newFeeRate.ID=uuidV1();
  303. newFeeRate.rates =feeRate.rates;
  304. let newFeeRateFile = {};
  305. newFeeRateFile.ID = uuidV1();
  306. newFeeRateFile.name = data.name;
  307. newFeeRateFile.libName = feeRateFile.libName;
  308. newFeeRateFile.libID=feeRateFile.libID;
  309. newFeeRateFile.rootProjectID = data.rootProjectID;
  310. newFeeRateFile.feeRateID =newFeeRate.ID;
  311. await feeRateModel.create(newFeeRate);
  312. await feeRateFileModel.create(newFeeRateFile);
  313. await project_feerate_temp.findOneAndUpdate({projectID:data.projectID},{feeRateFileID:newFeeRateFile.ID});
  314. newFeeRateFile.rates=newFeeRate.rates;
  315. newFeeRateFile.usageProjects=getUsageProjects(newFeeRateFile.ID);
  316. return newFeeRateFile;
  317. }