ration_glj_facade.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  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 glj_type_util = require('../../../public/cache/std_glj_type_util');
  19. let quantity_detail_facade = require('../../main/facade/quantity_detail_facade');
  20. let ration_installation_facade = require('../../main/facade/ration_installation_facade');
  21. let logger = require("../../../logs/log_helper").logger;
  22. import stdgljutil from "../../../public/cache/std_glj_type_util";
  23. import EngineeringLibModel from "../../users/models/engineering_lib_model";
  24. import GljDao from "../../complementary_glj_lib/models/gljModel";
  25. const complementaryGljModel = mongoose.model('complementary_glj_lib');
  26. const stdGljModel = mongoose.model('std_glj_lib_gljList');
  27. const gljClassModel = mongoose.model('std_glj_lib_gljClass');
  28. const projectDao = require('../../pm/models/project_model').project;
  29. const compleClassModel = mongoose.model('complementary_glj_section');
  30. module.exports = {
  31. save: save,
  32. getData: getData,
  33. deleteByRation: deleteByRation,
  34. getQuantityByProjectGLJ: getQuantityByProjectGLJ,
  35. getLibInfo: getLibInfo,
  36. getGLJData: getGLJData,
  37. getGLJDataByCodes:getGLJDataByCodes,
  38. addGLJ: addGLJ,
  39. deleteGLJ:deleteGLJ,
  40. insertAddTypeGLJ:insertAddTypeGLJ,
  41. replaceGLJ: replaceGLJ,
  42. replaceGLJByData:replaceGLJByData,
  43. mReplaceGLJ: mReplaceGLJ,
  44. updateRationGLJByEdit: updateRationGLJByEdit,
  45. getGLJClass: getGLJClass,
  46. insertGLJAsRation: insertGLJAsRation,
  47. getRationTypeGLJQuantity:getRationTypeGLJQuantity,
  48. getInfoFromProjectGLJ:getInfoFromProjectGLJ,
  49. createNewRecord:createNewRecord,
  50. getGLJSearchInfo:getGLJSearchInfo,
  51. updateRationGLJFromDoc:updateRationGLJFromDoc,
  52. getGLJLibByEngineerID:getGLJLibByEngineerID
  53. }
  54. let operationMap = {
  55. 'ut_create': create_ration_glj,
  56. 'ut_update': update_ration_glj,
  57. 'ut_delete': delete_ration_glj
  58. };
  59. let updateFunctionMap = {
  60. 'normalUpdate': normalUpdate
  61. };
  62. /**
  63. * 根据项目工料机ID和项目ID取消耗量
  64. *
  65. * @param {object} condition
  66. * @return Array
  67. */
  68. async function getQuantityByProjectGLJ(condition) {
  69. let query = {
  70. 'projectID': condition.projectID,
  71. };
  72. if(condition.projectGLJIDList){
  73. query['projectGLJID'] = {$in: condition.projectGLJIDList};
  74. }
  75. let startTime = +new Date();
  76. let results = await ration_glj.find(query, ['projectGLJID', 'quantity', 'rationID'], {sort: {projectGLJID: 1}});
  77. let rationList = _.uniq(_.map(results, 'rationID'));
  78. let getQuantity = +new Date();
  79. console.log("取工料机消耗量时间-----"+(getQuantity - startTime));
  80. let rationQuery = {
  81. 'projectID': condition.projectID,
  82. 'ID': {$in: rationList},
  83. 'deleteInfo': null
  84. };
  85. /* $and: [
  86. {'projectID': condition.projectID},
  87. {'ID': {$in: rationList}},
  88. {'deleteInfo': null}
  89. ]*/
  90. let rations = await ration.find(rationQuery, ['ID', 'quantity']);
  91. let rationsTime = +new Date();
  92. console.log("取定额消耗量时间-----"+(rationsTime - getQuantity));
  93. return combineQuantity(results, rations);
  94. }
  95. function combineQuantity(results, rations) {
  96. let resultList = [];
  97. let rationMap = _.indexBy(rations,'ID');
  98. for(let r of results){
  99. let tmp = {
  100. projectGLJID: r.projectGLJID,
  101. quantity: Number(r.quantity)
  102. }
  103. let ration = rationMap[r.rationID];//_.find(rations, {ID: r.rationID})
  104. if (ration) {
  105. tmp.rationID = ration.ID;
  106. tmp.rationQuantity = ration.quantity ? Number(ration.quantity) : undefined;
  107. }
  108. resultList.push(tmp);
  109. }
  110. return resultList;
  111. return resultList;
  112. }
  113. function get_lib_glj_info(ration_glj) {
  114. return function (result, cb) {
  115. std_glj_lib_gljList_model.findOne({'ID': ration_glj.GLJID}, (err, glj) => {
  116. if (err) {
  117. cb(err, '')
  118. } else if (glj) {
  119. ration_glj.name = glj.name;
  120. ration_glj.code = glj.code;
  121. ration_glj.original_code = glj.code;
  122. ration_glj.unit = glj.unit;
  123. ration_glj.specs = glj.specs;
  124. ration_glj.basePrice = glj.basePrice;
  125. ration_glj.marketPrice = glj.basePrice;
  126. ration_glj.shortName = glj.shortName;
  127. ration_glj.type = glj.gljType;
  128. ration_glj.repositoryId = glj.repositoryId;
  129. ration_glj.adjCoe = glj.adjCoe;
  130. getInfoFromProjectGLJ(ration_glj).then(function (info) {
  131. if (info) {
  132. let tem = {};
  133. tem.newRecode = createNewRecord(info);
  134. tem.showData = info;
  135. result.datas.push(tem);
  136. cb(null, result);
  137. } else {
  138. cb(new Error('get project glj error'), null);
  139. }
  140. });
  141. } else {
  142. cb(null, result);
  143. }
  144. })
  145. }
  146. }
  147. function createNewRecord(ration_glj) {
  148. let newRecoed = {};
  149. newRecoed.ID = ration_glj.ID;
  150. newRecoed.projectID = ration_glj.projectID;
  151. newRecoed.GLJID = ration_glj.GLJID;
  152. newRecoed.rationID = ration_glj.rationID;
  153. newRecoed.rationItemQuantity = ration_glj.rationItemQuantity;
  154. newRecoed.quantity = ration_glj.quantity;
  155. newRecoed.name = ration_glj.name;
  156. newRecoed.code = ration_glj.code;
  157. newRecoed.original_code = ration_glj.original_code;
  158. newRecoed.unit = ration_glj.unit;
  159. newRecoed.specs = ration_glj.specs;
  160. newRecoed.from = ration_glj.from ? ration_glj.from : 'std';
  161. newRecoed.createType = ration_glj.createType ? ration_glj.createType : 'normal';
  162. newRecoed.shortName = ration_glj.shortName;
  163. newRecoed.billsItemID = ration_glj.billsItemID;
  164. newRecoed.type = ration_glj.type;
  165. newRecoed.model = ration_glj.model;
  166. newRecoed.repositoryId = ration_glj.repositoryId;
  167. newRecoed.projectGLJID = ration_glj.projectGLJID;
  168. newRecoed.adjCoe = ration_glj.adjCoe;
  169. return newRecoed
  170. }
  171. async function getInfoFromProjectGLJ(ration_glj,unitPriceFileId,ext) {
  172. let data = getGLJSearchInfo(ration_glj);
  173. try {
  174. let projectGljModel = new GLJListModel();
  175. let result = await projectGljModel.addList(data,unitPriceFileId,ext);
  176. let typeString = result.type+"";
  177. ration_glj.marketPrice = result.unit_price.market_price;
  178. ration_glj.adjustPrice = result.unit_price.base_price;
  179. ration_glj.basePrice = result.unit_price.base_price;
  180. ration_glj.projectGLJID = result.id;
  181. if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
  182. ration_glj.isEstimate = result.is_evaluate;
  183. }
  184. if (result.hasOwnProperty('subList') && result.subList.length > 0) {
  185. ration_glj.subList = getMixRatioShowDatas(result.subList);
  186. }
  187. return ration_glj;
  188. } catch (err) {
  189. logger.err(err);
  190. return null;
  191. }
  192. }
  193. function getMixRatioShowDatas(subList) {
  194. var temRationGLJs = [];
  195. for (let pg of subList) {
  196. var tem = {
  197. projectGLJID: pg.id,
  198. code: pg.code,
  199. name: pg.name,
  200. specs: pg.specs,
  201. unit: pg.unit,
  202. shortName: pg.unit_price.short_name,
  203. rationItemQuantity: pg.ratio_data.consumption,
  204. basePrice: pg.unit_price.base_price,
  205. marketPrice: pg.unit_price.market_price,
  206. adjustPrice: pg.adjust_price,
  207. isEstimate: pg.is_evaluate,
  208. isMixRatio: true,
  209. isAdd: pg.unit_price.is_add,
  210. GLJID: pg.glj_id
  211. }
  212. temRationGLJs.push(tem);
  213. }
  214. temRationGLJs = _.sortBy(temRationGLJs, 'code');
  215. return temRationGLJs;
  216. }
  217. function create_ration_glj(user_id, datas) {
  218. return function (callback) {
  219. let ration_glj_list = datas.ration_glj_list;
  220. var tasks = [];
  221. tasks.push(startingTask("get glj info"))
  222. for (let i = 0; i < ration_glj_list.length; i++) {
  223. ration_glj_list[i].ID = uuidV1();
  224. tasks.push(get_lib_glj_info(ration_glj_list[i]))
  225. }
  226. async_n.waterfall(tasks, (err, results) => {
  227. if (err) {
  228. callback(err, results)
  229. } else {
  230. let newRecords = [];
  231. let showDatas = [];
  232. for (let r of results.datas) {
  233. if (r) {
  234. newRecords.push(r.newRecode);
  235. showDatas.push(r.showData);
  236. }
  237. }
  238. if (newRecords.length > 0) {
  239. ration_glj.insertMany(newRecords, (err, doc) => {
  240. if (err) {
  241. callback(err, null);
  242. } else {
  243. let returndata = {
  244. updateTpye: commonConsts.UT_CREATE,
  245. moduleName: 'ration_glj',
  246. data: {
  247. newRecords: newRecords,
  248. showDatas: showDatas
  249. }
  250. }
  251. callback(null, returndata)
  252. }
  253. });
  254. } else {
  255. logger.info("can't find gljs")
  256. callback(null, null)
  257. }
  258. }
  259. })
  260. }
  261. }
  262. function update_ration_glj(user_id, datas) {
  263. if (datas.updateFunction) {
  264. return updateFunctionMap[datas.updateFunction](user_id, datas);
  265. } else {
  266. return normalUpdate(user_id, datas);
  267. }
  268. }
  269. function normalUpdate(user_id, datas) {
  270. return function (callback) {
  271. ration_glj.update(datas.query, datas.doc, (err, result) => {
  272. if (err) {
  273. callback(err, '');
  274. } else {
  275. let returndata = {
  276. moduleName: 'ration_glj',
  277. data: {
  278. updateTpye: commonConsts.UT_UPDATE,
  279. query: datas.query,
  280. doc: datas.doc
  281. }
  282. }
  283. callback(null, returndata)
  284. }
  285. })
  286. }
  287. }
  288. async function doCustomQuantityUpdate(datas) {
  289. let result = await ration_glj.findOneAndUpdate(datas.query, datas.doc);
  290. let cal_result = await glj_calculate_facade.calculateQuantity({
  291. projectID: datas.query.projectID,
  292. rationID: datas.query.rationID
  293. });
  294. cal_result.glj_result.forEach(function (item) {
  295. if (!item.doc.hasOwnProperty('customQuantity')) {
  296. item.doc.customQuantity = null;
  297. }
  298. });
  299. return cal_result;
  300. }
  301. function delete_ration_glj(user_id, datas) {
  302. return function (callback) {
  303. deleteByID(datas, callback);
  304. //callback(new Error("删除子数据失败!"),null)
  305. //这个方法已经不用,先注释,稳定后再删除
  306. /* if (datas.deleteType == "RATION") {
  307. deleteByRation(datas, callback);
  308. } else if (datas.deleteType == "BILL") {
  309. deleteByBill(user_id, datas, callback);
  310. } else {
  311. deleteByID(datas, callback);
  312. }*/
  313. }
  314. }
  315. function deleteByRation(datas, callback) {
  316. let data = datas.updateData;
  317. let tasks = [];
  318. tasks.push(deleteGLJList(data));
  319. tasks.push(ration_coe_facade.delete_ration_coe(data));
  320. tasks.push(quantity_detail_facade.deleteByRation(data));
  321. tasks.push(ration_installation_facade.deleteByRation(data));
  322. async_n.parallel(tasks, function (err, result) {
  323. commonCallback(callback, result, err)
  324. })
  325. }
  326. function deleteGLJList(data) {
  327. return function (callback) {
  328. ration_glj.deleteMany({projectID: data.projectID, rationID: data.ID}, (err, result) => {
  329. commonCallback(callback, result, err)
  330. });
  331. }
  332. }
  333. function deleteByBill(user_id, datas, callback) {
  334. let tasks = [];
  335. tasks.push(startingTask("deleteByBill"));
  336. tasks.push(getRationsByBill(datas));
  337. tasks.push(deleteRationsbyBill(user_id, datas));
  338. tasks.push(deleteByMultiRations(datas));
  339. async_n.waterfall(tasks, function (err, results) {
  340. if (err) {
  341. callback(err, '');
  342. } else {
  343. callback(null, results);
  344. }
  345. })
  346. }
  347. function deleteByID(datas, callback) {
  348. deleteAndUpdateState(datas).then(function (result) {
  349. if (result.err) {
  350. callback(result.err, '');
  351. } else {
  352. let returndata = {
  353. moduleName: 'ration_glj',
  354. data: {
  355. updateTpye: commonConsts.UT_DELETE,
  356. query: datas.query,
  357. adjustState: result.adjustState
  358. }
  359. }
  360. callback(null, returndata)
  361. }
  362. })
  363. }
  364. async function deleteGLJ(IDs) {
  365. await ration_glj.deleteMany({'ID': {$in: IDs}});
  366. }
  367. async function deleteAndUpdateState(datas) {
  368. let result = {
  369. err: null
  370. }
  371. try {
  372. await ration_glj.deleteOne(datas.query);
  373. let stateResult = await glj_calculate_facade.calculateQuantity({
  374. projectID: datas.query.projectID,
  375. rationID: datas.doc.rationID
  376. });
  377. result.adjustState = stateResult.adjustState;
  378. } catch (err) {
  379. result.err = err;
  380. }
  381. return result;
  382. }
  383. function startingTask(processName) {
  384. return function (asyncCallBack) {
  385. var result = {
  386. processName: processName,
  387. datas: []
  388. };
  389. asyncCallBack(null, result);
  390. };
  391. }
  392. function getRationsByBill(datas) {
  393. return function (results, callback) {
  394. ration.find({
  395. projectID: datas.updateData.projectID,
  396. billsItemID: datas.updateData.ID
  397. }, function (err, rations) {
  398. if (err) {
  399. callback(err, '')
  400. } else {
  401. results.rations = rations;
  402. callback(null, results)
  403. }
  404. })
  405. }
  406. }
  407. function deleteRationsbyBill(user_id, datas) {
  408. return function (results, callback) {
  409. let deleteInfo = {
  410. deleteInfo: {deleted: true, deleteDateTime: new Date(), deleteBy: user_id}
  411. };
  412. ration.update({
  413. projectID: datas.updateData.projectID,
  414. billsItemID: datas.updateData.ID
  415. }, deleteInfo, {multi: true}, (err, deleteresults) => {
  416. if (err) {
  417. callback(err, '');
  418. } else {
  419. callback(null, results);
  420. }
  421. });
  422. }
  423. }
  424. function deleteByMultiRations(datas) {
  425. return function (results, deleteCallBack) {
  426. var delete_tasks = [];
  427. var deleteOne = function (ration) {
  428. return function (callback) {
  429. ration_glj.deleteMany({projectID: ration.projectID, rationID: ration.ID}, function (err, result) {
  430. commonCallback(callback, result, err)
  431. });
  432. }
  433. }
  434. let rations = results.rations;
  435. for (let i = 0; i < rations.length; i++) {
  436. delete_tasks.push(deleteOne(rations[i]._doc));
  437. delete_tasks.push(ration_coe_facade.delete_ration_coe(rations[i]._doc));
  438. delete_tasks.push(quantity_detail_facade.deleteByRation(rations[i]._doc));
  439. delete_tasks.push(ration_installation_facade.deleteByRation(rations[i]._doc));
  440. }
  441. delete_tasks.push(quantity_detail_facade.deleteByBill(datas.updateData));
  442. async_n.parallel(delete_tasks, (err, results) => {
  443. if (err) {
  444. deleteCallBack(err, '')
  445. } else {
  446. deleteCallBack(null, results)
  447. }
  448. })
  449. }
  450. }
  451. /*
  452. function deleteByRation(doc) {
  453. return function (callback){
  454. ration_glj.deleteMany({projectID: doc.updateData.projectID, rationID: doc.updateData.ID},callback);
  455. }
  456. }
  457. */
  458. function save(user_id, datas, callback) {
  459. let operations = [];
  460. if (_.isArray(datas)) {
  461. for (let i = 0; i < datas.length; i++) {
  462. operations.push(operationMap[datas[i].updateType](user_id, datas[i]));
  463. }
  464. } else {
  465. operations.push(operationMap[datas.updateType](user_id, datas));
  466. }
  467. async_n.parallel(operations, function (err, results) {
  468. if (err) {
  469. callback(err, '');
  470. } else {
  471. if (results.length == 1) {
  472. callback(null, results[0])
  473. } else {
  474. callback(null, results)
  475. }
  476. }
  477. })
  478. }
  479. async function getLibInfo(req) {
  480. let gljLibId = null, engineerID, sessionCompilation = req.session.sessionCompilation;
  481. engineerID = req.params.engineerID;
  482. if(engineerID){
  483. gljLibId = await getGLJLibByEngineerID(engineerID);
  484. }else {
  485. throw new Error("工程专业ID为空!");
  486. }
  487. let data = {
  488. userID: req.session.sessionUser.id,
  489. gljLibId: gljLibId,
  490. compilationId: sessionCompilation._id
  491. };
  492. return data;
  493. }
  494. async function getGLJLibByEngineerID (engineerID) {
  495. let engineeringLibModel = new EngineeringLibModel() ;
  496. let engineeringInfo = await engineeringLibModel.findDataByCondition({'_id': engineerID});
  497. let gljLibId = engineeringInfo.glj_lib.length > 0 && typeof engineeringInfo.glj_lib !== 'undefined' ? engineeringInfo.glj_lib[0].id : null;
  498. return gljLibId
  499. }
  500. function getGLJData(info, callback) {
  501. let gljDao = new GljDao();
  502. let datas = {};
  503. let gljDistTypeCache = stdgljutil.getStdGljTypeCacheObj().toArray();
  504. datas.distTypeTree = gljDistTypeCache;
  505. async_n.parallel([
  506. async function (cb) {
  507. try {
  508. datas.treeData = await gljDao.getMixedTree(info.gljLibId, info.userID, info.compilationId);
  509. cb(null);
  510. } catch (err) {
  511. cb(err);
  512. }
  513. },
  514. function (cb) {
  515. gljDao.getGljItems(info.gljLibId, info.userID, info.compilationId, function (err, data) {
  516. if (err) {
  517. cb(err);
  518. } else {
  519. datas.stdGLJ = data.stdGljs;
  520. datas.complementaryGLJs = data.complementaryGljs;
  521. cb(null);
  522. }
  523. });
  524. }
  525. ], function (err) {
  526. if (err) {
  527. callback(true, null);
  528. }
  529. else {
  530. callback(false, datas);
  531. }
  532. })
  533. }
  534. function getGLJSearchInfo(ration_glj) {
  535. let data = {
  536. glj_id: ration_glj.GLJID,
  537. project_id: ration_glj.projectID,
  538. code: ration_glj.code,
  539. original_code: ration_glj.original_code,
  540. name: ration_glj.name,
  541. //shortName: ration_glj.shortName,
  542. specs: ration_glj.specs,
  543. unit: ration_glj.unit,
  544. type: ration_glj.subType ? ration_glj.subType : ration_glj.type,//如果有subType,则是通过插入定额级的工料机进来的
  545. model: ration_glj.model,
  546. type_of_work: ration_glj.subType ? ration_glj.subType : ration_glj.type,
  547. base_price: ration_glj.basePrice,
  548. market_price: ration_glj.marketPrice,
  549. repositoryId: ration_glj.repositoryId,
  550. adjCoe: ration_glj.adjCoe,
  551. materialType:ration_glj.materialType,
  552. materialCoe:ration_glj.materialCoe,
  553. from: ration_glj.from ? ration_glj.from : 'std'//std:标准工料机库, cpt:补充工料机库
  554. };
  555. let glj_type_object = glj_type_util.getStdGljTypeCacheObj();
  556. let type = glj_type_object.getItemById(data.type);
  557. data.shortName = type.shortName;
  558. if (data.from == 'cpt') {//从补充工料机来的数据即为新增数据
  559. data.is_add = 1;
  560. }
  561. return data;
  562. }
  563. async function prepareExtData(projectID,compilation) {
  564. let ext , unitFileId ;
  565. let property = await projectDao.getProjectProperty(projectID);
  566. ext = projectDao.getExtendData(property,compilation);
  567. unitFileId = property.unitPriceFile !== undefined ? property.unitPriceFile.id : 0;
  568. return [unitFileId,ext];
  569. }
  570. async function addGLJ(rgList,compilation) {
  571. if (rgList.length <= 0) return {};
  572. let newRecodes = await insertAddTypeGLJ(rgList,compilation);
  573. let stateResult = await glj_calculate_facade.calculateQuantity({
  574. projectID: rgList[0].projectID,
  575. rationID: rgList[0].rationID
  576. });
  577. let result = {
  578. newRecodes: newRecodes,
  579. showData: rgList,
  580. adjustState: stateResult.adjustState
  581. };
  582. return result;
  583. }
  584. async function insertAddTypeGLJ(rgList,compilation) {
  585. let newRecodes = [];
  586. let [unitFileId,ext] = await prepareExtData(rgList[0].projectID,compilation);
  587. for (let g of rgList) {
  588. let projectGljModel = new GLJListModel();
  589. let result = await projectGljModel.addList(getGLJSearchInfo(g),unitFileId,ext);
  590. let typeString = result.type+'';
  591. g.marketPrice = result.unit_price.market_price;
  592. g.adjustPrice = result.unit_price.base_price;
  593. g.basePrice = result.unit_price.base_price;
  594. g.isAdd = result.unit_price.is_add;
  595. g.projectGLJID = result.id;
  596. if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
  597. g.isEstimate = result.is_evaluate;
  598. }
  599. g.ID = uuidV1();
  600. if (result.hasOwnProperty('subList') && result.subList.length > 0) {
  601. g.subList = getMixRatioShowDatas(result.subList);
  602. }
  603. newRecodes.push(createNewRecord(g));
  604. }
  605. await ration_glj.insertMany(newRecodes);
  606. return newRecodes;
  607. }
  608. async function replaceGLJByData(data,compilation) {
  609. let projectGljModel = new GLJListModel();
  610. let [unitFileId,ext] = await prepareExtData(data.projectID,compilation);
  611. let result = await projectGljModel.addList(getGLJSearchInfo(data),unitFileId,ext);
  612. let typeString = result.type+'';
  613. data.projectGLJID = result.id;
  614. let updateResult = await ration_glj.findOneAndUpdate({ID: data.ID, projectID: data.projectID}, data);//更新定额工料机
  615. //组装回传数据
  616. data.marketPrice = result.unit_price.market_price;
  617. data.adjustPrice = result.unit_price.base_price;
  618. data.basePrice = result.unit_price.base_price;
  619. data.isAdd = result.unit_price.is_add;
  620. if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
  621. data.isEstimate = result.is_evaluate;
  622. }
  623. if (result.hasOwnProperty('subList') && result.subList.length > 0) {
  624. data.subList = getMixRatioShowDatas(result.subList);
  625. }
  626. return data;
  627. }
  628. async function replaceGLJ(data,compilation) {
  629. let rdata = {};
  630. data = await replaceGLJByData(data,compilation);
  631. let stateResult = await glj_calculate_facade.calculateQuantity({
  632. projectID: data.projectID,
  633. rationID: data.rationID
  634. }, true,true);
  635. rdata.data = data;
  636. rdata.adjustState = stateResult.adjustState;
  637. rdata.name = stateResult.rationName;
  638. return rdata;
  639. }
  640. async function mReplaceGLJ(data,compilation) {
  641. let mresult = {};
  642. let projectGljModel = new GLJListModel();
  643. let [unitFileId,ext] = await prepareExtData(data.doc.projectID,compilation);
  644. //
  645. let result = await projectGljModel.addList(getGLJSearchInfo(data.doc),unitFileId,ext);
  646. let typeString = result.type+'';
  647. let newDoc = {};
  648. newDoc.projectGLJID = result.id;
  649. let rationList = await ration_glj.distinct('rationID', data.query);
  650. for(let t of data.tasks){
  651. t.updateOne.update.projectGLJID = result.id;//更新项目工料机ID
  652. }
  653. await ration_glj.bulkWrite(data.tasks);
  654. //let updateResult = await ration_glj.update(data.query, data.doc, {multi: true});
  655. newDoc.marketPrice = result.unit_price.market_price;
  656. newDoc.adjustPrice = result.unit_price.base_price;
  657. newDoc.basePrice = result.unit_price.base_price;
  658. newDoc.isAdd = result.unit_price.is_add;
  659. if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
  660. newDoc.isEstimate = result.is_evaluate;
  661. }
  662. if (result.hasOwnProperty('subList') && result.subList.length > 0) {
  663. newDoc.subList = getMixRatioShowDatas(result.subList);
  664. }
  665. let stateList = await changAdjustState(data, rationList);
  666. data.doc = newDoc;
  667. mresult.data = data;
  668. mresult.stateList = stateList;
  669. return mresult
  670. }
  671. async function updateRationGLJByEdit(data) {
  672. var doc = data.doc;
  673. var result;
  674. if (doc.hasOwnProperty('customQuantity')) {
  675. result = await doCustomQuantityUpdate(data)
  676. } else {
  677. result = await doRationGLJUpdate(data);
  678. }
  679. return result;
  680. }
  681. async function updateRationGLJFromDoc(rg,doc,priceInfo) {
  682. let gljListModel = new GLJListModel();
  683. let projectGLJ = getGLJSearchInfo(rg);
  684. for (let key in doc) {
  685. projectGLJ[key] = doc[key]
  686. }
  687. projectGLJ.base_price = priceInfo.base_price;
  688. projectGLJ.market_price = priceInfo.market_price;
  689. let projcetGLJ_n = await gljListModel.modifyGLJ(projectGLJ, rg);
  690. doc.code = projcetGLJ_n.code;
  691. doc.projectGLJID = projcetGLJ_n.id;
  692. if (projcetGLJ_n.unit_price.is_add == 1) {
  693. doc.createType = 'replace';
  694. doc.rcode = projcetGLJ_n.original_code;
  695. } else {
  696. doc.createType = 'normal';
  697. doc.rcode = '';
  698. }
  699. await ration_glj.findOneAndUpdate({ID:rg.ID}, doc);
  700. return [projcetGLJ_n,doc]
  701. }
  702. async function doRationGLJUpdate(data) {
  703. let resutl = {};
  704. let priceInfo = data.priceInfo;
  705. let rg = await ration_glj.findOne(data.query);
  706. let [projcetGLJ_n,doc] = await updateRationGLJFromDoc(rg,data.doc,priceInfo);
  707. //取价格
  708. let gljListModel = new GLJListModel();
  709. gljListModel.getGLJPrice(projcetGLJ_n);
  710. doc.basePrice = projcetGLJ_n.unit_price.base_price;
  711. doc.marketPrice = projcetGLJ_n.unit_price.market_price;
  712. doc.adjustPrice = projcetGLJ_n.adjust_price;
  713. doc.isAdd = projcetGLJ_n.unit_price.is_add;
  714. resutl.doc = doc;
  715. let stateResult = await glj_calculate_facade.calculateQuantity({
  716. projectID: data.query.projectID,
  717. rationID: data.query.rationID
  718. },null,true);
  719. resutl.adjustState = stateResult.adjustState;
  720. resutl.name = stateResult.rationName;
  721. return resutl;
  722. }
  723. async function getGLJClass(info, data) {
  724. let result = {
  725. exist: false
  726. }
  727. //检查补充工料机中是否已经存在一样的记录了
  728. let condition = {
  729. userId: info.userID,
  730. compilationId: info.compilationId,
  731. code: data.code,
  732. name: data.name,
  733. unit: data.unit,
  734. gljType: data.type,
  735. basePrice: data.basePrice
  736. }
  737. if (data.specs != null && data.specs != undefined && data.specs != '') {
  738. condition['specs'] = data.specs;
  739. }
  740. let glj = await complementaryGljModel.find(condition);
  741. if (glj.length > 0) { //如果已存在就直接返回,不用再新增了
  742. result.exist = true;
  743. return result
  744. }
  745. //查找工料机类型树
  746. let items = await compleClassModel.find({
  747. userId: info.userID,
  748. compilationId: info.compilationId
  749. });
  750. result.items = items;
  751. return result;
  752. }
  753. async function insertGLJAsRation(data,compilation) {
  754. let gljList = data.gljList;
  755. if (data.hasOwnProperty("selectedSerialNo")) { //如果需要,更新序列号。
  756. let query = {
  757. projectID: data.projectID,
  758. billsItemID: data.billsItemID,
  759. serialNo: {$gt: data.selectedSerialNo}
  760. }
  761. await ration.update(query, {$inc: {serialNo: gljList.length}}, {multi: true});
  762. }
  763. let [unitFileId,ext] = await prepareExtData(data.doc.projectID,compilation);
  764. for (let glj of gljList) {
  765. let p_glj = getGLJSearchInfo(glj);
  766. let projectGljModel = new GLJListModel();
  767. let result = await projectGljModel.addList(p_glj,unitFileId,ext);//逐条添加到项目工料机
  768. let typeString = result.type+'';
  769. glj.marketPrice = result.unit_price.market_price;
  770. glj.adjustPrice = result.unit_price.base_price;
  771. glj.basePrice = result.unit_price.base_price;
  772. glj.isAdd = result.unit_price.is_add;
  773. glj.projectGLJID = result.id;
  774. if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
  775. glj.isEstimate = result.is_evaluate;
  776. }
  777. }
  778. await ration.insertMany(gljList);
  779. return gljList;
  780. }
  781. async function getRationTypeGLJQuantity(projectID) {
  782. let rations = await ration.find({'projectID': projectID,'type':3,'deleteInfo': null}, ['ID', 'projectGLJID','quantity']);
  783. return rations;
  784. }
  785. async function changAdjustState(data, rationList) {
  786. let stateList = [];
  787. for (let r of rationList) {
  788. let stateResult = await glj_calculate_facade.calculateQuantity({
  789. projectID: data.query.projectID,
  790. rationID: r
  791. }, true,true);
  792. if(stateResult){
  793. stateList.push({rationID: r, adjustState: stateResult.adjustState,name:stateResult.rationName});
  794. }
  795. }
  796. return stateList;
  797. }
  798. async function getGLJDataByCodes(data,compilation) {
  799. let gljLibId = await getGLJLibByEngineerID(data.engineerID);
  800. let gljDatas = [];
  801. if(gljLibId){
  802. let stdList = await std_glj_lib_gljList_model.find({'repositoryId':gljLibId,code:{'$in':data.codes}});
  803. if(stdList.length > 0){
  804. let property = await projectDao.getProjectProperty(data.projectID);
  805. let ext = projectDao.getExtendData(property,compilation);//多单价处理
  806. for(let s of stdList){
  807. let tem = JSON.parse(JSON.stringify(s));
  808. if(ext && ext.priceField && tem && tem.priceProperty){
  809. tem.basePrice = tem.priceProperty[ext.priceField];
  810. }
  811. gljDatas.push(tem);
  812. }
  813. }
  814. }
  815. return gljDatas
  816. }
  817. async function testError() {
  818. throw new Error('test Error');
  819. }
  820. function getData(projectID, callback) {
  821. ration_glj.find({'projectID': projectID}, (err, datas) => {
  822. if (err) {
  823. callback(1, '', null);
  824. } else {
  825. callback(0, consts.projectConst.RATION_GLJ, datas);
  826. }
  827. })
  828. }
  829. function commonCallback(callback, result, err) {
  830. if (err) {
  831. callback(err, '');
  832. } else {
  833. callback(null, result);
  834. }
  835. }