| 
					
				 | 
			
			
				@@ -10,25 +10,30 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.ruoyi.ems.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.common.core.utils.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.ems.domain.Area; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.ems.domain.AreaBuilding; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.AreaBuildingZoning; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.ChargingBill; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.CoChargingConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.CoChargingConfigRel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.MeterDevice; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.MeterReading; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.ems.domain.common.AreaTier; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.common.MeterObjSubType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.common.MeterObjTag; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.common.MeterObjType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.vo.QueryChargingBill; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.domain.vo.QueryMeterReading; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.ruoyi.ems.mapper.AreaBuildingZoningMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.mapper.MeterDeviceMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.mapper.MeterReadingMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.ems.service.IAreaBuildingService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.ems.service.IAreaBuildingZoningService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.ems.service.IAreaService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.service.IChargingBillService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.service.ICoChargingConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.ems.util.DateUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.apache.commons.collections4.MapUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -63,7 +68,13 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private MeterDeviceMapper meterDeviceMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private AreaBuildingZoningMapper areaBuildingZoningMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private IAreaService areaService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private IAreaBuildingService buildingService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private IAreaBuildingZoningService zoningService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private ICoChargingConfigService coChargingConfigService; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -88,11 +99,53 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return mergeBill(queryParam, coBillMap, sharedMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<ChargingBill> selectTagChargingBill(QueryChargingBill queryParam) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 查询园区内部计费配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CoChargingConfig chargingCfg = coChargingConfigService.selectByArea(queryParam.getAreaCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, Long> individualMap = getQuantityByTag(queryParam, MeterObjTag.INDIVIDUAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, Long> sharedMap = getQuantityByTag(queryParam, MeterObjTag.SHARED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<ChargingBill> retList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date start = DateUtils.stringToDate(queryParam.getStartTime(), "yyyyMM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Date end = DateUtils.stringToDate(queryParam.getEndTime(), "yyyyMM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String objName = getObjName(queryParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String time = DateUtils.dateToString(start, "yyyyMM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ChargingBill bill = new ChargingBill(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setObjCode(queryParam.getObjArea()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setMeteredTime(time); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setObjName(objName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long individual = (null != individualMap.get(time)) ? individualMap.get(time) : 0L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setMeteredValue((double) individual); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setMeteredPrice(calcPrice(queryParam.getMeterCls(), individual, chargingCfg)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            long shared = (null != sharedMap.get(time)) ? sharedMap.get(time) : 0L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setSharedValue(shared); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setSharedPrice(calcPrice(queryParam.getMeterCls(), shared, chargingCfg)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setTotalValue(individual + shared); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setTotalPrice(clacTotalPrice(bill)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            retList.add(bill); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            start = DateUtils.adjustMonth(start, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        while (start.before(end) || start.equals(end)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return retList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private List<ChargingBill> mergeBill(QueryChargingBill queryParam, Map<String, ChargingBill> coBillMap, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<String, ChargingBill> sharedMap) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<ChargingBill> retList = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Date start = DateUtils.stringToDate(queryParam.getStartTime(), "yyyyMM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Date end = DateUtils.stringToDate(queryParam.getEndTime(), "yyyyMM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String objName = getObjName(queryParam); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         do { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             String time = DateUtils.dateToString(start, "yyyyMM"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -100,6 +153,7 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ChargingBill bill = new ChargingBill(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             bill.setObjCode(queryParam.getObjArea()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             bill.setMeteredTime(time); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bill.setObjName(objName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ChargingBill coBill = coBillMap.get(time); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -255,6 +309,27 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return retMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Map<String, Long> getQuantityByTag(QueryChargingBill queryParam, MeterObjTag tag) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, Long> retMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        QueryMeterReading param = new QueryMeterReading(queryParam.getAreaCode(), tag.getTagValue(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            queryParam.getMeterCls(), queryParam.getStartTime(), queryParam.getEndTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<MeterReading> totalReadings = meterReadingMapper.selectByTag(param); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, List<MeterReading>> groupedRecs = totalReadings.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            .collect(Collectors.groupingBy(MeterReading::getMeterMonth)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (Map.Entry<String, List<MeterReading>> entry : groupedRecs.entrySet()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            String meterTime = entry.getKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            List<MeterReading> sharedReadings = entry.getValue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 公摊用量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Long sharedQuantity = sumSharedReadings(sharedReadings); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            retMap.put(meterTime, sharedQuantity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return retMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 计算公摊价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -290,7 +365,7 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private double sharedPriceByArea(Double sharedPriceSum, String objCode, Set<String> coSet) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        List<AreaBuildingZoning> zonings = areaBuildingZoningMapper.selectByCodes(coSet); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<AreaBuildingZoning> zonings = zoningService.selectByCodes(coSet); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Map<String, AreaBuildingZoning> map = zonings.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             .collect(Collectors.toMap(AreaBuildingZoning::getZoningCode, Function.identity())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         AreaBuildingZoning zoning = map.get(objCode); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -298,7 +373,6 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Long areas = sumSharedAreas(zonings); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BigDecimal bd1 = new BigDecimal(sharedPriceSum.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BigDecimal bd2 = new BigDecimal(areas.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         BigDecimal bd3 = new BigDecimal(zoning.getBldgLdArea().toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -327,6 +401,25 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 计算用量总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param meterCls  计量类别 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param dosage    用量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param chargingCfg 价格配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return 返回总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Double calcPrice(int meterCls, Long dosage, CoChargingConfig chargingCfg) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (meterCls == 45) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return calcPrice(dosage, chargingCfg.getElecUnitPrice()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else if (meterCls == 70) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return calcPrice(dosage, chargingCfg.getWaterUnitPrice()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 计算用量总价 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param dosage    用量 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param unitPrice 价格配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return 返回总价 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -368,4 +461,29 @@ public class ChargingBillServiceImpl implements IChargingBillService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return coSet; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String getObjName(QueryChargingBill queryParam) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String objName = "未知"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.equals(AreaTier.Area.name(), queryParam.getTier())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Area area = areaService.selectAreaByCode(queryParam.getObjArea()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            objName = area != null ? area.getShortName() : "未知"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else if (StringUtils.equals(AreaTier.Building.name(), queryParam.getTier())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AreaBuilding building = buildingService.selectAreaBuildingByCode(queryParam.getObjArea()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            objName = (building != null) ? (building.getAreaShortName() + "/" + building.getBldgName()) : "未知"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else if (StringUtils.equals(AreaTier.Zoning.name(), queryParam.getTier())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            AreaBuildingZoning zoning = zoningService.selectAreaBuildingZoningByCode(queryParam.getObjArea()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (null != zoning) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                AreaBuilding building = buildingService.selectAreaBuildingByCode(zoning.getBldgCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                objName = (building != null) ? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    (building.getAreaShortName() + "/" + building.getBldgName() + "/" + zoning.getZoningName()) : 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    "未知"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return objName; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |