瀏覽代碼

标签管理+商户计费调整

learshaw 3 天之前
父節點
當前提交
70f25ee334
共有 38 個文件被更改,包括 1264 次插入1313 次删除
  1. 39 7
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/AreaController.java
  2. 73 49
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ChargingBillController.java
  3. 20 14
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/CoChargingConfigController.java
  4. 0 108
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EmsTagController.java
  5. 6 3
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/MeterDeviceController.java
  6. 105 0
      ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ObjTagController.java
  7. 7 138
      ems/ems-core/src/main/java/com/ruoyi/ems/domain/AreaAttr.java
  8. 0 160
      ems/ems-core/src/main/java/com/ruoyi/ems/domain/ChargingBill.java
  9. 0 14
      ems/ems-core/src/main/java/com/ruoyi/ems/domain/CoChargingConfig.java
  10. 0 45
      ems/ems-core/src/main/java/com/ruoyi/ems/domain/CoChargingConfigRel.java
  11. 7 0
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/AreaMapper.java
  12. 0 37
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/CoChargingConfigRelMapper.java
  13. 5 3
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/MeterDeviceMapper.java
  14. 7 0
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/MeterReadingMapper.java
  15. 14 16
      ems/ems-core/src/main/java/com/ruoyi/ems/mapper/ObjTagRelMapper.java
  16. 128 0
      ems/ems-core/src/main/java/com/ruoyi/ems/model/ChargingBillVO.java
  17. 52 57
      ems/ems-core/src/main/java/com/ruoyi/ems/model/QueryChargingBill.java
  18. 7 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IAreaService.java
  19. 27 23
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IChargingBillService.java
  20. 0 37
      ems/ems-core/src/main/java/com/ruoyi/ems/service/ICoChargingConfigRelService.java
  21. 13 6
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IMeterDeviceService.java
  22. 16 18
      ems/ems-core/src/main/java/com/ruoyi/ems/service/IObjTagRelService.java
  23. 4 9
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/AreaAttrServiceImpl.java
  24. 6 0
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/AreaServiceImpl.java
  25. 576 337
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ChargingBillServiceImpl.java
  26. 0 50
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/CoChargingConfigRelServiceImpl.java
  27. 3 44
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/CoChargingConfigServiceImpl.java
  28. 0 17
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmsTagServiceImpl.java
  29. 18 11
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/MeterDeviceServiceImpl.java
  30. 10 10
      ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ObjTagRelServiceImpl.java
  31. 8 0
      ems/ems-core/src/main/resources/mapper/ems/AreaMapper.xml
  32. 0 32
      ems/ems-core/src/main/resources/mapper/ems/CoChargingConfigRelMapper.xml
  33. 44 7
      ems/ems-core/src/main/resources/mapper/ems/MeterDeviceMapper.xml
  34. 20 2
      ems/ems-core/src/main/resources/mapper/ems/MeterReadingMapper.xml
  35. 14 14
      ems/ems-core/src/main/resources/mapper/ems/ObjTagRelMapper.xml
  36. 31 29
      ems/sql/ems_init_data.sql
  37. 3 14
      ems/sql/ems_server.sql
  38. 1 2
      ems/sql/ems_sys_data.sql

+ 39 - 7
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/AreaController.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.ems.domain.Area;
 import com.ruoyi.ems.domain.EmsFacs;
+import com.ruoyi.ems.domain.MeterDevice;
 import com.ruoyi.ems.domain.ObjTagRel;
 import com.ruoyi.ems.enums.BusObjType;
 import com.ruoyi.ems.model.TreeEntity;
