ration_facade.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. /**
  2. * Created by zhang on 2018/2/9.
  3. */
  4. let mongoose = require('mongoose');
  5. import SearchDao from '../../complementary_ration_lib/models/searchModel';
  6. const scMathUtil = require('../../../public/scMathUtil').getUtil();
  7. let ration_glj_facade = require("../../ration_glj/facade/ration_glj_facade")
  8. let quantity_detail = require("../facade/quantity_detail_facade");
  9. let ration_glj = mongoose.model('ration_glj');
  10. let ration_coe = mongoose.model('ration_coe');
  11. let ration_model = require('../models/ration');
  12. let bill_model = require('../models/bills');
  13. let decimal_facade = require('./decimal_facade');
  14. import installationFeeModel from "../models/installation_fee";
  15. import rationInstallationModel from "../models/ration_installation";
  16. const uuidV1 = require('uuid/v1');
  17. let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
  18. let coeMolde = mongoose.model('std_ration_lib_coe_list');
  19. let _= require('lodash');
  20. module.exports = {
  21. replaceRations: replaceRations,
  22. addNewRation:addNewRation
  23. };
  24. async function addNewRation(data) {
  25. let query = data.itemQuery;
  26. let stdRation = null;
  27. if(query){
  28. let searchDao = new SearchDao();
  29. stdRation = await searchDao.getRationItem(query.userID,query.rationRepId,query.code);
  30. data.newData.code = query.code;
  31. }
  32. if(data.brUpdate.length>0){
  33. await updateSerialNo(data.brUpdate);
  34. }
  35. let newRation =await insertNewRation(data.newData,stdRation,data.calQuantity);
  36. if(stdRation){
  37. return await addRationSubList(stdRation,newRation);
  38. }else {
  39. return {ration:newRation};
  40. }
  41. }
  42. async function updateSerialNo(serialNoUpdate){
  43. let tasks=[];
  44. for(let data of serialNoUpdate){
  45. let task={
  46. updateOne:{
  47. filter:{
  48. ID:data.ID,
  49. projectID:data.projectID
  50. },
  51. update :{
  52. serialNo:data.serialNo
  53. }
  54. }
  55. };
  56. tasks.push(task);
  57. }
  58. await ration_model.model.bulkWrite(tasks);
  59. }
  60. async function insertNewRation(newData,std,calQuantity) {//插入新的定额
  61. if(std){
  62. newData.name = std.name;
  63. newData.caption = std.caption;
  64. newData.unit = std.unit;
  65. newData.libID = std.rationRepId;
  66. newData.content = std.jobContent;
  67. if (std.chapter) {
  68. newData.comments = std.chapter.explanation;
  69. newData.ruleText = std.chapter.ruleText;
  70. }
  71. newData.from = std.type === 'complementary' ? 'cpt' : 'std';
  72. newData.programID = std.feeType;
  73. newData.rationAssList = createRationAss(std);
  74. // calculate ration Quantity
  75. }
  76. if(calQuantity){
  77. await CalculateQuantity(newData,newData.billsItemID,newData.projectID);
  78. }
  79. let newRation = await ration_model.model.create(newData);
  80. return newRation;
  81. }
  82. async function replaceRations(userID,data) {
  83. let searchDao = new SearchDao();
  84. let recodes = [];
  85. for(let recode of data.nodeInfo){
  86. let stdRation = await searchDao.getRationItem(userID,data.libID,recode.newCode);
  87. let newRecode = await replaceRation(recode,stdRation,data.projectID,data.calQuantity);
  88. if(newRecode){
  89. recodes.push(newRecode);
  90. }else {
  91. break;
  92. }
  93. }
  94. return recodes;
  95. }
  96. async function replaceRation(nodeInfo,stdRation,projectID,calQuantity) {
  97. if(stdRation){
  98. await deleRationSubRecode(projectID,nodeInfo.ID);
  99. let newRation = await updateRation(stdRation,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
  100. return await addRationSubList(stdRation,newRation);
  101. }else {
  102. return null;
  103. }
  104. }
  105. async function addRationSubList(stdRation,newRation) {
  106. let ration_gljs = await addRationGLJ(stdRation,newRation);
  107. let ration_coes = await addRationCoe(stdRation,newRation);
  108. //todo 添加增加安装费
  109. let ration_installs = await addRationInstallFee(stdRation,newRation);
  110. return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installs:ration_installs};
  111. }
  112. async function addRationInstallFee(std,newRation) {
  113. let install_fee_list = [];
  114. if(std.hasOwnProperty('rationInstList') && std.rationInstList.length > 0){
  115. let installFee = await installationFeeModel.findOne({'projectID': newRation.projectID});
  116. for(let ri of std.rationInstList){
  117. let feeItem = _.find(installFee.installFeeItem,{'ID':ri.feeItemId});
  118. let section = _.find(installFee.installSection,{'ID':ri.sectionId});
  119. if(feeItem&&section){
  120. let tem_r_i = {
  121. libID:installFee.libID,
  122. projectID:newRation.projectID,
  123. rationID:newRation.ID,
  124. feeItemId:feeItem.ID,
  125. sectionId:section.ID,
  126. itemName:feeItem.feeItem,
  127. feeType:feeItem.feeType,
  128. sectionName:section.name,
  129. unifiedSetting:1
  130. };
  131. if(section.feeRuleId&&section.feeRuleId!=''){
  132. let feeRule = _.find(installFee.feeRule,{'ID':section.feeRuleId});
  133. if(feeRule){
  134. tem_r_i.ruleId = feeRule.ID;
  135. tem_r_i.code = feeRule.code;
  136. tem_r_i.rule = feeRule.rule;
  137. tem_r_i.base = feeRule.base;
  138. tem_r_i.feeRate = feeRule.feeRate;
  139. tem_r_i.labour = feeRule.labour;
  140. tem_r_i.material = feeRule.material;
  141. tem_r_i.machine = feeRule.machine;
  142. tem_r_i.position = feeRule.position;
  143. tem_r_i.billID = feeRule.billID;
  144. }
  145. }
  146. tem_r_i.ID = uuidV1();
  147. install_fee_list.push(tem_r_i);
  148. }
  149. }
  150. if(install_fee_list.length>0){
  151. await rationInstallationModel.insertMany(install_fee_list);
  152. }
  153. }
  154. return install_fee_list;
  155. }
  156. async function addRationCoe(std,newRation) {
  157. let ration_coe_list = [];
  158. let seq = 0;
  159. if(std.hasOwnProperty('rationCoeList')&&std.rationCoeList.length>0){//添加标准库的工料机
  160. for(let sub of std.rationCoeList){
  161. let libCoe = await coeMolde.findOne({'libID':std.rationRepId,'ID':sub.ID,"$or": [{"isDeleted": null}, {"isDeleted": false}]});//std.rationRepId;
  162. if(libCoe){
  163. let newCoe = {};
  164. newCoe.ID = uuidV1();
  165. newCoe.coeID = sub.ID;
  166. newCoe.seq = seq;
  167. newCoe.name = libCoe.name;
  168. newCoe.content = libCoe.content;
  169. newCoe.isAdjust=0;
  170. newCoe.coes = libCoe.coes;
  171. newCoe.rationID = newRation.ID;
  172. newCoe.projectID = newRation.projectID;
  173. seq++;
  174. ration_coe_list.push(newCoe);
  175. }
  176. }
  177. }
  178. let lastCoe ={
  179. coeID:-1,
  180. name : '自定义系数',
  181. content:'人工×1,材料×1,机械×1,主材×1,设备×1',
  182. isAdjust:0,
  183. seq:seq,
  184. rationID : newRation.ID,
  185. projectID : newRation.projectID
  186. };
  187. lastCoe.ID = uuidV1();
  188. lastCoe.coes = getCustomerCoeData();
  189. ration_coe_list.push(lastCoe);
  190. await ration_coe.insertMany(ration_coe_list);
  191. return ration_coe_list;
  192. }
  193. function getCustomerCoeData() {
  194. var coeList = [];
  195. coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'定额'});
  196. coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'人工'});
  197. coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'材料'});
  198. coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'机械'});
  199. coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'主材'});
  200. coeList.push({ amount:1, operator:'*', gljCode:null, coeType:'设备'});
  201. return coeList;
  202. };
  203. async function addRationGLJ(std,newRation) {
  204. let newRationGLJList = [];
  205. let rationGLJShowList = [];
  206. if(std.hasOwnProperty('rationGljList') && std.rationGljList.length > 0){
  207. for(let sub of std.rationGljList){
  208. let newGLJ = {};
  209. newGLJ.ID = uuidV1();
  210. newGLJ.projectID = newRation.projectID;
  211. newGLJ.GLJID = sub.gljId;
  212. newGLJ.rationID = newRation.ID;
  213. newGLJ.billsItemID = newRation.billsItemID;
  214. newGLJ.rationItemQuantity = sub.consumeAmt;
  215. newGLJ.quantity = sub.consumeAmt;
  216. newGLJ.glj_repository_id = std.rationRepId;
  217. let std_glj = await std_glj_lib_gljList_model.findOne({'ID':sub.gljId});
  218. if(std_glj){
  219. newGLJ.name = std_glj.name;
  220. newGLJ.code = std_glj.code;
  221. newGLJ.original_code = std_glj.code;
  222. newGLJ.unit = std_glj.unit;
  223. newGLJ.specs = std_glj.specs;
  224. newGLJ.basePrice = std_glj.basePrice;
  225. newGLJ.shortName = std_glj.shortName;
  226. newGLJ.type = std_glj.gljType;
  227. newGLJ.repositoryId = std_glj.repositoryId;
  228. newGLJ.adjCoe = std_glj.adjCoe;
  229. let info = await ration_glj_facade.getInfoFromProjectGLJ(newGLJ);
  230. newGLJ = ration_glj_facade.createNewRecord(info);
  231. newRationGLJList.push(newGLJ);
  232. rationGLJShowList.push(info);
  233. }
  234. }
  235. }
  236. if(newRationGLJList.length>0){
  237. await ration_glj.insertMany(newRationGLJList);
  238. }
  239. return rationGLJShowList;
  240. }
  241. async function deleRationSubRecode(projectID,rationID) {//删除挂在定额下的数据,如工程量明细,定额工料机等
  242. let delete_query={projectID: projectID, rationID: rationID};
  243. //删除工程量明细
  244. await quantity_detail.deleteByQuery(delete_query) ;
  245. await ration_coe.deleteMany(delete_query);//删除附注条件
  246. await ration_glj.deleteMany(delete_query);//删除定额工料机
  247. //todo 删除安装
  248. }
  249. async function updateRation(std,rationID,billsItemID,projectID,calQuantity) {
  250. // insertNewRation
  251. let ration ={};
  252. ration.code = std.code;
  253. ration.name = std.name;
  254. ration.caption = std.caption;
  255. ration.unit = std.unit;
  256. ration.libID = std.rationRepId;
  257. ration.content = std.jobContent;
  258. ration.adjustState = '';
  259. ration.isFromDetail=0;
  260. ration.isSubcontract=false;
  261. ration.fees=[];
  262. if (std.chapter) {
  263. ration.comments = std.chapter.explanation;
  264. ration.ruleText = std.chapter.ruleText;
  265. }
  266. ration.from = std.type === 'complementary' ? 'cpt' : 'std';
  267. ration.programID = std.feeType;
  268. ration.rationAssList = createRationAss(std);//生成辅助定额
  269. if(calQuantity){
  270. await CalculateQuantity(ration,billsItemID,projectID);
  271. }
  272. let unsetObject = {
  273. "marketUnitFee":1,
  274. 'marketTotalFee':1,
  275. "maskName":1
  276. }
  277. let newRation = await ration_model.model.findOneAndUpdate({ID:rationID,projectID:projectID},{"$set":ration,"$unset":unsetObject},{new: true});//;
  278. return newRation;
  279. }
  280. function createRationAss(std) {
  281. let rationAssList = [];//生成辅助定额
  282. if(std.hasOwnProperty('rationAssList')&&std.rationAssList.length>0){
  283. for(let i=0;i<std.rationAssList.length;i++){
  284. let ass = std.rationAssList[i];
  285. ass.actualValue = ass.stdValue;
  286. rationAssList.push(ass);
  287. }
  288. }
  289. return rationAssList;
  290. }
  291. async function CalculateQuantity (ration,billsItemID,projectID) {
  292. // calculate ration Quantity
  293. let decimalObject =await decimal_facade.getProjectDecimal(projectID);
  294. let quantity_decimal = (decimalObject&&decimalObject.ration&&decimalObject.ration.quantity)?decimalObject.ration.quantity:3;
  295. let pbill = await bill_model.model.findOne({projectID:projectID,ID:billsItemID});
  296. let billsQuantity = pbill.quantity ? pbill.quantity : 0;
  297. let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit);
  298. billsQuantity=scMathUtil.roundForObj(billsQuantity,bill_decimal);
  299. ration.quantityEXP="QDL";
  300. ration.quantity = scMathUtil.roundForObj(billsQuantity / FilterNumberFromUnit(ration.unit),quantity_decimal);//不管是否打勾都做转换
  301. ration.contain = scMathUtil.roundForObj(ration.quantity/billsQuantity,6);
  302. };
  303. function FilterNumberFromUnit (unit) {
  304. let reg = new RegExp('^[0-9]+');
  305. if (reg.test(unit)) {
  306. return parseInt(unit.match(reg)[0]);
  307. } else {
  308. return 1;
  309. }
  310. };