OverheadLineService.java 11 KB

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