info_price_facade.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /**
  2. * Created by zhang on 2020/7/20
  3. */
  4. module.exports={
  5. getOptions,
  6. getDataByCondition,
  7. mutiApplyInfoPrice
  8. };
  9. const mongoose = require('mongoose');
  10. let infoLibModel = mongoose.model("std_price_info_lib");
  11. let infoItemsModel = mongoose.model("std_price_info_items");
  12. let infoAreasModel = mongoose.model("std_price_info_areas");
  13. let unitPriceModel = mongoose.model("unit_price");
  14. let _ = require("lodash");
  15. let gljUtil = require('../../../public/web/gljUtil');
  16. const scMathUtil = require('../../../public/scMathUtil').getUtil();
  17. // 载入模块
  18. var Segment = require('segment');
  19. // 创建实例
  20. var segment = new Segment();
  21. // 使用默认的识别模块及字典,载入字典文件需要1秒,仅初始化时执行一次即可
  22. segment.useDefault();
  23. async function getOptions(data,compilation){//data 是预留对象,暂时不用
  24. let compilationID = compilation._id;
  25. let areaMap={};
  26. let periodMap={};
  27. let areas =await infoAreasModel.find({"compilationID":compilationID}).lean();
  28. let libList = await infoLibModel.find({"compilationID":compilationID}).lean();
  29. for(let l of libList){
  30. // for(let area of l.areas){
  31. // if(!areaMap[area]) areas.push(area);
  32. // }
  33. //2020-05
  34. let periodArray = l.period.split("-");
  35. periodMap[periodArray[0]]?periodMap[periodArray[0]].push(periodArray[1]):periodMap[periodArray[0]]=[periodArray[1]]
  36. }
  37. for(let key in periodMap){
  38. periodMap[key] = _.sortBy(periodMap[key]);
  39. }
  40. return {areas:areas,periodMap:periodMap}
  41. }
  42. async function getDataByCondition(data,compilation){
  43. let result = {};
  44. data.condition["compilationID"] = compilation._id;
  45. //特殊处理重庆的,地区选择非“通用”时,搜索范围应是当前选择的地区,加上“通用”中的信息价。
  46. if (data.condition.commonInfoPriceID) {
  47. let idArray = [data.condition.areaID,data.condition.commonInfoPriceID];
  48. data.condition.areaID = {$in: idArray}
  49. delete data.condition.commonInfoPriceID;
  50. }
  51. //根据地区+期数+材料编号的前4位与信息价材料的分类编号匹配,如果有数据,则显示数据出来。
  52. //先按编号匹配
  53. if (data.code) {
  54. result = await getDataByCode(data.code, data);
  55. if (result.totalSize > 0) return result;
  56. }
  57. //编号匹配不上的情况:
  58. //有关键字的情况
  59. if (data.keyWord) {
  60. return await getDataByKeyWord(data.keyWord,data);
  61. }
  62. //查询所有的情况
  63. if(data.lastID){ //有最后一行说明是查询下一页
  64. data.condition["_id"] = {$gt:mongoose.Types.ObjectId(data.lastID)};
  65. }else{
  66. result.totalSize = await infoItemsModel.find(data.condition).count();
  67. }
  68. result.items = await infoItemsModel.find(data.condition).lean().sort({"_id":1}).limit(50);
  69. return result;
  70. }
  71. async function getDataByCode(code, data) {
  72. let condition = { ...data.condition };
  73. condition.code = code;
  74. let totalSize = await infoItemsModel.find(condition).count();
  75. if (data.lastID) { //有最后一行说明是查询下一页
  76. condition["_id"] = {$gt:mongoose.Types.ObjectId(data.lastID)};
  77. }
  78. let items = [];
  79. if (totalSize > 0) {
  80. items = await infoItemsModel.find(condition).lean().sort({"_id":1}).limit(50);
  81. }
  82. return {totalSize,items}
  83. }
  84. async function getDataByKeyWord(keyword, data) {
  85. let items = [];
  86. let nameArray = [];
  87. //混凝土 和 砼 认成一个
  88. // keyword = keyword.replace(/混凝土/g, "砼");
  89. if (keyword.length < 3) {
  90. nameArray.push(keyword)
  91. } else {
  92. nameArray = segment.doSegment(keyword, {
  93. simple: true, //不返回词性
  94. stripPunctuation: true //去除标点符号
  95. });
  96. }
  97. let temArr = [];
  98. for (let a of nameArray) {
  99. if (a == "混凝土") a = '砼';
  100. if (a == '砼' || a.length > 1) temArr.push(a);
  101. }
  102. nameArray = temArr;
  103. console.log(nameArray);
  104. let allInfoPrice = await infoItemsModel.find(data.condition).lean().sort({"_id":1});
  105. let maxNum = 0;//最大匹配数
  106. let matchMap = {};//匹配储存
  107. for (let info of allInfoPrice) {
  108. //specs
  109. let mstring = info.name + info.spec;
  110. mstring = mstring.replace(/混凝土/g, "砼");
  111. let matchCount = 0;
  112. for (let na of nameArray) {
  113. if (mstring.indexOf(na) != -1) {
  114. matchCount++;
  115. }
  116. }
  117. if (matchCount > 0) {
  118. matchMap[matchCount] ? matchMap[matchCount].push(info) : matchMap[matchCount] = [info];
  119. if (matchCount > maxNum) maxNum = matchCount;
  120. }
  121. }
  122. if (maxNum > 0) items = matchMap[maxNum];
  123. totalSize = items.length
  124. return {totalSize,items}
  125. }
  126. async function mutiApplyInfoPrice(data,compilation){
  127. data.condition["compilationID"] = compilation._id;
  128. let infoPrices = await infoItemsModel.find(data.condition).lean();
  129. let tasks = [];
  130. let projectGLJMap = {};
  131. for(let info of infoPrices){
  132. let index = gljUtil.getIndex(info,["name","specs","unit"]);
  133. if(data.pgljMap[index]){
  134. for(let obj of data.pgljMap[index]){
  135. let infoPrice = gljUtil.getInfoMarketPrice(info,data.taxType);
  136. infoPrice = scMathUtil.roundToString(infoPrice,data.decimal);
  137. let doc = {'market_price':infoPrice,'priceFrom':data.priceFrom};
  138. let task = {
  139. updateOne:{
  140. filter:{'id':obj.unitPriceID},
  141. update:doc
  142. }
  143. };
  144. tasks.push(task);
  145. projectGLJMap[obj.pgljID] = {index:obj.fullIndex,doc:doc};
  146. }
  147. }
  148. }
  149. if(tasks.length > 0) await unitPriceModel.bulkWrite(tasks);
  150. return projectGLJMap;
  151. }