Prechádzať zdrojové kódy

Merge branch 'master' of http://git.xt.wenhq.top:8083/hs/zhny_bg

hsshuxian 11 mesiacov pred
rodič
commit
79dbd49a13
16 zmenil súbory, kde vykonal 512 pridanie a 93 odobranie
  1. 19 4
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/ChargingBillController.java
  2. 65 8
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/ChargingBill.java
  3. 38 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/common/MeterObjTag.java
  4. 33 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/vo/QueryMeterReading.java
  5. 8 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/AreaBuildingZoningMapper.java
  6. 24 15
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/CoChargingConfigMapper.java
  7. 21 13
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/MeterReadingMapper.java
  8. 2 2
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IChargingBillService.java
  9. 22 15
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/ICoChargingConfigService.java
  10. 206 26
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/ChargingBillServiceImpl.java
  11. 13 1
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/CoChargingConfigServiceImpl.java
  12. 17 1
      ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/AreaBuildingZoningMapper.xml
  13. 7 2
      ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/CoChargingConfigMapper.xml
  14. 16 1
      ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/MeterReadingMapper.xml
  15. 19 3
      ems-cloud/sql/ems_init_data.sql
  16. 2 2
      ems-cloud/sql/ems_server.sql

+ 19 - 4
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/ChargingBillController.java

@@ -22,8 +22,10 @@ package com.ruoyi.ems.controller;
 
 import com.ruoyi.common.core.web.controller.BaseController;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.ems.domain.ChargingBill;
 import com.ruoyi.ems.domain.vo.QueryChargingBill;
 import com.ruoyi.ems.service.IChargingBillService;
+import com.ruoyi.ems.util.exception.BusinessException;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -32,6 +34,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * 商户能源账单配置Controller
  *
@@ -39,19 +43,30 @@ import org.springframework.web.bind.annotation.RestController;
  * @date 2024-08-26
  */
 @RestController
-@RequestMapping("/basecfg/bill/charging")
-@Api(value = "CoChargingBillController", description = "计费账单服务")
+@RequestMapping("/charging/bill/")
+@Api(value = "ChargingBillController", description = "计费账单服务")
 public class ChargingBillController extends BaseController {
     @Autowired
     private IChargingBillService chargingBillService;
 
     /**
      * 商户计费
+     *
      * @param queryParam 查询参数
      * @return
      */
-    @GetMapping(value = "/co/bill")
+    @GetMapping(value = "/co")
     public AjaxResult getCoBill(QueryChargingBill queryParam) {
-        return success(chargingBillService.selectChargingBillList(queryParam));
+        try {
+            List<ChargingBill> list = chargingBillService.selectCoChargingBill(queryParam);
+            return success(list);
+        }
+        catch (BusinessException e) {
+            return error(e.getMessage());
+        }
+        catch (Exception e) {
+            logger.error("系统异常", e);
+            return error("系统异常");
+        }
     }
 }

+ 65 - 8
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/ChargingBill.java

