ration_glj_facade.js 34 KB

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