|
@@ -26,12 +26,17 @@ import com.ruoyi.ems.mapper.MeterDeviceMapper;
|
|
|
import com.ruoyi.ems.mapper.MeterReadingMapper;
|
|
|
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;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
@@ -71,13 +76,65 @@ public class ChargingBillServiceImpl implements IChargingBillService {
|
|
|
*/
|
|
|
@Override
|
|
|
public List<ChargingBill> selectCoChargingBill(QueryChargingBill queryParam) {
|
|
|
+ // 查询园区内部计费配置
|
|
|
+ CoChargingConfig chargingCfg = coChargingConfigService.selectByArea(queryParam.getAreaCode());
|
|
|
+
|
|
|
+ // 计算个户账单
|
|
|
+ Map<String, ChargingBill> coBillMap = clacCoBill(queryParam, chargingCfg);
|
|
|
+
|
|
|
+ // 计算公摊账单
|
|
|
+ Map<String, ChargingBill> sharedMap = clacSharedBill(queryParam, chargingCfg);
|
|
|
+
|
|
|
+ return mergeBill(queryParam, coBillMap, sharedMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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");
|
|
|
+
|
|
|
+ do {
|
|
|
+ String time = DateUtils.dateToString(start, "yyyyMM");
|
|
|
+
|
|
|
+ ChargingBill bill = new ChargingBill();
|
|
|
+ bill.setObjCode(queryParam.getObjArea());
|
|
|
+ bill.setMeteredTime(time);
|
|
|
+
|
|
|
+ ChargingBill coBill = coBillMap.get(time);
|
|
|
+
|
|
|
+ if (null != coBill) {
|
|
|
+ bill.setMeteredValue(coBill.getMeteredValue());
|
|
|
+ bill.setMeteredPrice(coBill.getMeteredPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ ChargingBill sharedBill = sharedMap.get(time);
|
|
|
+
|
|
|
+ if (null != sharedBill) {
|
|
|
+ bill.setSharedPrice(sharedBill.getSharedPrice());
|
|
|
+ bill.setSharedComputeType(sharedBill.getSharedComputeType());
|
|
|
+ }
|
|
|
+
|
|
|
+ bill.setTotalPrice(clacTotalPrice(bill));
|
|
|
+
|
|
|
+ retList.add(bill);
|
|
|
+
|
|
|
+ start = DateUtils.adjustMonth(start, 1);
|
|
|
+ }
|
|
|
+ while (start.before(end) || start.equals(end));
|
|
|
+
|
|
|
+ return retList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, ChargingBill> clacCoBill(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
|
|
|
+ Map<String, ChargingBill> retMap = null;
|
|
|
|
|
|
// 查询计量设备
|
|
|
int objType = MeterObjType.METER_ABZ.getType();
|
|
|
int objSubType = MeterObjSubType.getByTier(queryParam.getTier()).getType();
|
|
|
- MeterDevice meterDevice = meterDeviceMapper.selectMeterDeviceByObj(objType, objSubType,
|
|
|
- queryParam.getAreaCode(), queryParam.getMeterCls());
|
|
|
+
|
|
|
+ MeterDevice meterDevice = meterDeviceMapper.selectMeterDeviceByObj(objType, objSubType, queryParam.getObjArea(),
|
|
|
+ queryParam.getMeterCls());
|
|
|
|
|
|
if (null != meterDevice) {
|
|
|
QueryMeterReading recParam = new QueryMeterReading();
|
|
@@ -87,98 +144,121 @@ public class ChargingBillServiceImpl implements IChargingBillService {
|
|
|
recParam.setEndMonth(queryParam.getEndTime());
|
|
|
|
|
|
List<MeterReading> recList = meterReadingMapper.selectList(recParam);
|
|
|
- retList = convertToChargingBill(meterDevice, queryParam, recList);
|
|
|
+ List<ChargingBill> billList = convertToChargingBill(queryParam, chargingCfg, recList);
|
|
|
+ retMap = billList.stream().collect(Collectors.toMap(ChargingBill::getMeteredTime, Function.identity()));
|
|
|
}
|
|
|
|
|
|
- return retList;
|
|
|
+ return MapUtils.isNotEmpty(retMap) ? retMap : new HashMap<>();
|
|
|
}
|
|
|
|
|
|
- private List<ChargingBill> convertToChargingBill(MeterDevice meterDevice, QueryChargingBill queryParam,
|
|
|
- List<MeterReading> recList) {
|
|
|
- List<ChargingBill> retList = new ArrayList<>();
|
|
|
+ private Map<String, ChargingBill> clacSharedBill(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
|
|
|
+ Map<String, ChargingBill> retMap = null;
|
|
|
|
|
|
- // 查询园区内部计费配置
|
|
|
- CoChargingConfig chargingCfg = coChargingConfigService.selectByArea(meterDevice.getAreaCode());
|
|
|
+ if (queryParam.getMeterCls() == 45) {
|
|
|
+ retMap = clacElecSharedPrice(queryParam, chargingCfg);
|
|
|
+ }
|
|
|
+ else if (queryParam.getMeterCls() == 70) {
|
|
|
+ retMap = clacWaterSharedPrice(queryParam, chargingCfg);
|
|
|
+ }
|
|
|
|
|
|
- // 参与公摊的分区ID
|
|
|
- Set<String> coSet = getCoSet(chargingCfg);
|
|
|
+ return MapUtils.isNotEmpty(retMap) ? retMap : new HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<ChargingBill> convertToChargingBill(QueryChargingBill queryParam, CoChargingConfig chargingCfg,
|
|
|
+ List<MeterReading> recList) {
|
|
|
+ List<ChargingBill> retList = new ArrayList<>();
|
|
|
|
|
|
for (MeterReading rec : recList) {
|
|
|
ChargingBill bill = new ChargingBill();
|
|
|
- bill.setObjType(meterDevice.getObjType());
|
|
|
- bill.setObjSubType(meterDevice.getObjSubType());
|
|
|
- bill.setObjCode(meterDevice.getObjCode());
|
|
|
bill.setMeteredValue(rec.getIncrease().doubleValue());
|
|
|
bill.setMeteredTime(rec.getMeterMonth());
|
|
|
|
|
|
- // 计算商户个体费用、公摊费用
|
|
|
+ // 计算商户个体费用
|
|
|
if (null != chargingCfg) {
|
|
|
- if (meterDevice.getMeterCls() == 45) {
|
|
|
+ if (queryParam.getMeterCls() == 45) {
|
|
|
bill.setMeteredPrice(calcPrice(rec.getIncrease(), chargingCfg.getElecUnitPrice()));
|
|
|
- bill.setSharedComputeType(chargingCfg.getElecGtComputeType());
|
|
|
- clacElecSharedPrice(bill, meterDevice, chargingCfg, queryParam, coSet);
|
|
|
}
|
|
|
- else if (meterDevice.getMeterCls() == 70) {
|
|
|
+ else if (queryParam.getMeterCls() == 70) {
|
|
|
bill.setMeteredPrice(calcPrice(rec.getIncrease(), chargingCfg.getWaterUnitPrice()));
|
|
|
- bill.setSharedComputeType(chargingCfg.getWaterGtComputeType());
|
|
|
- clacWaterSharedPrice(bill, meterDevice, chargingCfg, queryParam, coSet);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- bill.setTotalPrice(clacTotalPrice(bill));
|
|
|
retList.add(bill);
|
|
|
}
|
|
|
|
|
|
return retList;
|
|
|
}
|
|
|
|
|
|
- private Set<String> getCoSet(CoChargingConfig chargingCfg) {
|
|
|
- Set<String> coSet;
|
|
|
+ private Map<String, ChargingBill> clacElecSharedPrice(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
|
|
|
+ Map<String, ChargingBill> retMap = new HashMap<>();
|
|
|
+ // 参与公摊的分区ID
|
|
|
+ Set<String> coSet = getCoSet(chargingCfg);
|
|
|
|
|
|
- if (null != chargingCfg) {
|
|
|
- coSet = chargingCfg.getRelCoList().stream().map(CoChargingConfigRel::getZoningCode)
|
|
|
- .collect(Collectors.toSet());
|
|
|
- }
|
|
|
- else {
|
|
|
- coSet = new HashSet<>();
|
|
|
+ // 电价公摊计算
|
|
|
+ if (chargingCfg.getElecGtComputeType() > 0 && coSet.contains(queryParam.getObjArea())) {
|
|
|
+ QueryMeterReading param = new QueryMeterReading(queryParam.getAreaCode(), MeterObjTag.SHARED.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();
|
|
|
+
|
|
|
+ // 公摊价格计算
|
|
|
+ Double price = clacSharedPrice(sharedReadings, coSet, queryParam.getObjArea(),
|
|
|
+ chargingCfg.getElecGtComputeType(), chargingCfg.getElecUnitPrice());
|
|
|
+
|
|
|
+ ChargingBill bill = new ChargingBill();
|
|
|
+ bill.setSharedPrice(price);
|
|
|
+ bill.setSharedComputeType(chargingCfg.getElecGtComputeType());
|
|
|
+
|
|
|
+ retMap.put(meterTime, bill);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- return coSet;
|
|
|
+ return retMap;
|
|
|
}
|
|
|
|
|
|
- private void clacElecSharedPrice(ChargingBill bill, MeterDevice meterDevice, CoChargingConfig chargingCfg,
|
|
|
- QueryChargingBill queryParam, Set<String> coSet) {
|
|
|
-
|
|
|
- // 电价公摊计算
|
|
|
- if (chargingCfg.getElecGtComputeType() > 0 && coSet.contains(meterDevice.getObjCode())) {
|
|
|
- QueryMeterReading param = new QueryMeterReading(meterDevice.getAreaCode(), MeterObjTag.SHARED.getTagValue(),
|
|
|
- meterDevice.getMeterCls(), queryParam.getStartTime(), queryParam.getEndTime());
|
|
|
- List<MeterReading> sharedReadings = meterReadingMapper.selectByTag(param);
|
|
|
- Double price = clacSharedPrice(sharedReadings, coSet, meterDevice.getObjCode(),
|
|
|
- chargingCfg.getElecGtComputeType(), chargingCfg.getElecUnitPrice());
|
|
|
-
|
|
|
- bill.setSharedPrice(price);
|
|
|
- }
|
|
|
- }
|
|
|
+ private Map<String, ChargingBill> clacWaterSharedPrice(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
|
|
|
+ Map<String, ChargingBill> retMap = new HashMap<>();
|
|
|
+ // 参与公摊的分区ID
|
|
|
+ Set<String> coSet = getCoSet(chargingCfg);
|
|
|
|
|
|
- private void clacWaterSharedPrice(ChargingBill bill, MeterDevice meterDevice, CoChargingConfig chargingCfg,
|
|
|
- QueryChargingBill queryParam, Set<String> coSet) {
|
|
|
// 水价公摊计算
|
|
|
- if (chargingCfg.getWaterGtComputeType() > 0 && coSet.contains(meterDevice.getObjCode())) {
|
|
|
- QueryMeterReading param = new QueryMeterReading(meterDevice.getAreaCode(), MeterObjTag.SHARED.getTagValue(),
|
|
|
- meterDevice.getMeterCls(), queryParam.getStartTime(), queryParam.getEndTime());
|
|
|
- List<MeterReading> sharedReadings = meterReadingMapper.selectByTag(param);
|
|
|
- Double price = clacSharedPrice(sharedReadings, coSet, meterDevice.getObjCode(),
|
|
|
- chargingCfg.getWaterGtComputeType(), chargingCfg.getWaterUnitPrice());
|
|
|
-
|
|
|
- bill.setSharedPrice(price);
|
|
|
+ if (chargingCfg.getWaterGtComputeType() > 0 && coSet.contains(queryParam.getObjArea())) {
|
|
|
+ QueryMeterReading param = new QueryMeterReading(queryParam.getAreaCode(), MeterObjTag.SHARED.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();
|
|
|
+
|
|
|
+ // 公摊价格计算
|
|
|
+ Double price = clacSharedPrice(sharedReadings, coSet, queryParam.getObjArea(),
|
|
|
+ chargingCfg.getWaterGtComputeType(), chargingCfg.getWaterUnitPrice());
|
|
|
+
|
|
|
+ ChargingBill bill = new ChargingBill();
|
|
|
+ bill.setObjCode(queryParam.getObjArea());
|
|
|
+ bill.setSharedPrice(price);
|
|
|
+ bill.setSharedComputeType(chargingCfg.getElecGtComputeType());
|
|
|
+
|
|
|
+ retMap.put(meterTime, bill);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
+ return retMap;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 计算公摊价
|
|
|
*
|
|
|
- * @return
|
|
|
+ * @return 价格
|
|
|
*/
|
|
|
private Double clacSharedPrice(List<MeterReading> sharedReadings, Set<String> coSet, String objCode,
|
|
|
int gtComputeType, Double unitPrice) {
|
|
@@ -259,13 +339,33 @@ public class ChargingBillServiceImpl implements IChargingBillService {
|
|
|
}
|
|
|
|
|
|
private Double clacTotalPrice(ChargingBill bill) {
|
|
|
- BigDecimal bd1 = new BigDecimal(bill.getMeteredPrice().toString());
|
|
|
-
|
|
|
- if (null != bill.getSharedPrice()) {
|
|
|
+ if (null != bill.getMeteredPrice() && null != bill.getSharedPrice()) {
|
|
|
+ BigDecimal bd1 = new BigDecimal(bill.getMeteredPrice().toString());
|
|
|
BigDecimal bd2 = new BigDecimal(bill.getSharedPrice().toString());
|
|
|
- bd1 = bd1.add(bd2);
|
|
|
+ return bd1.add(bd2).setScale(3, RoundingMode.HALF_UP).doubleValue();
|
|
|
+ }
|
|
|
+ else if (null == bill.getMeteredPrice() && null != bill.getSharedPrice()) {
|
|
|
+ return bill.getSharedPrice();
|
|
|
+ }
|
|
|
+ else if (null != bill.getMeteredPrice() && null == bill.getSharedPrice()) {
|
|
|
+ return bill.getMeteredPrice();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return null;
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ private Set<String> getCoSet(CoChargingConfig chargingCfg) {
|
|
|
+ Set<String> coSet;
|
|
|
|
|
|
- return bd1.setScale(3, RoundingMode.HALF_UP).doubleValue();
|
|
|
+ if (null != chargingCfg) {
|
|
|
+ coSet = chargingCfg.getRelCoList().stream().map(CoChargingConfigRel::getZoningCode)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ coSet = new HashSet<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ return coSet;
|
|
|
}
|
|
|
}
|