ration_glj_facade.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. /**
  2. * Created by chen on 2017/6/29.
  3. */
  4. let mongoose = require('mongoose');
  5. const uuidV1 = require('uuid/v1');
  6. let consts = require('../../main/models/project_consts')
  7. let commonConsts = consts.commonConst;
  8. let _=require("lodash");
  9. let ration_glj = mongoose.model('ration_glj');
  10. import GLJListModel from '../../glj/models/glj_list_model';
  11. let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
  12. let async_n = require("async");
  13. let ration = mongoose.model('ration');
  14. let ration_coe_facade = require('./ration_coe_facade');
  15. let ration_coe = mongoose.model('ration_coe');
  16. let std_ration_lib_ration_items = mongoose.model('std_ration_lib_ration_items');
  17. let glj_calculate_facade = require('./glj_calculate_facade');
  18. let quantity_detail_facade = require('./quantity_detail_facade');
  19. let logger = require("../../../logs/log_helper").logger;
  20. import stdgljutil from "../../../public/cache/std_glj_type_util";
  21. import EngineeringLibModel from "../../users/models/engineering_lib_model";
  22. import GljDao from "../../complementary_glj_lib/models/gljModel";
  23. module.exports={
  24. save:save,
  25. getData:getData,
  26. deleteByRation:deleteByRation,
  27. getQuantityByProjectGLJ:getQuantityByProjectGLJ,
  28. getLibInfo:getLibInfo,
  29. getGLJData:getGLJData,
  30. addGLJ:addGLJ
  31. }
  32. let operationMap={
  33. 'ut_create':create_ration_glj,
  34. 'ut_update':update_ration_glj,
  35. 'ut_delete':delete_ration_glj
  36. };
  37. let updateFunctionMap = {
  38. 'normalUpdate':normalUpdate,
  39. 'marketPriceAdjustUpdate':marketPriceAdjustUpdate,
  40. 'customQuantityUpdate':customQuantityUpdate
  41. };
  42. /**
  43. * 根据项目工料机ID和项目ID取消耗量
  44. *
  45. * @param {object} condition
  46. * @return Array
  47. */
  48. async function getQuantityByProjectGLJ(condition) {
  49. let query ={
  50. $and:[
  51. {'projectID':condition.projectID},
  52. {'projectGLJID':{$in:condition.projectGLJIDList}}
  53. ]
  54. }
  55. let results = await ration_glj.find(query,['projectGLJID','quantity','rationID'],{sort: {projectGLJID: 1}});
  56. let rationList = _.uniq(_.map(results,'rationID'));
  57. let rationQuery={
  58. $and:[
  59. {'projectID':condition.projectID},
  60. {'ID':{$in:rationList}},
  61. {'deleteInfo': null}
  62. ]
  63. }
  64. let rations = await ration.find(rationQuery,['ID','quantity']);
  65. return combineQuantity(results,rations);
  66. }
  67. function combineQuantity(results,rations) {
  68. let resultList=[];
  69. _.forEach(results,function (data) {
  70. let tmp = {
  71. projectGLJID:data.projectGLJID,
  72. quantity: data.quantity
  73. }
  74. let ration=_.find(rations,{ID:data.rationID});
  75. if(ration){
  76. tmp.rationID=ration.ID;
  77. tmp.rationQuantity=ration.quantity?Number(ration.quantity):undefined;
  78. }
  79. resultList.push(tmp);
  80. /* if(resultMap.hasOwnProperty(data.projectGLJID)){
  81. resultMap[data.projectGLJID] += data.quantity;
  82. }else {
  83. resultMap[data.projectGLJID] = data.quantity;
  84. }*/
  85. });
  86. /* var resultList =[];
  87. for(let key in resultMap){
  88. let newObject = {
  89. 'projectGLJID':key,
  90. 'quantity':resultMap[key]
  91. }
  92. resultList.push(newObject)
  93. }*/
  94. return resultList;
  95. }
  96. function get_lib_glj_info(ration_glj) {
  97. return function (result,cb) {
  98. std_glj_lib_gljList_model.findOne({'ID':ration_glj.GLJID},(err,glj)=>{
  99. if(err){
  100. cb(err,'')
  101. }else if(glj){
  102. ration_glj.name = glj.name;
  103. ration_glj.code = glj.code;
  104. ration_glj.unit = glj.unit;
  105. ration_glj.specs = glj.specs;
  106. ration_glj.basePrice = glj.basePrice;
  107. ration_glj.shortName = glj.shortName;
  108. ration_glj.type = glj.gljType;
  109. ration_glj.repositoryId = glj.repositoryId;
  110. getInfoFromProjectGLJ(ration_glj).then(function (info) {
  111. if(info){
  112. let tem={};
  113. tem.newRecode=createNewRecord(info);
  114. tem.showData=info;
  115. result.datas.push(tem);
  116. cb(null,result);
  117. }else {
  118. cb(new Error('get project glj error'),null);
  119. }
  120. });
  121. }else {
  122. cb(null,null);
  123. }
  124. })
  125. }
  126. }
  127. function createNewRecord(ration_glj) {
  128. let newRecoed={};
  129. newRecoed.ID=ration_glj.ID;
  130. newRecoed.projectID=ration_glj.projectID;
  131. newRecoed.GLJID=ration_glj.GLJID;
  132. newRecoed.rationID=ration_glj.rationID;
  133. newRecoed.rationItemQuantity=ration_glj.rationItemQuantity;
  134. newRecoed.quantity=ration_glj.quantity;
  135. newRecoed.name = ration_glj.name;
  136. newRecoed.code = ration_glj.code;
  137. newRecoed.unit = ration_glj.unit;
  138. newRecoed.specs = ration_glj.specs;
  139. newRecoed.shortName = ration_glj.shortName;
  140. newRecoed.type = ration_glj.type;
  141. newRecoed.repositoryId = ration_glj.repositoryId;
  142. newRecoed.projectGLJID=ration_glj.projectGLJID;
  143. return newRecoed
  144. }
  145. async function getInfoFromProjectGLJ(ration_glj) {
  146. let data = getGLJSearchInfo(ration_glj);
  147. try {
  148. let projectGljModel = new GLJListModel();
  149. let result = await projectGljModel.addList(data);
  150. ration_glj.marketPrice=result.unit_price.market_price;
  151. ration_glj.adjustPrice=result.unit_price.base_price;
  152. ration_glj.basePrice=result.unit_price.base_price;
  153. ration_glj.projectGLJID=result.id;
  154. ration_glj.isEstimate=result.is_evaluate;
  155. return ration_glj;
  156. } catch (err) {
  157. logger.err(err);
  158. return null;
  159. }
  160. }
  161. function create_ration_glj(user_id,datas) {
  162. return function (callback) {
  163. let ration_glj_list=datas.ration_glj_list;
  164. var tasks=[];
  165. tasks.push(startingTask("get glj info"))
  166. for(let i =0;i<ration_glj_list.length;i++){
  167. ration_glj_list[i].ID = uuidV1();
  168. tasks.push(get_lib_glj_info(ration_glj_list[i]))
  169. }
  170. async_n.waterfall(tasks,(err,results)=>{
  171. if(err){
  172. callback(err,results)
  173. }else {
  174. let newRecords =[];
  175. let showDatas=[];
  176. for (let r of results.datas){
  177. if(r){
  178. newRecords.push(r.newRecode);
  179. showDatas.push(r.showData);
  180. }
  181. }
  182. if(newRecords.length>0){
  183. ration_glj.insertMany(newRecords,(err,doc)=>{
  184. if(err){
  185. callback(err,null);
  186. }else {
  187. let returndata ={
  188. updateTpye:commonConsts.UT_CREATE,
  189. moduleName:'ration_glj',
  190. data:{
  191. newRecords:newRecords,
  192. showDatas:showDatas
  193. }
  194. }
  195. callback(null,returndata)
  196. }
  197. });
  198. }else {
  199. logger.info("can't find gljs")
  200. callback(null,null)
  201. }
  202. }
  203. })
  204. }
  205. }
  206. function update_ration_glj(user_id,datas) {
  207. if(datas.updateFunction){
  208. return updateFunctionMap[datas.updateFunction](user_id,datas);
  209. }else {
  210. return normalUpdate(user_id,datas);
  211. }
  212. }
  213. function normalUpdate(user_id,datas){
  214. return function(callback) {
  215. ration_glj.update(datas.query,datas.doc,(err,result)=>{
  216. if(err){
  217. callback(err,'');
  218. }else {
  219. let returndata ={
  220. moduleName:'ration_glj',
  221. data:{
  222. updateTpye:commonConsts.UT_UPDATE,
  223. query:datas.query,
  224. doc:datas.doc
  225. }
  226. }
  227. callback(null,returndata)
  228. }
  229. })
  230. }
  231. }
  232. function customQuantityUpdate(user_id,datas){
  233. return function(callback) {
  234. doCustomQuantityUpdate(datas).then((result)=>{
  235. if(result.err){
  236. callback(result.err,'');
  237. }else {
  238. let ration_glj_data ={
  239. moduleName:'ration_glj',
  240. data:{
  241. updateTpye:commonConsts.UT_UPDATE,
  242. quantityRefresh:true,
  243. glj_result:result.cal_result.glj_result
  244. }
  245. };
  246. let ration_data ={
  247. moduleName:'ration',
  248. data:{
  249. updateTpye:commonConsts.UT_UPDATE,
  250. stateRefresh:true,
  251. rationID:result.cal_result.rationID,
  252. adjustState:result.cal_result.adjustState
  253. }
  254. };
  255. callback(null,[ration_glj_data,ration_data]);
  256. }
  257. })
  258. }
  259. }
  260. async function doCustomQuantityUpdate(datas){
  261. let result = {
  262. err:null
  263. }
  264. try{
  265. await ration_glj.update(datas.query,datas.doc);
  266. let cal_result = await glj_calculate_facade.calculateQuantity({projectID:datas.query.projectID,rationID:datas.query.rationID});
  267. cal_result.glj_result.forEach(function (item) {
  268. if(!item.doc.hasOwnProperty('customQuantity')){
  269. item.doc.customQuantity=null;
  270. }
  271. });
  272. result.cal_result =cal_result;
  273. console.log(result);
  274. return result;
  275. }catch (err){
  276. result.err = err;
  277. console.log(err);
  278. return result;
  279. }
  280. }
  281. function marketPriceAdjustUpdate(user_id,datas) {
  282. return function (callback) {
  283. updateprojectGljAndRationGLJ(datas.query,datas.doc).then((result)=>{
  284. if(result.err){
  285. callback(result.err,'');
  286. }else {
  287. let returndata ={
  288. moduleName:'ration_glj',
  289. data:{
  290. updateTpye:commonConsts.UT_UPDATE,
  291. query:datas.query,
  292. doc:result.doc
  293. }
  294. };
  295. let ration_data ={
  296. moduleName:'ration',
  297. data:{
  298. updateTpye:commonConsts.UT_UPDATE,
  299. stateRefresh:true,
  300. rationID:datas.query.rationID,
  301. adjustState:result.adjustState
  302. }
  303. }
  304. callback(null,[returndata,ration_data]);
  305. }
  306. })
  307. }
  308. }
  309. async function updateprojectGljAndRationGLJ(query,doc) {
  310. let returnresult={};
  311. try {
  312. let gljListModel = new GLJListModel();
  313. let temp = doc.market_price;
  314. if(doc.market_price==null){
  315. doc.market_price = doc.base_price;
  316. }
  317. delete doc.base_price;
  318. let result = await gljListModel.modifyMarketPrice(doc);
  319. let updateDoc ={
  320. marketPrice:result.unit_price.market_price,
  321. marketPriceAdjust:temp,
  322. projectGLJID:result.id,
  323. isEstimate:result.is_evaluate,
  324. name : result.name,
  325. code:result.code
  326. };
  327. let updateresult = await ration_glj.findOneAndUpdate(query, updateDoc);
  328. let stateResult = await glj_calculate_facade.calculateQuantity({projectID:query.projectID,rationID:query.rationID},true);
  329. returnresult ={
  330. err:null,
  331. doc :updateDoc,
  332. adjustState:stateResult.adjustState
  333. }
  334. return returnresult;
  335. } catch (error) {
  336. returnresult.err = error;
  337. console.log(error);
  338. return returnresult
  339. }
  340. }
  341. function delete_ration_glj(user_id,datas) {
  342. return function (callback) {
  343. if(datas.deleteType=="RATION"){
  344. deleteByRation(datas,callback);
  345. }else if(datas.deleteType=="BILL"){
  346. deleteByBill(user_id,datas,callback);
  347. } else{
  348. deleteByID(datas,callback);
  349. }
  350. }
  351. }
  352. function deleteByRation(datas,callback) {
  353. let data = datas.updateData;
  354. let tasks=[];
  355. tasks.push(deleteGLJList(data));
  356. tasks.push(ration_coe_facade.delete_ration_coe(data));
  357. tasks.push(quantity_detail_facade.deleteByRation(data));
  358. async_n.parallel(tasks,function (err,result) {
  359. commonCallback(callback,result,err)
  360. })
  361. }
  362. function deleteGLJList(data) {
  363. return function (callback) {
  364. ration_glj.deleteMany({projectID: data.projectID, rationID: data.ID},(err,result)=>{
  365. commonCallback(callback,result,err)
  366. });
  367. }
  368. }
  369. function deleteByBill(user_id,datas,callback) {
  370. let tasks = [];
  371. tasks.push(startingTask("deleteByBill"));
  372. tasks.push(getRationsByBill(datas));
  373. tasks.push(deleteRationsbyBill(user_id,datas));
  374. tasks.push(deleteByMultiRations(datas));
  375. async_n.waterfall(tasks,function (err,results) {
  376. if(err){
  377. callback(err,'');
  378. }else {
  379. callback(null,results);
  380. }
  381. })
  382. }
  383. function deleteByID(datas,callback){
  384. ration_glj.deleteOne(datas.query,(err,result)=>{
  385. if(err){
  386. callback(err,'');
  387. }else {
  388. let returndata ={
  389. moduleName:'ration_glj',
  390. data:{
  391. updateTpye:commonConsts.UT_DELETE,
  392. query:datas.query,
  393. }
  394. }
  395. callback(null,returndata)
  396. }
  397. })
  398. }
  399. function startingTask(processName){
  400. return function(asyncCallBack){
  401. var result = {
  402. processName : processName,
  403. datas:[]
  404. };
  405. asyncCallBack(null, result);
  406. };
  407. }
  408. function getRationsByBill(datas) {
  409. return function (results,callback) {
  410. ration.find({projectID:datas.updateData.projectID,billsItemID:datas.updateData.ID,deleteInfo: null},function (err,rations) {
  411. if(err){
  412. callback(err,'')
  413. }else {
  414. results.rations=rations;
  415. callback(null,results)
  416. }
  417. })
  418. }
  419. }
  420. function deleteRationsbyBill (user_id,datas){
  421. return function (results,callback) {
  422. let deleteInfo ={
  423. deleteInfo :{deleted: true, deleteDateTime: new Date(), deleteBy: user_id}
  424. };
  425. ration.update({projectID: datas.updateData.projectID, billsItemID:datas.updateData.ID},deleteInfo,{multi: true},(err,deleteresults)=>{
  426. if(err){
  427. callback(err,'');
  428. }else {
  429. callback(null,results);
  430. }
  431. });
  432. }
  433. }
  434. function deleteByMultiRations(datas) {
  435. return function (results,deleteCallBack) {
  436. var delete_tasks = [];
  437. var deleteOne=function (ration) {
  438. return function (callback) {
  439. ration_glj.deleteMany({projectID: ration.projectID, rationID: ration.ID},function (err,result) {
  440. commonCallback(callback,result,err)
  441. });
  442. }
  443. }
  444. let rations = results.rations;
  445. for(let i=0;i<rations.length;i++){
  446. delete_tasks.push(deleteOne(rations[i]._doc));
  447. delete_tasks.push(ration_coe_facade.delete_ration_coe(rations[i]._doc));
  448. delete_tasks.push(quantity_detail_facade.deleteByRation(rations[i]._doc));
  449. }
  450. delete_tasks.push(quantity_detail_facade.deleteByBill(datas.updateData));
  451. async_n.parallel(delete_tasks,(err,results)=>{
  452. if (err){
  453. deleteCallBack(err,'')
  454. }else {
  455. deleteCallBack(null,results)
  456. }
  457. })
  458. }
  459. }
  460. /*
  461. function deleteByRation(doc) {
  462. return function (callback){
  463. ration_glj.deleteMany({projectID: doc.updateData.projectID, rationID: doc.updateData.ID},callback);
  464. }
  465. }
  466. */
  467. function save (user_id, datas, callback) {
  468. let operations=[];
  469. if(_.isArray(datas)){
  470. for(let i=0;i<datas.length;i++){
  471. operations.push(operationMap[datas[i].updateType](user_id,datas[i]));
  472. }
  473. }else {
  474. operations.push(operationMap[datas.updateType](user_id,datas));
  475. }
  476. async_n.parallel(operations,function (err,results) {
  477. if(err){
  478. callback(err,'');
  479. }else {
  480. if(results.length==1){
  481. callback(null,results[0])
  482. }else {
  483. callback(null,results)
  484. }
  485. }
  486. })
  487. }
  488. async function getLibInfo(req){
  489. let gljLibId = null, engineeringId, sessionCompilation = req.session.sessionCompilation,
  490. rationValuation = sessionCompilation.ration_valuation,
  491. billValuation = sessionCompilation.bill_valuation,
  492. engineeringLibModel = new EngineeringLibModel();
  493. if(rationValuation[0]){
  494. let engineeringList = rationValuation[0].engineering_list;
  495. engineeringId = engineeringList.length > 0 ? engineeringList[0].engineering_id : null;
  496. let engineeringInfo = await engineeringLibModel.getEngineering(engineeringId);
  497. gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
  498. }
  499. else if(billValuation[0]){
  500. let engineeringList = billValuation[0].engineering_list;
  501. engineeringId = engineeringList.length > 0 ? engineeringList[0].engineering_id : null;
  502. let engineeringInfo = await engineeringLibModel.getEngineering(engineeringId);
  503. gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
  504. }
  505. let data = {
  506. userID: req.session.sessionUser.ssoId,
  507. gljLibId: gljLibId,
  508. compilationId: sessionCompilation._id
  509. };
  510. return data;
  511. }
  512. function getGLJData(info,callback) {
  513. let gljDao = new GljDao();
  514. let datas={};
  515. let gljDistTypeCache = stdgljutil.getStdGljTypeCacheObj().toArray();
  516. datas.distTypeTree=gljDistTypeCache;
  517. async_n.parallel([
  518. function (cb) {
  519. gljDao.getGljTypes(info.gljLibId,function (err,data) {
  520. if(err){
  521. cb(err);
  522. }else {
  523. datas.treeData=data;
  524. cb(null);
  525. }
  526. })
  527. },
  528. function (cb) {
  529. gljDao.getGljItems(info.gljLibId,info.userID,info.compilationId, function (err,data) {
  530. if(err){
  531. cb(err);
  532. }else {
  533. datas.stdGLJ=data.stdGljs;
  534. datas.complementaryGLJs=data.complementaryGljs;
  535. cb(null);
  536. }
  537. });
  538. }
  539. ], function (err) {
  540. if(err){
  541. callback(true, null);
  542. }
  543. else{
  544. callback(false, datas);
  545. }
  546. })
  547. }
  548. function getGLJSearchInfo(ration_glj) {
  549. let data = {
  550. glj_id: ration_glj.GLJID,
  551. project_id: ration_glj.projectID,
  552. code: ration_glj.code,
  553. name: ration_glj.name,
  554. specs: ration_glj.specs,
  555. unit: ration_glj.unit,
  556. type: ration_glj.type,
  557. type_of_work: ration_glj.type,
  558. base_price: ration_glj.basePrice,
  559. market_price: ration_glj.basePrice,
  560. repositoryId:ration_glj.repositoryId
  561. };
  562. return data;
  563. }
  564. async function addGLJ(rgList) {
  565. let newRecodes = [];
  566. for(let g of rgList){
  567. let projectGljModel = new GLJListModel();
  568. let result = await projectGljModel.addList(getGLJSearchInfo(g));
  569. g.marketPrice=result.unit_price.market_price;
  570. g.adjustPrice=result.unit_price.base_price;
  571. g.basePrice=result.unit_price.base_price;
  572. g.projectGLJID=result.id;
  573. g.isEstimate=result.is_evaluate;
  574. g.ID=uuidV1();
  575. newRecodes.push(createNewRecord(g));
  576. }
  577. await ration_glj.insertMany(newRecodes);
  578. let result={
  579. newRecodes:newRecodes,
  580. showData:rgList
  581. }
  582. return result;
  583. }
  584. function getData(projectID, callback) {
  585. ration_glj.find({'projectID':projectID},(err,datas)=>{
  586. if(err){
  587. callback(1, '', null);
  588. }else {
  589. callback(0, consts.projectConst.RATION_GLJ, datas);
  590. }
  591. })
  592. }
  593. function commonCallback(callback,result,err) {
  594. if(err){
  595. callback(err,'');
  596. }else {
  597. callback(null,result);
  598. }
  599. }