CarRptController.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.hb.proj.car.controller;
  2. import java.text.DecimalFormat;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Set;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import org.apache.commons.lang.StringUtils;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Controller;
  14. import org.springframework.web.bind.annotation.RequestMapping;
  15. import com.hb.proj.car.service.CarOilMonitorService;
  16. import com.hb.proj.car.service.CarRptService;
  17. import com.hb.proj.car.service.CarRptUtils;
  18. import com.hb.proj.car.service.CarService;
  19. import com.hb.proj.car.service.EnergySumRptService;
  20. import com.hb.proj.input.service.CarConsumeService;
  21. import com.hb.proj.model.CarConsume;
  22. import com.hb.proj.model.CarConsumeRptVO;
  23. import com.hb.proj.model.ERP;
  24. import com.hb.proj.model.OtherConsume;
  25. import com.hb.proj.utils.JsonOutUtils;
  26. import com.hb.proj.utils.MySessionUser;
  27. import com.hb.proj.utils.RptMonthUtil;
  28. import com.hb.proj.utils.RptOuter;
  29. import com.hb.xframework.util.DateUtil;
  30. import com.hb.xframework.util.SessionThreadLocal;
  31. @Controller
  32. @RequestMapping("/**/rpt")
  33. public class CarRptController {
  34. @Autowired
  35. private CarService carService;
  36. @Autowired
  37. private CarRptService service;
  38. @Autowired
  39. private CarOilMonitorService monitorService;
  40. @Autowired
  41. private CarConsumeService consumeService;
  42. @Autowired
  43. private EnergySumRptService energyService;
  44. /**
  45. * 单车油耗明细(有两个报表:项目部用、安全科用)
  46. * @param request
  47. * @param response
  48. */
  49. @RequestMapping("/loadCarConsumeDtl")
  50. public void loadCarConsumeDtl(HttpServletRequest request,HttpServletResponse response){
  51. try{
  52. MySessionUser su=(MySessionUser)SessionThreadLocal.getSessionUser();
  53. if(su==null){
  54. JsonOutUtils.returnError(response, "缺少登录信息");
  55. return;
  56. }
  57. String orgAssistCode=request.getParameter("orgAssistCode");
  58. String orgName=request.getParameter("orgName");
  59. String startMonth=request.getParameter("startMonth");
  60. String endMonth=request.getParameter("endMonth");
  61. //String useType=request.getParameter("useType"); //1:安全科;其它:项目部
  62. String deviceKey=request.getParameter("deviceKey");
  63. String sortField=request.getParameter("sortField");
  64. String sortType=request.getParameter("sortType");
  65. boolean rptForMgr="1".equals(request.getParameter("useType"));
  66. if(StringUtils.isEmpty(orgAssistCode)){
  67. orgAssistCode=su.isSysAdmin()?null:su.getOrgAssistCode();
  68. }
  69. Map<String,Object> rootMap=rptCarConsume(rptForMgr,orgName,orgAssistCode,startMonth,endMonth,deviceKey,sortField,sortType);
  70. RptOuter.clearTemplateCache();
  71. RptOuter.write(request,response,rootMap,rptForMgr?"carOilCostDtlSafeDpt.ftl":"carOilCostDtl.ftl");
  72. }
  73. catch(Exception e){
  74. e.printStackTrace();
  75. JsonOutUtils.returnError(response, "服务出现错误");
  76. }
  77. }
  78. /**
  79. * 为单车油耗统计、按车型统计油耗提供核心方法(包括相关导出)
  80. * @param mgrRpt 管理用统计(安全科用)
  81. * @param orgName
  82. * @param orgAssistCode
  83. * @param startMonth
  84. * @param endMonth
  85. * @param deviceKey 设备名称或型号,可以同时输入
  86. * @param sortField 排序字段
  87. * @param sortType 排序方式 desc、asc
  88. */
  89. private Map<String,Object> rptCarConsume(boolean mgrRpt,String orgName,String orgAssistCode,String startMonth,String endMonth,String deviceKey,String sortField,String sortType){
  90. if(StringUtils.isEmpty(startMonth)&&StringUtils.isEmpty(endMonth)){ //默认当月
  91. startMonth=DateUtil.format((new Date()), "yyyy-MM");
  92. endMonth=startMonth;
  93. }
  94. else if(StringUtils.isEmpty(endMonth)){ //只输入开始月份的
  95. endMonth=startMonth;
  96. }
  97. else if(StringUtils.isEmpty(startMonth)){
  98. startMonth=endMonth;
  99. }
  100. List<CarConsumeRptVO> carConsumes=service.loadCarConsumeDtl(startMonth, endMonth, orgAssistCode,deviceKey,sortField,sortType);
  101. Map<String,Object> rootMap=new HashMap<String,Object>();
  102. //安全科用,采用新逻辑计算实际单耗:上报加油量+上期余油-本期余油
  103. if(mgrRpt){
  104. Set<String> carIds=new HashSet<String>(carConsumes.size());
  105. String crtMonth=DateUtil.format(new Date(), "yyyy-MM-dd");
  106. for(CarConsumeRptVO car : carConsumes){
  107. carIds.add(car.getCarId());
  108. car.setRealAge(RptMonthUtil.getWorkAge(DateUtil.format(car.getWorkStart(),"yyyy-MM"),crtMonth));
  109. }
  110. Map<String,Map<String,Object>> volMapping=monitorService.loadCarMonitorRpt(carIds,startMonth, endMonth);
  111. boolean hadMonitor=volMapping!=null&&volMapping.size()>0;
  112. Map<String,Object> mthVol=null;
  113. for(CarConsumeRptVO car : carConsumes){
  114. mthVol=hadMonitor?volMapping.get(car.getCarId()):null;
  115. if(mthVol!=null&&mthVol.get("startVolume")!=null&&mthVol.get("endVolume")!=null){
  116. car.init(((Number)mthVol.get("startVolume")).doubleValue(),((Number)mthVol.get("endVolume")).doubleValue());
  117. }
  118. else{
  119. car.init(null,null);
  120. }
  121. }
  122. }
  123. else{ //项目用报表需要:计算汽油、柴油平均单价 2021.1.6
  124. if(!startMonth.equals(endMonth)){ //跨月查询,实际单耗要重新计算
  125. CarRptUtils.calculateRealCostPer100km(carConsumes);
  126. }
  127. ERP erp=energyService.erpMonthSum(startMonth,endMonth);
  128. OtherConsume kl=energyService.otherMonthSum(startMonth, endMonth);
  129. erp=ERPKlSumUtil.erpPlusKlMonth(kl,erp);
  130. if(erp==null){
  131. return rootMap;
  132. }
  133. rootMap.put("oilPrice", getPrice(erp.getOilMoney(),erp.getOilCount())); //元/千克
  134. rootMap.put("coilPrice", getPrice(erp.getCoilMoney(),erp.getCoilCount())); //元/千克
  135. }
  136. String rptMonthTitle=startMonth.replace("-", "年")+"月";
  137. String rptMonthCell=(startMonth.split("-"))[1]+"月";
  138. if(!startMonth.equals(endMonth)){
  139. rptMonthTitle+="——"+endMonth.replace("-", "年")+"月";
  140. rptMonthCell+="-"+(endMonth.split("-"))[1]+"月";
  141. }
  142. rootMap.put("orgName", orgName!=null?orgName:"");
  143. rootMap.put("rptMonthTitle", rptMonthTitle);
  144. rootMap.put("rptMonthCell", rptMonthCell);
  145. rootMap.put("datas", carConsumes);
  146. Map<String,Object> otherConsume=consumeService.loadOtherConsume(startMonth, endMonth, orgAssistCode);
  147. rootMap.put("otherConsume", otherConsume);
  148. return rootMap;
  149. }
  150. private String getPrice(Double money,Double count){
  151. if(money==null||count==null){
  152. return null;
  153. }
  154. DecimalFormat df=new DecimalFormat("#0.000");
  155. return df.format((money*10)/count);
  156. }
  157. /**
  158. * 各车型(其实是设备名称)油耗汇总表,需要在loadCarConsumeDtl方法的结果集上,在程序内部进行分组统计
  159. * (如果直接在sql中按设备名分组,丢失设备型号,行驶油耗无法计算)
  160. * @param orgName
  161. * @param orgAssistCode
  162. * @param year
  163. * @param request
  164. * @param response
  165. */
  166. @RequestMapping("/loadCarTypeConsume")
  167. public void loadCarTypeConsume(String orgName,String orgAssistCode,String startMonth,String endMonth,HttpServletRequest request,HttpServletResponse response){
  168. try{
  169. MySessionUser su=(MySessionUser)SessionThreadLocal.getSessionUser();
  170. if(su==null){ //测试暂时不用
  171. JsonOutUtils.returnError(response, "缺少登录信息");
  172. return;
  173. }
  174. if(StringUtils.isEmpty(orgAssistCode)){
  175. orgAssistCode=su.isSysAdmin()?null:su.getOrgAssistCode();
  176. }
  177. if(StringUtils.isEmpty(startMonth)&&StringUtils.isEmpty(endMonth)){ //默认当月
  178. startMonth=DateUtil.format((new Date()), "yyyy-MM");
  179. endMonth=startMonth;
  180. }
  181. else if(StringUtils.isEmpty(startMonth)){
  182. startMonth=endMonth;
  183. }
  184. else if(StringUtils.isEmpty(endMonth)){
  185. endMonth=startMonth;
  186. }
  187. List<CarConsume> carConsumes=service.loadCarTypeConsume(startMonth, endMonth, orgAssistCode);
  188. String rptMonthTitle=startMonth.replace("-", "年")+"月";
  189. if(!startMonth.equals(endMonth)){
  190. rptMonthTitle+="——"+endMonth.replace("-", "年")+"月";
  191. }
  192. Map<String,Object> rootMap=new HashMap<String,Object>();
  193. rootMap.put("orgName", orgName!=null?orgName:"");
  194. rootMap.put("rptMonthTitle", rptMonthTitle);
  195. rootMap.put("datas", carConsumes);
  196. Map<String,Object> otherConsume=consumeService.loadOtherConsume(startMonth, endMonth, orgAssistCode);
  197. rootMap.put("otherConsume", otherConsume);
  198. RptOuter.clearTemplateCache();
  199. RptOuter.write(request,response,rootMap,"carTypeOilCostRpt.ftl");
  200. }
  201. catch(Exception e){
  202. e.printStackTrace();
  203. JsonOutUtils.returnError(response, "服务出现错误");
  204. }
  205. }
  206. }