calc_program.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. /**
  2. * Created by CSL on 2017-07-19.
  3. * dispExpr: F8*(L-1); expression: "@('8') * (L-1)";
  4. * 说明:F后跟行号,L替换人工系数值,@后跟ID。用到L的规则必须有labourCoeID属性(反过来不要求),
  5. * 用到费率的规则必须有feeRateID属性,当有该属性时,会自动显示费率值。
  6. */
  7. class CalcProgram {
  8. constructor(project){
  9. this.project = project;
  10. this.datas = [];
  11. this.digit = 2;
  12. this.digitDefault = 6;
  13. this.calc = new Calculation();
  14. project.registerModule(ModuleNames.calc_program, this);
  15. };
  16. getSourceType () {
  17. return ModuleNames.calc_program;
  18. };
  19. loadData (datas) {
  20. this.datas = datas;
  21. };
  22. doAfterUpdate (err, data) {
  23. if(!err){
  24. // do
  25. }
  26. };
  27. // 经测试,全部编译一次耗时0.003~0.004秒。耗时基本忽略不计。
  28. compileAllTemps(){
  29. let calcFeeRates = this.project.FeeRate.datas.rates;
  30. let calcLabourCoes = this.project.labourCoe.datas.coes;
  31. let calcTemplates = this.project.calcProgram.datas.templates;
  32. this.calc.compilePublics(calcFeeRates, calcLabourCoes, feeType, rationCalcBase);
  33. for (let ct of calcTemplates){
  34. this.calc.compileTemplate(ct);
  35. };
  36. // 存储费率临时数据,报表用。
  37. if (this.calc.saveForReports.length > 0){
  38. let saveDatas = {};
  39. saveDatas.projectID = projectInfoObj.projectInfo.ID;
  40. saveDatas.calcItems = this.calc.saveForReports;
  41. CommonAjax.post('/calcProgram/saveCalcItems', saveDatas, function (data) {
  42. this.calc.saveForReports = [];
  43. });
  44. };
  45. };
  46. calculate(treeNode){
  47. if (treeNode.sourceType === this.project.Ration.getSourceType()) {
  48. treeNode.data.gljList = this.project.ration_glj.getGljArrByRation(treeNode.data.ID);
  49. }
  50. else if (treeNode.sourceType === this.project.Bills.getSourceType()) {
  51. let rations = this.project.Ration.getBillsSortRation(treeNode.source.getID());
  52. treeNode.data.gljList = this.project.ration_glj.getGatherGljArrByRations(rations);
  53. };
  54. this.calc.calculate(treeNode);
  55. // 存储、刷新本结点、所有父结点
  56. if (this.calc.changed) {
  57. me.saveAndCalcParents(treeNode);
  58. this.calc.changed = false;
  59. };
  60. };
  61. saveAndCalcParents(treeNode) {
  62. if (treeNode.parent) {
  63. projectObj.converseCalculateBills(treeNode.parent);
  64. };
  65. let data = {ID: treeNode.data.ID, projectID: projectObj.project.ID(), fees: treeNode.data.fees};
  66. let newDta = {'updateType': 'ut_update', 'updateData': data};
  67. let newDataArr = [];
  68. newDataArr.push(newDta);
  69. projectObj.project.pushNow('', treeNode.sourceType, newDataArr);
  70. projectObj.mainController.refreshTreeNode([treeNode]);
  71. };
  72. gatherRationFeeTypes(treeNode){
  73. let me = this;
  74. let changed = false;
  75. let rst = [];
  76. if (treeNode.sourceType === this.project.Bills.getSourceType()) {
  77. if (!treeNode.data.fees) {
  78. treeNode.data.fees = [];
  79. treeNode.data.feesIndex = {};
  80. changed = true;
  81. };
  82. let rations = this.project.Ration.getRationsByNode(treeNode);
  83. for (let ft of feeType) {
  84. let ftObj = {};
  85. ftObj.type = ft.type;
  86. ftObj.name = ft.name;
  87. let uf = 0, tf = 0, tuf = 0, ttf = 0;
  88. for (let ration of rations) {
  89. if (ration.feesIndex && ration.feesIndex[ft.type]) {
  90. uf = (uf + parseFloat(ration.feesIndex[ft.type].unitFee)).toDecimal(me.digitDefault);
  91. tf = (tf + parseFloat(ration.feesIndex[ft.type].totalFee)).toDecimal(me.digitDefault);
  92. tuf = (tuf + parseFloat(ration.feesIndex[ft.type].tenderUnitFee)).toDecimal(me.digitDefault);
  93. ttf = (ttf + parseFloat(ration.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
  94. };
  95. };
  96. ftObj.unitFee = uf.toDecimal(me.digit);
  97. ftObj.totalFee = tf.toDecimal(me.digit);
  98. ftObj.tenderUnitFee = tuf.toDecimal(me.digit);
  99. ftObj.tenderTotalFee = ttf.toDecimal(me.digit);
  100. if (!treeNode.data.feesIndex[ftObj.type]){
  101. let fee = {
  102. 'fieldName': ftObj.type,
  103. 'unitFee': ftObj.unitFee,
  104. 'totalFee': ftObj.totalFee,
  105. 'tenderUnitFee': 0,
  106. 'tenderTotalFee': 0
  107. };
  108. treeNode.data.fees.push(fee);
  109. treeNode.data.feesIndex[ftObj.type] = fee;
  110. changed = true;
  111. }
  112. else{
  113. if (treeNode.data.feesIndex[ftObj.type].unitFee != ftObj.unitFee){
  114. treeNode.data.feesIndex[ftObj.type].unitFee = ftObj.unitFee;
  115. changed = true;
  116. };
  117. if (treeNode.data.feesIndex[ftObj.type].totalFee != ftObj.totalFee){
  118. treeNode.data.feesIndex[ftObj.type].totalFee = ftObj.totalFee;
  119. changed = true;
  120. };
  121. };
  122. rst.push(ftObj);
  123. };
  124. if (changed) {
  125. me.saveAndCalcParents(treeNode);
  126. changed = false;
  127. };
  128. };
  129. return rst;
  130. };
  131. gatherBillFeeTypes(treeNode){
  132. let me = this;
  133. let changed = false;
  134. let rst = [];
  135. if (treeNode.sourceType === this.project.Bills.getSourceType()) {
  136. if (!treeNode.data.fees) {
  137. treeNode.data.fees = [];
  138. treeNode.data.feesIndex = {};
  139. changed = true;
  140. };
  141. for (let ft of feeType) {
  142. let ftObj = {};
  143. ftObj.type = ft.type;
  144. ftObj.name = ft.name;
  145. let uf = 0, tf = 0, tuf = 0, ttf = 0;
  146. for (let node of treeNode.children) {
  147. if (node.data.feesIndex && node.data.feesIndex[ft.type]) {
  148. uf = (uf + parseFloat(node.data.feesIndex[ft.type].unitFee)).toDecimal(me.digitDefault);
  149. tf = (tf + parseFloat(node.data.feesIndex[ft.type].totalFee)).toDecimal(me.digitDefault);
  150. tuf = (tuf + parseFloat(node.data.feesIndex[ft.type].tenderUnitFee)).toDecimal(me.digitDefault);
  151. ttf = (ttf + parseFloat(node.data.feesIndex[ft.type].tenderTotalFee)).toDecimal(me.digitDefault);
  152. };
  153. };
  154. ftObj.unitFee = uf.toDecimal(me.digit);
  155. ftObj.totalFee = tf.toDecimal(me.digit);
  156. ftObj.tenderUnitFee = tuf.toDecimal(me.digit);
  157. ftObj.tenderTotalFee = ttf.toDecimal(me.digit);
  158. if (!treeNode.data.feesIndex[ftObj.type]){
  159. let fee = {
  160. 'fieldName': ftObj.type,
  161. 'unitFee': ftObj.unitFee,
  162. 'totalFee': ftObj.totalFee,
  163. 'tenderUnitFee': 0,
  164. 'tenderTotalFee': 0
  165. };
  166. treeNode.data.fees.push(fee);
  167. treeNode.data.feesIndex[ftObj.type] = fee;
  168. changed = true;
  169. }
  170. else{
  171. if (treeNode.data.feesIndex[ftObj.type].unitFee != ftObj.unitFee){
  172. treeNode.data.feesIndex[ftObj.type].unitFee = ftObj.unitFee;
  173. changed = true;
  174. };
  175. if (treeNode.data.feesIndex[ftObj.type].totalFee != ftObj.totalFee){
  176. treeNode.data.feesIndex[ftObj.type].totalFee = ftObj.totalFee;
  177. changed = true;
  178. };
  179. };
  180. rst.push(ftObj);
  181. if (changed) {
  182. me.saveAndCalcParents(treeNode);
  183. changed = false;
  184. };
  185. };
  186. };
  187. return rst;
  188. }
  189. }