Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

chen.cheng 11 mesi fa
parent
commit
433fe32eec

+ 3 - 24
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/ChargingBill.java

@@ -20,10 +20,6 @@ package com.ruoyi.ems.domain;
  * @since [产品/模块版本]
  */
 public class ChargingBill {
-    private Long objType;
-
-    private Long objSubType;
-
     /**
      * 账单项目名称
      */
@@ -59,22 +55,6 @@ public class ChargingBill {
      */
     private Double totalPrice;
 
-    public Long getObjType() {
-        return objType;
-    }
-
-    public void setObjType(Long objType) {
-        this.objType = objType;
-    }
-
-    public Long getObjSubType() {
-        return objSubType;
-    }
-
-    public void setObjSubType(Long objSubType) {
-        this.objSubType = objSubType;
-    }
-
     public String getObjCode() {
         return objCode;
     }
@@ -133,9 +113,8 @@ public class ChargingBill {
 
     @Override
     public String toString() {
-        return "ChargingBill{" + "objType=" + objType + ", objSubType=" + objSubType + ", objCode='" + objCode + '\''
-            + ", meteredTime='" + meteredTime + '\'' + ", meteredValue=" + meteredValue + ", meteredPrice="
-            + meteredPrice + ", sharedPrice=" + sharedPrice + ", sharedComputeType=" + sharedComputeType
-            + ", totalPrice=" + totalPrice + '}';
+        return "ChargingBill{" + "objCode='" + objCode + '\'' + ", meteredTime='" + meteredTime + '\''
+            + ", meteredValue=" + meteredValue + ", meteredPrice=" + meteredPrice + ", sharedPrice=" + sharedPrice
+            + ", sharedComputeType=" + sharedComputeType + ", totalPrice=" + totalPrice + '}';
     }
 }

+ 28 - 5
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/vo/QueryChargingBill.java

@@ -10,6 +10,9 @@
  */
 package com.ruoyi.ems.domain.vo;
 
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.ems.domain.common.AreaTier;
+
 /**
  * 查询账单请求
  * <功能详细描述>
@@ -23,7 +26,7 @@ public class QueryChargingBill {
     /**
      * 区域编码
      */
-    private String areaCode;
+    private String areaPath;
 
     /**
      * 区域层级
@@ -45,12 +48,12 @@ public class QueryChargingBill {
      */
     private String endTime;
 
-    public String getAreaCode() {
-        return areaCode;
+    public String getAreaPath() {
+        return areaPath;
     }
 
-    public void setAreaCode(String areaCode) {
-        this.areaCode = areaCode;
+    public void setAreaPath(String areaPath) {
+        this.areaPath = areaPath;
     }
 
     public String getTier() {
@@ -84,4 +87,24 @@ public class QueryChargingBill {
     public void setEndTime(String endTime) {
         this.endTime = endTime;
     }
+
+    public String getAreaCode() {
+        return StringUtils.split(areaPath, "/")[0];
+    }
+
+    public String getObjArea() {
+        String[] pathArray = StringUtils.split(areaPath, "/");
+
+        if (AreaTier.Area.name().equals(this.tier)) {
+            return pathArray[0];
+        }
+        else if (AreaTier.Building.name().equals(this.tier)) {
+            return pathArray[1];
+        }
+        else if (AreaTier.Zoning.name().equals(this.tier)) {
+            return pathArray[2];
+        }
+
+        return null;
+    }
 }

+ 4 - 4
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/vo/QueryMeterReading.java

@@ -30,7 +30,7 @@ public class QueryMeterReading {
     private Integer objTag;
 
     /** 计量介质 */
-    private Long meterCls;
+    private Integer meterCls;
 
     /** 年份 */
     private String year;
@@ -49,7 +49,7 @@ public class QueryMeterReading {
     public QueryMeterReading() {
     }
 
-    public QueryMeterReading(String areaCode, Integer objTag, Long meterCls, String startMonth, String endMonth) {
+    public QueryMeterReading(String areaCode, Integer objTag, Integer meterCls, String startMonth, String endMonth) {
         this.areaCode = areaCode;
         this.objTag = objTag;
         this.meterCls = meterCls;
@@ -81,11 +81,11 @@ public class QueryMeterReading {
         this.objTag = objTag;
     }
 
-    public Long getMeterCls() {
+    public Integer getMeterCls() {
         return meterCls;
     }
 
-    public void setMeterCls(Long meterCls) {
+    public void setMeterCls(Integer meterCls) {
         this.meterCls = meterCls;
     }
 

+ 161 - 61
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/ChargingBillServiceImpl.java

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

+ 0 - 1
ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/MeterReadingMapper.xml

@@ -57,7 +57,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>
             <if test="areaCode != null  and areaCode != ''"> and r.area_code = #{areaCode}</if>
             <if test="objTag != null"> and d.obj_tag = #{objTag}</if>
-            <if test="objTag != null"> and d.obj_tag = #{objTag}</if>
             <if test="startMonth != null  and startMonth != ''"> and meter_month &gt;= #{startMonth}</if>
             <if test="endMonth != null  and endMonth != ''"> and meter_month &lt;= #{endMonth}</if>
         </where>