OverheadLineService.java 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package com.jeeplus.modules.sg.overheadline.service;
  2. import com.jeeplus.common.utils.excel.ImportExcel;
  3. import com.jeeplus.common.utils.sg.ExcelUtil;
  4. import com.jeeplus.modules.sg.overheadline.entity.JkxlAdjustFee;
  5. import com.jeeplus.modules.sg.overheadline.entity.JkxlDetailFee;
  6. import com.jeeplus.modules.sg.overheadline.entity.WbsProject;
  7. import com.jeeplus.modules.sg.overheadline.mapper.OverheadLineMapper;
  8. import com.jeeplus.modules.sg.overheadline.util.BashInfo;
  9. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import org.springframework.web.multipart.MultipartFile;
  14. import java.io.IOException;
  15. import java.math.BigDecimal;
  16. import java.text.SimpleDateFormat;
  17. import java.util.*;
  18. @Service
  19. public class OverheadLineService {
  20. @Autowired
  21. private OverheadLineMapper overheadLineMapper;
  22. @Autowired
  23. private FeeAdjustService feeAdjustService;
  24. @Autowired
  25. private RuleRatioService ruleRatioService;
  26. public List<JkxlDetailFee> getList(String id){
  27. return overheadLineMapper.getList(id);
  28. }
  29. public List<JkxlDetailFee> findList(String id){
  30. List<JkxlDetailFee> list = overheadLineMapper.findList(id);
  31. double btTotal = 0.00;
  32. double qtTotal = 0.00;
  33. for(JkxlDetailFee jkxlDetailFee : list){
  34. //本体费用求和
  35. if(jkxlDetailFee.getOriginalTotalCost() != null){
  36. btTotal += jkxlDetailFee.getTotalFee();
  37. }
  38. //其他费用求和
  39. if(jkxlDetailFee.getOriginalTotalCost() == null && jkxlDetailFee.getTotalFee() != null){
  40. qtTotal += jkxlDetailFee.getTotalFee();
  41. }
  42. }
  43. for(JkxlDetailFee jkxlDetailFee : list){
  44. if(jkxlDetailFee.getWbsCode().equals("30000000")){
  45. jkxlDetailFee.setTotalFee(btTotal+qtTotal);
  46. }
  47. if(jkxlDetailFee.getWbsCode().equals("39000000")){
  48. jkxlDetailFee.setTotalFee(btTotal);
  49. }
  50. if(jkxlDetailFee.getWbsCode().equals("34000000")){
  51. jkxlDetailFee.setTotalFee(qtTotal);
  52. }
  53. }
  54. return list;
  55. }
  56. public JkxlDetailFee getDate(String id, String wbsCode){
  57. return overheadLineMapper.getData(id,wbsCode);
  58. }
  59. @Transactional
  60. public void updataDate(JkxlDetailFee jkxlDetailFee){
  61. overheadLineMapper.updateDate(jkxlDetailFee);
  62. }
  63. @Transactional
  64. public void saveProject(WbsProject wbsProject){
  65. overheadLineMapper.saveProject(wbsProject);
  66. }
  67. public void save(MultipartFile file,double sl,String name,String id) throws IOException, InvalidFormatException {
  68. WbsProject wbsProject = new WbsProject();
  69. wbsProject.setId(id);
  70. wbsProject.setName(name);
  71. wbsProject.setCreateDate(new Date());
  72. //保存项目
  73. overheadLineMapper.saveProject(wbsProject);
  74. //获取调差系数
  75. double[] tcRate = new double[3];
  76. tcRate[0] = ruleRatioService.getValueByName(BashInfo.RATIO_RGTC).getValue()/100;
  77. tcRate[1] = ruleRatioService.getValueByName(BashInfo.RATIO_CLTC).getValue()/100;
  78. tcRate[2] = ruleRatioService.getValueByName(BashInfo.RATIO_JXTC).getValue()/100;
  79. //读取表格
  80. ImportExcel importExcel = new ImportExcel(file,1,BashInfo.SHEET_FBFXJJ); //分部分项工程量清单计价表
  81. ImportExcel csqd = new ImportExcel(file,1,BashInfo.SHEET_CSB); // 措施项目清单计价表(一)
  82. ImportExcel gf = new ImportExcel(file,1,BashInfo.SHEET_GFQD); //规费项目清单计价表
  83. ImportExcel qt = new ImportExcel(file,1,BashInfo.SHEET_QTFY); //其他项目清单计价表
  84. ImportExcel total = new ImportExcel(file,1,BashInfo.SHEET_HZB ); //工程项目竣工结算汇总表
  85. ImportExcel gzhz = new ImportExcel(file,1,BashInfo.SHEET_GCHZ ); //架空线路工程费用汇总表
  86. //获取补增值税税率调整差额和扣减甲供材超供材料费
  87. double[] wsbFees = ExcelUtil.getDoubleArray(total, new String[]{BashInfo.BZZSSL,BashInfo.KJJGCC},1,2);
  88. double[] originalTotalFees = ExcelUtil.getDoubleArray(gzhz,BashInfo.HZ_ALL,1,2); //获取合计费
  89. double[] zjgcFees = ExcelUtil.getDoubleArray(gzhz,BashInfo.HZ_ALL,1,3); //获取直接工程费
  90. double[][] originalFees = ExcelUtil.getDoubleArrays(importExcel,BashInfo.MX_ALL,2, new int[]{13, 14, 15, 17}); //获取原始费用
  91. double texRate = ExcelUtil.getTexRate(total); //获取税率
  92. double totalFee = ExcelUtil.getDouble(importExcel,BashInfo.PROJECTNAME,2,12); //获取架空线路合计金额
  93. double[] csRate = BashInfo.getCsRate(csqd); //获取措施费率
  94. double[] gfRate = BashInfo.getGfRate(gf); //获取规费率
  95. double[] qtFees = BashInfo.getQtFees(qt); //获取其他费用
  96. double gcjsFee = BashInfo.getGcjsFee(total); //获取工程结算价
  97. //将本体工程费用明细存入集合
  98. List<JkxlDetailFee> list = new ArrayList<>();
  99. for(int i=0;i<originalTotalFees.length;i++){
  100. JkxlDetailFee jkxlDetailFee = new JkxlDetailFee();
  101. double originalTotalCost = originalTotalFees[i]; //原合计
  102. double otherRate = originalTotalCost/totalFee; //其他费用分摊比例
  103. double orRate = new BigDecimal(otherRate).setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); //四舍五入
  104. double otherFee = qtFees[2]*otherRate; //其他费用
  105. double zjgcFee = zjgcFees[i];//直接工程费
  106. double originalRgCost = originalFees[i][0];// 原人工费
  107. double rgCost = originalRgCost/(1+tcRate[0]); //后人工费
  108. double originalCbrCost = originalFees[i][1]; //原承包人采购
  109. double cbrCost = originalCbrCost/(1+tcRate[1]); //后承包人采购
  110. double originalFbrCost = originalFees[i][2]; //原发包人采购
  111. double fbrCost = originalFbrCost/(1+sl); //后发包人采购
  112. double originalJxrCost = originalFees[i][3]; //原机械费
  113. double jxCost = originalJxrCost/(1+tcRate[2]); //后机械费
  114. double measuresFee1 = (zjgcFee-fbrCost*sl)*csRate[0]; //措施费一(2)
  115. double measuresFee2 = rgCost*csRate[1]; //措施费一(1)
  116. double measuresFee3 = 0.00; //措施费二
  117. double fees = rgCost*gfRate[1]*1.12+rgCost*gfRate[0]; //规费
  118. double tax = (originalTotalCost+measuresFee1+measuresFee2+measuresFee3+fees+otherFee-originalFbrCost)*texRate; //税金
  119. double totalfee = originalTotalCost+measuresFee1+measuresFee2+measuresFee3+fees+otherFee+tax-originalFbrCost; //合计
  120. jkxlDetailFee.setOriginalTotalCost(originalTotalCost);
  121. jkxlDetailFee.setOriginalRate(orRate);
  122. jkxlDetailFee.setOriginalRgCost(originalRgCost);
  123. jkxlDetailFee.setRgCost(rgCost);
  124. jkxlDetailFee.setOriginalCbrCost(originalCbrCost);
  125. jkxlDetailFee.setCbrCost(cbrCost);
  126. jkxlDetailFee.setOriginalFbrCost(originalFbrCost);
  127. jkxlDetailFee.setFbrCost(fbrCost);
  128. jkxlDetailFee.setOriginalJxCost(originalJxrCost);
  129. jkxlDetailFee.setJxCost(jxCost);
  130. jkxlDetailFee.setMeasuresFee1(measuresFee1);
  131. jkxlDetailFee.setMeasuresFee2(measuresFee2);
  132. jkxlDetailFee.setMeasuresFee3(measuresFee3);
  133. jkxlDetailFee.setFees(fees);
  134. jkxlDetailFee.setOtherCost(otherFee);
  135. jkxlDetailFee.setTex(tax);
  136. jkxlDetailFee.setTotalFee(totalfee);
  137. jkxlDetailFee.setZjgcFee(zjgcFee);
  138. jkxlDetailFee.setWbsCode(BashInfo.WBSIDS[i]);
  139. jkxlDetailFee.setId(id);
  140. list.add(jkxlDetailFee);
  141. }
  142. //分摊费用到合计
  143. double tz = 0.00;
  144. for(JkxlDetailFee jkxlDetailFee : list){
  145. tz += jkxlDetailFee.getTotalFee();
  146. }
  147. if(gcjsFee>tz){
  148. double gxFee = gcjsFee-tz-qtFees[0]-qtFees[1]-wsbFees[0]-wsbFees[1];
  149. double rate1 = 0.00;
  150. double gxFee1 = 0.00;
  151. double totalF = 0.00;
  152. for(JkxlDetailFee jkxlDetailFee : list){
  153. rate1 = jkxlDetailFee.getTotalFee()/tz;
  154. gxFee1 = gxFee*rate1;
  155. totalF = gxFee1 + jkxlDetailFee.getTotalFee();
  156. jkxlDetailFee.setGxFee(Math.abs(gxFee1));
  157. jkxlDetailFee.setTotalFee(totalF);
  158. }
  159. }else {
  160. double gxFee = tz+qtFees[0]+qtFees[1]+wsbFees[0]+wsbFees[1]-gcjsFee;
  161. double rate1 = 0.00;
  162. double gxFee1 = 0.00;
  163. double totalF = 0.00;
  164. for(JkxlDetailFee jkxlDetailFee : list){
  165. rate1 = jkxlDetailFee.getTotalFee()/tz;
  166. gxFee1 = gxFee*rate1;
  167. totalF = jkxlDetailFee.getTotalFee()-gxFee1;
  168. jkxlDetailFee.setGxFee(Math.abs(gxFee1));
  169. jkxlDetailFee.setTotalFee(totalF);
  170. }
  171. }
  172. //将其他费用存入集合
  173. JkxlDetailFee jkxlDetailFee1 = new JkxlDetailFee();
  174. JkxlDetailFee jkxlDetailFee2 = new JkxlDetailFee();
  175. jkxlDetailFee1.setId(id);
  176. jkxlDetailFee1.setWbsCode("34120000");
  177. jkxlDetailFee1.setTotalFee(qtFees[0]);
  178. jkxlDetailFee2.setWbsCode("34220000");
  179. jkxlDetailFee2.setTotalFee(qtFees[1]);
  180. jkxlDetailFee2.setId(id);
  181. list.add(jkxlDetailFee1);
  182. list.add(jkxlDetailFee2);
  183. //保存费用明细
  184. for(JkxlDetailFee jkxlDetailFee:list){
  185. overheadLineMapper.save(jkxlDetailFee);
  186. }
  187. //保存未识别费用
  188. JkxlAdjustFee jkxlAdjustFee = new JkxlAdjustFee();
  189. jkxlAdjustFee.setId(id);
  190. jkxlAdjustFee.setType(BashInfo.BZZSSL);
  191. jkxlAdjustFee.setFee(wsbFees[0]);
  192. feeAdjustService.save(jkxlAdjustFee);
  193. JkxlAdjustFee jkxlAdjustFee1 = new JkxlAdjustFee();
  194. jkxlAdjustFee1.setId(id);
  195. jkxlAdjustFee1.setType(BashInfo.KJJGCC);
  196. jkxlAdjustFee1.setFee(wsbFees[1]);
  197. feeAdjustService.save(jkxlAdjustFee1);
  198. }
  199. }