@@ -20,12 +20,14 @@ package com.ruoyi.ems.domain;
  * @since [产品/模块版本]
  */
 public class ChargingBill {
-    private int objType;
+    private Long objType;
+
+    private Long objSubType;
 
     /**
      * 账单项目名称
      */
-    private String itemName;
+    private String objCode;
 
     /**
      * 计量时间
@@ -42,20 +44,43 @@ public class ChargingBill {
      */
     private Double meteredPrice;
 
-    public int getObjType() {
+    /**
+     * 公摊金额
+     */
+    private Double sharedPrice;
+
+    /**
+     * 公摊计算方式
+     */
+    private Integer sharedComputeType;
+
+    /**
+     * 合计金额
+     */
+    private Double totalPrice;
+
+    public Long getObjType() {
         return objType;
     }
 
-    public void setObjType(int objType) {
+    public void setObjType(Long objType) {
         this.objType = objType;
     }
 
-    public String getItemName() {
-        return itemName;
+    public Long getObjSubType() {
+        return objSubType;
+    }
+
+    public void setObjSubType(Long objSubType) {
+        this.objSubType = objSubType;
+    }
+
+    public String getObjCode() {
+        return objCode;
     }
 
-    public void setItemName(String itemName) {
-        this.itemName = itemName;
+    public void setObjCode(String objCode) {
+        this.objCode = objCode;
     }
 
     public String getMeteredTime() {
@@ -81,4 +106,36 @@ public class ChargingBill {
     public void setMeteredPrice(Double meteredPrice) {
         this.meteredPrice = meteredPrice;
     }
+
+    public Double getSharedPrice() {
+        return sharedPrice;
+    }
+
+    public void setSharedPrice(Double sharedPrice) {
+        this.sharedPrice = sharedPrice;
+    }
+
+    public Integer getSharedComputeType() {
+        return sharedComputeType;
+    }
+
+    public void setSharedComputeType(Integer sharedComputeType) {
+        this.sharedComputeType = sharedComputeType;
+    }
+
+    public Double getTotalPrice() {
+        return totalPrice;
+    }
+
+    public void setTotalPrice(Double totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    @Override
+    public String toString() {
+        return "ChargingBill{" + "objType=" + objType + ", objSubType=" + objSubType + ", objCode='" + objCode + '\''
+            + ", meteredTime='" + meteredTime + '\'' + ", meteredValue=" + meteredValue + ", meteredPrice="
+            + meteredPrice + ", sharedPrice=" + sharedPrice + ", sharedComputeType=" + sharedComputeType
+            + ", totalPrice=" + totalPrice + '}';
+    }
 }

+ 38 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/common/MeterObjTag.java

@@ -0,0 +1,38 @@
+/*
+ * 文 件 名:  MeterObjTag
+ * 版    权:  浩鲸云计算科技股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2024/9/3
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.domain.common;
+
+/**
+ * 计量对象标签
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2024/9/3]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+public enum MeterObjTag {
+    // 公摊
+    SHARED(0),
+
+    // 个体
+    INDIVIDUAL(1);
+
+    private int tagValue;
+
+    private MeterObjTag(int tagValue) {
+        this.tagValue = tagValue;
+    }
+
+    public int getTagValue() {
+        return tagValue;
+    }
+}

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

@@ -26,6 +26,12 @@ public class QueryMeterReading {
     /** 设备编号 */
     private String deviceCode;
 
+    /** 对象标签 */
+    private Integer objTag;
+
+    /** 计量介质 */
+    private Long meterCls;
+
     /** 年份 */
     private String year;
 
@@ -40,6 +46,17 @@ public class QueryMeterReading {
      */
     private String orderFlag = "ASC";
 
+    public QueryMeterReading() {
+    }
+
+    public QueryMeterReading(String areaCode, Integer objTag, Long meterCls, String startMonth, String endMonth) {
+        this.areaCode = areaCode;
+        this.objTag = objTag;
+        this.meterCls = meterCls;
+        this.startMonth = startMonth;
+        this.endMonth = endMonth;
+    }
+
     public String getAreaCode() {
         return areaCode;
     }
@@ -56,6 +73,22 @@ public class QueryMeterReading {
         this.deviceCode = deviceCode;
     }
 
+    public Integer getObjTag() {
+        return objTag;
+    }
+
+    public void setObjTag(Integer objTag) {
+        this.objTag = objTag;
+    }
+
+    public Long getMeterCls() {
+        return meterCls;
+    }
+
+    public void setMeterCls(Long meterCls) {
+        this.meterCls = meterCls;
+    }
+
     public String getYear() {
         return year;
     }

+ 8 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/AreaBuildingZoningMapper.java

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

+ 24 - 15
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/CoChargingConfigMapper.java

@@ -1,61 +1,70 @@
 package com.ruoyi.ems.mapper;
 
 import java.util.List;
+
 import com.ruoyi.ems.domain.CoChargingConfig;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 商户能源计费配置Mapper接口
- * 
+ *
  * @author ruoyi
  * @date 2024-08-26
  */
-public interface CoChargingConfigMapper
-{
+public interface CoChargingConfigMapper {
     /**
      * 查询商户能源计费配置
-     * 
+     *
      * @param id 商户能源计费配置主键
      * @return 商户能源计费配置
      */
-     CoChargingConfig selectCoChargingConfigById(Long id);
+    CoChargingConfig selectCoChargingConfigById(Long id);
+
+    /**
+     * 查询商户能源计费配置
+     *
+     * @param areaCode 商户能源计费配置主键
+     * @return 商户能源计费配置
+     */
+    CoChargingConfig selectByArea(@Param("areaCode") String areaCode);
 
     /**
      * 查询商户能源计费配置列表
-     * 
+     *
      * @param coChargingConfig 商户能源计费配置
      * @return 商户能源计费配置集合
      */
-     List<CoChargingConfig> selectCoChargingConfigList(CoChargingConfig coChargingConfig);
+    List<CoChargingConfig> selectCoChargingConfigList(CoChargingConfig coChargingConfig);
 
     /**
      * 新增商户能源计费配置
-     * 
+     *
      * @param coChargingConfig 商户能源计费配置
      * @return 结果
      */
-     int insertCoChargingConfig(CoChargingConfig coChargingConfig);
+    int insertCoChargingConfig(CoChargingConfig coChargingConfig);
 
     /**
      * 修改商户能源计费配置
-     * 
+     *
      * @param coChargingConfig 商户能源计费配置
      * @return 结果
      */
-     int updateCoChargingConfig(CoChargingConfig coChargingConfig);
+    int updateCoChargingConfig(CoChargingConfig coChargingConfig);
 
     /**
      * 删除商户能源计费配置
-     * 
+     *
      * @param id 商户能源计费配置主键
      * @return 结果
      */
-     int deleteCoChargingConfigById(Long id);
+    int deleteCoChargingConfigById(Long id);
 
     /**
      * 批量删除商户能源计费配置
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */
-     int deleteCoChargingConfigByIds(Long[] ids);
+    int deleteCoChargingConfigByIds(Long[] ids);
 }

+ 21 - 13
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/MeterReadingMapper.java

@@ -7,57 +7,65 @@ import com.ruoyi.ems.domain.vo.QueryMeterReading;
 import org.apache.ibatis.annotations.Param;
 
 /**
- * 手动抄记录Mapper接口
+ * 抄记录Mapper接口
  *
  * @author ruoyi
  * @date 2024-08-28
  */
 public interface MeterReadingMapper {
     /**
-     * 查询手动抄记录列表
+     * 查询抄记录列表
      *
      * @param id   区域编码
-     * @return 手动抄记录集合
+     * @return 抄记录集合
      */
     MeterReading selectById(@Param("id") Long id);
 
     /**
-     * 查询手动抄记录列表
+     * 查询抄记录列表
      *
      * @param areaCode   区域编码
      * @param deviceCode 设备编码
-     * @return 手动抄记录集合
+     * @return 抄记录集合
      */
     MeterReading selectLastItem(@Param("areaCode") String areaCode, @Param("deviceCode") String deviceCode);
 
     /**
-     * 查询手动抄记录列表
+     * 查询抄记录列表
      *
      * @param queryMeterReading 参数
-     * @return 手动抄记录集合
+     * @return 抄记录集合
      */
     List<MeterReading> selectList(QueryMeterReading queryMeterReading);
 
     /**
-     * 新增手动抄记录
+     * 查询抄记录列表
      *
-     * @param meterReadingManual 手动抄记录
+     * @param queryMeterReading 参数
+     * @return 抄记录集合
+     */
+    List<MeterReading> selectByTag(QueryMeterReading queryMeterReading);
+
+    /**
+     * 新增抄记录
+     *
+     * @param meterReadingManual 抄记录
      * @return 结果
      */
     int insert(MeterReading meterReadingManual);
 
     /**
-     * 修改手动抄记录
+     * 修改抄记录
      *
-     * @param meterReadingManual 手动抄记录
+     * @param meterReadingManual 抄记录
      * @return 结果
      */
     int update(MeterReading meterReadingManual);
 
     /**
-     * 删除手动抄记录
+     * 删除抄记录
      *
-     * @param id 手动抄记录主键
+     * @param id 抄记录主键
      * @return 结果
      */
     int deleteById(Long id);

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

@@ -26,9 +26,9 @@ import java.util.List;
  */
 public interface IChargingBillService {
     /**
-     * 查询计费账单列表
+     * 查询商户计费账单列表
      * @param queryParam 查询参数
      * @return 返回列表
      */
-    List<ChargingBill> selectChargingBillList(QueryChargingBill queryParam);
+    List<ChargingBill> selectCoChargingBill(QueryChargingBill queryParam);
 }

+ 22 - 15
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/ICoChargingConfigService.java

@@ -6,57 +6,64 @@ import java.util.List;
 
 /**
  * 商户能源计费配置Service接口
- * 
+ *
  * @author ruoyi
  * @date 2024-08-26
  */
-public interface ICoChargingConfigService
-{
+public interface ICoChargingConfigService {
     /**
      * 查询商户能源计费配置
-     * 
+     *
      * @param id 商户能源计费配置主键
      * @return 商户能源计费配置
      */
-     CoChargingConfig selectCoChargingConfigById(Long id);
+    CoChargingConfig selectCoChargingConfigById(Long id);
+
+    /**
+     * 查询商户能源计费配置
+     *
+     * @param areaCode 服务区编号
+     * @return 商户能源计费配置
+     */
+    CoChargingConfig selectByArea(String areaCode);
 
     /**
      * 查询商户能源计费配置列表
-     * 
+     *
      * @param coChargingConfig 商户能源计费配置
      * @return 商户能源计费配置集合
      */
-     List<CoChargingConfig> selectCoChargingConfigList(CoChargingConfig coChargingConfig);
+    List<CoChargingConfig> selectCoChargingConfigList(CoChargingConfig coChargingConfig);
 
     /**
      * 新增商户能源计费配置
-     * 
+     *
      * @param coChargingConfig 商户能源计费配置
      * @return 结果
      */
-     int insertCoChargingConfig(CoChargingConfig coChargingConfig);
+    int insertCoChargingConfig(CoChargingConfig coChargingConfig);
 
     /**
      * 修改商户能源计费配置
-     * 
+     *
      * @param coChargingConfig 商户能源计费配置
      * @return 结果
      */
-     int updateCoChargingConfig(CoChargingConfig coChargingConfig);
+    int updateCoChargingConfig(CoChargingConfig coChargingConfig);
 
     /**
      * 批量删除商户能源计费配置
-     * 
+     *
      * @param ids 需要删除的商户能源计费配置主键集合
      * @return 结果
      */
-     int deleteCoChargingConfigByIds(Long[] ids);
+    int deleteCoChargingConfigByIds(Long[] ids);
 
     /**
      * 删除商户能源计费配置信息
-     * 
+     *
      * @param id 商户能源计费配置主键
      * @return 结果
      */
-     int deleteCoChargingConfigById(Long id);
+    int deleteCoChargingConfigById(Long id);
 }

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

@@ -10,22 +10,34 @@
  */
 package com.ruoyi.ems.service.impl;
 
+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.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.IChargingBillService;
-import com.ruoyi.ems.util.exception.BusinessException;
+import com.ruoyi.ems.service.ICoChargingConfigService;
 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.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 账单服务接口
@@ -45,47 +57,215 @@ public class ChargingBillServiceImpl implements IChargingBillService {
     @Autowired
     private MeterDeviceMapper meterDeviceMapper;
 
+    @Autowired
+    private AreaBuildingZoningMapper areaBuildingZoningMapper;
+
+    @Autowired
+    private ICoChargingConfigService coChargingConfigService;
+
+    /**
+     * 查询商户计费账单列表
+     *
+     * @param queryParam 查询参数
+     * @return 返回列表
+     */
     @Override
-    public List<ChargingBill> selectChargingBillList(QueryChargingBill queryParam) {
+    public List<ChargingBill> selectCoChargingBill(QueryChargingBill queryParam) {
         List<ChargingBill> retList = new ArrayList<>();
 
-        try {
-            // 查询计量设备
-            int objType = MeterObjType.METER_ABZ.getType();
-            int objSubType = MeterObjSubType.getByTier(queryParam.getTier()).getType();
-            MeterDevice meterDevice = meterDeviceMapper.selectMeterDeviceByObj(objType, objSubType,
-                queryParam.getAreaCode(), queryParam.getMeterCls());
-
-            if (null != meterDevice) {
-                QueryMeterReading recParam = new QueryMeterReading();
-                recParam.setAreaCode(meterDevice.getAreaCode());
-                recParam.setDeviceCode(meterDevice.getDeviceCode());
-                recParam.setStartMonth(queryParam.getStartTime());
-                recParam.setEndMonth(queryParam.getEndTime());
-
-                List<MeterReading> recList = meterReadingMapper.selectList(recParam);
-                retList = convertToChargingBill(recList);
-            }
-        }
-        catch (BusinessException e) {
-            throw e;
-        }
-        catch (Exception e) {
-            throw new BusinessException(-1, "查询账单失败", e);
+        // 查询计量设备
+        int objType = MeterObjType.METER_ABZ.getType();
+        int objSubType = MeterObjSubType.getByTier(queryParam.getTier()).getType();
+        MeterDevice meterDevice = meterDeviceMapper.selectMeterDeviceByObj(objType, objSubType,
+            queryParam.getAreaCode(), queryParam.getMeterCls());
+
+        if (null != meterDevice) {
+            QueryMeterReading recParam = new QueryMeterReading();
+            recParam.setAreaCode(meterDevice.getAreaCode());
+            recParam.setDeviceCode(meterDevice.getDeviceCode());
+            recParam.setStartMonth(queryParam.getStartTime());
+            recParam.setEndMonth(queryParam.getEndTime());
+
+            List<MeterReading> recList = meterReadingMapper.selectList(recParam);
+            retList = convertToChargingBill(meterDevice, queryParam, recList);
         }
 
         return retList;
     }
 
-    private List<ChargingBill> convertToChargingBill(List<MeterReading> recList) {
+    private List<ChargingBill> convertToChargingBill(MeterDevice meterDevice, QueryChargingBill queryParam,
+        List<MeterReading> recList) {
         List<ChargingBill> retList = new ArrayList<>();
 
+        // 查询园区内部计费配置
+        CoChargingConfig chargingCfg = coChargingConfigService.selectByArea(meterDevice.getAreaCode());
+
+        // 参与公摊的分区ID
+        Set<String> coSet = getCoSet(chargingCfg);
+
         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) {
+                    bill.setMeteredPrice(calcPrice(rec.getIncrease(), chargingCfg.getElecUnitPrice()));
+                    bill.setSharedComputeType(chargingCfg.getElecGtComputeType());
+                    clacElecSharedPrice(bill, meterDevice, chargingCfg, queryParam, coSet);
+                }
+                else if (meterDevice.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;
+
+        if (null != chargingCfg) {
+            coSet = chargingCfg.getRelCoList().stream().map(CoChargingConfigRel::getZoningCode)
+                .collect(Collectors.toSet());
+        }
+        else {
+            coSet = new HashSet<>();
+        }
+
+        return coSet;
+    }
+
+    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 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);
+        }
+    }
+
+    /**
+     * 计算公摊价
+     *
+     * @return
+     */
+    private Double clacSharedPrice(List<MeterReading> sharedReadings, Set<String> coSet, String objCode,
+        int gtComputeType, Double unitPrice) {
+        double sharedPrice = 0.0;
+
+        // 公摊用量
+        Long sharedQuantity = sumSharedReadings(sharedReadings);
+
+        // 公摊总价
+        Double sharedPriceSum = calcPrice(sharedQuantity, unitPrice);
+
+        // 按户数公摊
+        if (gtComputeType == 1) {
+            sharedPrice = sharedPriceByCount(sharedPriceSum, coSet.size());
+        }
+        // 按面积公摊
+        else if (gtComputeType == 2) {
+            sharedPrice = sharedPriceByArea(sharedPriceSum, objCode, coSet);
+        }
+
+        return sharedPrice;
+    }
+
+    private Double sharedPriceByCount(Double price, int count) {
+        BigDecimal bd1 = new BigDecimal(price.toString());
+        BigDecimal bd2 = new BigDecimal(String.valueOf(count));
+        BigDecimal res = bd1.divide(bd2, 3, RoundingMode.HALF_UP);
+        return res.doubleValue();
+    }
+
+    private double sharedPriceByArea(Double sharedPriceSum, String objCode, Set<String> coSet) {
+        List<AreaBuildingZoning> zonings = areaBuildingZoningMapper.selectByCodes(coSet);
+        Map<String, AreaBuildingZoning> map = zonings.stream()
+            .collect(Collectors.toMap(AreaBuildingZoning::getZoningCode, Function.identity()));
+        AreaBuildingZoning zoning = map.get(objCode);
+
+        Long areas = sumSharedAreas(zonings);
+
+        BigDecimal bd1 = new BigDecimal(sharedPriceSum.toString());
+
+        BigDecimal bd2 = new BigDecimal(areas.toString());
+        BigDecimal bd3 = new BigDecimal(zoning.getBldgLdArea().toString());
+
+        // 计算当前区块面积占总建筑面积的比例
+        BigDecimal bl = bd3.divide(bd2, 3, RoundingMode.HALF_UP);
+        BigDecimal res = bd1.multiply(bl);
+        return res.doubleValue();
+    }
+
+    private Long sumSharedReadings(List<MeterReading> sharedReadings) {
+        long sum = 0;
+        for (MeterReading rec : sharedReadings) {
+            sum += rec.getIncrease();
+        }
+        return sum;
+    }
+
+    private Long sumSharedAreas(List<AreaBuildingZoning> zonings) {
+        long sum = 0;
+        for (AreaBuildingZoning zo : zonings) {
+            sum += zo.getBldgLdArea();
+        }
+        return sum;
+    }
+
+    /**
+     * 计算用量总价
+     *
+     * @param dosage    用量
+     * @param unitPrice 价格配置
+     * @return 返回总价
+     */
+    private Double calcPrice(Long dosage, Double unitPrice) {
+        BigDecimal bd1 = new BigDecimal(dosage.toString());
+        BigDecimal bd2 = new BigDecimal(unitPrice.toString());
+        BigDecimal res = bd1.multiply(bd2);
+        return res.setScale(3, RoundingMode.HALF_UP).doubleValue();
+    }
+
+    private Double clacTotalPrice(ChargingBill bill) {
+        BigDecimal bd1 = new BigDecimal(bill.getMeteredPrice().toString());
+
+        if (null != bill.getSharedPrice()) {
+            BigDecimal bd2 = new BigDecimal(bill.getSharedPrice().toString());
+            bd1 = bd1.add(bd2);
+        }
+
+        return bd1.setScale(3, RoundingMode.HALF_UP).doubleValue();
+    }
 }

+ 13 - 1
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/CoChargingConfigServiceImpl.java

@@ -41,6 +41,17 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
         return config;
     }
 
+    @Override
+    public CoChargingConfig selectByArea(String areaCode) {
+        CoChargingConfig config = coChargingConfigMapper.selectByArea(areaCode);
+
+        if (null != config) {
+            config.setRelCoList(relService.selectRelList(config.getId()));
+        }
+
+        return config;
+    }
+
     /**
      * 查询商户能源计费配置列表
      *
@@ -86,7 +97,8 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
         if (CollectionUtils.isNotEmpty(coChargingConfig.getRelCoList())) {
             relService.deleteRel(coChargingConfig.getId());
             relService.insertRelBatch(coChargingConfig.getRelCoList());
-        } else {
+        }
+        else {
             relService.deleteRel(coChargingConfig.getId());
         }
 

+ 17 - 1
ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/AreaBuildingZoningMapper.xml

@@ -64,7 +64,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectAreaBuildingZoningVo"/>
         where z.`zoning_code` = #{code}
     </select>
-        
+
+    <select id="selectByCodes"  resultMap="AreaBuildingZoningResult">
+        select
+            z.`id`,
+            z.`bldg_code`,
+            z.`zoning_code`,
+            z.`zoning_name`,
+            z.`floor`,
+            z.`bldg_ld_area`,
+            z.`usage_detail`
+        from adm_area_building_zoning z
+        where z.`zoning_code` = in
+        <foreach item="code" collection="codes" open="(" separator="," close=")">
+            #{code}
+        </foreach>
+    </select>
+
     <insert id="insertAreaBuildingZoning" parameterType="com.ruoyi.ems.domain.AreaBuildingZoning" useGeneratedKeys="true" keyProperty="id">
         insert into adm_area_building_zoning
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 7 - 2
ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/CoChargingConfigMapper.xml

@@ -33,9 +33,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     
     <select id="selectCoChargingConfigById" parameterType="Long" resultMap="CoChargingConfigResult">
         <include refid="selectCoChargingConfigVo"/>
-        where a.id = #{id}
+
     </select>
-        
+
+    <select id="selectByArea" parameterType="java.lang.String" resultMap="CoChargingConfigResult">
+        <include refid="selectCoChargingConfigVo"/>
+        where a.area_code = #{areaCode}
+    </select>
+
     <insert id="insertCoChargingConfig" parameterType="com.ruoyi.ems.domain.CoChargingConfig" useGeneratedKeys="true" keyProperty="id">
         insert into adm_co_charging_config
         <trim prefix="(" suffix=")" suffixOverrides=",">

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

@@ -41,13 +41,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <where>  
             <if test="deviceCode != null  and deviceCode != ''"> and device_code = #{deviceCode}</if>
             <if test="areaCode != null  and areaCode != ''"> and area_code = #{areaCode}</if>
-            <if test="year != null  and year != ''"> and year = #{year}</if>
+            <if test="year != null  and year != ''"> and `year` = #{year}</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>
         ORDER BY meter_month ${orderFlag}
     </select>
 
+    <select id="selectByTag" parameterType="com.ruoyi.ems.domain.vo.QueryMeterReading" resultMap="MeterReadingManualResult">
+        select
+            r.id, r.device_code, r.area_code, r.`year`, r.meter_month, r.last_reading, r.last_time, r.meter_reading, r.meter_time, r.increase, r.create_time, r.update_time
+        from adm_meter_reading r
+        left join
+            adm_meter_device d on r.device_code = d.device_code
+        <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>
+    </select>
+
     <insert id="insert" parameterType="com.ruoyi.ems.domain.MeterReading" useGeneratedKeys="true" keyProperty="id">
         insert into adm_meter_reading
         <trim prefix="(" suffix=")" suffixOverrides=",">

+ 19 - 3
ems-cloud/sql/ems_init_data.sql

@@ -236,7 +236,8 @@ INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_ty
 INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-108', '321283124S3001', 45, 1, 3, 'B-108', 1, 4, 1, 1, '直采表');
 INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-109', '321283124S3001', 45, 1, 3, 'B-109', 1, 4, 1, 1, '直采表');
 INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-110', '321283124S3001', 45, 1, 3, 'B-110', 1, 4, 1, 1, '直采表');
-INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-Z120', '321283124S3001', 45, 2, 1, 'Z120', 0, 4, 1, 20, '互感器表');
+INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-Z101', '321283124S3001', 45, 2, 1, 'Z101', 0, 4, 1, 1, '直采表');
+INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-Z120', '321283124S3001', 45, 2, 1, 'Z120', 0, 4, 1, 50, '互感器表');
 
 -- 水表
 INSERT INTO `adm_meter_device` (`device_code`, `area_code`, `meter_cls`, `obj_type`, `obj_sub_type`, `obj_code`, `obj_tag`, `col_cycle`, `col_mode`, `magnification`, `spec_desc`) VALUES ('J-D-B-01', '321283124S3001', 70, 1, 2, '321283124S300101', 0, 4, 1, 1, '直采表');
@@ -324,6 +325,21 @@ INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`
 INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-110', '321283124S3001', '2024', '202407', 600, '2024-06-30', 700, '2024-07-31', 100, NULL, NULL);
 INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-110', '321283124S3001', '2024', '202408', 700, '2024-07-31', 800, '2024-08-31', 100, NULL, NULL);
 
-
-
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202401', 0, '2024-02-29', 1000, '2024-01-31', 100, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202402', 1000, '2024-02-29', 2120, '2024-02-28', 1120, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202403', 2120, '2024-02-29', 3345, '2024-03-31', 1225, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202404', 3345, '2024-03-31', 4478, '2024-04-30', 1133, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202405', 4478, '2024-04-30', 5521, '2024-05-31', 1043, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202406', 5521, '2024-05-31', 6793, '2024-06-30', 1272, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202407', 6793, '2024-06-30', 7886, '2024-07-31', 1093, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z101', '321283124S3001', '2024', '202408', 7886, '2024-07-31', 8947, '2024-08-31', 1061, NULL, NULL);
+
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202401', 0, '2024-02-29', 25, '2024-01-31', 1250, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202402', 25, '2024-02-29', 73, '2024-02-28', 2400, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202403', 73, '2024-02-29', 133, '2024-03-31', 3000, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202404', 133, '2024-03-31', 187, '2024-04-30', 2700, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202405', 187, '2024-04-30', 242, '2024-05-31', 2750, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202406', 242, '2024-05-31', 293, '2024-06-30', 2550, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202407', 293, '2024-06-30', 387, '2024-07-31', 4700, NULL, NULL);
+INSERT INTO adm_meter_reading (`device_code`, `area_code`, `year`, `meter_month`, `last_reading`, `last_time`, `meter_reading`, `meter_time`, `increase`, `create_time`, `update_time`) VALUES ('J-D-B-Z120', '321283124S3001', '2024', '202408', 387, '2024-07-31', 465, '2024-08-31', 3900, NULL, NULL);
 

+ 2 - 2
ems-cloud/sql/ems_server.sql

@@ -835,8 +835,8 @@ create table adm_meter_reading (
   `meter_reading`    int             not null                     comment '抄表值',
   `meter_time`       date            not null                     comment '本次抄表日期',
   `increase`         int             not null                     comment '增量',
-  `create_time`      datetime        default null                 comment '创建时间',
-  `update_time`      datetime        default null                 comment '更新时间',
+  `create_time`      datetime        default CURRENT_TIMESTAMP    comment '创建时间',
+  `update_time`      datetime        default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '更新时间',
   primary key (`id`),
   key meter_reading_manual(`device_code`)
 ) engine=innodb auto_increment=1 comment = '抄表记录表';