engineering_lib_model.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /**
  2. * 计价规则标准库业务逻辑
  3. *
  4. * @author CaiAoLin
  5. * @date 2017/8/31
  6. * @version
  7. */
  8. import mongoose from "mongoose";
  9. import BaseModel from "../../common/base/base_model";
  10. import CompilationModel from "./compilation_model";
  11. let stdRationLibModel = mongoose.model("std_ration_lib_map");
  12. import {default as EngineeringConst, List as EngineeringList} from "../../common/const/engineering";
  13. const billsGuidanceLibModel = mongoose.model('std_billsGuidance_lib');
  14. const billsLibListsModel = mongoose.model('std_bills_lib_lists');
  15. class EngineeringLibModel extends BaseModel {
  16. /**
  17. * 构造函数
  18. *
  19. * @return {void}
  20. */
  21. constructor() {
  22. let parent = super();
  23. parent.model = mongoose.model("engineering_lib");
  24. parent.init();
  25. }
  26. /**
  27. * 获取标准库数据
  28. *
  29. * @param {Object} data
  30. * @param {Number} engineering
  31. * @return {Promise}
  32. */
  33. async getLib(data, engineering) {
  34. let result = {};
  35. if (data.length <= 0) {
  36. return result;
  37. }
  38. let id = '';
  39. for(let tmp of data) {
  40. if (tmp.engineering === engineering) {
  41. id = tmp.engineering_id;
  42. break;
  43. }
  44. }
  45. if (id === '') {
  46. return result;
  47. }
  48. let condition = {_id: id};
  49. return this.findDataByCondition(condition);
  50. }
  51. async getLibsByValuationID(valuationID){
  52. return this.findDataByCondition({valuationID:valuationID},null,false);
  53. }
  54. async deleteByValuationID(valuationID){
  55. return await this.db.delete({valuationID:valuationID});
  56. }
  57. //添加空的默认的所有标准库
  58. /**
  59. * @param valuationID
  60. * @returns {Promise.<*>}
  61. */
  62. async addStdLib(valuationID){
  63. let stdLibs = [];
  64. for(let eng of EngineeringList){
  65. let tem = {
  66. glj_col:{showAdjustPrice:false},
  67. valuationID:valuationID,
  68. name:eng.name,
  69. engineering:eng.value
  70. };
  71. stdLibs.push(tem);
  72. }
  73. let result = await this.db.create(stdLibs);
  74. return result;
  75. }
  76. async addEngineer(data){
  77. data.glj_col = {showAdjustPrice:false};
  78. if(data.compilationId && data.compilationId!=""){
  79. data.ration_lib = [];
  80. let rationList = await stdRationLibModel.find({compilationId:data.compilationId},['ID','dispName']);
  81. for(let i =0;i< rationList.length;i++){
  82. let tem = {
  83. id:rationList[i].ID,
  84. name:rationList[i].dispName,
  85. isDefault:false
  86. };
  87. if(i == 0) tem.isDefault = true;
  88. data.ration_lib.push(tem);
  89. }
  90. }
  91. let result = await this.db.create(data);
  92. return result;
  93. }
  94. /**
  95. * 新增标准库
  96. *
  97. * @param {String} valuationId
  98. * @param {Object} data
  99. * @return {Promise}
  100. */
  101. async addLib(engineerId, data) {
  102. if(data.glj_col){
  103. data.glj_col = JSON.parse(data.glj_col);
  104. }
  105. data.isInstall == 'true'?data.isInstall=true:data.isInstall=false;
  106. data.isItemIncrease == 'true'?data.isItemIncrease=true:data.isItemIncrease=false;
  107. data.isAreaIncrease == 'true'?data.isAreaIncrease=true:data.isAreaIncrease=false;
  108. let result = false;
  109. data = this.filterLibData(data);
  110. try {
  111. // 处理清单指引
  112. if (data.billsGuidance_lib && data.billsGuidance_lib.length) {
  113. const billsGuidanceLibIDs = data.billsGuidance_lib.map(item => item.id);
  114. const billsGuidanceLibs = await billsGuidanceLibModel.find({ ID: { $in: billsGuidanceLibIDs } }, '-_id ID type').lean();
  115. const libTypeMap = {};
  116. billsGuidanceLibs.forEach(lib => libTypeMap[lib.ID] = lib.type);
  117. data.billsGuidance_lib.forEach(lib => {
  118. lib.type = libTypeMap[lib.id] || 1;
  119. });
  120. }
  121. // 标准清单新增清单类型
  122. if (data.bill_lib && data.bill_lib.length) {
  123. const billLibIDs = data.bill_lib.map(item => +item.id);
  124. const billLibs = await billsLibListsModel.find({ billsLibId: { $in: billLibIDs } }, '-_id billsLibId libType').lean();
  125. const libTypeMap = {};
  126. billLibs.forEach(lib => libTypeMap[lib.billsLibId] = lib.libType);
  127. data.bill_lib.forEach(lib => {
  128. lib.libType = libTypeMap[lib.id] || '1';
  129. });
  130. }
  131. let engineeringLib = await this.findDataByCondition({_id:engineerId});
  132. if(engineeringLib){
  133. // 存在则直接更新
  134. delete data.id;
  135. delete data.section;
  136. let condition = {_id: engineerId};
  137. result = await this.db.update(condition, data);
  138. result = result.ok === 1;
  139. }else {
  140. throw new Error("找不到对应的工程专业");
  141. }
  142. } catch (error) {
  143. console.log(error);
  144. result = false;
  145. }
  146. return result;
  147. }
  148. /**
  149. * 过滤计价数据
  150. *
  151. * @param {Object} data
  152. * @return {Object}
  153. */
  154. filterLibData(data) {
  155. if (Object.keys(data).length <= 0 || data.section === undefined) {
  156. console.log('1');
  157. throw '数据有误';
  158. }
  159. data.engineering = parseInt(data.engineering);
  160. //需求修改,工程专业可以随便输入了
  161. //检测专业工程是否合法
  162. /* let match = false;
  163. for(let index in EngineeringConst) {
  164. if (EngineeringConst[index] === data.engineering) {
  165. match = true;
  166. break;
  167. }
  168. }
  169. if (!match) {
  170. throw '工程专业错误';
  171. }*/
  172. // 判断标准清单
  173. data.bill_lib = this._validLib(data.bill_lib);
  174. // 判断定额库
  175. data.ration_lib = this._validLib(data.ration_lib);
  176. //设置默认定额库
  177. this.setDefaultRation(data);
  178. // 判断工料机库
  179. data.glj_lib = this._validLib(data.glj_lib);
  180. // 判断清单指引库
  181. data.billsGuidance_lib = this._validLib(data.billsGuidance_lib);
  182. /*// 判断费率标准
  183. data.fee_lib = this._validLib(data.fee_lib);*/
  184. // 判断人工系数
  185. data.artificial_lib = this._validLib(data.artificial_lib);
  186. //判断工程特征库
  187. data.feature_lib = this._validLib(data.feature_lib);
  188. //判断基本信息
  189. data.info_lib = this._validLib(data.info_lib);
  190. //判断工程信息
  191. data.engineer_info_lib = this._validLib(data.engineer_info_lib);
  192. //判断累进区间库
  193. data.progressive_lib = this._validLib(data.progressive_lib);
  194. //判断工程特征指标信息
  195. data.engineer_feature_lib = this._validLib(data.engineer_feature_lib);
  196. //判断主要工料指标信息
  197. data.material_lib = this._validLib(data.material_lib);
  198. //判断主要工料指标信息
  199. data.main_quantity_lib = this._validLib(data.main_quantity_lib);
  200. //判断主要经济指标信息
  201. data.economic_lib = this._validLib(data.economic_lib);
  202. data.over_height_lib = this._validLib(data.over_height_lib);
  203. //计税方式组合
  204. data.tax_group = this._validLib(data.tax_group);
  205. return data;
  206. }
  207. /**
  208. * 校验库数据
  209. *
  210. * @param {Object} libData
  211. * @return {Object}
  212. */
  213. _validLib(libData) {
  214. let result = [];
  215. // 判断标准库
  216. if (libData === undefined || libData ===null ||libData === '') {
  217. return result;//throw '标准库不能为空'; 按新需求,标准库等不做非空判断
  218. }
  219. libData = libData instanceof Array ? libData : [libData];
  220. for(let tmp in libData) {
  221. result[tmp] = JSON.parse(libData[tmp]);
  222. }
  223. return result;
  224. }
  225. //设置默认定额库
  226. setDefaultRation(data){
  227. if(data.ration_lib && data.ration_lib.length>0){
  228. if(data.ration_isDefault && data.ration_isDefault != ""){
  229. for(let r of data.ration_lib){
  230. r.id.toString() == data.ration_isDefault?r.isDefault = true:r.isDefault=false;
  231. }
  232. }else {
  233. data.ration_lib[0].isDefault = true;
  234. }
  235. }
  236. }
  237. /**
  238. * 获取对应标准库数量
  239. *
  240. * @param {Object} valuationData
  241. * @return {Object}
  242. */
  243. async getLibCount(valuationData) {
  244. let result = {};
  245. if (valuationData.engineering_list === undefined || valuationData.engineering_list.length <= 0) {
  246. return result;
  247. }
  248. // 整理需要查找的数据
  249. let findIdList = [];
  250. for(let engineering of valuationData.engineering_list) {
  251. findIdList.push(engineering.engineering_id);
  252. }
  253. let condition = {_id: {$in: findIdList}};
  254. let libData = await this.findDataByCondition(condition, null, false);
  255. if (libData === null) {
  256. return result;
  257. }
  258. // 整理数据
  259. let countData = {};
  260. for(let tmp of libData) {
  261. countData[tmp._id] = {
  262. bill_count: tmp.bill_lib.length,
  263. ration_count: tmp.ration_lib.length,
  264. glj_count: tmp.glj_lib.length,
  265. fee_count: tmp.fee_lib.length,
  266. artificial_count: tmp.artificial_lib.length,
  267. program_count: tmp.program_lib.length,
  268. };
  269. }
  270. for(let engineering of valuationData.engineering_list) {
  271. if (countData[engineering.engineering_id] !== undefined) {
  272. result[engineering.engineering] = countData[engineering.engineering_id];
  273. }
  274. }
  275. return result;
  276. }
  277. async copyRationLibsToOthers(valuationID, engineeringID) {
  278. const compilationModel = new CompilationModel();
  279. const compilation = await compilationModel.model.findOne({ $or: [{ 'bill_valuation.id': valuationID }, { 'ration_valuation.id': valuationID }]});
  280. if (!compilation) {
  281. return;
  282. }
  283. const valuationIDList = [];
  284. const allValuation = compilation.ration_valuation.concat(compilation.bill_valuation);
  285. for (const valuation of allValuation) {
  286. valuationIDList.push(valuation.id);
  287. }
  288. const engineering = await this.findDataByCondition({ _id: engineeringID });
  289. if (!engineering) {
  290. return;
  291. }
  292. await this.model.updateMany({ valuationID: { $in: valuationIDList } }, {$set: { ration_lib: engineering.ration_lib }});
  293. }
  294. }
  295. export default EngineeringLibModel;