glj_controller.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. /**
  2. * 工料机相关控制器
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/6/22
  6. * @version
  7. */
  8. const BaseController = require("../../common/base/base_controller");
  9. const GLJTypeConst = require("../../common/const/glj_type_const");
  10. const GLJListModel = require("../models/glj_list_model");
  11. const UnitPriceModel = require("../models/unit_price_model");
  12. const MixRatioModel = require("../models/mix_ratio_model");
  13. const UnitPriceFileModel = require("../models/unit_price_file_model");
  14. let logger = require("../../../logs/log_helper").logger;
  15. let consts = require('../../main/models/project_consts');
  16. let glj_type_util = require('../../../public/cache/std_glj_type_util');
  17. let ration_glj_facade = require('../../ration_glj/facade/ration_glj_facade');
  18. let EngineeringLibModel = require("../../users/models/engineering_lib_model");
  19. let mongoose = require('mongoose');
  20. let original_calc_model = mongoose.model('original_calc');
  21. let freight_calc_model = mongoose.model('freight_calc');
  22. let com_electrovalence_model = mongoose.model('com_electrovalence');
  23. let ration = mongoose.model('ration');
  24. let projectModel = mongoose.model('projects');
  25. let _ = require('lodash');
  26. let glj_facade = require('../facade/glj_facade');
  27. let gljUtil = require('../../../public/gljUtil');
  28. const ProjectModel = require('../../pm/models/project_model').project;
  29. const commonFacade = require('../../main/facade/common_facade');
  30. class GLJController extends BaseController {
  31. /**
  32. * 构造函数
  33. *
  34. * @return {void}
  35. */
  36. constructor() {
  37. let parent = super();
  38. parent.title = '工料机';
  39. }
  40. /**
  41. * 获取工料机相关数据
  42. *
  43. * @param {object} request
  44. * @param {object} response
  45. * @return {void}
  46. */
  47. async getGljList(request, response) {
  48. // 标段id
  49. let projectId = request.body.project_id;
  50. projectId = parseInt(projectId);
  51. let responseData = await getGLJListByProjectID(projectId);
  52. responseData.hostname = request.hostname;
  53. response.json(responseData);
  54. }
  55. /**
  56. * project getData 接口
  57. * @param projectID
  58. * @param callback
  59. */
  60. getData(projectID, callback){
  61. let start = +new Date();
  62. getGLJListByProjectID(projectID).then(function(result){
  63. let end = +new Date();
  64. console.log("项目工料机模块取数据总时间-----"+(end - start));
  65. callback(result.err,consts.projectConst.PROJECTGLJ,result.data);
  66. })
  67. }
  68. /**
  69. * 更新数据
  70. *
  71. * @param {object} request
  72. * @param {object} response
  73. * @return {void}
  74. */
  75. async updateData(request, response) {
  76. let field = request.body.field;
  77. let value = request.body.value;
  78. let extend = request.body.extend;
  79. value = value === 'true' ? 1 : value;
  80. value = value === 'false' ? 0 : value;
  81. let id = request.body.id;
  82. let responseData = {
  83. err: 0,
  84. msg: ''
  85. };
  86. try {
  87. // 可编辑的字段
  88. let editableField = ['is_evaluate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption',
  89. 'supply', 'supply_quantity','delivery_address','delivery','materialType','materialCoe','is_main_material','remark'];
  90. if (editableField.indexOf(field) < 0) {
  91. throw '对应字段不能编辑';
  92. }
  93. let modelString = 'glj';
  94. // 切割字段
  95. let fieldArray = field.split('.');
  96. modelString = fieldArray.length > 1 ? fieldArray[0] : modelString;
  97. field = fieldArray.length > 1 ? fieldArray[1] : field;
  98. // 组合数据
  99. let updateData = new Object();
  100. updateData[field] = value;
  101. let result = false;
  102. let model = null;
  103. switch (modelString) {
  104. case 'glj':
  105. if (extend&&extend !== '') {
  106. extend = JSON.parse(extend);
  107. for (let code in extend) {
  108. updateData[code] = extend[code];
  109. }
  110. }
  111. console.log(updateData);
  112. model = new GLJListModel();
  113. // 更新数据
  114. result = await model.updateById(id, updateData);
  115. break;
  116. case 'unit_price':
  117. model = new UnitPriceModel();
  118. // 更新数据
  119. result = await model.updatePrice({id: id}, updateData, extend);
  120. break;
  121. case 'mix_ratio':
  122. let marketPrice = request.body.market_price;
  123. let basePrice = request.body.base_price;
  124. model = new MixRatioModel();
  125. result = await model.updateById(id, updateData);
  126. if (result && marketPrice && basePrice) {
  127. // 修改后更新父节点的项目工料机市场单价
  128. let mixRatioData = await model.findDataByCondition({id: id});
  129. if (mixRatioData.length <= 0) {
  130. break;
  131. }
  132. let indexList = ['code','name','specs','unit','type'];
  133. let keyList = mixRatioData.connect_key.split("|-|");
  134. // 更新市场单价和基价单价
  135. let condition = {unit_price_file_id: mixRatioData.unit_price_file_id};
  136. for(let i = 1;i<keyList.length;i++){
  137. if(keyList[i]!='null'){
  138. condition[indexList[i]]=keyList[i];
  139. }
  140. }
  141. let unitPriceUpdate = {
  142. // base_price: basePrice, ---- 20190218 修改机械台班的组成物,仅重新计算机械预算价,定额价保持不变。
  143. market_price: marketPrice
  144. };
  145. let unitPriceModel = new UnitPriceModel();
  146. let unitPriceResult = await unitPriceModel.updatePrice(condition, unitPriceUpdate);
  147. if (!unitPriceResult) {
  148. throw '更新单价数据失败';
  149. }
  150. }
  151. break;
  152. }
  153. if (!result) {
  154. throw '更新失败';
  155. }
  156. } catch (error) {
  157. console.log('error:' + error);
  158. responseData.err = 1;
  159. }
  160. response.json(responseData);
  161. }
  162. /**
  163. * 加载配合比相关数据
  164. *
  165. * @return {void}
  166. */
  167. async getRatio(request, response) {
  168. let projectGLJId = request.body.id;
  169. let projectId = request.body.project_id;
  170. let responseData = {
  171. err: 0,
  172. data: null
  173. };
  174. try {
  175. // 获取标段对应的单价文件id
  176. let unitPriceFileId = await commonFacade.getUnitPriceFileId(projectId);
  177. if (unitPriceFileId <= 0) {
  178. throw '没有对应的单价文件';
  179. }
  180. let gljListModel = new GLJListModel();
  181. let result = await gljListModel.getCompositionList(projectGLJId, unitPriceFileId);
  182. if (result.length <= 0) {
  183. throw '没有找到数据';
  184. }
  185. responseData.data = JSON.stringify(result);
  186. } catch (error) {
  187. console.log(error);
  188. responseData.err = 1;
  189. }
  190. response.json(responseData);
  191. }
  192. /**
  193. * 删除配合比数据
  194. *
  195. * @param {object} request
  196. * @param {object} response
  197. * @return {void}
  198. */
  199. async deleteMixRatio(request, response) {
  200. if(request.body.data){
  201. let data = request.body.data;
  202. request.body = JSON.parse(data);
  203. }
  204. let id = request.body.id;
  205. id = parseInt(id);
  206. let responseData = {
  207. err: 0,
  208. msg: ''
  209. };
  210. try {
  211. if (isNaN(id) || id <= 0) {
  212. throw '参数错误';
  213. }
  214. let mixRatioModel = new MixRatioModel();
  215. let result = await mixRatioModel.deleteById(id);
  216. let unitPriceModel = new UnitPriceModel();
  217. if(request.body.unitPrice){
  218. let unitPrice = _.isObject(request.body.unitPrice)?request.body.unitPrice: JSON.parse(request.body.unitPrice);
  219. await unitPriceModel.model.update(unitPrice.query,unitPrice.doc);
  220. }
  221. if(request.body.parent){
  222. let parent = _.isObject(request.body.parent)?request.body.parent:JSON.parse(request.body.parent);
  223. await unitPriceModel.model.update(parent.query,parent.doc);
  224. }
  225. if (!result) {
  226. throw '删除失败';
  227. }
  228. } catch (error) {
  229. console.log(error);
  230. responseData.err = 1;
  231. responseData.msg = error;
  232. }
  233. response.json(responseData);
  234. }
  235. //添加组成物
  236. async addMixRatio(request,response){
  237. let result={
  238. error:0
  239. };
  240. try {
  241. let data = request.body.data;
  242. data = JSON.parse(data);
  243. let gljList = data.gljList, parentInfo = data.parentInfo,mixRatios = [];
  244. let projectGljModel = new GLJListModel();
  245. let mixRatioModel = new MixRatioModel();
  246. if(gljList.length > 0){
  247. let [unitFileId,ext] = await ration_glj_facade.prepareExtData(gljList[0].project_id,request.session.sessionCompilation);
  248. for(let g of gljList){
  249. let newProjectGLJ = await projectGljModel.addList(g,unitFileId,ext);
  250. let mixRatio = {
  251. glj_id:newProjectGLJ.glj_id,
  252. consumption:0,
  253. unit_price_file_id:unitFileId,
  254. connect_key:parentInfo.connect_key,
  255. type: newProjectGLJ.type,
  256. code: newProjectGLJ.code,
  257. specs:newProjectGLJ.specs,
  258. name:newProjectGLJ.name,
  259. unit:newProjectGLJ.unit,
  260. model:newProjectGLJ.model
  261. };
  262. newProjectGLJ.ratio_data = await mixRatioModel.add(mixRatio);
  263. mixRatios.push(newProjectGLJ);
  264. }
  265. }
  266. result.data = mixRatios;
  267. }catch (err){
  268. logger.err(err);
  269. result.error=1;
  270. result.message = err.message;
  271. }
  272. response.json(result);
  273. }
  274. /**
  275. * 获取项目与单价文件对应的数据
  276. *
  277. * @param {object} request
  278. * @param {object} response
  279. * @return {void}
  280. */
  281. async getProjectInfo(request, response) {
  282. if(typeof request.body.data == "string"){
  283. request.body = JSON.parse(request.body.data)
  284. }
  285. let projectId = request.body.project_id;
  286. let rootProjectID = request.body.rootProjectID;
  287. projectId = parseInt(projectId);
  288. const notDeleted = [{deleteInfo: null}, {'deleteInfo.deleted': false}];
  289. let responseData = {
  290. err: 0,
  291. data: null
  292. };
  293. try {
  294. let sessionUserData = request.session.sessionUser;
  295. //获取当前单位工程
  296. let currentTender = await projectModel.findOne({ID: projectId, $or: notDeleted});
  297. // 获取对应用户所有的建设项目数据
  298. let projectList = await ProjectModel.getUserProjectData(sessionUserData.id,request.session.sessionCompilation._id);
  299. //获取对应用户所有文件夹
  300. let folders = await projectModel.find({userID: sessionUserData.id, $or: notDeleted, projType: 'Folder'}, {_id: 0, name: 1, ID: 1, NextSiblingID: 1, ParentID: 1});
  301. if(currentTender === null){
  302. throw '当前单位工程不存在';
  303. }
  304. if (projectList === null) {
  305. throw '没有找到对应的项目数据';
  306. }
  307. // 转换mongoose数据
  308. projectList = JSON.stringify(projectList);
  309. projectList = JSON.parse(projectList);
  310. let result = {
  311. self: [],
  312. other: [],
  313. treeData: []
  314. };
  315. for (let index in projectList) {
  316. // 获取对应的单价文件
  317. let unitPriceFileModel = new UnitPriceFileModel();
  318. let unitPriceFileData = await unitPriceFileModel.getDataByRootProject(projectList[index].ID);
  319. projectList[index].unitPriceList = unitPriceFileData;
  320. // 归类
  321. if (rootProjectID == projectList[index].ID) {
  322. //剔除自身
  323. let currentUsedUF = currentTender.property.unitPriceFile.id;
  324. result.self = _.filter(unitPriceFileData, function (uf) {
  325. return uf.id !== currentUsedUF;
  326. });
  327. result.currentProjectName = projectList[index].name;
  328. } else {
  329. result.other.push(projectList[index]);
  330. }
  331. result.treeData.push({name: projectList[index].name, ID: projectList[index].ID, NextSiblingID: projectList[index].NextSiblingID, ParentID: projectList[index].ParentID});
  332. }
  333. result.treeData = result.treeData.concat(folders);
  334. responseData.data = result;
  335. response.json(responseData);
  336. } catch (error) {
  337. responseData.err = 1;
  338. response.json(responseData);
  339. }
  340. }
  341. /**
  342. * 更改单价文件
  343. *
  344. * @param {object} request
  345. * @param {object} response
  346. * @return {void}
  347. */
  348. async changeUnitPriceFile(request, response) {
  349. let projectId = request.body.project_id;
  350. let changeUnitPriceId = request.body.change_id;
  351. let newName = request.body.newName;
  352. let type = request.body.type;
  353. type = parseInt(type);
  354. let responseData = {
  355. err: 0,
  356. msg: ''
  357. };
  358. try {
  359. responseData.unitFile = await glj_facade.changeUnitFile({projectID:projectId}, {id:changeUnitPriceId,name:newName},type,request.session.sessionUser.id);
  360. } catch (error) {
  361. console.log(error);
  362. responseData.err = 1;
  363. responseData.msg = error;
  364. }
  365. response.json(responseData);
  366. }
  367. async changeVvTaxFile(request, response){
  368. let result={error:0};
  369. try {
  370. let data = JSON.parse(request.body.data);
  371. await glj_facade.changeVvTaxFile(data);
  372. }catch (err){
  373. logger.err(err);
  374. result.error=1;
  375. result.message = err.message;
  376. }
  377. response.json(result);
  378. }
  379. async changeAssistProductionFeeRate(request, response){
  380. let result={error:0};
  381. try {
  382. let data = JSON.parse(request.body.data);
  383. await glj_facade.changeAssistProductionFeeRate(data);
  384. }catch (err){
  385. logger.err(err);
  386. result.error=1;
  387. result.message = err.message;
  388. }
  389. response.json(result);
  390. }
  391. async updateMaterialCalc(request, response){
  392. let result={error:0};
  393. try {
  394. let data = JSON.parse(request.body.data);
  395. result.data = await glj_facade.updateMaterialCalc(data);
  396. }catch (err){
  397. logger.err(err);
  398. result.error=1;
  399. result.message = err.message;
  400. }
  401. response.json(result);
  402. }
  403. async updateMaterialCalcTasks(request, response){
  404. let result={error:0};
  405. try {
  406. let data = JSON.parse(request.body.data);
  407. result.data = await glj_facade.updateMaterialCalcTasks(data);
  408. }catch (err){
  409. logger.err(err);
  410. result.error=1;
  411. result.message = err.message;
  412. }
  413. response.json(result);
  414. }
  415. async insertElectrovalence(request, response){
  416. let result={error:0};
  417. try {
  418. let data = JSON.parse(request.body.data);
  419. result.data = await glj_facade.insertElectrovalence(data,request.session.sessionCompilation._id);
  420. }catch (err){
  421. logger.err(err);
  422. result.error=1;
  423. result.message = err.message;
  424. }
  425. response.json(result);
  426. }
  427. async updateElectrovalence(request, response){
  428. let result={error:0};
  429. try {
  430. let data = JSON.parse(request.body.data);
  431. result.data = await glj_facade.updateElectrovalence(data);
  432. }catch (err){
  433. logger.err(err);
  434. result.error=1;
  435. result.message = err.message;
  436. }
  437. response.json(result);
  438. }
  439. async updateUserFreight(request, response){
  440. let result={error:0};
  441. try {
  442. let data = JSON.parse(request.body.data);
  443. result.data = await glj_facade.updateUserFreight(data,request);
  444. }catch (err){
  445. logger.err(err);
  446. result.error=1;
  447. result.message = err.message;
  448. }
  449. response.json(result);
  450. }
  451. async checkUnitFileName(request, response){
  452. let result={
  453. error:0
  454. }
  455. try {
  456. let data = request.body.data;
  457. let nameExist = false;
  458. data = JSON.parse(data);
  459. let unitPriceFileModel = new UnitPriceFileModel();
  460. let count = await unitPriceFileModel.model.count({root_project_id:data.rootProjectID,name:data.name,deleteInfo:null});
  461. if(count>0){
  462. nameExist = true;
  463. }else {
  464. nameExist = false;
  465. }
  466. result.data= nameExist;
  467. }catch (err){
  468. console.log(err);
  469. result.error=1;
  470. result.message = err.message;
  471. }
  472. response.json(result);
  473. }
  474. /**
  475. * 单价文件另存为
  476. *
  477. * @param {object} request
  478. * @param {object} response
  479. * @return {void}
  480. */
  481. async unitPriceSaveAs(request, response) {
  482. let responseData = {
  483. err: 0,
  484. msg: ''
  485. };
  486. let projectId = request.body.project_id;
  487. let name = request.body.name;
  488. try {
  489. // 当前单价文件id
  490. let currentUnitPriceId = await commonFacade.getUnitPriceFileId(projectId);
  491. // 获取当前项目的rootProjectId
  492. let projectData = await ProjectModel.getProject(projectId);
  493. let rootProjectId = projectData.property.rootProjectID !== undefined ? projectData.property.rootProjectID : 0;
  494. // 新增单价文件信息
  495. let unitPriceFileModel = new UnitPriceFileModel();
  496. let insertData = {
  497. name: name,
  498. project_id: projectId,
  499. user_id: request.session.sessionUser.id,
  500. root_project_id: rootProjectId
  501. };
  502. let addResult = await unitPriceFileModel.add(insertData);
  503. if (!addResult) {
  504. throw '单价文件另存为失败';
  505. }
  506. // 查找对应单价文件的项目工料机数据
  507. let unitPriceModel = new UnitPriceModel();
  508. let copyResult = await unitPriceModel.copyNotExist(currentUnitPriceId, addResult.id,projectId);
  509. // 复制成功后更改project数据
  510. if (!copyResult) {
  511. throw '复制数据失败';
  512. }
  513. await ProjectModel.updateUnitFileToProject(projectId,{id:addResult.id,name:addResult.name});
  514. responseData.data = addResult;
  515. } catch (error) {
  516. responseData.err = 1;
  517. responseData.msg = error;
  518. }
  519. response.json(responseData);
  520. }
  521. /**
  522. * 获取项目中所有组成物数据(用户缓存到前端变量)
  523. *
  524. * @param {object} request
  525. * @param {object} response
  526. * @return {void}
  527. */
  528. async getComposition(request, response) {
  529. let projectId = request.body.project_id;
  530. projectId = parseInt(projectId);
  531. let responseData = {
  532. err: 0,
  533. data: null
  534. };
  535. try {
  536. // 当前单价文件id
  537. let currentUnitPriceId = await commonFacade.getUnitPriceFileId(projectId);
  538. if (currentUnitPriceId <= 0) {
  539. throw '没有找到对应的单价文件';
  540. }
  541. // 获取组成物数据
  542. let mixRatioModel = new MixRatioModel();
  543. let compositionData = await mixRatioModel.findDataByCondition({unit_price_file_id: currentUnitPriceId}, null, false);
  544. if (compositionData === null) {
  545. throw '没有找到组成物数据';
  546. }
  547. compositionData = JSON.parse(JSON.stringify(compositionData));
  548. // 查找对应的单价数据
  549. let unitPriceModel = new UnitPriceModel();
  550. let unitPriceData = await unitPriceModel.findDataByCondition({unit_price_file_id: currentUnitPriceId}, null, false, 'glj_id');
  551. // 整理数据
  552. let result = {};
  553. for(let composition of compositionData) {
  554. let tmpId = composition.glj_id !== undefined ? composition.glj_id : -1;
  555. let tmpData = {
  556. market_price: unitPriceData[tmpId] !== undefined ?
  557. unitPriceData[tmpId].market_price : 0,
  558. base_price: unitPriceData[tmpId] !== undefined ?
  559. unitPriceData[tmpId].base_price : 0,
  560. consumption: composition.consumption,
  561. glj_type: composition.glj_type,
  562. connect_code: composition.connect_code
  563. };
  564. if (result[tmpId] === undefined) {
  565. result[tmpId] = [];
  566. }
  567. result[tmpId].push(tmpData);
  568. }
  569. responseData.data = result;
  570. } catch (error) {
  571. responseData.err = 1;
  572. responseData.data = null;
  573. }
  574. response.json(responseData);
  575. }
  576. /**
  577. * 模拟定额插入
  578. *
  579. * @param {object} request
  580. * @param {object} response
  581. * @return {void}
  582. */
  583. async test(request, response) {
  584. // 从定额库获取的数据
  585. let data = {
  586. glj_id: 17,
  587. project_id: 1,
  588. code: '00010201',
  589. name: '土石方综合工日',
  590. specs: '',
  591. unit: '工日',
  592. type: GLJTypeConst.LABOUR,
  593. base_price: 50,
  594. market_price: 50
  595. };
  596. try {
  597. let gljListModel = new GLJListModel();
  598. let result = await gljListModel.addList(data);
  599. } catch (error) {
  600. console.log(error);
  601. }
  602. response.end('success');
  603. }
  604. /**
  605. * 模拟定额修改单价
  606. *
  607. * @param {object} request
  608. * @param {object} response
  609. * @return {void}
  610. */
  611. async testModify(request, response) {
  612. let projectId = request.query.project;
  613. // 修改数据
  614. let updateData = {
  615. code: '36290101',
  616. market_price: '13',
  617. name: '水(10)',
  618. project_id: projectId
  619. };
  620. try {
  621. let gljListModel = new GLJListModel();
  622. let result = await gljListModel.modifyMarketPrice(updateData);
  623. console.log(result);
  624. } catch (error) {
  625. console.log(error);
  626. }
  627. response.end('success');
  628. }
  629. /**
  630. * 测试删除
  631. *
  632. * @param {object} request
  633. * @param {object} response
  634. * @return {void}
  635. */
  636. async delete(request, response) {
  637. try {
  638. let gljListModel = new GLJListModel();
  639. let result = await gljListModel.deleteById(63);
  640. console.log(result);
  641. } catch (error) {
  642. console.log(error);
  643. }
  644. response.end('success');
  645. }
  646. async updateUnitPrice(req, res){
  647. let result={
  648. error:0
  649. }
  650. try {
  651. let data = req.body.data;
  652. data = JSON.parse(data);
  653. let unitPriceModel = new UnitPriceModel();
  654. // 更新数据
  655. let datas = await unitPriceModel.updateUnitPrice(data);
  656. result.data=datas;
  657. }catch (err){
  658. logger.err(err);
  659. result.error=1;
  660. result.message = err.message;
  661. }
  662. res.json(result);
  663. }
  664. async updateCalcMaterial(req, res){
  665. let result={
  666. error:0
  667. }
  668. try {
  669. let data = req.body.data;
  670. data = JSON.parse(data);
  671. let unitPriceModel = new UnitPriceModel();
  672. // 更新数据
  673. let datas = await unitPriceModel.updateCalcMaterial(data);
  674. result.data=datas;
  675. }catch (err){
  676. logger.err(err);
  677. result.error=1;
  678. result.message = err.message;
  679. }
  680. res.json(result);
  681. }
  682. async batchUpdatePrices(req, res){
  683. let result={
  684. error:0
  685. }
  686. try {
  687. let data = req.body.data;
  688. data = JSON.parse(data);
  689. let unitPriceModel = new UnitPriceModel();
  690. // 更新数据
  691. let datas = await unitPriceModel.batchUpdatePrices(data);
  692. result.data=datas;
  693. }catch (err){
  694. logger.err(err);
  695. result.error=1;
  696. result.message = err.message;
  697. }
  698. res.json(result);
  699. }
  700. async batchUpdateGLJProperty(req, res){
  701. let result={
  702. error:0
  703. };
  704. try {
  705. let data = req.body.data;
  706. data = JSON.parse(data);
  707. let tasks = [];
  708. for(let key in data){
  709. let doc = data[key];
  710. let query = {id:parseInt(key)};
  711. let task = {updateOne:{filter:query, update :doc}};
  712. tasks.push(task);
  713. }
  714. if(tasks.length > 0){
  715. let gljModel = new GLJListModel().model;
  716. await gljModel.bulkWrite(tasks);
  717. }
  718. result.data=data;
  719. }catch (err){
  720. logger.err(err);
  721. result.error=1;
  722. result.message = err.message;
  723. }
  724. res.json(result);
  725. }
  726. async batchUpdateConsumption(req,res){
  727. let result={
  728. error:0
  729. };
  730. try {
  731. let data = req.body.data;
  732. data = JSON.parse(data);
  733. let mixTasks = [],unitPriceTask=[];
  734. for(let d of data){
  735. if(d.type == 'mix_ratio'){
  736. let task = {updateOne:{filter:d.query, update :d.doc}};
  737. mixTasks.push(task);
  738. }else if(d.type == 'unitPrice'){
  739. let utask = {updateOne:{filter:d.query, update :d.doc}};
  740. unitPriceTask.push(utask);
  741. }
  742. }
  743. if(mixTasks.length > 0){
  744. let mixRatioModel = new MixRatioModel().model;
  745. await mixRatioModel.bulkWrite(mixTasks);
  746. }
  747. let unitPriceModel = new UnitPriceModel();
  748. if(unitPriceTask.length > 0)await unitPriceModel.model.bulkWrite(unitPriceTask);
  749. result.data = "ok";
  750. }catch (err){
  751. logger.err(err);
  752. result.error=1;
  753. result.message = err.message;
  754. }
  755. res.json(result);
  756. }
  757. async updateEvaluateMaterial(request, response){
  758. let result={error:0};
  759. try {
  760. let data = JSON.parse(request.body.data);
  761. result.data = await glj_facade.updateEvaluateMaterial(data);
  762. }catch (err){
  763. logger.err(err);
  764. result.error=1;
  765. result.message = err.message;
  766. }
  767. response.json(result);
  768. }
  769. async modifyKeyValue(req,res){//修改工料机关键的属性:名称、类型、规格、型号等
  770. let result={
  771. error:0
  772. }
  773. try {
  774. let data = req.body.data;
  775. data = JSON.parse(data);
  776. let gljListModel = new GLJListModel();
  777. let ration_data = await ration.findOne(data.ration);
  778. // 修改项目工料机
  779. let projcetGLJ = await gljListModel.modifyGLJ(data.updateData,ration_data);
  780. // let datas = await gljListModel.addList(data);
  781. result.data=projcetGLJ;
  782. }catch (err){
  783. logger.err(err);
  784. result.error=1;
  785. result.message = err.message;
  786. }
  787. res.json(result);
  788. }
  789. async getVvTaxList(req,res){
  790. let vvTxtList = [];
  791. try {
  792. let egnrModel = new EngineeringLibModel();
  793. let egnr = await egnrModel.getEngineering(req.query.engineeringID);
  794. vvTxtList = egnr.vvTax_lib;
  795. }catch (err){
  796. logger.err(err);
  797. }
  798. res.json(vvTxtList);
  799. }
  800. async getUserFreights(req,res){
  801. let userFreights = [];
  802. try {
  803. userFreights = await await glj_facade.getUserFreights(req);
  804. }catch (err){
  805. logger.err(err);
  806. }
  807. res.json(userFreights);
  808. }
  809. async getProjectGLJsByProjectID(projectId){
  810. return await getGLJListByProjectID(projectId)
  811. }
  812. async getFreightAndOriginalData(projectId,unitPriceFileId){
  813. return await getFreightAndOriginalData(projectId,unitPriceFileId);
  814. }
  815. }
  816. async function getFreightAndOriginalData(projectId,unitPriceFileId){
  817. if(!unitPriceFileId) unitPriceFileId = await commonFacade.getUnitPriceFileId(projectId);
  818. let originalList = await original_calc_model.find({"unit_price_file_id":unitPriceFileId}).lean();
  819. let freightList = await freight_calc_model .find({"unit_price_file_id":unitPriceFileId}).lean();
  820. return [originalList,freightList]
  821. }
  822. /**
  823. * 取项目工料机列表
  824. * @param projectId
  825. * @returns {Promise.<void>}
  826. */
  827. async function getGLJListByProjectID(projectId){
  828. let responseData = {
  829. err: 0,
  830. msg: '',
  831. data: {}
  832. };
  833. try {
  834. if (isNaN(projectId) || projectId <= 0) {
  835. throw '标段id有误';
  836. }
  837. // 获取标段对应的单价文件id
  838. let unitPriceFileId = await commonFacade.getUnitPriceFileId(projectId);
  839. if (unitPriceFileId <= 0) {
  840. throw '没有对应的单价文件';
  841. }
  842. // 获取使用该单价文件的项目数据
  843. let tenderData = await ProjectModel.getTenderByUnitPriceFileId(unitPriceFileId);
  844. let usedTenderList = [];
  845. let usedUnitPriceInfo = {};
  846. if (tenderData !== null) {
  847. for (let tmp of tenderData) {
  848. usedTenderList.push(tmp.name);
  849. usedUnitPriceInfo.name = tmp.property.unitPriceFile.name;
  850. usedUnitPriceInfo.id = tmp.property.unitPriceFile.id;
  851. }
  852. }
  853. let [originalList,freightList] = await getFreightAndOriginalData(projectId,unitPriceFileId);
  854. responseData.data.originalList = originalList;
  855. responseData.data.freightList = freightList;
  856. responseData.data.com_electrovalence = await com_electrovalence_model.findOne({"unit_price_file_id":unitPriceFileId}).lean();
  857. //if(!responseData.data.com_electrovalence) responseData.data.com_electrovalence = {};
  858. // 先获取对应标段的项目工料机数据
  859. let gljListModel = new GLJListModel();
  860. let [gljList, mixRatioConnectData,mixRatioMap,unitPriceMap] = await gljListModel.getListByProjectId(projectId, unitPriceFileId,responseData.data.freightList,responseData.data.originalList,responseData.data.com_electrovalence);
  861. responseData.data.gljList = gljList;
  862. responseData.data.mixRatioConnectData = mixRatioConnectData;
  863. responseData.data.mixRatioMap = mixRatioMap;
  864. responseData.data.usedTenderList = usedTenderList;
  865. responseData.data.unitPriceMap = unitPriceMap;
  866. let gljTypeMap = glj_type_util.getStdGljTypeCacheObj().innerGljTypeObj;
  867. let unitPriceFileModel = new UnitPriceFileModel();
  868. let unitFileInfo = await unitPriceFileModel.findDataByCondition({id: unitPriceFileId});
  869. responseData.data.constData = {
  870. materialIdList: gljListModel.materialIdList,
  871. ownCompositionTypes: gljListModel.ownCompositionTypes,
  872. roomId: unitPriceFileId,
  873. GLJTypeConst: JSON.stringify(GLJTypeConst),
  874. usedUnitPriceInfo: usedUnitPriceInfo,
  875. gljTypeMap:gljTypeMap,
  876. vvTaxFileID:unitFileInfo.vvTaxFileID,
  877. assistProductionFeeRate:unitFileInfo.assistProductionFeeRate?unitFileInfo.assistProductionFeeRate:3,
  878. machineConstCoe:unitFileInfo.machineConstCoe?unitFileInfo.machineConstCoe:1
  879. };
  880. } catch (error) {
  881. console.log(error);
  882. responseData.err = 1;
  883. responseData.msg = error;
  884. }
  885. return responseData;
  886. }
  887. module.exports = GLJController;