ration_glj_facade.js 21 KB

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