|
@@ -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;
|
|
|
+ }
|
|
|
}
|