OverheadLineService.java 11 KB

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