@@ -15,6 +16,7 @@ import com.ruoyi.ems.service.IEmsFacsService;
 import com.ruoyi.ems.service.IObjTagRelService;
 import com.ruoyi.ems.util.AreaUtils;
 import io.swagger.annotations.Api;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -26,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -53,7 +56,7 @@ public class AreaController extends BaseController {
     /**
      * 查询区域对象列表
      */
-    //@RequiresPermissions("ems:area:list")
+    @RequiresPermissions("ems:area:list")
     @GetMapping("/list")
     public AjaxResult list(Area area) {
         List<Area> list = areaService.selectArea(area);
@@ -84,14 +87,14 @@ public class AreaController extends BaseController {
 
         // 查询列表
         List<ObjTagRel> tagRels = objTagRelService.selectListByTagCode(BusObjType.AREA.getValue(), tagCode);
-        Set<String> facsAreaCodes = tagRels.stream().map(ObjTagRel::getObjCode).collect(Collectors.toSet());
+        Set<String> tagAreaCodes = tagRels.stream().map(ObjTagRel::getObjCode).collect(Collectors.toSet());
 
         // 过滤树节点
         List<Area> areaTargets = AreaUtils.compressTree(areaTree);
 
         Iterator<Area> it = areaTargets.iterator();
         while (it.hasNext()) {
-            if (!facsAreaCodes.contains(it.next().getAreaCode())) {
+            if (!tagAreaCodes.contains(it.next().getAreaCode())) {
                 it.remove();
             }
         }
@@ -167,12 +170,12 @@ public class AreaController extends BaseController {
         List<Area> areaTree = areaService.selectAreaTree(parentCode, recursion);
 
         // 查询列表
-        List<ObjTagRel> tagRels = objTagRelService.selectListByTagCode(BusObjType.AREA.getValue(), tagCode);
-        Set<String> facsAreaCodes = tagRels.stream().map(ObjTagRel::getObjCode).collect(Collectors.toSet());
+        List<Area> list = areaService.selectAreaByTag(tagCode);
+        Set<String> tagAreaCodes = list.stream().map(Area::getAreaCode).collect(Collectors.toSet());
 
         // 过滤树节点
-        areaTree = AreaUtils.filterTree(areaTree, facsAreaCodes);
-        List<TreeEntity> retList = AreaUtils.convertAreaTree(areaTree);
+        areaTree = AreaUtils.filterTree(areaTree, tagAreaCodes);
+        List<TreeEntity> retList = convertAreaTreeHelper(areaTree, tagAreaCodes, 1, Integer.MAX_VALUE);
 
         return success(retList);
     }
@@ -222,4 +225,33 @@ public class AreaController extends BaseController {
         return toAjax(areaService.deleteAreaByIds(ids));
     }
 
+    private static List<TreeEntity> convertAreaTreeHelper(List<?> areas, Set<String> tagAreaCodes, int currentLevel,
+        int maxLevel) {
+        List<TreeEntity> retList = new ArrayList<>();
+
+        if (CollectionUtils.isEmpty(areas)) {
+            return retList;
+        }
+
+        for (Object obj : areas) {
+            Area area = (Area) obj;
+            TreeEntity tree = new TreeEntity();
+            tree.setId(area.getAreaCode());
+            tree.setLabel(area.getAreaName());
+
+            if (tagAreaCodes.contains(area.getAreaCode())) {
+                tree.setType("seller");
+            } else {
+                tree.setType("area");
+            }
+
+            // 当当前层级小于最大层级时,递归处理子节点
+            if (currentLevel < maxLevel && CollectionUtils.isNotEmpty(area.getChildren())) {
+                tree.setChildren(convertAreaTreeHelper(area.getChildren(), tagAreaCodes, currentLevel + 1, maxLevel));
+            }
+
+            retList.add(tree);
+        }
+        return retList;
+    }
 }

+ 73 - 49
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ChargingBillController.java

@@ -1,91 +1,115 @@
-/*
- * 文 件 名:  CoBillController
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  lvwenbin
- * 修改时间:  2024/8/30
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
+// com/ruoyi/ems/controller/ChargingBillController.java
 package com.ruoyi.ems.controller;
 
-/**
- * 商户账单接口
- * <功能详细描述>
- *
- * @author lvwenbin
- * @version [版本号, 2024/8/30]
- * @see [相关类/方法]
- * @since [产品/模块版本]
- */
-
 import com.huashe.common.domain.AjaxResult;
-import com.huashe.common.exception.BusinessException;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.ems.domain.ChargingBill;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.ems.model.ChargingBillVO;
 import com.ruoyi.ems.model.QueryChargingBill;
 import com.ruoyi.ems.service.IChargingBillService;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
- * 商户能源账单配置Controller
+ * 商户能源账单Controller
  *
  * @author ruoyi
- * @date 2024-08-26
+ * @date 2024-12-20
  */
 @RestController
-@RequestMapping("/charging/bill/")
+@RequestMapping("/charging/bill")
 @Api(value = "ChargingBillController", description = "计费账单服务")
 public class ChargingBillController extends BaseController {
+
     @Autowired
     private IChargingBillService chargingBillService;
 
     /**
-     * 查询账单
-     *
-     * @param queryParam 查询参数
-     * @return 计费
+     * 查询总览数据
      */
-    @GetMapping(value = "/co")
-    public AjaxResult getCoBill(QueryChargingBill queryParam) {
+    //@RequiresPermissions("ems:charging:list")
+    @GetMapping("/overview")
+    @ApiOperation("查询总览数据")
+    public AjaxResult getOverview(QueryChargingBill queryParam) {
         try {
-            List<ChargingBill> list = chargingBillService.selectCoChargingBill(queryParam);
-            return success(list);
-        }
-        catch (BusinessException e) {
-            return error(e.getMessage());
+            ChargingBillVO bill = chargingBillService.selectOverviewTotal(queryParam);
+            return success(bill);
         }
         catch (Exception e) {
-            logger.error("系统异常", e);
-            return error("系统异常");
+            logger.error("查询总览数据异常", e);
+            return error("系统异常: " + e.getMessage());
         }
     }
 
     /**
-     * 商户计费
-     *
-     * @param queryParam 查询参数
-     * @return 计费
+     * 查询总览数据
      */
-    @GetMapping(value = "/getByTag")
-    public AjaxResult getByTag(QueryChargingBill queryParam) {
+    //@RequiresPermissions("ems:charging:list")
+    @GetMapping("/overview/list")
+    @ApiOperation("查询总览数据")
+    public AjaxResult getOverviewList(QueryChargingBill queryParam) {
         try {
-            List<ChargingBill> list = chargingBillService.selectTagChargingBill(queryParam);
+            List<ChargingBillVO> list = chargingBillService.selectOverviewList(queryParam);
             return success(list);
         }
-        catch (BusinessException e) {
-            return error(e.getMessage());
+        catch (Exception e) {
+            logger.error("查询总览数据异常", e);
+            return error("系统异常: " + e.getMessage());
+        }
+    }
+
+    /**
+     * 查询个户综合账单
+     */
+    //@RequiresPermissions("ems:charging:list")
+    @GetMapping("/seller")
+    @ApiOperation("查询商户用能账单")
+    public AjaxResult getIndividualBill(QueryChargingBill queryParam) {
+        try {
+            ChargingBillVO bill = chargingBillService.selectSellerEmsBill(queryParam);
+            return success(bill);
         }
         catch (Exception e) {
-            logger.error("系统异常", e);
-            return error("系统异常");
+            logger.error("查询个户账单异常", e);
+            return error("系统异常: " + e.getMessage());
         }
     }
+
+    /**
+     * 查询历史账单列表
+     */
+    //@RequiresPermissions("ems:charging:list")
+    @GetMapping("/seller/history")
+    @ApiOperation("查询历史账单列表")
+    public TableDataInfo getSellerHistoryBills(QueryChargingBill queryParam) {
+        startPage();
+        List<ChargingBillVO> list = chargingBillService.selectSellerHistoryBills(queryParam);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出账单
+     */
+    @RequiresPermissions("ems:charging:export")
+    @Log(title = "计费账单", businessType = BusinessType.EXPORT)
+    @PostMapping("/seller/export")
+    @ApiOperation("导出账单")
+    public void exportSellerBill(HttpServletResponse response, QueryChargingBill queryParam) {
+        List<ChargingBillVO> list = chargingBillService.selectSellerHistoryBills(queryParam);
+        ExcelUtil<ChargingBillVO> util = new ExcelUtil<>(ChargingBillVO.class);
+        String fileName = String.format("计费账单_%s.xlsx", System.currentTimeMillis());
+        util.exportExcel(response, list, fileName);
+    }
 }

+ 20 - 14
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/CoChargingConfigController.java

@@ -17,21 +17,21 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 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
- * 
+ *
  * @author ruoyi
  * @date 2024-08-26
  */
 @RestController
 @RequestMapping("/basecfg/elecPrice/coCharging")
 @Api(value = "CoChargingConfigController", description = "商户能源计费配置")
-public class CoChargingConfigController extends BaseController
-{
+public class CoChargingConfigController extends BaseController {
     @Autowired
     private ICoChargingConfigService coChargingConfigService;
 
@@ -40,20 +40,29 @@ public class CoChargingConfigController extends BaseController
      */
     @RequiresPermissions("basecfg:price:list")
     @GetMapping("/list")
-    public TableDataInfo list(CoChargingConfig coChargingConfig)
-    {
+    public TableDataInfo list(CoChargingConfig coChargingConfig) {
         startPage();
         List<CoChargingConfig> list = coChargingConfigService.selectCoChargingConfigList(coChargingConfig);
         return getDataTable(list);
     }
 
     /**
+     * 根据区域查询商户能源计费配置
+     * @param areaCode areaCode
+     * @return
+     */
+    @GetMapping("/getByArea")
+    public AjaxResult getByArea(@RequestParam(name = "areaCode") String areaCode) {
+        CoChargingConfig config = coChargingConfigService.selectByArea(areaCode);
+        return success(config);
+    }
+
+    /**
      * 获取商户能源计费配置详细信息
      */
     @RequiresPermissions("basecfg:price:query")
     @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
         return success(coChargingConfigService.selectCoChargingConfigById(id));
     }
 
@@ -63,8 +72,7 @@ public class CoChargingConfigController extends BaseController
     @RequiresPermissions("basecfg:price:add")
     @Log(title = "商户能源计费配置", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody CoChargingConfig coChargingConfig)
-    {
+    public AjaxResult add(@RequestBody CoChargingConfig coChargingConfig) {
         return toAjax(coChargingConfigService.insertCoChargingConfig(coChargingConfig));
     }
 
@@ -74,8 +82,7 @@ public class CoChargingConfigController extends BaseController
     @RequiresPermissions("ems:config:edit")
     @Log(title = "商户能源计费配置", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody CoChargingConfig coChargingConfig)
-    {
+    public AjaxResult edit(@RequestBody CoChargingConfig coChargingConfig) {
         return toAjax(coChargingConfigService.updateCoChargingConfig(coChargingConfig));
     }
 
@@ -84,9 +91,8 @@ public class CoChargingConfigController extends BaseController
      */
     @RequiresPermissions("ems:config:remove")
     @Log(title = "商户能源计费配置", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(coChargingConfigService.deleteCoChargingConfigByIds(ids));
     }
 }

+ 0 - 108
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/EmsTagController.java

@@ -1,108 +0,0 @@
-package com.ruoyi.ems.controller;
-
-import com.huashe.common.domain.AjaxResult;
-import com.ruoyi.common.core.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.web.controller.BaseController;
-import com.ruoyi.common.core.web.page.TableDataInfo;
-import com.ruoyi.common.log.annotation.Log;
-import com.ruoyi.common.log.enums.BusinessType;
-import com.ruoyi.common.security.annotation.RequiresPermissions;
-import com.ruoyi.ems.domain.EmsTag;
-import com.ruoyi.ems.service.IEmsTagService;
-import io.swagger.annotations.Api;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 标签分类Controller
- * 
- * @author ruoyi
- * @date 2024-08-16
- */
-@RestController
-@RequestMapping("/tag")
-@Api(value = "EmsTagController", description = "标签管理管理")
-public class EmsTagController extends BaseController
-{
-    @Autowired
-    private IEmsTagService emsTagService;
-
-    /**
-     * 查询标签分类列表
-     */
-    @RequiresPermissions("ems:tag:list")
-    @GetMapping("/list")
-    public TableDataInfo list(EmsTag emsTag)
-    {
-        startPage();
-        List<EmsTag> list = emsTagService.selectEmsTagList(emsTag);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出标签分类列表
-     */
-    @RequiresPermissions("ems:tag:export")
-    @Log(title = "标签分类", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, EmsTag dimEmsTag)
-    {
-        List<EmsTag> list = emsTagService.selectEmsTagList(dimEmsTag);
-        ExcelUtil<EmsTag> util = new ExcelUtil<EmsTag>(EmsTag.class);
-        util.exportExcel(response, list, "标签分类数据");
-    }
-
-    /**
-     * 获取标签分类详细信息
-     */
-    @RequiresPermissions("ems:tag:query")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
-        return success(emsTagService.selectEmsTagById(id));
-    }
-
-    /**
-     * 新增标签分类
-     */
-    @RequiresPermissions("ems:tag:add")
-    @Log(title = "标签分类", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@RequestBody EmsTag dimEmsTag)
-    {
-        return toAjax(emsTagService.insertEmsTag(dimEmsTag));
-    }
-
-    /**
-     * 修改标签分类
-     */
-    @RequiresPermissions("ems:tag:edit")
-    @Log(title = "标签分类", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@RequestBody EmsTag dimEmsTag)
-    {
-
-        return toAjax(emsTagService.updateEmsTag(dimEmsTag));
-    }
-
-    /**
-     * 删除标签分类
-     */
-    @RequiresPermissions("ems:tag:remove")
-    @Log(title = "标签分类", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
-        return toAjax(emsTagService.deleteEmsTagByIds(ids));
-    }
-}

+ 6 - 3
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/MeterDeviceController.java

@@ -83,7 +83,8 @@ public class MeterDeviceController extends BaseController {
             startPage();
             List<MeterDevice> list = meterDeviceService.selectMeterDeviceList(queryDevice);
             tabInfo = getDataTable(list);
-        } catch (BusinessException e) {
+        }
+        catch (BusinessException e) {
             tabInfo = new TableDataInfo();
             tabInfo.setCode(e.getCode());
             tabInfo.setMsg(e.getMessage());
@@ -101,7 +102,7 @@ public class MeterDeviceController extends BaseController {
     @RequiresPermissions("basecfg:meterdevc:list")
     @GetMapping("/getTreeByArea")
     public AjaxResult getTreeByArea(
-            @RequestParam(name = "parentCode", required = false, defaultValue = "0") String parentCode,
+        @RequestParam(name = "parentCode", required = false, defaultValue = "0") String parentCode,
         QueryDevice queryParam) {
         List<TreeEntity> retList = new ArrayList<>();
 
@@ -126,7 +127,8 @@ public class MeterDeviceController extends BaseController {
 
     /**
      * 递归构建区域树节点,区分区域和设备类型
-     * @param area 当前区域节点
+     *
+     * @param area     当前区域节点
      * @param groupMap 设备按区域分组的映射
      * @return 当前区域对应的树形节点(若无可挂载内容则返回null)
      */
@@ -172,6 +174,7 @@ public class MeterDeviceController extends BaseController {
 
     /**
      * 将设备列表转换为TreeEntity列表(基础转换,不包含类型设置)
+     *
      * @param devices 设备列表
      * @return 转换后的TreeEntity列表
      */

+ 105 - 0
ems/ems-cloud/ems-server/src/main/java/com/ruoyi/ems/controller/ObjTagController.java

@@ -0,0 +1,105 @@
+/*
+ * 文 件 名:  ObjTagController
+ * 版    权:  华设设计集团股份有限公司
+ * 描    述:  <描述>
+ * 修 改 人:  lvwenbin
+ * 修改时间:  2025/9/3
+ * 跟踪单号:  <跟踪单号>
+ * 修改单号:  <修改单号>
+ * 修改内容:  <修改内容>
+ */
+package com.ruoyi.ems.controller;
+
+import com.huashe.common.domain.AjaxResult;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.ems.domain.ObjTagRel;
+import com.ruoyi.ems.service.IObjTagRelService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <一句话功能简述>
+ * <功能详细描述>
+ *
+ * @author lvwenbin
+ * @version [版本号, 2025/9/3]
+ * @see [相关类/方法]
+ * @since [产品/模块版本]
+ */
+@RestController
+@RequestMapping("/tag")
+@Api(value = "ObjTagController", description = "对象标签接口")
+public class ObjTagController extends BaseController {
+    @Resource
+    private IObjTagRelService objTagRelService;
+
+    /**
+     * 新增能源对象属性
+     */
+    @PostMapping(value = "/rel")
+    @ApiOperation(value = "saveObjTagRel", notes = "保存标签-对象关系")
+    public AjaxResult saveObjTagRel(ObjTagRel objTagRel) {
+        return toAjax(objTagRelService.save(objTagRel));
+    }
+
+    /**
+     * 删除能源对象属性
+     */
+    @DeleteMapping(value = "/rel")
+    @ApiOperation(value = "removeObjTagRel", notes = "保存标签-对象关系")
+    public AjaxResult removeObjTagRel(ObjTagRel objTagRel) {
+        return toAjax(objTagRelService.remove(objTagRel));
+    }
+
+    /**
+     * 查询对象&标签关系列表
+     *
+     * @param objType 标签类型
+     * @return 对象&标签关系集合
+     */
+    @GetMapping(value = "/rel/getByObjType")
+    @ApiOperation(value = "getRelByObjType", notes = "根据对象类型查询绑定关系")
+    public AjaxResult getRelByObjType(@RequestParam(name = "objType") Integer objType) {
+        List<ObjTagRel> list = objTagRelService.selectListByType(objType);
+        return success(list);
+    }
+
+    /**
+     * 查询对象&标签关系
+     *
+     * @param objType 标签类型
+     * @param tagCode 标签代码
+     * @return 结果
+     */
+    @GetMapping(value = "/rel/selectByTagCode")
+    @ApiOperation(value = "selectRelByTagCode", notes = "根据标签代码查询绑定关系")
+    public AjaxResult selectRelByTagCode(@RequestParam(name = "objType") Integer objType,
+        @RequestParam(name = "tagCode") String tagCode) {
+        List<ObjTagRel> list = objTagRelService.selectListByTagCode(objType, tagCode);
+        return success(list);
+    }
+
+    /**
+     * 查询对象&标签关系
+     *
+     * @param objType 标签类型
+     * @param objCode 标签代码
+     * @return 结果
+     */
+    @GetMapping(value = "/rel/selectByObjCode")
+    @ApiOperation(value = "selectRelByObjCode", notes = "根据对象代码查询绑定关系")
+    public AjaxResult selectRelByObjCode(@RequestParam(name = "objType") Integer objType,
+        @RequestParam(name = "objCode") String objCode) {
+        List<ObjTagRel> list = objTagRelService.selectListByObjCode(objType, objCode);
+        return success(list);
+    }
+}

+ 7 - 138
ems/ems-core/src/main/java/com/ruoyi/ems/domain/AreaAttr.java

@@ -1,6 +1,7 @@
 package com.ruoyi.ems.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -13,6 +14,7 @@ import java.util.List;
  * @author ruoyi
  * @date 2024-11-01
  */
+@Data
 public class AreaAttr
 {
     /** 序号 */
@@ -38,19 +40,19 @@ public class AreaAttr
     private Date openDate;
 
     /** 建筑面积(平方米 m²) */
-    private Long floorArea;
+    private Double floorArea;
 
     /** 使用面积(平方米 m²) */
-    private Long usableArea;
+    private Double usableArea;
 
     /** 楼层 */
-    private Long floor;
+    private Integer floor;
 
     /** 经度 */
-    private Long longitude;
+    private Double longitude;
 
     /** 纬度 */
-    private Long latitude;
+    private Double latitude;
 
     /**
      * 标签名称
@@ -67,139 +69,6 @@ public class AreaAttr
      */
     private List<String> tagCodeList;
 
-    public void setId(Long id) 
-    {
-        this.id = id;
-    }
-
-    public Long getId() 
-    {
-        return id;
-    }
-    public void setAreaCode(String areaCode) 
-    {
-        this.areaCode = areaCode;
-    }
-
-    public String getAreaCode() 
-    {
-        return areaCode;
-    }
-    public void setAttrOrg(String attrOrg) 
-    {
-        this.attrOrg = attrOrg;
-    }
-
-    public String getAttrOrg() 
-    {
-        return attrOrg;
-    }
-    public void setMgrOrg(String mgrOrg) 
-    {
-        this.mgrOrg = mgrOrg;
-    }
-
-    public String getMgrOrg() 
-    {
-        return mgrOrg;
-    }
-    public void setLeader(String leader) 
-    {
-        this.leader = leader;
-    }
-
-    public String getLeader() 
-    {
-        return leader;
-    }
-    public void setPhone(String phone) 
-    {
-        this.phone = phone;
-    }
-
-    public String getPhone() 
-    {
-        return phone;
-    }
-    public void setOpenDate(Date openDate) 
-    {
-        this.openDate = openDate;
-    }
-
-    public Date getOpenDate() 
-    {
-        return openDate;
-    }
-    public void setFloorArea(Long floorArea) 
-    {
-        this.floorArea = floorArea;
-    }
-
-    public Long getFloorArea() 
-    {
-        return floorArea;
-    }
-    public void setUsableArea(Long usableArea) 
-    {
-        this.usableArea = usableArea;
-    }
-
-    public Long getUsableArea() 
-    {
-        return usableArea;
-    }
-    public void setFloor(Long floor) 
-    {
-        this.floor = floor;
-    }
-
-    public Long getFloor() 
-    {
-        return floor;
-    }
-    public void setLongitude(Long longitude) 
-    {
-        this.longitude = longitude;
-    }
-
-    public Long getLongitude() 
-    {
-        return longitude;
-    }
-    public void setLatitude(Long latitude) 
-    {
-        this.latitude = latitude;
-    }
-
-    public Long getLatitude() 
-    {
-        return latitude;
-    }
-
-    public String getTagCodes() {
-        return tagCodes;
-    }
-
-    public void setTagCodes(String tagCodes) {
-        this.tagCodes = tagCodes;
-    }
-
-    public String getTagNames() {
-        return tagNames;
-    }
-
-    public void setTagNames(String tagNames) {
-        this.tagNames = tagNames;
-    }
-
-    public List<String> getTagCodeList() {
-        return tagCodeList;
-    }
-
-    public void setTagCodeList(List<String> tagCodeList) {
-        this.tagCodeList = tagCodeList;
-    }
-
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

+ 0 - 160
ems/ems-core/src/main/java/com/ruoyi/ems/domain/ChargingBill.java

@@ -1,160 +0,0 @@
-/*
- * 文 件 名:  ChargingBill
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  lvwenbin
- * 修改时间:  2024/9/2
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
-package com.ruoyi.ems.domain;
-
-/**
- * 账单
- * <功能详细描述>
- *
- * @author lvwenbin
- * @version [版本号, 2024/9/2]
- * @see [相关类/方法]
- * @since [产品/模块版本]
- */
-public class ChargingBill {
-    /**
-     * 账单主体代码
-     */
-    private String objCode;
-
-    /**
-     * 账单主体名称
-     */
-    private String objName;
-
-    /**
-     * 计量时间
-     */
-    private String meteredTime;
-
-    /**
-     * 计量值
-     */
-    private Double meteredValue;
-
-    /**
-     * 计量金额
-     */
-    private Double meteredPrice;
-
-    /**
-     * 公摊值
-     */
-    private Long sharedValue;
-
-    /**
-     * 公摊金额
-     */
-    private Double sharedPrice;
-
-    /**
-     * 公摊计算方式
-     */
-    private Integer sharedComputeType;
-
-    /**
-     * 总计用量
-     */
-    private Long totalValue;
-
-    /**
-     * 合计金额
-     */
-    private Double totalPrice;
-
-    public String getObjCode() {
-        return objCode;
-    }
-
-    public void setObjCode(String objCode) {
-        this.objCode = objCode;
-    }
-
-    public String getObjName() {
-        return objName;
-    }
-
-    public void setObjName(String objName) {
-        this.objName = objName;
-    }
-
-    public String getMeteredTime() {
-        return meteredTime;
-    }
-
-    public void setMeteredTime(String meteredTime) {
-        this.meteredTime = meteredTime;
-    }
-
-    public Double getMeteredValue() {
-        return meteredValue;
-    }
-
-    public void setMeteredValue(Double meteredValue) {
-        this.meteredValue = meteredValue;
-    }
-
-    public Double getMeteredPrice() {
-        return meteredPrice;
-    }
-
-    public void setMeteredPrice(Double meteredPrice) {
-        this.meteredPrice = meteredPrice;
-    }
-
-    public Long getSharedValue() {
-        return sharedValue;
-    }
-
-    public void setSharedValue(Long sharedValue) {
-        this.sharedValue = sharedValue;
-    }
-
-    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 Long getTotalValue() {
-        return totalValue;
-    }
-
-    public void setTotalValue(Long totalValue) {
-        this.totalValue = totalValue;
-    }
-
-    public Double getTotalPrice() {
-        return totalPrice;
-    }
-
-    public void setTotalPrice(Double totalPrice) {
-        this.totalPrice = totalPrice;
-    }
-
-    @Override
-    public String toString() {
-        return "ChargingBill{" + "objCode='" + objCode + '\'' + ", objName='" + objName + '\'' + ", meteredTime='"
-            + meteredTime + '\'' + ", meteredValue=" + meteredValue + ", meteredPrice=" + meteredPrice
-            + ", sharedValue=" + sharedValue + ", sharedPrice=" + sharedPrice + ", sharedComputeType="
-            + sharedComputeType + ", totalValue='" + totalValue + '\'' + ", totalPrice=" + totalPrice + '}';
-    }
-}

+ 0 - 14
ems/ems-core/src/main/java/com/ruoyi/ems/domain/CoChargingConfig.java

@@ -1,13 +1,10 @@
 package com.ruoyi.ems.domain;
 
-import com.alibaba.fastjson2.JSONObject;
 import com.huashe.common.annotation.Excel;
 import com.huashe.common.domain.BaseEntity;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
-import java.util.List;
-
 /**
  * 商户能源计费配置对象 adm_co_charging_config
  * 
@@ -55,8 +52,6 @@ public class CoChargingConfig extends BaseEntity
     @Excel(name = "水费计算说明")
     private String waterComputeDesc;
 
-    private List<CoChargingConfigRel> relCoList;
-
     public Long getId() {
         return id;
     }
@@ -137,14 +132,6 @@ public class CoChargingConfig extends BaseEntity
         this.waterComputeDesc = waterComputeDesc;
     }
 
-    public List<CoChargingConfigRel> getRelCoList() {
-        return relCoList;
-    }
-
-    public void setRelCoList(List<CoChargingConfigRel> relCoList) {
-        this.relCoList = relCoList;
-    }
-
     @Override
     public String toString() {
         return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@@ -157,7 +144,6 @@ public class CoChargingConfig extends BaseEntity
             .append("waterUnitPrice", getWaterUnitPrice())
             .append("waterGtComputeType", getWaterGtComputeType())
             .append("waterComputeDesc", getWaterComputeDesc())
-            .append("relCoList", JSONObject.toJSONString(getRelCoList()))
             .toString();
     }
 }

+ 0 - 45
ems/ems-core/src/main/java/com/ruoyi/ems/domain/CoChargingConfigRel.java

@@ -1,45 +0,0 @@
-package com.ruoyi.ems.domain;
-
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-
-/**
- * 商户能源计费关系对象 adm_co_charging_config_rel
- * 
- * @author ruoyi
- * @date 2024-08-26
- */
-public class CoChargingConfigRel
-{
-    /** 计费序号 */
-    private Long priceCfgId;
-
-    /** 区块编码 */
-    private String areaCode;
-
-    public void setPriceCfgId(Long priceCfgId) 
-    {
-        this.priceCfgId = priceCfgId;
-    }
-
-    public Long getPriceCfgId() 
-    {
-        return priceCfgId;
-    }
-
-    public String getAreaCode() {
-        return areaCode;
-    }
-
-    public void setAreaCode(String areaCode) {
-        this.areaCode = areaCode;
-    }
-
-    @Override
-    public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("priceCfgId", getPriceCfgId())
-            .append("areaCode", getAreaCode())
-            .toString();
-    }
-}

+ 7 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/AreaMapper.java

@@ -45,6 +45,13 @@ public interface AreaMapper {
     List<Area> selectByCodes(@Param("set") Set<String> areaCodes);
 
     /**
+     * 查询区域对象列表
+     * @param tagCode 标签编码
+     * @return 区域对象集合
+     */
+    List<Area> selectAreaByTag(@Param("tagCode") String tagCode);
+
+    /**
      * 新增区域对象
      *
      * @param area 区域对象

+ 0 - 37
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/CoChargingConfigRelMapper.java

@@ -1,37 +0,0 @@
-package com.ruoyi.ems.mapper;
-
-import com.ruoyi.ems.domain.CoChargingConfigRel;
-
-import java.util.List;
-
-/**
- * 商户能源计费关系Mapper接口
- *
- * @author ruoyi
- * @date 2024-08-26
- */
-public interface CoChargingConfigRelMapper {
-    /**
-     * 查询商户能源计费关系列表
-     *
-     * @param cfgId 配置Id
-     * @return 商户能源计费关系集合
-     */
-    List<CoChargingConfigRel> selectRelList(Long cfgId);
-
-    /**
-     * 新增商户能源计费关系
-     *
-     * @param list 关系列表
-     * @return 结果
-     */
-    int insertRelBatch(List<CoChargingConfigRel> list);
-
-    /**
-     * 批量删除商户能源计费关系
-     *
-     * @param cfgId 配置Id
-     * @return 结果
-     */
-    int deleteRel(Long cfgId);
-}

+ 5 - 3
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/MeterDeviceMapper.java

@@ -30,8 +30,11 @@ public interface MeterDeviceMapper {
      */
     MeterDevice selectMeterDeviceByCode(@Param("deviceCode") String deviceCode);
 
-    List<MeterDevice> selectMeterDeviceByObj(@Param("areaCode") String areaCode, @Param("objType") int objType,
-                                             @Param("boundaryObj") String boundaryObj, @Param("meterCls") int meterCls);
+    List<MeterDevice> selectMeterDeviceByObj(@Param("areaCode") String areaCode, @Param("meterCls") Integer meterCls,
+        @Param("colMode") Integer colMode, @Param("objType") Integer objType, @Param("objCode") String objCode);
+
+    List<MeterDevice> selectMeterDevByTag(@Param("tagCode") String tagCode,
+        @Param("queryDevice") QueryDevice queryDevice);
 
     /**
      * 查询计量设备列表
@@ -81,7 +84,6 @@ public interface MeterDeviceMapper {
      */
     int deleteMeterDeviceByIds(Long[] ids);
 
-
     int countMeterDeviceByObj(MeterDevice meterDevice);
 
     int countOnlineMeterDeviceByObj(ElecMeterH elecMeterH);

+ 7 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/MeterReadingMapper.java

@@ -2,9 +2,12 @@ package com.ruoyi.ems.mapper;
 
 import com.ruoyi.ems.domain.MeterReading;
 import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.model.WaterConsumptionVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Set;
 
 /**
  * 抄记录Mapper接口
@@ -30,6 +33,10 @@ public interface MeterReadingMapper {
      */
     MeterReading selectLastItem(@Param("areaCode") String areaCode, @Param("deviceCode") String deviceCode);
 
+    BigDecimal selectSummaryByDevices(
+        @Param("queryMeter") QueryMeter queryMeter,
+        @Param("meterDevices") Set<String> meterDevices);
+
     /**
      * 查询抄记录列表
      *

+ 14 - 16
ems/ems-core/src/main/java/com/ruoyi/ems/mapper/ObjTagRelMapper.java

@@ -13,6 +13,20 @@ import java.util.List;
  */
 public interface ObjTagRelMapper {
     /**
+     * 新增绑定关系
+     * @param objTagRel 绑定关系
+     * @return cnt
+     */
+    int insert(ObjTagRel objTagRel);
+
+    /**
+     * 删除绑定关系
+     * @param objTagRel 绑定关系
+     * @return cnt
+     */
+    int delete(ObjTagRel objTagRel);
+
+    /**
      * 查询对象&标签关系列表
      *
      * @param objType 标签类型
@@ -39,14 +53,6 @@ public interface ObjTagRelMapper {
     List<ObjTagRel> selectListByObjCode(@Param("objType") int objType, @Param("objCode") String objCode);
 
     /**
-     * 批量插入
-     *
-     * @param list 对象&标签关系
-     * @return 结果
-     */
-    int insertBatch(List<ObjTagRel> list);
-
-    /**
      * 删除对象&标签关系
      *
      * @param objType 标签类型
@@ -54,12 +60,4 @@ public interface ObjTagRelMapper {
      * @return 结果
      */
     int deleteByObjCode(@Param("objType") int objType, @Param("objCode") String objCode);
-
-    /**
-     * 删除对象&标签关系
-     *
-     * @param tagCode 标签代码
-     * @return 结果
-     */
-    int deleteByTagCode(String tagCode);
 }

+ 128 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/model/ChargingBillVO.java

@@ -0,0 +1,128 @@
+// com/ruoyi/ems/domain/ChargingBillVO.java
+package com.ruoyi.ems.model;
+
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 计费账单VO
+ *
+ * @author ruoyi
+ * @date 2024-12-20
+ */
+@Data
+public class ChargingBillVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 账单主体代码
+     */
+    private String objCode;
+
+    /**
+     * 账单主体名称
+     */
+    private String objName;
+
+    /**
+     * 计量时间
+     */
+    private String meteredTime;
+
+    /**
+     * 电量统计-自动
+     */
+    private ElecAutoStatistics elecAutoStats;
+
+    /**
+     * 电量统计-手动
+     */
+    private ElecManualStatistics elecManualStats;
+
+    /**
+     * 水量统计-自动
+     */
+    private WaterStatistics waterAutoStats;
+
+    /**
+     * 水量统计-手动
+     */
+    private WaterStatistics waterManualStats;
+
+    /**
+     * 公摊数据
+     */
+    private SharedData sharedData;
+
+    /**
+     * 合计数据
+     */
+    private TotalStatistics totalStats;
+
+    /**
+     * 电量统计内部类
+     */
+    @Data
+    public static class ElecAutoStatistics implements Serializable {
+        private BigDecimal totalQuantity;       // 总用量
+        private BigDecimal sharpPeakQuantity;   // 尖峰电量
+        private BigDecimal peakQuantity;        // 峰段电量
+        private BigDecimal normalQuantity;      // 平段电量
+        private BigDecimal valleyQuantity;      // 谷段电量
+        private BigDecimal deepValleyQuantity;  // 深谷电量
+        private BigDecimal totalCost;           // 总费用
+        private String unit = "kW·h";            // 单位
+    }
+
+    /**
+     * 电量统计内部类
+     */
+    @Data
+    public static class ElecManualStatistics implements Serializable {
+        private BigDecimal totalQuantity;       // 总用量
+        private BigDecimal totalCost;           // 总费用
+        private String unit = "kW·h";            // 单位
+    }
+
+    /**
+     * 水量统计内部类
+     */
+    @Data
+    public static class WaterStatistics implements Serializable {
+        private BigDecimal totalQuantity;       // 总用量
+        private BigDecimal totalCost;           // 总费用
+        private String unit = "m³";             // 单位
+    }
+
+    /**
+     * 公摊数据内部类
+     */
+    @Data
+    public static class SharedData implements Serializable {
+        private BigDecimal elecSharedQuantity;  // 电公摊量
+        private BigDecimal elecSharedCost;      // 电公摊费用
+        private BigDecimal waterSharedQuantity; // 水公摊量
+        private BigDecimal waterSharedCost;     // 水公摊费用
+        private Integer elecSharedType;         // 电公摊方式
+        private Integer waterSharedType;        // 水公摊方式
+        private String elecSharedTypeName;      // 电公摊方式名称
+        private String waterSharedTypeName;     // 水公摊方式名称
+    }
+
+    /**
+     * 合计统计内部类
+     */
+    @Data
+    public static class TotalStatistics implements Serializable {
+        private BigDecimal elecTotalQuantity;   // 电总量
+        private BigDecimal elecTotalCost;       // 电总费用
+        private BigDecimal waterTotalQuantity;  // 水总量
+        private BigDecimal waterTotalCost;      // 水总费用
+        private BigDecimal sharedTotalCost;     // 公摊总费用
+        private BigDecimal grandTotalCost;      // 总费用
+    }
+}

+ 52 - 57
ems/ems-core/src/main/java/com/ruoyi/ems/model/QueryChargingBill.java

@@ -1,85 +1,80 @@
-/*
- * 文 件 名:  QueryChargingBill
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  lvwenbin
- * 修改时间:  2024/9/2
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
 package com.ruoyi.ems.model;
 
-import org.apache.commons.lang3.StringUtils;
+import lombok.Data;
+import java.io.Serializable;
 
 /**
- * 查询账单请求
- * <功能详细描述>
+ * 计费查询参数
  *
- * @author lvwenbin
- * @version [版本号, 2024/9/2]
- * @see [相关类/方法]
- * @since [产品/模块版本]
+ * @author ruoyi
+ * @date 2024-12-20
  */
-public class QueryChargingBill {
+@Data
+public class QueryChargingBill implements Serializable {
+    private static final long serialVersionUID = 1L;
+
     /**
-     * 区域编码
+     * 区域路径(用于前端树形结构传递)
      */
     private String areaPath;
 
     /**
-     * 计量类型 45:电,70:水
+     * 区域编码
      */
-    private Integer meterCls;
+    private String areaCode;
 
     /**
-     * 开始时间
+     * 计量类型 45:电,70:水, null:全部
      */
-    private String startTime;
+    private Integer meterCls;
 
     /**
-     * 结束时间
+     * 采集方式 0:自动 1:手动 null:全部
      */
-    private String endTime;
+    private Integer colMode;
 
-    public String getAreaPath() {
-        return areaPath;
-    }
-
-    public void setAreaPath(String areaPath) {
-        this.areaPath = areaPath;
-    }
+    /**
+     * 标签代码(用于查询特定标签的区域)
+     */
+    private String tagCode;
 
-    public Integer getMeterCls() {
-        return meterCls;
-    }
+    /**
+     * 开始时间 格式根据timeDimension变化
+     */
+    private String startTime;
 
-    public void setMeterCls(Integer meterCls) {
-        this.meterCls = meterCls;
-    }
+    /**
+     * 结束时间 格式根据timeDimension变化
+     */
+    private String endTime;
 
-    public String getStartTime() {
-        return startTime;
-    }
+    /**
+     * 时间维度 hour/day/month/year
+     */
+    private String timeDimension = "month";
 
-    public void setStartTime(String startTime) {
-        this.startTime = startTime;
-    }
+    /**
+     * 是否包含自动采集数据
+     */
+    private Boolean includeAuto = true;
 
-    public String getEndTime() {
-        return endTime;
-    }
+    /**
+     * 是否包含手动抄表数据
+     */
+    private Boolean includeManual = true;
 
-    public void setEndTime(String endTime) {
-        this.endTime = endTime;
-    }
+    /**
+     * 是否包含公摊数据
+     */
+    private Boolean includeShared = true;
 
-    public String getAreaCode() {
-        return StringUtils.split(areaPath, "/")[0];
-    }
+    /**
+     * 页码
+     */
+    private Integer pageNum;
 
-    public String getObjArea() {
-        String[] pathArray = StringUtils.split(areaPath, "/");
-        return pathArray[pathArray.length -1];
-    }
+    /**
+     * 每页大小
+     */
+    private Integer pageSize;
 }

+ 7 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/IAreaService.java

@@ -53,6 +53,13 @@ public interface IAreaService {
     List<Area> selectAreaDetail(Area area);
 
     /**
+     * 查询标签绑定的区域
+     * @param tagCode 标签
+     * @return 区域对象集合
+     */
+    List<Area> selectAreaByTag(String tagCode);
+
+    /**
      * 新增区域对象
      *
      * @param area 区域对象

+ 27 - 23
ems/ems-core/src/main/java/com/ruoyi/ems/service/IChargingBillService.java

@@ -1,43 +1,47 @@
-/*
- * 文 件 名:  IChargingBillService
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  lvwenbin
- * 修改时间:  2024/9/2
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
+// com/ruoyi/ems/service/IChargingBillService.java
 package com.ruoyi.ems.service;
 
-import com.ruoyi.ems.domain.ChargingBill;
+import com.ruoyi.ems.model.ChargingBillVO;
 import com.ruoyi.ems.model.QueryChargingBill;
 
 import java.util.List;
 
 /**
- * 计费账单服务
- * <功能详细描述>
+ * 计费账单服务接口
  *
- * @author lvwenbin
- * @version [版本号, 2024/9/2]
- * @see [相关类/方法]
- * @since [产品/模块版本]
+ * @author ruoyi
+ * @date 2024-12-20
  */
 public interface IChargingBillService {
     /**
-     * 查询商户计费账单列表
+     * 查询综合账单(包含全部商户汇总(电、水),全部公摊汇总)
+     *
+     * @param queryParam 查询参数
+     * @return 综合账单
+     */
+    ChargingBillVO selectOverviewTotal(QueryChargingBill queryParam);
+
+    /**
+     * 查询综合账单(包含全部商户汇总(电、水),全部公摊汇总)
+     *
+     * @param queryParam 查询参数
+     * @return 综合账单
+     */
+    List<ChargingBillVO> selectOverviewList(QueryChargingBill queryParam);
+
+    /**
+     * 查询商户用能账单(包含自动、手动、公摊)
      *
      * @param queryParam 查询参数
-     * @return 返回列表
+     * @return 综合账单
      */
-    List<ChargingBill> selectCoChargingBill(QueryChargingBill queryParam);
+    ChargingBillVO selectSellerEmsBill(QueryChargingBill queryParam);
 
     /**
-     * 查询计费账单列表by标签
+     * 查询历史账单列表
      *
      * @param queryParam 查询参数
-     * @return 返回列表
+     * @return 历史账单列表
      */
-    List<ChargingBill> selectTagChargingBill(QueryChargingBill queryParam);
+    List<ChargingBillVO> selectSellerHistoryBills(QueryChargingBill queryParam);
 }

+ 0 - 37
ems/ems-core/src/main/java/com/ruoyi/ems/service/ICoChargingConfigRelService.java

@@ -1,37 +0,0 @@
-package com.ruoyi.ems.service;
-
-import com.ruoyi.ems.domain.CoChargingConfigRel;
-
-import java.util.List;
-
-/**
- * 商户能源计费关系Service接口
- *
- * @author ruoyi
- * @date 2024-08-26
- */
-public interface ICoChargingConfigRelService {
-    /**
-     * 查询商户能源计费关系列表
-     *
-     * @param cfgId 配置Id
-     * @return 商户能源计费关系集合
-     */
-    List<CoChargingConfigRel> selectRelList(Long cfgId);
-
-    /**
-     * 新增商户能源计费关系
-     *
-     * @param list 关系列表
-     * @return 结果
-     */
-    int insertRelBatch(List<CoChargingConfigRel> list);
-
-    /**
-     * 批量删除商户能源计费关系
-     *
-     * @param cfgId 配置Id
-     * @return 结果
-     */
-    int deleteRel(Long cfgId);
-}

+ 13 - 6
ems/ems-core/src/main/java/com/ruoyi/ems/service/IMeterDeviceService.java

@@ -39,6 +39,12 @@ public interface IMeterDeviceService {
     List<MeterDevice> selectMeterDeviceList(QueryDevice queryDevice);
 
     /**
+     * 根据标签查询计量设备
+     * @return 计量设备集合
+     */
+    List<MeterDevice> selectMeterDevByTag(String tagCode, QueryDevice queryDevice);
+
+    /**
      * 查询计量设备列表
      *
      * @param deviceModel 模型编码
@@ -49,14 +55,15 @@ public interface IMeterDeviceService {
     /**
      * 查询区域计量表计
      *
-     * @param areaCode    区域代码
-     * @param objType     对象类型
-     * @param boundaryObj 对象类型
-     * @param meterCls    计量对象分类
+     * @param areaCode 区域代码
+     * @param meterCls 计量对象分类
+     * @param colMode  采集方式
+     * @param objType  对象类型
+     * @param objCode  对象类型
      * @return 结果
      */
-    List<MeterDevice> selectMeterDeviceByObj(String areaCode, MeterObjType objType, String boundaryObj,
-        Integer meterCls);
+    List<MeterDevice> selectMeterDeviceByObj(String areaCode, Integer meterCls, Integer colMode, MeterObjType objType,
+        String objCode);
 
     /**
      * 新增计量设备

+ 16 - 18
ems/ems-core/src/main/java/com/ruoyi/ems/service/IObjTagRelService.java

@@ -12,6 +12,20 @@ import java.util.List;
  */
 public interface IObjTagRelService {
     /**
+     * 新增绑定关系
+     * @param objTagRel 绑定关系
+     * @return cnt
+     */
+    int save(ObjTagRel objTagRel);
+
+    /**
+     * 删除绑定关系
+     * @param objTagRel 绑定关系
+     * @return cnt
+     */
+    int remove(ObjTagRel objTagRel);
+
+    /**
      * 查询对象&标签关系列表
      *
      * @param objType 标签类型
@@ -20,7 +34,7 @@ public interface IObjTagRelService {
     List<ObjTagRel> selectListByType(int objType);
 
     /**
-     * 新增对象&标签关系
+     * 查询对象&标签关系
      *
      * @param objType 标签类型
      * @param tagCode 标签代码
@@ -29,7 +43,7 @@ public interface IObjTagRelService {
     List<ObjTagRel> selectListByTagCode(int objType, String tagCode);
 
     /**
-     * 新增对象&标签关系
+     * 查询对象&标签关系
      *
      * @param objType 标签类型
      * @param objCode 标签代码
@@ -38,14 +52,6 @@ public interface IObjTagRelService {
     List<ObjTagRel> selectListByObjCode(int objType, String objCode);
 
     /**
-     * 批量插入
-     *
-     * @param list 对象&标签关系
-     * @return 结果
-     */
-    int insertBatch(List<ObjTagRel> list);
-
-    /**
      * 删除对象&标签关系
      *
      * @param objType 标签类型
@@ -53,12 +59,4 @@ public interface IObjTagRelService {
      * @return 结果
      */
     int deleteByObjCode(int objType, String objCode);
-
-    /**
-     * 删除对象&标签关系
-     *
-     * @param tagCode 标签代码
-     * @return 结果
-     */
-    int deleteByTagCode(String tagCode);
 }

+ 4 - 9
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/AreaAttrServiceImpl.java

@@ -25,6 +25,7 @@ import java.util.stream.Collectors;
  */
 @Service
 public class AreaAttrServiceImpl implements IAreaAttrService {
+     // TODO 区域打标签重构
     @Autowired
     private AreaAttrMapper areaAttrMapper;
 
@@ -114,29 +115,23 @@ public class AreaAttrServiceImpl implements IAreaAttrService {
     public void insertTagRel(AreaAttr areaAttr) {
         if (CollectionUtils.isNotEmpty(areaAttr.getTagCodeList())) {
             List<String> tagArray = areaAttr.getTagCodeList();
-            List<ObjTagRel> tagRelList = new ArrayList<>();
 
             for (String tagCode : tagArray) {
                 ObjTagRel tagRel = new ObjTagRel(tagCode, BusObjType.AREA, areaAttr.getAreaCode());
-                tagRelList.add(tagRel);
+                tagRelService.save(tagRel);
             }
-
-            tagRelService.insertBatch(tagRelList);
         }
     }
 
     public void updateTagRel(AreaAttr areaAttr) {
         if (CollectionUtils.isNotEmpty(areaAttr.getTagCodeList())) {
             List<String> tagArray = areaAttr.getTagCodeList();
-            List<ObjTagRel> tagRelList = new ArrayList<>();
+            tagRelService.deleteByObjCode(BusObjType.AREA.getValue(), areaAttr.getAreaCode());
 
             for (String tagCode : tagArray) {
                 ObjTagRel tagRel = new ObjTagRel(tagCode, BusObjType.AREA, areaAttr.getAreaCode());
-                tagRelList.add(tagRel);
+                tagRelService.save(tagRel);
             }
-
-            tagRelService.deleteByObjCode(BusObjType.AREA.getValue(), areaAttr.getAreaCode());
-            tagRelService.insertBatch(tagRelList);
         }
         else {
             tagRelService.deleteByObjCode(BusObjType.AREA.getValue(), areaAttr.getAreaCode());

+ 6 - 0
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/AreaServiceImpl.java

@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -92,6 +93,11 @@ public class AreaServiceImpl implements IAreaService {
     }
 
     @Override
+    public List<Area> selectAreaByTag(String tagCode) {
+        return areaMapper.selectAreaByTag(tagCode);
+    }
+
+    @Override
     public List<Area> selectAreaTree(String parentCode, boolean recursion) {
         List<Area> dbAreas = areaMapper.selectAreaList(new Area());
         Map<String, List<Area>> areaMap = dbAreas.stream()

+ 576 - 337
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ChargingBillServiceImpl.java

@@ -1,72 +1,71 @@
-/*
- * 文 件 名:  ChargingBillServiceImpl
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  lvwenbin
- * 修改时间:  2024/9/2
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
 package com.ruoyi.ems.service.impl;
 
 import com.huashe.common.utils.DateUtils;
 import com.ruoyi.ems.domain.Area;
 import com.ruoyi.ems.domain.AreaAttr;
-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.enums.MeterObjTag;
 import com.ruoyi.ems.enums.MeterObjType;
-import com.ruoyi.ems.mapper.AreaAttrMapper;
-import com.ruoyi.ems.mapper.AreaMapper;
+import com.ruoyi.ems.mapper.ElecConsumptionMapper;
 import com.ruoyi.ems.mapper.MeterReadingMapper;
+import com.ruoyi.ems.mapper.WaterConsumptionMapper;
+import com.ruoyi.ems.model.ChargingBillVO;
+import com.ruoyi.ems.model.ElecConsumptionVO;
 import com.ruoyi.ems.model.QueryChargingBill;
+import com.ruoyi.ems.model.QueryDevice;
 import com.ruoyi.ems.model.QueryMeter;
+import com.ruoyi.ems.model.WaterConsumptionVO;
+import com.ruoyi.ems.service.IAreaAttrService;
+import com.ruoyi.ems.service.IAreaService;
 import com.ruoyi.ems.service.IChargingBillService;
 import com.ruoyi.ems.service.ICoChargingConfigService;
 import com.ruoyi.ems.service.IMeterDeviceService;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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.time.LocalDateTime;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Date;
-import java.util.HashMap;
-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;
 
 /**
- * 账单服务接口
- * <功能详细描述>
+ * 计费账单服务实现
  *
- * @author lvwenbin
- * @version [版本号, 2024/9/2]
- * @see [相关类/方法]
- * @since [产品/模块版本]
+ * @author ruoyi
+ * @date 2024-12-20
  */
 @Service
 public class ChargingBillServiceImpl implements IChargingBillService {
 
+    private static final Logger logger = LoggerFactory.getLogger(ChargingBillServiceImpl.class);
+
     @Autowired
-    private MeterReadingMapper meterReadingMapper;
+    private IAreaService areaService;
+
+    @Autowired
+    private IAreaAttrService attrService;
+
+    @Autowired
+    private ElecConsumptionMapper elecConsumptionMapper;
 
     @Autowired
-    private AreaMapper areaMapper;
+    private WaterConsumptionMapper waterConsumptionMapper;
 
     @Autowired
-    private AreaAttrMapper areaAttrMapper;
+    private MeterReadingMapper meterReadingMapper;
 
     @Autowired
     private ICoChargingConfigService coChargingConfigService;
@@ -74,408 +73,648 @@ public class ChargingBillServiceImpl implements IChargingBillService {
     @Autowired
     private IMeterDeviceService meterDeviceService;
 
-    /**
-     * 查询商户计费账单列表
-     *
-     * @param queryParam 查询参数
-     * @return 返回列表
-     */
     @Override
-    public List<ChargingBill> selectCoChargingBill(QueryChargingBill queryParam) {
-        // TODO 查询计费配置待改造,支持每个区域不同的计费方式,目前只支持园区级统一计费
-        // 查询园区内部计费配置
-        CoChargingConfig chargingCfg = coChargingConfigService.selectByArea(queryParam.getAreaCode());
+    public ChargingBillVO selectOverviewTotal(QueryChargingBill param) {
+        ChargingBillVO vo = new ChargingBillVO();
+
+        try {
+            Area area = areaService.selectAreaByCode(param.getAreaCode());
+            CoChargingConfig config = coChargingConfigService.selectByArea(area.getAreaCode());
+            vo.setObjCode(param.getAreaCode());
+            vo.setObjName(area.getAreaName());
+            vo.setMeteredTime(param.getStartTime());
+
+            // 1. 商户自用数据计算
+            if (param.getIncludeAuto()) {
+                // 1.1 商户用电-自动抄表数据
+                List<MeterDevice> elecADevs = meterDeviceService.selectMeterDeviceByObj(area.getAreaCode(), 45, 0,
+                    MeterObjType.METER_AREA, null);
+                ChargingBillVO.ElecAutoStatistics elecAStatistics = selectElecAutoStats(param, config, elecADevs);
+                vo.setElecAutoStats(elecAStatistics);
+
+                // 1.2 商户用水-自动抄表数据
+                List<MeterDevice> waterADevs = meterDeviceService.selectMeterDeviceByObj(area.getAreaCode(), 70, 0,
+                    MeterObjType.METER_AREA, null);
+                ChargingBillVO.WaterStatistics waterAStatistics = selectWaterAutoStats(param, config, waterADevs);
+                vo.setWaterAutoStats(waterAStatistics);
+            }
 
-        // 计算个户账单
-        Map<String, ChargingBill> coBillMap = clacCoBill(queryParam, chargingCfg);
+            if (param.getIncludeManual()) {
+                // 1.3 商户用电-手动抄表数据
+                List<MeterDevice> elecMDevs = meterDeviceService.selectMeterDeviceByObj(area.getAreaCode(), 45, 1,
+                    MeterObjType.METER_AREA, null);
+                ChargingBillVO.ElecManualStatistics elecMStatistics = selectElecManualStats(param, config, elecMDevs);
+                vo.setElecManualStats(elecMStatistics);
+
+                // 1.4 商户用水-手动抄表数据
+                List<MeterDevice> waterMDevs = meterDeviceService.selectMeterDeviceByObj(area.getAreaCode(), 70, 1,
+                    MeterObjType.METER_AREA, null);
+                ChargingBillVO.WaterStatistics waterMStatistics = selectWaterManualStats(param, config, waterMDevs);
+                vo.setWaterManualStats(waterMStatistics);
+            }
 
-        // 计算公摊账单
-        Map<String, ChargingBill> sharedMap = clacSharedBill(queryParam, chargingCfg);
+            if (param.getIncludeShared()) {
+                // 2. 公摊数据计算
+                ChargingBillVO.SharedData sharedData = calculateSharedData(param, config, false);
+                vo.setSharedData(sharedData);
+            }
 
-        return mergeBill(queryParam, coBillMap, sharedMap);
+            ChargingBillVO.TotalStatistics total = calculateTotal(vo);
+            vo.setTotalStats(total);
+        }
+        catch (Exception e) {
+            logger.error("查询个总览异常", e);
+        }
+
+        return vo;
     }
 
     @Override
-    public List<ChargingBill> selectTagChargingBill(QueryChargingBill queryParam) {
-        // 查询园区内部计费配置
-        CoChargingConfig chargingCfg = coChargingConfigService.selectByArea(queryParam.getAreaCode());
+    public List<ChargingBillVO> selectOverviewList(QueryChargingBill param) {
+        List<ChargingBillVO> resultList = new ArrayList<>();
+
+        try {
+            // 解析时间范围
+            Date startDate = DateUtils.stringToDate(param.getStartTime(), "yyyyMM");
+            Date endDate = DateUtils.stringToDate(param.getEndTime(), "yyyyMM");
+
+            // 按月循环查询
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(startDate);
+
+            while (!calendar.getTime().after(endDate)) {
+                QueryChargingBill monthQuery = new QueryChargingBill();
+                BeanUtils.copyProperties(param, monthQuery);
+                String monthStr = DateUtils.dateToString(calendar.getTime(), "yyyyMM");
+                monthQuery.setStartTime(monthStr);
+                monthQuery.setEndTime(monthStr);
+
+                ChargingBillVO bill = selectOverviewTotal(monthQuery);
+                bill.setMeteredTime(monthStr);
+                resultList.add(bill);
+
+                // 下一个月
+                calendar.add(Calendar.MONTH, 1);
+            }
 
-        Map<String, Long> individualMap = getQuantityByTag(queryParam, MeterObjTag.INDIVIDUAL);
-        Map<String, Long> sharedMap = getQuantityByTag(queryParam, MeterObjTag.SHARED);
+        }
+        catch (Exception e) {
+            logger.error("查询总览列表异常", e);
+        }
 
-        List<ChargingBill> retList = new ArrayList<>();
-        Date start = DateUtils.stringToDate(queryParam.getStartTime(), "yyyyMM");
-        Date end = DateUtils.stringToDate(queryParam.getEndTime(), "yyyyMM");
-        String objName = getObjName(queryParam);
+        return resultList;
+    }
 
-        do {
-            String time = DateUtils.dateToString(start, "yyyyMM");
+    @Override
+    public ChargingBillVO selectSellerEmsBill(QueryChargingBill param) {
+        ChargingBillVO vo = new ChargingBillVO();
+
+        try {
+            Area area = areaService.selectAreaByCode(param.getAreaCode());
+            String rootArea = getRootArea(area);
+            CoChargingConfig config = coChargingConfigService.selectByArea(rootArea);
+            vo.setObjCode(param.getAreaCode());
+            vo.setObjName(area.getAreaName());
+            vo.setMeteredTime(param.getStartTime());
+
+            // 1. 商户自用数据计算
+            if (param.getIncludeAuto()) {
+                // 1.1 商户用电-自动抄表数据
+                List<MeterDevice> elecADevs = meterDeviceService.selectMeterDeviceByObj(rootArea, 45, 0,
+                    MeterObjType.METER_AREA, param.getAreaCode());
+                ChargingBillVO.ElecAutoStatistics elecAStatistics = selectElecAutoStats(param, config, elecADevs);
+                vo.setElecAutoStats(elecAStatistics);
+
+                // 1.2 商户用水-自动抄表数据
+                List<MeterDevice> waterADevs = meterDeviceService.selectMeterDeviceByObj(rootArea, 70, 0,
+                    MeterObjType.METER_AREA, param.getAreaCode());
+                ChargingBillVO.WaterStatistics waterAStatistics = selectWaterAutoStats(param, config, waterADevs);
+                vo.setWaterAutoStats(waterAStatistics);
+            }
 
-            ChargingBill bill = new ChargingBill();
-            bill.setObjCode(queryParam.getObjArea());
-            bill.setMeteredTime(time);
-            bill.setObjName(objName);
+            if (param.getIncludeManual()) {
+                // 1.3 商户用电-手动抄表数据
+                List<MeterDevice> elecMDevs = meterDeviceService.selectMeterDeviceByObj(rootArea, 45, 1,
+                    MeterObjType.METER_AREA, param.getAreaCode());
+                ChargingBillVO.ElecManualStatistics elecMStatistics = selectElecManualStats(param, config, elecMDevs);
+                vo.setElecManualStats(elecMStatistics);
+
+                // 1.4 商户用水-手动抄表数据
+                List<MeterDevice> waterMDevs = meterDeviceService.selectMeterDeviceByObj(rootArea, 70, 1,
+                    MeterObjType.METER_AREA, param.getAreaCode());
+                ChargingBillVO.WaterStatistics waterMStatistics = selectWaterManualStats(param, config, waterMDevs);
+                vo.setWaterManualStats(waterMStatistics);
+            }
 
-            long individual = (null != individualMap.get(time)) ? individualMap.get(time) : 0L;
-            bill.setMeteredValue((double) individual);
-            bill.setMeteredPrice(calcPrice(queryParam.getMeterCls(), individual, chargingCfg));
+            if (param.getIncludeShared()) {
+                // 2. 公摊数据计算
+                ChargingBillVO.SharedData sharedData = calculateSharedData(param, config, true);
+                vo.setSharedData(sharedData);
+            }
 
-            long shared = (null != sharedMap.get(time)) ? sharedMap.get(time) : 0L;
-            bill.setSharedValue(shared);
-            bill.setSharedPrice(calcPrice(queryParam.getMeterCls(), shared, chargingCfg));
+            ChargingBillVO.TotalStatistics total = calculateTotal(vo);
+            vo.setTotalStats(total);
+        }
+        catch (Exception e) {
+            logger.error("查询个户账单异常", e);
+        }
 
-            bill.setTotalValue(individual + shared);
-            bill.setTotalPrice(clacTotalPrice(bill));
+        return vo;
+    }
 
-            retList.add(bill);
+    @Override
+    public List<ChargingBillVO> selectSellerHistoryBills(QueryChargingBill param) {
+        List<ChargingBillVO> resultList = new ArrayList<>();
+
+        try {
+            // 解析时间范围
+            Date startDate = DateUtils.stringToDate(param.getStartTime(), "yyyyMM");
+            Date endDate = DateUtils.stringToDate(param.getEndTime(), "yyyyMM");
+
+            // 按月循环查询
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(startDate);
+
+            while (!calendar.getTime().after(endDate)) {
+                QueryChargingBill monthQuery = new QueryChargingBill();
+                BeanUtils.copyProperties(param, monthQuery);
+                String monthStr = DateUtils.dateToString(calendar.getTime(), "yyyyMM");
+                monthQuery.setStartTime(monthStr);
+                monthQuery.setEndTime(monthStr);
+
+                ChargingBillVO bill = selectSellerEmsBill(monthQuery);
+                bill.setMeteredTime(monthStr);
+                resultList.add(bill);
+
+                // 下一个月
+                calendar.add(Calendar.MONTH, 1);
+            }
 
-            start = DateUtils.adjustMonth(start, 1);
         }
-        while (start.before(end) || start.equals(end));
+        catch (Exception e) {
+            logger.error("查询历史账单列表异常", e);
+        }
 
-        return retList;
+        return resultList;
     }
 
-    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);
+    /**
+     * 商户用电-自动抄表数据统计
+     *
+     * @param param     查询条件
+     * @param elecADevs 商户绑定表计列表
+     * @return 商用用电-自动抄表数据统计
+     */
+    private ChargingBillVO.ElecAutoStatistics selectElecAutoStats(QueryChargingBill param, CoChargingConfig config,
+        List<MeterDevice> elecADevs) {
+        ChargingBillVO.ElecAutoStatistics stats = new ChargingBillVO.ElecAutoStatistics();
 
-        do {
-            String time = DateUtils.dateToString(start, "yyyyMM");
+        if (CollectionUtils.isNotEmpty(elecADevs)) {
+            // 构建查询参数
+            QueryMeter queryMeter = buildQueryMeter(param, 45);
 
-            ChargingBill bill = new ChargingBill();
-            bill.setObjCode(queryParam.getObjArea());
-            bill.setMeteredTime(time);
-            bill.setObjName(objName);
+            // 获取区域绑定的设备
+            Set<String> devices = elecADevs.stream().map(MeterDevice::getDeviceCode).collect(Collectors.toSet());
 
-            ChargingBill coBill = coBillMap.get(time);
+            // 查询电量数据
+            ElecConsumptionVO consumption = elecConsumptionMapper.selectAreaElecConsumptionSummaryByDevices(queryMeter,
+                devices);
 
-            if (null != coBill) {
-                bill.setMeteredValue(coBill.getMeteredValue());
-                bill.setMeteredPrice(coBill.getMeteredPrice());
+            if (consumption != null && consumption.getTotalElecQuantity() != null) {
+                BeanUtils.copyProperties(consumption, stats);
+                stats.setTotalQuantity(consumption.getTotalElecQuantity());
+                stats.setTotalCost(calculateCost(consumption.getTotalElecQuantity(), 45, config));
             }
-
-            ChargingBill sharedBill = sharedMap.get(time);
-
-            if (null != sharedBill) {
-                bill.setSharedPrice(sharedBill.getSharedPrice());
-                bill.setSharedComputeType(sharedBill.getSharedComputeType());
+            else {
+                stats.setTotalQuantity(BigDecimal.ZERO);
+                stats.setTotalCost(BigDecimal.ZERO);
             }
-
-            bill.setTotalPrice(clacTotalPrice(bill));
-
-            retList.add(bill);
-
-            start = DateUtils.adjustMonth(start, 1);
         }
-        while (start.before(end) || start.equals(end));
+        else {
+            stats.setTotalQuantity(BigDecimal.ZERO);
+            stats.setTotalCost(BigDecimal.ZERO);
+        }
 
-        return retList;
+        return stats;
     }
 
-    private Map<String, ChargingBill> clacCoBill(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
-        Map<String, ChargingBill> retMap = null;
+    /**
+     * 商户用水-自动抄表数据统计
+     *
+     * @param param      查询条件
+     * @param waterADevs 商户绑定表计列表
+     * @return 商用用水-自动抄表数据统计
+     */
+    private ChargingBillVO.WaterStatistics selectWaterAutoStats(QueryChargingBill param, CoChargingConfig config,
+        List<MeterDevice> waterADevs) {
+        ChargingBillVO.WaterStatistics stats = new ChargingBillVO.WaterStatistics();
+
+        if (CollectionUtils.isNotEmpty(waterADevs)) {
+            // 构建查询参数
+            QueryMeter queryMeter = buildQueryMeter(param, 70);
 
-        List<MeterDevice> meterDevices = meterDeviceService.selectMeterDeviceByObj(queryParam.getAreaCode(), MeterObjType.METER_AREA, queryParam.getObjArea(),
-            queryParam.getMeterCls());
+            // 获取区域绑定的设备
+            Set<String> devices = waterADevs.stream().map(MeterDevice::getDeviceCode).collect(Collectors.toSet());
 
-        if (CollectionUtils.isNotEmpty(meterDevices) ) {
-            // TODO 当有多个设备时,需要融合计算
-            MeterDevice meterDevice = meterDevices.get(0);
-            QueryMeter recParam = new QueryMeter();
-            recParam.setAreaCode(meterDevice.getAreaCode());
-            recParam.setDeviceCode(meterDevice.getDeviceCode());
-            recParam.setStartRecTime(queryParam.getStartTime());
-            recParam.setEndRecTime(queryParam.getEndTime());
+            // 查询电量数据
+            WaterConsumptionVO consumption = waterConsumptionMapper.selectAreaWaterConsumptionSummaryByDevices(
+                queryMeter, devices);
 
-            List<MeterReading> recList = meterReadingMapper.selectList(recParam);
-            List<ChargingBill> billList = convertToChargingBill(queryParam, chargingCfg, recList);
-            retMap = billList.stream().collect(Collectors.toMap(ChargingBill::getMeteredTime, Function.identity()));
+            if (consumption != null && consumption.getTotalWaterQuantity() != null) {
+                stats.setTotalQuantity(consumption.getTotalWaterQuantity());
+                stats.setTotalCost(calculateCost(consumption.getTotalWaterQuantity(), 70, config));
+            }
+            else {
+                stats.setTotalQuantity(BigDecimal.ZERO);
+                stats.setTotalCost(BigDecimal.ZERO);
+            }
+        }
+        else {
+            stats.setTotalQuantity(BigDecimal.ZERO);
+            stats.setTotalCost(BigDecimal.ZERO);
         }
 
-        return MapUtils.isNotEmpty(retMap) ? retMap : new HashMap<>();
+        return stats;
     }
 
-    private Map<String, ChargingBill> clacSharedBill(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
-        Map<String, ChargingBill> retMap = null;
+    /**
+     * 商户用电-自动抄表数据统计
+     *
+     * @param param     查询条件
+     * @param elecMDevs 商户绑定表计列表
+     * @return 商用用电-手动动抄表数据统计
+     */
+    private ChargingBillVO.ElecManualStatistics selectElecManualStats(QueryChargingBill param, CoChargingConfig config,
+        List<MeterDevice> elecMDevs) {
+        ChargingBillVO.ElecManualStatistics stats = new ChargingBillVO.ElecManualStatistics();
 
-        if (queryParam.getMeterCls() == 45) {
-            retMap = clacElecSharedPrice(queryParam, chargingCfg);
-        }
-        else if (queryParam.getMeterCls() == 70) {
-            retMap = clacWaterSharedPrice(queryParam, chargingCfg);
-        }
+        if (CollectionUtils.isNotEmpty(elecMDevs)) {
+            QueryMeter queryMeter = new QueryMeter();
+            queryMeter.setAreaCode(param.getAreaCode());
+            queryMeter.setStartRecTime(param.getStartTime());
+            queryMeter.setEndRecTime(param.getEndTime());
 
-        return MapUtils.isNotEmpty(retMap) ? retMap : new HashMap<>();
-    }
+            // 获取区域绑定的设备
+            Set<String> devices = elecMDevs.stream().map(MeterDevice::getDeviceCode).collect(Collectors.toSet());
 
-    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.setMeteredValue(rec.getIncrease().doubleValue());
-            bill.setMeteredTime(rec.getMeterMonth());
-
-            // 计算商户个体费用
-            if (null != chargingCfg) {
-                if (queryParam.getMeterCls() == 45) {
-                    bill.setMeteredPrice(calcPrice(rec.getIncrease(), chargingCfg.getElecUnitPrice()));
-                }
-                else if (queryParam.getMeterCls() == 70) {
-                    bill.setMeteredPrice(calcPrice(rec.getIncrease(), chargingCfg.getWaterUnitPrice()));
-                }
-            }
+            BigDecimal quantity = meterReadingMapper.selectSummaryByDevices(queryMeter, devices);
 
-            retList.add(bill);
+            if (quantity != null) {
+                stats.setTotalQuantity(quantity);
+                stats.setTotalCost(calculateCost(quantity, 45, config));
+            }
+            else {
+                stats.setTotalQuantity(BigDecimal.ZERO);
+                stats.setTotalCost(BigDecimal.ZERO);
+            }
+        }
+        else {
+            stats.setTotalQuantity(BigDecimal.ZERO);
+            stats.setTotalCost(BigDecimal.ZERO);
         }
 
-        return retList;
+        return stats;
     }
 
-    private Map<String, ChargingBill> clacElecSharedPrice(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
-        Map<String, ChargingBill> retMap = new HashMap<>();
-        // 参与公摊的分区ID
-        Set<String> coSet = getCoSet(chargingCfg);
-
-        // 电价公摊计算
-        if (chargingCfg.getElecGtComputeType() > 0 && coSet.contains(queryParam.getObjArea())) {
-            QueryMeter param = new QueryMeter(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));
+    /**
+     * 商户用水-手动抄表数据统计
+     *
+     * @param param      查询条件
+     * @param waterMDevs 商户绑定表计列表
+     * @return 商用用水-手动抄表数据统计
+     */
+    private ChargingBillVO.WaterStatistics selectWaterManualStats(QueryChargingBill param, CoChargingConfig config,
+        List<MeterDevice> waterMDevs) {
+        ChargingBillVO.WaterStatistics stats = new ChargingBillVO.WaterStatistics();
 
-            for (Map.Entry<String, List<MeterReading>> entry : groupedRecs.entrySet()) {
-                String meterTime = entry.getKey();
-                List<MeterReading> sharedReadings = entry.getValue();
+        if (CollectionUtils.isNotEmpty(waterMDevs)) {
+            QueryMeter queryMeter = new QueryMeter();
+            queryMeter.setAreaCode(param.getAreaCode());
+            queryMeter.setStartRecTime(param.getStartTime());
+            queryMeter.setEndRecTime(param.getEndTime());
 
-                // 公摊价格计算
-                Double price = clacSharedPrice(sharedReadings, coSet, queryParam.getObjArea(),
-                    chargingCfg.getElecGtComputeType(), chargingCfg.getElecUnitPrice());
+            // 获取区域绑定的设备
+            Set<String> devices = waterMDevs.stream().map(MeterDevice::getDeviceCode).collect(Collectors.toSet());
 
-                ChargingBill bill = new ChargingBill();
-                bill.setSharedPrice(price);
-                bill.setSharedComputeType(chargingCfg.getElecGtComputeType());
+            BigDecimal quantity = meterReadingMapper.selectSummaryByDevices(queryMeter, devices);
 
-                retMap.put(meterTime, bill);
+            if (quantity != null) {
+                stats.setTotalQuantity(quantity);
+                stats.setTotalCost(calculateCost(quantity, 70, config));
+            }
+            else {
+                stats.setTotalQuantity(BigDecimal.ZERO);
+                stats.setTotalCost(BigDecimal.ZERO);
             }
         }
+        else {
+            stats.setTotalQuantity(BigDecimal.ZERO);
+            stats.setTotalCost(BigDecimal.ZERO);
+        }
 
-        return retMap;
+        return stats;
     }
 
-    private Map<String, ChargingBill> clacWaterSharedPrice(QueryChargingBill queryParam, CoChargingConfig chargingCfg) {
-        Map<String, ChargingBill> retMap = new HashMap<>();
-        // 参与公摊的分区ID
-        Set<String> coSet = getCoSet(chargingCfg);
-
-        // 水价公摊计算
-        if (chargingCfg.getWaterGtComputeType() > 0 && coSet.contains(queryParam.getObjArea())) {
-            QueryMeter param = new QueryMeter(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);
+    /**
+     * 计算公摊数据
+     */
+    private ChargingBillVO.SharedData calculateSharedData(QueryChargingBill param, CoChargingConfig config,
+        boolean isGtForArea) {
+        ChargingBillVO.SharedData sharedData = new ChargingBillVO.SharedData();
+
+        try {
+            // 1. 查询公摊用量
+            BigDecimal totalElecShared = BigDecimal.ZERO;
+            BigDecimal totalWaterShared = BigDecimal.ZERO;
+
+            // 查询公摊电表-自动表统计数据
+            QueryDevice queryElecMDev = buildQueryDev(param.getAreaCode(), 45, 1, 0);
+            List<MeterDevice> sharedElecMDevs = meterDeviceService.selectMeterDevByTag("MeterDev_Gt_45", queryElecMDev);
+            ChargingBillVO.ElecAutoStatistics elecAStatistics = selectElecAutoStats(param, config, sharedElecMDevs);
+            totalElecShared = totalElecShared.add(elecAStatistics.getTotalQuantity());
+
+            // 查询公摊电表-手动表统计数据
+            queryElecMDev = buildQueryDev(param.getAreaCode(), 45, 1, 1);
+            sharedElecMDevs = meterDeviceService.selectMeterDevByTag("MeterDev_Gt_45", queryElecMDev);
+            ChargingBillVO.ElecManualStatistics elecManualStatistics = selectElecManualStats(param, config,
+                sharedElecMDevs);
+            totalElecShared = totalElecShared.add(elecManualStatistics.getTotalQuantity());
+
+            // 查询公摊水表-自动表统计数据
+            QueryDevice queryWaterMDev = buildQueryDev(param.getAreaCode(), 70, 1, 0);
+            List<MeterDevice> sharedWaterMDevs = meterDeviceService.selectMeterDevByTag("MeterDev_Gt_70",
+                queryWaterMDev);
+            ChargingBillVO.WaterStatistics waterAStatistics = selectWaterAutoStats(param, config, sharedWaterMDevs);
+            totalWaterShared = totalWaterShared.add(waterAStatistics.getTotalQuantity());
+
+            // 查询公摊电表-手动表统计数据
+            queryWaterMDev = buildQueryDev(param.getAreaCode(), 70, 1, 1);
+            sharedWaterMDevs = meterDeviceService.selectMeterDevByTag("MeterDev_Gt_70", queryWaterMDev);
+            ChargingBillVO.WaterStatistics waterMStatistics = selectWaterManualStats(param, config, sharedWaterMDevs);
+            totalWaterShared = totalWaterShared.add(waterMStatistics.getTotalQuantity());
+
+            // 3. 计算当前区域应承担的公摊
+            if (isGtForArea) {
+                BigDecimal elecSharedForArea = calculateSharedForArea(totalElecShared, config.getElecGtComputeType(),
+                    config.getAreaCode(), param.getAreaCode());
+                BigDecimal waterSharedForArea = calculateSharedForArea(totalWaterShared, config.getWaterGtComputeType(),
+                    config.getAreaCode(), param.getAreaCode());
+
+                sharedData.setElecSharedQuantity(elecSharedForArea);
+                sharedData.setElecSharedCost(calculateCost(elecSharedForArea, 45, config));
+                sharedData.setWaterSharedQuantity(waterSharedForArea);
+                sharedData.setWaterSharedCost(calculateCost(waterSharedForArea, 70, config));
+                sharedData.setElecSharedType(config.getElecGtComputeType());
+                sharedData.setWaterSharedType(config.getWaterGtComputeType());
+                sharedData.setElecSharedTypeName(getSharedTypeName(config.getElecGtComputeType()));
+                sharedData.setWaterSharedTypeName(getSharedTypeName(config.getWaterGtComputeType()));
+            }
+            else {
+                sharedData.setElecSharedQuantity(totalElecShared);
+                sharedData.setElecSharedCost(calculateCost(totalElecShared, 45, config));
+                sharedData.setWaterSharedQuantity(totalWaterShared);
+                sharedData.setWaterSharedCost(calculateCost(totalWaterShared, 70, config));
             }
-
         }
-
-        return retMap;
-    }
-
-    private Map<String, Long> getQuantityByTag(QueryChargingBill queryParam, MeterObjTag tag) {
-        Map<String, Long> retMap = new HashMap<>();
-
-        QueryMeter param = new QueryMeter(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);
+        catch (Exception e) {
+            logger.error("计算公摊数据异常", e);
         }
 
-        return retMap;
+        return sharedData;
     }
 
     /**
-     * 计算公摊价
-     *
-     * @return 价格
+     * 计算合计
      */
-    private Double clacSharedPrice(List<MeterReading> sharedReadings, Set<String> coSet, String objCode,
-        int gtComputeType, Double unitPrice) {
-        double sharedPrice = 0.0;
+    private ChargingBillVO.TotalStatistics calculateTotal(ChargingBillVO billVO) {
+        ChargingBillVO.TotalStatistics total = new ChargingBillVO.TotalStatistics();
+
+        // 电量合计
+        BigDecimal elecQuantity = BigDecimal.ZERO;
+        BigDecimal elecCost = BigDecimal.ZERO;
+
+        if (billVO.getElecAutoStats() != null) {
+            elecQuantity = elecQuantity.add(billVO.getElecAutoStats().getTotalQuantity() != null ?
+                billVO.getElecAutoStats().getTotalQuantity() :
+                BigDecimal.ZERO);
+            elecCost = elecCost.add(billVO.getElecAutoStats().getTotalCost() != null ?
+                billVO.getElecAutoStats().getTotalCost() :
+                BigDecimal.ZERO);
+        }
 
-        // 公摊用量
-        Long sharedQuantity = sumSharedReadings(sharedReadings);
+        if (billVO.getElecManualStats() != null) {
+            elecQuantity = elecQuantity.add(billVO.getElecManualStats().getTotalQuantity() != null ?
+                billVO.getElecManualStats().getTotalQuantity() :
+                BigDecimal.ZERO);
+            elecCost = elecCost.add(billVO.getElecManualStats().getTotalCost() != null ?
+                billVO.getElecManualStats().getTotalCost() :
+                BigDecimal.ZERO);
+        }
 
-        // 公摊总价
-        Double sharedPriceSum = calcPrice(sharedQuantity, unitPrice);
+        // 水量合计
+        BigDecimal waterQuantity = BigDecimal.ZERO;
+        BigDecimal waterCost = BigDecimal.ZERO;
+
+        if (billVO.getWaterAutoStats() != null) {
+            waterQuantity = waterQuantity.add(billVO.getWaterAutoStats().getTotalQuantity() != null ?
+                billVO.getWaterAutoStats().getTotalQuantity() :
+                BigDecimal.ZERO);
+            waterCost = waterCost.add(billVO.getWaterAutoStats().getTotalCost() != null ?
+                billVO.getWaterAutoStats().getTotalCost() :
+                BigDecimal.ZERO);
+        }
 
-        // 按户数公摊
-        if (gtComputeType == 1) {
-            sharedPrice = sharedPriceByCount(sharedPriceSum, coSet.size());
+        if (billVO.getWaterManualStats() != null) {
+            waterQuantity = waterQuantity.add(billVO.getWaterManualStats().getTotalQuantity() != null ?
+                billVO.getWaterManualStats().getTotalQuantity() :
+                BigDecimal.ZERO);
+            waterCost = waterCost.add(billVO.getWaterManualStats().getTotalCost() != null ?
+                billVO.getWaterManualStats().getTotalCost() :
+                BigDecimal.ZERO);
         }
-        // 按面积公摊
-        else if (gtComputeType == 2) {
-            sharedPrice = sharedPriceByArea(sharedPriceSum, objCode, coSet);
+
+        // 公摊合计
+        BigDecimal sharedCost = BigDecimal.ZERO;
+
+        if (billVO.getSharedData() != null) {
+            elecQuantity = elecQuantity.add(billVO.getSharedData().getElecSharedQuantity() != null ?
+                billVO.getSharedData().getElecSharedQuantity() :
+                BigDecimal.ZERO);
+            elecCost = elecCost.add(billVO.getSharedData().getElecSharedCost() != null ?
+                billVO.getSharedData().getElecSharedCost() :
+                BigDecimal.ZERO);
+            waterQuantity = waterQuantity.add(billVO.getSharedData().getWaterSharedQuantity() != null ?
+                billVO.getSharedData().getWaterSharedQuantity() :
+                BigDecimal.ZERO);
+            waterCost = waterCost.add(billVO.getSharedData().getWaterSharedCost() != null ?
+                billVO.getSharedData().getWaterSharedCost() :
+                BigDecimal.ZERO);
+
+            sharedCost = sharedCost.add(billVO.getSharedData().getElecSharedCost() != null ?
+                billVO.getSharedData().getElecSharedCost() :
+                BigDecimal.ZERO);
+            sharedCost = sharedCost.add(billVO.getSharedData().getWaterSharedCost() != null ?
+                billVO.getSharedData().getWaterSharedCost() :
+                BigDecimal.ZERO);
         }
 
-        return sharedPrice;
+        total.setElecTotalQuantity(elecQuantity);
+        total.setElecTotalCost(elecCost);
+        total.setWaterTotalQuantity(waterQuantity);
+        total.setWaterTotalCost(waterCost);
+        total.setSharedTotalCost(sharedCost);
+        total.setGrandTotalCost(elecCost.add(waterCost));
+
+        return total;
     }
 
-    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();
+    /**
+     * 构建QueryMeter参数
+     */
+    private QueryMeter buildQueryMeter(QueryChargingBill queryParam, Integer meterCls) {
+        QueryMeter queryMeter = new QueryMeter();
+        BeanUtils.copyProperties(queryParam, queryMeter);
+        queryMeter.setMeterCls(meterCls);
+
+        // 处理起始日期
+        LocalDateTime startDateTime = YearMonth.parse(queryParam.getStartTime(), DateTimeFormatter.ofPattern("yyyyMM"))
+            .atDay(1).atStartOfDay();
+        queryMeter.setStartRecTime(startDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+        // 处理结束日期
+        LocalDateTime endDateTime = YearMonth.parse(queryParam.getEndTime(), DateTimeFormatter.ofPattern("yyyyMM"))
+            .atEndOfMonth().atTime(23, 59, 59);
+        queryMeter.setEndRecTime(endDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+        return queryMeter;
     }
 
-    private double sharedPriceByArea(Double sharedPriceSum, String objCode, Set<String> coSet) {
-        List<AreaAttr> attrObjs = areaAttrMapper.selectAreaAttrList(coSet);
-        Map<String, AreaAttr> map = attrObjs.stream()
-            .collect(Collectors.toMap(AreaAttr::getAreaCode, Function.identity()));
-        AreaAttr attr = map.get(objCode);
+    /**
+     * 计算费用
+     */
+    private BigDecimal calculateCost(BigDecimal quantity, Integer meterCls, CoChargingConfig config) {
+        if (quantity == null || quantity.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
 
-        // 计算总面积
-        Long areas = sumSharedAreas(attrObjs);
+        try {
+            if (config == null) {
+                return BigDecimal.ZERO;
+            }
 
-        BigDecimal bd1 = new BigDecimal(sharedPriceSum.toString());
-        BigDecimal bd2 = new BigDecimal(areas.toString());
-        BigDecimal bd3 = new BigDecimal(attr.getUsableArea().toString());
+            BigDecimal unitPrice = BigDecimal.ZERO;
+            if (meterCls == 45) {
+                unitPrice = new BigDecimal(String.valueOf(config.getElecUnitPrice()));
+            }
+            else if (meterCls == 70) {
+                unitPrice = new BigDecimal(String.valueOf(config.getWaterUnitPrice()));
+            }
 
-        // 计算当前区块面积占总建筑面积的比例
-        BigDecimal bl = bd3.divide(bd2, 3, RoundingMode.HALF_UP);
-        BigDecimal res = bd1.multiply(bl);
-        return res.doubleValue();
-    }
+            return quantity.multiply(unitPrice).setScale(2, RoundingMode.HALF_UP);
 
-    private Long sumSharedReadings(List<MeterReading> sharedReadings) {
-        long sum = 0;
-        for (MeterReading rec : sharedReadings) {
-            sum += rec.getIncrease();
         }
-        return sum;
+        catch (Exception e) {
+            logger.error("计算费用异常", e);
+            return BigDecimal.ZERO;
+        }
     }
 
-    private Long sumSharedAreas(List<AreaAttr> attrObjs) {
-        long sum = 0;
-        for (AreaAttr attr : attrObjs) {
-            sum += attr.getUsableArea();
-        }
-        return sum;
+    private QueryDevice buildQueryDev(String areaCode, Integer meterCls, Integer enable, Integer colMode) {
+        QueryDevice queryDevice = new QueryDevice();
+        queryDevice.setAreaCode(areaCode);
+        queryDevice.setMeterCls(meterCls);
+        queryDevice.setDeviceEnable(enable);
+        queryDevice.setColMode(colMode);
+        return queryDevice;
     }
 
     /**
-     * 计算用量总价
-     *
-     * @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());
+    private BigDecimal calculateSharedForArea(BigDecimal totalShared, Integer sharedType, String rootArea,
+        String areaCode) {
+        if (totalShared == null || totalShared.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
         }
 
-        return null;
+        try {
+            switch (sharedType) {
+                case 0: // 不计入
+                    return BigDecimal.ZERO;
+
+                case 1: // 户数均摊
+                    // 查询需要公摊的商户数量
+                    List<Area> areas1 = areaService.selectAreaByTag("Area_Seller");
+                    areas1 = areas1.stream()
+                        .filter(area -> ArrayUtils.contains(StringUtils.split(area.getAncestors(), ","), rootArea))
+                        .collect(Collectors.toList());
+                    int count = areas1.size();
+                    if (count > 0) {
+                        return totalShared.divide(new BigDecimal(count), 2, RoundingMode.HALF_UP);
+                    }
+                    return BigDecimal.ZERO;
+
+                case 2: // 面积均摊
+                    List<Area> areas2 = areaService.selectAreaByTag("Area_Seller");
+                    List<String> areaCodes = areas2.stream()
+                        .filter(area -> ArrayUtils.contains(StringUtils.split(area.getAncestors(), ","), rootArea))
+                        .map(Area::getAreaCode).collect(Collectors.toList());
+                    List<AreaAttr> attrList = attrService.selectAreaAttrList(areaCodes);
+
+                    BigDecimal totalA = BigDecimal.ZERO;
+                    BigDecimal currentA = BigDecimal.ZERO;
+
+                    for (AreaAttr attr : attrList) {
+                        if (StringUtils.equals(areaCode, attr.getAreaCode())) {
+                            currentA = new BigDecimal(String.valueOf(attr.getUsableArea()));
+                        }
+
+                        // 计算总面积
+                        totalA = totalA.add(new BigDecimal(String.valueOf(attr.getUsableArea())));
+                    }
+
+                    if (totalA.compareTo(BigDecimal.ZERO) > 0) {
+                        return totalShared.multiply(currentA).divide(totalA, 2, RoundingMode.HALF_UP);
+                    }
+                    return BigDecimal.ZERO;
+
+                default:
+                    return BigDecimal.ZERO;
+            }
+        }
+        catch (Exception e) {
+            logger.error("计算区域公摊异常", e);
+            return BigDecimal.ZERO;
+        }
     }
 
     /**
-     * 计算用量总价
-     *
-     * @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) {
-        if (null != bill.getMeteredPrice() && null != bill.getSharedPrice()) {
-            BigDecimal bd1 = new BigDecimal(bill.getMeteredPrice().toString());
-            BigDecimal bd2 = new BigDecimal(bill.getSharedPrice().toString());
-            return bd1.add(bd2).setScale(3, RoundingMode.HALF_UP).doubleValue();
+    private String getSharedTypeName(Integer type) {
+        if (type == null) {
+            return "未知";
         }
-        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;
+
+        switch (type) {
+            case 0:
+                return "不计入";
+            case 1:
+                return "户数均摊";
+            case 2:
+                return "面积均摊";
+            default:
+                return "未知";
         }
     }
 
-    private Set<String> getCoSet(CoChargingConfig chargingCfg) {
-        Set<String> coSet;
+    private String getRootArea(Area area) {
+        String ancestors = area.getAncestors();
+        String[] ancestorsArr = StringUtils.split(ancestors, ",");
 
-        if (null != chargingCfg) {
-            coSet = chargingCfg.getRelCoList().stream().map(CoChargingConfigRel::getAreaCode)
-                .collect(Collectors.toSet());
+        if (ancestorsArr.length < 2) {
+            return area.getAreaCode();
         }
         else {
-            coSet = new HashSet<>();
+            return ancestorsArr[1];
         }
-
-        return coSet;
-    }
-
-    private String getObjName(QueryChargingBill queryParam) {
-        String areaPath = queryParam.getAreaPath();
-        List<String> areaCodes = Arrays.asList(StringUtils.split(areaPath, "/"));
-        List<Area> areaList = areaMapper.selectByCodes(new HashSet<>(areaCodes));
-        Map<String, Area> map = areaList.stream().collect(Collectors.toMap(Area::getAreaCode, Function.identity()));
-
-        List<String> names = new ArrayList<>();
-
-        for (String areaCode : areaCodes) {
-            Area area = map.get(areaCode);
-
-            if (null != area) {
-                names.add(StringUtils.isNotBlank(area.getShortName()) ? area.getShortName() : area.getAreaName());
-            }
-            else {
-                names.add("未知");
-            }
-        }
-
-        return StringUtils.join(names, "/");
     }
 }

+ 0 - 50
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/CoChargingConfigRelServiceImpl.java

@@ -1,50 +0,0 @@
-/*
- * 文 件 名:  CoChargingConfigRelServiceImpl
- * 版    权:  浩鲸云计算科技股份有限公司
- * 描    述:  <描述>
- * 修 改 人:  lvwenbin
- * 修改时间:  2024/8/26
- * 跟踪单号:  <跟踪单号>
- * 修改单号:  <修改单号>
- * 修改内容:  <修改内容>
- */
-package com.ruoyi.ems.service.impl;
-
-import com.ruoyi.ems.domain.CoChargingConfigRel;
-import com.ruoyi.ems.mapper.CoChargingConfigRelMapper;
-import com.ruoyi.ems.service.ICoChargingConfigRelService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * 商户配置关联表 服务层实现
- * <功能详细描述>
- *
- * @author lvwenbin
- * @version [版本号, 2024/8/26]
- * @see [相关类/方法]
- * @since [产品/模块版本]
- */
-
-@Service
-public class CoChargingConfigRelServiceImpl implements ICoChargingConfigRelService {
-    @Autowired
-    private CoChargingConfigRelMapper coChargingConfigRelMapper;
-
-    @Override
-    public List<CoChargingConfigRel> selectRelList(Long cfgId) {
-        return coChargingConfigRelMapper.selectRelList(cfgId);
-    }
-
-    @Override
-    public int insertRelBatch(List<CoChargingConfigRel> list) {
-        return coChargingConfigRelMapper.insertRelBatch(list);
-    }
-
-    @Override
-    public int deleteRel(Long cfgId) {
-        return coChargingConfigRelMapper.deleteRel(cfgId);
-    }
-}

+ 3 - 44
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/CoChargingConfigServiceImpl.java

@@ -2,9 +2,7 @@ package com.ruoyi.ems.service.impl;
 
 import com.ruoyi.ems.domain.CoChargingConfig;
 import com.ruoyi.ems.mapper.CoChargingConfigMapper;
-import com.ruoyi.ems.service.ICoChargingConfigRelService;
 import com.ruoyi.ems.service.ICoChargingConfigService;
-import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -21,9 +19,6 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
     @Autowired
     private CoChargingConfigMapper coChargingConfigMapper;
 
-    @Autowired
-    private ICoChargingConfigRelService relService;
-
     /**
      * 查询商户能源计费配置
      *
@@ -32,24 +27,12 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
      */
     @Override
     public CoChargingConfig selectCoChargingConfigById(Long id) {
-        CoChargingConfig config = coChargingConfigMapper.selectCoChargingConfigById(id);
-
-        if (config != null) {
-            config.setRelCoList(relService.selectRelList(config.getId()));
-        }
-
-        return config;
+        return coChargingConfigMapper.selectCoChargingConfigById(id);
     }
 
     @Override
     public CoChargingConfig selectByArea(String areaCode) {
-        CoChargingConfig config = coChargingConfigMapper.selectByArea(areaCode);
-
-        if (null != config) {
-            config.setRelCoList(relService.selectRelList(config.getId()));
-        }
-
-        return config;
+        return coChargingConfigMapper.selectByArea(areaCode);
     }
 
     /**
@@ -60,15 +43,7 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
      */
     @Override
     public List<CoChargingConfig> selectCoChargingConfigList(CoChargingConfig admCoChargingConfig) {
-        List<CoChargingConfig> list = coChargingConfigMapper.selectCoChargingConfigList(admCoChargingConfig);
-
-        if (CollectionUtils.isNotEmpty(list)) {
-            for (CoChargingConfig config : list) {
-                config.setRelCoList(relService.selectRelList(config.getId()));
-            }
-        }
-
-        return list;
+        return coChargingConfigMapper.selectCoChargingConfigList(admCoChargingConfig);
     }
 
     /**
@@ -79,10 +54,6 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
      */
     @Override
     public int insertCoChargingConfig(CoChargingConfig coChargingConfig) {
-        if (CollectionUtils.isNotEmpty(coChargingConfig.getRelCoList())) {
-            relService.insertRelBatch(coChargingConfig.getRelCoList());
-        }
-
         return coChargingConfigMapper.insertCoChargingConfig(coChargingConfig);
     }
 
@@ -94,14 +65,6 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
      */
     @Override
     public int updateCoChargingConfig(CoChargingConfig coChargingConfig) {
-        if (CollectionUtils.isNotEmpty(coChargingConfig.getRelCoList())) {
-            relService.deleteRel(coChargingConfig.getId());
-            relService.insertRelBatch(coChargingConfig.getRelCoList());
-        }
-        else {
-            relService.deleteRel(coChargingConfig.getId());
-        }
-
         return coChargingConfigMapper.updateCoChargingConfig(coChargingConfig);
     }
 
@@ -113,9 +76,6 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
      */
     @Override
     public int deleteCoChargingConfigByIds(Long[] ids) {
-        for (Long id : ids) {
-            relService.deleteRel(id);
-        }
         return coChargingConfigMapper.deleteCoChargingConfigByIds(ids);
     }
 
@@ -127,7 +87,6 @@ public class CoChargingConfigServiceImpl implements ICoChargingConfigService {
      */
     @Override
     public int deleteCoChargingConfigById(Long id) {
-        relService.deleteRel(id);
         return coChargingConfigMapper.deleteCoChargingConfigById(id);
     }
 }

+ 0 - 17
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/EmsTagServiceImpl.java

@@ -3,7 +3,6 @@ package com.ruoyi.ems.service.impl;
 import com.ruoyi.ems.domain.EmsTag;
 import com.ruoyi.ems.mapper.EmsTagMapper;
 import com.ruoyi.ems.service.IEmsTagService;
-import com.ruoyi.ems.service.IObjTagRelService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -20,9 +19,6 @@ public class EmsTagServiceImpl implements IEmsTagService {
     @Autowired
     private EmsTagMapper emsTagMapper;
 
-    @Autowired
-    private IObjTagRelService tagRelService;
-
     /**
      * 查询标签分类
      *
@@ -75,13 +71,6 @@ public class EmsTagServiceImpl implements IEmsTagService {
      */
     @Override
     public int deleteEmsTagByIds(Long[] ids) {
-        for (Long id : ids) {
-            EmsTag tag = emsTagMapper.selectEmsTagById(id);
-            if (null != tag) {
-                tagRelService.deleteByTagCode(tag.getTagCode());
-            }
-        }
-
         return emsTagMapper.deleteEmsTagByIds(ids);
     }
 
@@ -93,12 +82,6 @@ public class EmsTagServiceImpl implements IEmsTagService {
      */
     @Override
     public int deleteEmsTagById(Long id) {
-        EmsTag tag = emsTagMapper.selectEmsTagById(id);
-
-        if (null != tag) {
-            tagRelService.deleteByTagCode(tag.getTagCode());
-        }
-
         return emsTagMapper.deleteEmsTagById(id);
     }
 }

+ 18 - 11
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/MeterDeviceServiceImpl.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -57,14 +58,19 @@ public class MeterDeviceServiceImpl implements IMeterDeviceService {
     }
 
     @Override
+    public List<MeterDevice> selectMeterDevByTag(String tagCode, QueryDevice queryDevice) {
+        return meterDeviceMapper.selectMeterDevByTag(tagCode, queryDevice);
+    }
+
+    @Override
     public List<MeterDevice> selectByModel(String deviceModel) {
         return meterDeviceMapper.selectByModel(deviceModel);
     }
 
     @Override
-    public List<MeterDevice> selectMeterDeviceByObj(String areaCode, MeterObjType objType, String boundaryObj,
-                                                    Integer meterCls) {
-        return meterDeviceMapper.selectMeterDeviceByObj(areaCode, objType.getType(), boundaryObj, meterCls);
+    public List<MeterDevice> selectMeterDeviceByObj(String areaCode, Integer meterCls, Integer colMode,
+        MeterObjType objType, String objCode) {
+        return meterDeviceMapper.selectMeterDeviceByObj(areaCode, meterCls, colMode, objType.getType(), objCode);
     }
 
     /**
@@ -111,24 +117,25 @@ public class MeterDeviceServiceImpl implements IMeterDeviceService {
         return meterDeviceMapper.deleteMeterDeviceById(id);
     }
 
-
     @Override
     public Map<String, Integer> cntMeterDevice(String areaCode) {
         Future<?> totalDevice = ThreadUtil.execAsync(() -> meterDeviceMapper.countMeterDeviceByObj(new MeterDevice() {{
             setAreaCode(areaCode);
         }}));
-        Future<?> onlineDevice = ThreadUtil.execAsync(() -> meterDeviceMapper.countOnlineMeterDeviceByObj(new ElecMeterH() {
-            {
-                setStartRecTime(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd));
-                setAreaCode(areaCode);
-            }
-        }));
+        Future<?> onlineDevice = ThreadUtil.execAsync(
+            () -> meterDeviceMapper.countOnlineMeterDeviceByObj(new ElecMeterH() {
+                {
+                    setStartRecTime(DateTimeUtil.currentDateTime(DateTimeUtil.DateFormatter.yyyy_MM_dd));
+                    setAreaCode(areaCode);
+                }
+            }));
 
         Map<String, Integer> result = new HashMap<>();
         try {
             result.put("totalDevice", (Integer) totalDevice.get());
             result.put("onlineDevice", (Integer) onlineDevice.get());
-        } catch (Exception e) {
+        }
+        catch (Exception e) {
             log.error("cntMeterDevice error {}", e.getMessage());
         }
         return result;

+ 10 - 10
ems/ems-core/src/main/java/com/ruoyi/ems/service/impl/ObjTagRelServiceImpl.java

@@ -20,6 +20,16 @@ public class ObjTagRelServiceImpl implements IObjTagRelService {
     private ObjTagRelMapper objTagRelMapper;
 
     @Override
+    public int save(ObjTagRel objTagRel) {
+        return objTagRelMapper.insert(objTagRel);
+    }
+
+    @Override
+    public int remove(ObjTagRel objTagRel) {
+        return objTagRelMapper.delete(objTagRel);
+    }
+
+    @Override
     public List<ObjTagRel> selectListByType(int objType) {
         return objTagRelMapper.selectListByType(objType);
     }
@@ -35,17 +45,7 @@ public class ObjTagRelServiceImpl implements IObjTagRelService {
     }
 
     @Override
-    public int insertBatch(List<ObjTagRel> list) {
-        return objTagRelMapper.insertBatch(list);
-    }
-
-    @Override
     public int deleteByObjCode(int objType, String objCode) {
         return objTagRelMapper.deleteByObjCode(objType, objCode);
     }
-
-    @Override
-    public int deleteByTagCode(String tagCode) {
-        return objTagRelMapper.deleteByTagCode(tagCode);
-    }
 }

+ 8 - 0
ems/ems-core/src/main/resources/mapper/ems/AreaMapper.xml

@@ -44,6 +44,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </where>
     </select>
 
+    <select id="selectAreaByTag" resultMap="areaResult">
+        select
+            a.id, a.area_code, a.parent_code, a.ancestors, a.area_name, a.short_name, a.`desc`, a.order_num, a.status
+        from adm_area a
+          inner join adm_obj_tag_rel r on a.area_code = r.obj_code and r.obj_type = 1
+        where r.tag_code = #{tagCode}
+    </select>
+
     <select id="selectAreaById" parameterType="Long" resultMap="areaResult">
         <include refid="selectAreaVo"/>
         where id = #{id}

+ 0 - 32
ems/ems-core/src/main/resources/mapper/ems/CoChargingConfigRelMapper.xml

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper
-PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.ruoyi.ems.mapper.CoChargingConfigRelMapper">
-    
-    <resultMap type="com.ruoyi.ems.domain.CoChargingConfigRel" id="CoChargingConfigRelResult">
-        <result property="priceCfgId"    column="price_cfg_id"    />
-        <result property="areaCode"      column="area_code"    />
-    </resultMap>
-
-    <sql id="selectAdmCoChargingConfigRelVo">
-        select price_cfg_id, area_code from adm_co_charging_config_rel
-    </sql>
-
-    <select id="selectRelList" parameterType="java.lang.Long" resultMap="CoChargingConfigRelResult">
-        <include refid="selectAdmCoChargingConfigRelVo"/>
-        where price_cfg_id = #{cfgId}
-    </select>
-
-    <insert id="insertRelBatch" parameterType="java.util.List">
-        insert into adm_co_charging_config_rel (price_cfg_id, area_code)
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.priceCfgId}, #{item.areaCode})
-        </foreach>
-    </insert>
-
-    <delete id="deleteRel" parameterType="Long">
-        delete from adm_co_charging_config_rel where price_cfg_id = #{cfgId}
-    </delete>
-</mapper>

+ 44 - 7
ems/ems-core/src/main/resources/mapper/ems/MeterDeviceMapper.xml

@@ -88,13 +88,50 @@
                m.magnification,
                m.spec_desc
         from adm_meter_device m
-        where m.area_code = #{areaCode}
-          and m.meter_cls = #{meterCls}
-          and m.device_code in
-              (select r.meter_device
-               from adm_meter_boundary_rel r
-               where r.boundary_obj = #{boundaryObj}
-                 and r.obj_type = #{objType})
+        <where>
+            <if test="areaCode != null and areaCode != ''">
+                AND m.area_code = #{areaCode}
+            </if>
+            <if test="meterCls != null">
+                AND m.meter_cls = #{meterCls}
+            </if>
+            <if test="colMode != null">
+                AND m.col_mode = #{colMode}
+            </if>
+            <if test="objType != null and objCode != null and objCode != ''">
+                AND m.device_code in
+                 (select r.meter_device
+                     from adm_meter_boundary_rel r
+                  where r.boundary_obj = #{objCode}
+                  and r.obj_type = #{objType})
+            </if>
+        </where>
+    </select>
+
+    <select id="selectMeterDevByTag" resultMap="meterDeviceResult">
+        select m.id,
+        m.area_code,
+        m.device_model,
+        m.device_code,
+        m.device_name,
+        m.location,
+        m.location_ref,
+        m.meter_cls,
+        m.col_cycle,
+        m.col_mode,
+        m.magnification,
+        m.spec_desc
+        from adm_meter_device m
+          left join adm_obj_tag_rel r on r.obj_code = m.device_code and r.obj_type = 4
+        <where>
+            <if test="tagCode != null and tagCode != ''">and r.tag_code = #{tagCode}</if>
+            <if test="queryDevice.deviceCode != null and queryDevice.deviceCode != ''">and m.device_code = #{queryDevice.deviceCode}</if>
+            <if test="queryDevice.areaCode != null and queryDevice.areaCode != ''">and m.area_code = #{queryDevice.areaCode}</if>
+            <if test="queryDevice.deviceModel != null and queryDevice.deviceModel != ''">and m.device_model = #{queryDevice.deviceModel}</if>
+            <if test="queryDevice.meterCls != null and queryDevice.meterCls != ''">and m.meter_cls = #{queryDevice.meterCls}</if>
+            <if test="queryDevice.deviceEnable != null">and m.device_enable = #{queryDevice.deviceEnable}</if>
+            <if test="queryDevice.colMode != null ">and m.col_mode = #{queryDevice.colMode}</if>
+        </where>
     </select>
 
     <insert id="insertMeterDevice" parameterType="com.ruoyi.ems.domain.MeterDevice" useGeneratedKeys="true"

+ 20 - 2
ems/ems-core/src/main/resources/mapper/ems/MeterReadingMapper.xml

@@ -32,7 +32,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="meterReading"    column="meter_reading"    />
         <result property="meterTime"    column="meter_time"    />
         <result property="increase"    column="increase"    />
-        <result property="increase"    column="increase"    />
         <result property="createTime"    column="create_time"    />
         <result property="updateTime"    column="update_time"    />
     </resultMap>
@@ -57,6 +56,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         limit 1
     </select>
 
+    <!-- 根据设备代码列表查询区域用能汇总 -->
+    <select id="selectSummaryByDevices" resultType="java.math.BigDecimal">
+        SELECT
+        ROUND(SUM(r.increase), 2) as quantity
+        FROM adm_meter_reading r
+        WHERE r.device_code IN
+        <foreach collection="meterDevices" item="device" open="(" close=")" separator=",">
+            #{device}
+        </foreach>
+        <if test="queryMeter.areaCode != null and queryMeter.areaCode != ''">
+            AND r.area_code = #{queryMeter.areaCode}
+        </if>
+        <if test="queryMeter.startRecTime != null and queryMeter.startRecTime != ''">
+            AND r.meter_month &gt;= #{queryMeter.startRecTime}
+        </if>
+        <if test="queryMeter.endRecTime != null and queryMeter.endRecTime != ''">
+            AND r.meter_month &lt;= #{queryMeter.endRecTime}
+        </if>
+    </select>
+
     <select id="selectList" parameterType="com.ruoyi.ems.model.QueryMeter" resultMap="MeterReadingManualResult">
         <include refid="selectMeterReadingManualVo"/>
         <where>  
@@ -77,7 +96,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             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="startRecTime != null  and startRecTime != ''"> and meter_month &gt;= #{startRecTime}</if>
             <if test="endRecTime != null  and endRecTime != ''"> and meter_month &lt;= #{endRecTime}</if>
         </where>

+ 14 - 14
ems/ems-core/src/main/resources/mapper/ems/ObjTagRelMapper.xml

@@ -15,6 +15,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select tag_code, obj_type, obj_code from adm_obj_tag_rel
     </sql>
 
+
+    <insert id="insert" parameterType="com.ruoyi.ems.domain.ObjTagRel">
+        replace into adm_obj_tag_rel (tag_code, obj_type, obj_code) values (#{tagCode}, #{objType}, #{objCode})
+    </insert>
+
+    <insert id="delete" parameterType="com.ruoyi.ems.domain.ObjTagRel">
+        delete from adm_obj_tag_rel where tag_code = #{tagCode} and obj_type = #{objType} and obj_code = #{objCode}
+    </insert>
+
     <select id="selectListByType" parameterType="java.lang.Integer" resultMap="objTagRelResult">
         select
             r.tag_code, t.tag_name, r.obj_type, r.obj_code
@@ -24,8 +33,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="selectListByTagCode" resultMap="objTagRelResult">
-        <include refid="selectAdmObjTagRelVo"/>
-        where obj_type = #{objType} and tag_code = #{tagCode}
+        select
+            r.tag_code, t.tag_name, r.obj_type, r.obj_code
+        from adm_obj_tag_rel r
+                 left join dim_ems_tag t on r.tag_code = t.tag_code
+        where r.obj_type = #{objType} and r.tag_code = #{tagCode}
     </select>
 
     <select id="selectListByObjCode" resultMap="objTagRelResult">
@@ -36,18 +48,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where r.obj_type = #{objType} and r.obj_code = #{objCode}
     </select>
 
-    <insert id="insertBatch" parameterType="java.util.List">
-        insert into adm_obj_tag_rel (tag_code, obj_type, obj_code)
-        values
-        <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.tagCode}, #{item.objType}, #{item.objCode})
-        </foreach>
-    </insert>
-
-    <delete id="deleteByTagCode" >
-        delete from adm_obj_tag_rel where tag_code = #{tagCode}
-    </delete>
-
 
     <delete id="deleteByObjCode">
         delete from adm_obj_tag_rel where obj_type = #{objType} and obj_code = #{objCode}

+ 31 - 29
ems/sql/ems_init_data.sql

@@ -33,20 +33,20 @@ INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `s
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30010104', '321283124S300101', '0,321283124S3001,321283124S300101', '二楼', '二楼', '综合楼厨房', 4, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10101', '321283124S30010101', '0,321283124S3001,321283124S300101,321283124S30010101', '卫生间', '卫生间', '卫生间', 1, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10102', '321283124S30010101', '0,321283124S3001,321283124S300101,321283124S30010101', '开水间', '开水间', '开水间', 2, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10103', '321283124S30010101', '0,321283124S3001,321283124S300101,321283124S30010101', '货车服务空间', '货车服务空间', '货车服务空间', 16, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10201', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '超市', '超市', '超市', 3, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10202', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '特产市集', '特产市集', '特产市集', 4, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10203', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '中餐厅', '中餐厅', '中餐厅', 5, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10204', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '德克士', '德克士', '德克士', 6, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10205', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '共和春面馆', '共和春面馆', '共和春面馆', 7, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10206', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '堂食餐饮', '堂食餐饮', '堂食餐饮', 8, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10207', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '传统小吃', '传统小吃', '传统小吃', 9, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10208', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '沪上阿姨', '沪上阿姨', '沪上阿姨', 10, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10209', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '微团生活馆', '微团生活馆', '微团生活馆', 11, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10210', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '服饰鞋帽', '服饰鞋帽', '服饰鞋帽', 12, 0);
-
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30010201', '321283124S300102', '0,321283124S3001,321283124S300102', '北区司机之家维修间', '司机之家维修间', '北区司机之家维修间', 2, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30010202', '321283124S300102', '0,321283124S3001,321283124S300102', '北区司机之家二楼', '司机之家二楼', '北区司机之家二楼', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10103', '321283124S30010101', '0,321283124S3001,321283124S300101,321283124S30010101', '货车服务空间', '货车服务空间', '货车服务空间', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10201', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '超市', '超市', '超市', 1, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10202', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '特产市集', '特产市集', '特产市集', 2, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10203', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '中餐厅', '中餐厅', '中餐厅', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10204', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '德克士', '德克士', '德克士', 4, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10205', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '共和春面馆', '共和春面馆', '共和春面馆', 5, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10206', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '堂食餐饮', '堂食餐饮', '堂食餐饮', 6, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10207', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '传统小吃', '传统小吃', '传统小吃', 7, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10208', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '沪上阿姨', '沪上阿姨', '沪上阿姨', 8, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10209', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '微团生活馆', '微团生活馆', '微团生活馆', 9, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('B-10210', '321283124S30010102', '0,321283124S3001,321283124S300101,321283124S30010102', '服饰鞋帽', '服饰鞋帽', '服饰鞋帽', 10, 0);
+
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30010201', '321283124S300102', '0,321283124S3001,321283124S300102', '北区司机之家维修间', '司机之家维修间', '北区司机之家维修间', 1, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30010202', '321283124S300102', '0,321283124S3001,321283124S300102', '北区司机之家二楼', '司机之家二楼', '北区司机之家二楼', 2, 0);
 
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020101', '321283124S300201', '0,321283124S3002,321283124S300201', '一楼', '一楼', '综合楼一楼', 1, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020102', '321283124S300201', '0,321283124S3002,321283124S300201', '商铺', '商铺', '综合楼商铺', 2, 0);
@@ -54,20 +54,20 @@ INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `s
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020104', '321283124S300201', '0,321283124S3002,321283124S300201', '二楼', '二楼', '综合楼厨房', 4, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10101', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '卫生间', '卫生间', '卫生间', 1, 0);
 INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10102', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '开水间', '开水间', '开水间', 2, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10103', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '货车服务空间', '货车服务空间', '货车服务空间', 16, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10201', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '超市', '超市', '超市', 3, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10202', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '特产市集', '特产市集', '特产市集', 4, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10203', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '中餐厅', '中餐厅', '中餐厅', 5, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10204', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '德克士', '德克士', '德克士', 6, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10205', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '共和春面馆', '共和春面馆', '共和春面馆', 7, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10206', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '堂食餐饮', '堂食餐饮', '堂食餐饮', 8, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10207', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '传统小吃', '传统小吃', '传统小吃', 9, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10208', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '沪上阿姨', '沪上阿姨', '沪上阿姨', 10, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10209', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '微团生活馆', '微团生活馆', '微团生活馆', 11, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10210', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '服饰鞋帽', '服饰鞋帽', '服饰鞋帽', 12, 0);
-
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020201', '321283124S300202', '0,321283124S3002,321283124S300202', '南区司机之家维修间', '南区司机之家维修间', '南区司机之家维修间', 2, 0);
-INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020202', '321283124S300202', '0,321283124S3002,321283124S300202', '南区司机之家二楼', '南区司机之家二楼', '南区司机之家二楼', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10103', '321283124S30020101', '0,321283124S3002,321283124S300201,321283124S30020101', '货车服务空间', '货车服务空间', '货车服务空间', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10201', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '超市', '超市', '超市', 1, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10202', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '特产市集', '特产市集', '特产市集', 2, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10203', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '中餐厅', '中餐厅', '中餐厅', 3, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10204', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '德克士', '德克士', '德克士', 4, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10205', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '共和春面馆', '共和春面馆', '共和春面馆', 5, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10206', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '堂食餐饮', '堂食餐饮', '堂食餐饮', 6, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10207', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '传统小吃', '传统小吃', '传统小吃', 7, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10208', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '沪上阿姨', '沪上阿姨', '沪上阿姨', 8, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10209', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '微团生活馆', '微团生活馆', '微团生活馆', 9, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('N-10210', '321283124S30020102', '0,321283124S3002,321283124S300201,321283124S30020102', '服饰鞋帽', '服饰鞋帽', '服饰鞋帽', 10, 0);
+
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020201', '321283124S300202', '0,321283124S3002,321283124S300202', '南区司机之家维修间', '南区司机之家维修间', '南区司机之家维修间', 1, 0);
+INSERT INTO `adm_area` (`area_code`, `parent_code`, `ancestors`, `area_name`, `short_name`, `desc`, `order_num`, `status`) VALUES ('321283124S30020202', '321283124S300202', '0,321283124S3002,321283124S300202', '南区司机之家二楼', '南区司机之家二楼', '南区司机之家二楼', 2, 0);
 
 -- 区域属性属性
 INSERT INTO `adm_area_attr` (`area_code`, `attr_org`, `mgr_org`, `leader`, `phone`, `open_date`, `floor_area`, `usable_area`, `floor`, `longitude`, `latitude`) VALUES ('321283124S3001', '常泰大桥服务区', '润扬大桥投资管理有限公司', 'xxx', '13000000000', '2025-01-01', 7250, 6000, NULL, 120.050937, 32.071956);
@@ -361,6 +361,7 @@ insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-1020
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-10209', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('B-10210', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('321283124S300102', 1, 'Area_01');
+insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('321283124S30010103', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-102', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10201', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10202', 1, 'Area_01');
@@ -373,6 +374,7 @@ insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-1020
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10209', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('N-10210', 1, 'Area_01');
 insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('321283124S300202', 1, 'Area_01');
+insert into adm_obj_tag_rel (`obj_code`, `obj_type`, `tag_code`) VALUES ('321283124S30020103', 1, 'Area_01');
 
 
 -- 服务区用电属性数据
@@ -578,8 +580,8 @@ INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2003_AV_0006');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, '321283124S300101', 45, 'C_2004_AV_0400');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10204', 45, 'C_2003_AV_0206');
+INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10208', 45, 'C_2003_AV_0238');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10209', 45, 'C_2003_AV_0214');
-INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10209', 45, 'C_2003_AV_0238');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10210', 45, 'C_2003_AV_0246');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10207', 45, 'C_2003_AV_0278');
 INSERT INTO `adm_meter_boundary_rel` (`obj_type`, `boundary_obj`, `meter_cls`, `meter_device`) VALUES (1, 'B-10205', 45, 'C_2003_AV_0294');

+ 3 - 14
ems/sql/ems_server.sql

@@ -297,8 +297,9 @@ create table dim_ems_tag (
   unique key ux_ems_tag(`tag_code`)
 ) engine=innodb auto_increment=1 comment = '标签分类';
 
-INSERT INTO `dim_ems_tag` (`tag_model`, `tag_code`, `tag_name`, `mod_flag`, `tag_color`) VALUES ('Area', 'Area_00', '公共区域', 0, null);
-INSERT INTO `dim_ems_tag` (`tag_model`, `tag_code`, `tag_name`, `mod_flag`, `tag_color`) VALUES ('Area', 'Area_01', '商户区域', 0, null);
+INSERT INTO dim_ems_tag (`tag_model`, `tag_code`, `tag_name`, `mod_flag`, `tag_color`) VALUES ('Area', 'Area_01', '商户区域', 0, 'rgba(255, 120, 0, 1)');
+INSERT INTO dim_ems_tag (`tag_model`, `tag_code`, `tag_name`, `mod_flag`, `tag_color`) VALUES ('MeterDev', 'MeterDev_Gt_45', '公摊电表', 0, 'rgba(255, 120, 0, 1)');
+INSERT INTO dim_ems_tag (`tag_model`, `tag_code`, `tag_name`, `mod_flag`, `tag_color`) VALUES ('MeterDev', 'MeterDev_Gt_70', '公摊水表', 0, 'rgba(255, 120, 0, 1)');
 
 -- ----------------------------
 -- 电价计量分类
@@ -1199,18 +1200,6 @@ create table adm_co_charging_config (
   unique key ux_co_charging_config(`area_code`)
 ) engine=innodb auto_increment=1 comment = '商户能源计费配置';
 
-
--- ----------------------------
--- 商户能源计费关系表
--- ----------------------------
-drop table if exists adm_co_charging_config_rel;
-create table adm_co_charging_config_rel (
-  `price_cfg_id`          bigint(20)      not null auto_increment      comment '计费序号',
-  `area_code`             varchar(16)     not null                     comment '区块编码',
-  unique key ux_co_emsprice_config_rel(`price_cfg_id`, `area_code`)
-) engine=innodb comment = '商户能源计费关系表';
-
-
 -- ----------------------------
 -- 电网供应计量表
 -- ----------------------------

+ 1 - 2
ems/sql/ems_sys_data.sql

@@ -66,8 +66,7 @@ insert into sys_menu values ('154',  '巡检报告',       '5',    '4',  'oper-r
 insert into sys_menu values ('161',  '区域配置',       '6',    '1',  'areacfg',            'basecfg/area/index',    '', 1, 0, 'C', '0', '0',   'basecfg:area:list',      'cfgwrite',       'admin', sysdate(), '', null, '区域配置');
 insert into sys_menu values ('162',  '设备设施',       '6',    '2',  'devicecfg',          '',                       '', 1, 0, 'M', '0', '0',   'basecfg:device',         'devicemgr',      'admin', sysdate(), '', null, '设备设施');
 insert into sys_menu values ('163',  '能源计量',       '6',    '3',  'energycfg',          '',                       '', 1, 0, 'M', '0', '0',   'basecfg:energy',         'energy',         'admin', sysdate(), '', null, '能源计量');
-insert into sys_menu values ('164',  '标签管理',       '6',    '4',  'emstag',             'basecfg/tag',            '', 1, 0, 'C', '0', '0',   'basecfg:tag:list',       'tree',           'admin', sysdate(), '', null, '标签菜单');
-insert into sys_menu values ('165',  '系统对接',       '6',    '5',  'adapter',          null, '', 1, 0, 'M', '0', '0', '',  'client',      'admin', sysdate(), '', null, '系统对接');
+insert into sys_menu values ('165',  '系统对接',       '6',    '4',  'adapter',          null, '', 1, 0, 'M', '0', '0', '',  'client',      'admin', sysdate(), '', null, '系统对接');
 
 insert into sys_menu values ('170',  '用户管理',       '7',   '1',  'user',               'system/user/index',      '', 1, 0, 'C', '0', '0',   'system:user:list',       'user',           'admin', sysdate(), '', null, '用户管理菜单');
 insert into sys_menu values ('171',  '角色管理',       '7',   '2',  'role',               'system/role/index',      '', 1, 0, 'C', '0', '0',   'system:role:list',       'peoples',        'admin', sysdate(), '', null, '角色管理菜单');