Ver código fonte

计费总览接口

lv.wenbin 11 meses atrás
pai
commit
5bbe5a2154

+ 22 - 1
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/ChargingBillController.java

@@ -53,7 +53,7 @@ public class ChargingBillController extends BaseController {
      * 商户计费
      *
      * @param queryParam 查询参数
-     * @return
+     * @return 计费
      */
     @GetMapping(value = "/co")
     public AjaxResult getCoBill(QueryChargingBill queryParam) {
@@ -69,4 +69,25 @@ public class ChargingBillController extends BaseController {
             return error("系统异常");
         }
     }
+
+    /**
+     * 商户计费
+     *
+     * @param queryParam 查询参数
+     * @return 计费
+     */
+    @GetMapping(value = "/getByTag")
+    public AjaxResult getByTag(QueryChargingBill queryParam) {
+        try {
+            List<ChargingBill> list = chargingBillService.selectTagChargingBill(queryParam);
+            return success(list);
+        }
+        catch (BusinessException e) {
+            return error(e.getMessage());
+        }
+        catch (Exception e) {
+            logger.error("系统异常", e);
+            return error("系统异常");
+        }
+    }
 }

+ 45 - 5
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/ChargingBill.java

@@ -11,7 +11,7 @@
 package com.ruoyi.ems.domain;
 
 /**
- * 采购项目
+ * 账单
  * <功能详细描述>
  *
  * @author lvwenbin
@@ -21,11 +21,16 @@ package com.ruoyi.ems.domain;
  */
 public class ChargingBill {
     /**
-     * 账单项目名称
+     * 账单主体代码
      */
     private String objCode;
 
     /**
+     * 账单主体名称
+     */
+    private String objName;
+
+    /**
      * 计量时间
      */
     private String meteredTime;
@@ -41,6 +46,11 @@ public class ChargingBill {
     private Double meteredPrice;
 
     /**
+     * 公摊值
+     */
+    private Long sharedValue;
+
+    /**
      * 公摊金额
      */
     private Double sharedPrice;
@@ -51,6 +61,11 @@ public class ChargingBill {
     private Integer sharedComputeType;
 
     /**
+     * 总计用量
+     */
+    private Long totalValue;
+
+    /**
      * 合计金额
      */
     private Double totalPrice;
@@ -63,6 +78,14 @@ public class ChargingBill {
         this.objCode = objCode;
     }
 
+    public String getObjName() {
+        return objName;
+    }
+
+    public void setObjName(String objName) {
+        this.objName = objName;
+    }
+
     public String getMeteredTime() {
         return meteredTime;
     }
@@ -87,6 +110,14 @@ public class ChargingBill {
         this.meteredPrice = meteredPrice;
     }
 
+    public Long getSharedValue() {
+        return sharedValue;
+    }
+
+    public void setSharedValue(Long sharedValue) {
+        this.sharedValue = sharedValue;
+    }
+
     public Double getSharedPrice() {
         return sharedPrice;
     }
@@ -103,6 +134,14 @@ public class ChargingBill {
         this.sharedComputeType = sharedComputeType;
     }
 
+    public Long getTotalValue() {
+        return totalValue;
+    }
+
+    public void setTotalValue(Long totalValue) {
+        this.totalValue = totalValue;
+    }
+
     public Double getTotalPrice() {
         return totalPrice;
     }
@@ -113,8 +152,9 @@ public class ChargingBill {
 
     @Override
     public String toString() {
-        return "ChargingBill{" + "objCode='" + objCode + '\'' + ", meteredTime='" + meteredTime + '\''
-            + ", meteredValue=" + meteredValue + ", meteredPrice=" + meteredPrice + ", sharedPrice=" + sharedPrice
-            + ", sharedComputeType=" + sharedComputeType + ", totalPrice=" + totalPrice + '}';
+        return "ChargingBill{" + "objCode='" + objCode + '\'' + ", objName='" + objName + '\'' + ", meteredTime='"
+            + meteredTime + '\'' + ", meteredValue=" + meteredValue + ", meteredPrice=" + meteredPrice
+            + ", sharedValue=" + sharedValue + ", sharedPrice=" + sharedPrice + ", sharedComputeType="
+            + sharedComputeType + ", totalValue='" + totalValue + '\'' + ", totalPrice=" + totalPrice + '}';
     }
 }

+ 9 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IAreaBuildingZoningService.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.service;
 
 import java.util.List;
+import java.util.Set;
 
 import com.ruoyi.ems.domain.AreaBuildingZoning;
 
@@ -28,6 +29,14 @@ public interface IAreaBuildingZoningService {
     AreaBuildingZoning selectAreaBuildingZoningByCode(String code);
 
     /**
+     * 查询建筑区域划分
+     *
+     * @param codes 建筑区域划分code list
+     * @return 建筑区域划分
+     */
+    List<AreaBuildingZoning> selectByCodes(Set<String> codes);
+
+    /**
      * 查询建筑区域划分列表
      *
      * @param areaBuildingZoning 建筑区域划分

+ 7 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IChargingBillService.java

@@ -31,4 +31,11 @@ public interface IChargingBillService {
      * @return 返回列表
      */
     List<ChargingBill> selectCoChargingBill(QueryChargingBill queryParam);
+
+    /**
+     * 查询计费账单列表by标签
+     * @param queryParam 查询参数
+     * @return 返回列表
+     */
+    List<ChargingBill> selectTagChargingBill(QueryChargingBill queryParam);
 }

+ 6 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/AreaBuildingZoningServiceImpl.java

@@ -16,6 +16,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -60,6 +61,11 @@ public class AreaBuildingZoningServiceImpl implements IAreaBuildingZoningService
         return areaBuildingZoningMapper.selectAreaBuildingZoningByCode(code);
     }
 
+    @Override
+    public List<AreaBuildingZoning> selectByCodes(Set<String> codes) {
+        return areaBuildingZoningMapper.selectByCodes(codes);
+    }
+
     /**
      * 查询建筑区域划分列表
      *

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

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