瀏覽代碼

结算设备查询

hym 3 年之前
父節點
當前提交
d1ab5c048d

+ 4 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java

@@ -2,6 +2,7 @@ package com.zcxk.rmcp.core.dao;
 
 
 import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.dto.measurementSettlement.MeasurementSettlementDto;
 import com.zcxk.rmcp.api.query.CommonQueryCondition;
 import com.zcxk.rmcp.api.vo.DeviceCommunityVo;
 import com.zcxk.rmcp.api.vo.DeviceNoCellVo;
@@ -61,4 +62,7 @@ public interface DeviceMapper {
     **/
     List<DeviceNoCellVo> listNoCellDevice(@Param("categoryId") Integer categoryId, @Param("userCondition") UserCondition userCondition);
 
+
+
+    List<Device> findMeasurementDevice(MeasurementSettlementDto measurementSettlement);
 }

+ 11 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml

@@ -518,4 +518,15 @@
     <include refid="permissionCondition"/>
       AND rd.community_id = 0
   </select>
+
+  <select id="findMeasurementDevice" resultType="com.zcxk.rmcp.core.entity.Device">
+    select * from rmcp_device rd
+    <where>
+      status=1
+      <if test="companyOrgId != null">and rd.company_org_id = #{companyOrgId}</if>
+      <if test="deptOrgId != null">and rd.dept_org_id = #{deptOrgId}</if>
+      <if test="communityId != null">and rd.community_id = #{communityId}</if>
+    </where>
+  </select>
+
 </mapper>

+ 208 - 12
zoniot-rmcp/zoniot-xxljob-client/src/main/java/com/zcxk/xxljob/jobs/MeasurementSettlementRecordHander.java

@@ -3,19 +3,26 @@ import com.alibaba.fastjson.JSON;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import com.zcxk.core.common.pojo.PageResult;
+import com.zcxk.core.utils.DateUtil;
 import com.zcxk.rmcp.api.dto.measurementSettlement.MeasurementSettlementDto;
+import com.zcxk.rmcp.api.query.CommonQueryCondition;
+import com.zcxk.rmcp.core.dao.DeviceMapper;
+import com.zcxk.rmcp.core.dao.MeasurementInstanceMapper;
 import com.zcxk.rmcp.core.dao.MeasurementRecordMapper;
+import com.zcxk.rmcp.core.dao.MeasurementSettlementMapper;
 import com.zcxk.rmcp.core.dao.mongo.MeterReadRecordDao;
+import com.zcxk.rmcp.core.entity.Device;
+import com.zcxk.rmcp.core.entity.MeasurementInstance;
 import com.zcxk.rmcp.core.entity.MeasurementRecord;
+import com.zcxk.rmcp.core.entity.MeasurementSettlement;
 import com.zcxk.rmcp.core.mongo.MeterReadRecord;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -25,22 +32,211 @@ public class MeasurementSettlementRecordHander {
     MeterReadRecordDao meterReadRecordDao;
     @Resource
     MeasurementRecordMapper measurementRecordMapper;
+    @Resource
+    MeasurementInstanceMapper measurementInstanceMapper;
+    @Resource
+    DeviceMapper deviceMapper;
     @XxlJob("measurementHandler")
     public ReturnT<String> execute(String info) throws Exception {
         log.info("开始执行分发任务");
         MeasurementSettlementDto measurementSettlement=JSON.parseObject(info,MeasurementSettlementDto.class);
-        int i=0;
-        while(true){
-            PageResult<MeterReadRecord> meterReadRecords =
-                    meterReadRecordDao.querySettlementWaterConsumption(measurementSettlement, i);
-            List<MeterReadRecord> records = meterReadRecords.getRows();
-            if(CollectionUtils.isEmpty(records)){
-               break;
+        List<Device> devices = deviceMapper.findMeasurementDevice(measurementSettlement);
+        int page=0;
+        MeasurementInstance measurementInstance=new MeasurementInstance();
+        measurementInstance.setPlanid(measurementSettlement.getId());
+        measurementInstance.setTotalWaterMeters(devices.size());
+        measurementInstance.setCreateBy("admin");
+        measurementInstance.setCreateDate(new Date());
+        Date date=new Date();
+        Integer clearingPeriod = measurementSettlement.getBillingCycle();
+        Date clearingEndDate = getClearingEndDate(date);
+        Date clearingStartDate = getClearingStartDate(clearingEndDate,clearingPeriod);
+        measurementInstance.setClearingDay(Integer.parseInt(DateUtil.formatDate(date, "yyyyMMdd")));
+        measurementInstance.setClearingStartDate(clearingStartDate);
+        measurementInstance.setClearingEndDate(clearingEndDate);
+        measurementInstanceMapper.insert(measurementInstance);
+        List<MeasurementRecord> items = new ArrayList<>();
+
+
+        for(Device device : devices) {
+            MeasurementRecord item = createClearingRecordItem(device,measurementSettlement,date,
+                    measurementInstance.getId());
+            items.add(item);
+            if(items.size() % 1000 == 0) {// 每一千次做一次批量插入
+                measurementRecordMapper.batchInsert(items);
+                items.clear();
             }
-            Map<String, List<MeterReadRecord>> detailmap = records.stream()
-                    .collect(Collectors.groupingBy(d -> d.getDeviceNo() ));
         }
+        if(items.size() > 0) {
+            measurementRecordMapper.batchInsert(items);
+            items.clear();
+        }
+
 
         return ReturnT.SUCCESS;
     }
+
+    protected Date getClearingEndDate(Date clearingDate ) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(clearingDate);
+        calendar.add(Calendar.DATE, -1);
+        Date endDate = calendar.getTime();
+        return endDate;
+    }
+    protected Date getClearingStartDate(Date endDate ,Integer period) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(endDate);
+        calendar.add(Calendar.MONTH, period*-1);
+        Date beginDate = calendar.getTime();
+        return beginDate ;
+    }
+
+    private MeasurementRecord createClearingRecordItem(Device device ,MeasurementSettlementDto measurementSettlement,Date clearingDate,Integer clearingRecordId) {
+        MeasurementRecord item = new MeasurementRecord();
+        item.setDeviceId(device.getId());
+        item.setPlanId(clearingRecordId);
+        item.setMeterNo(device.getMeterNo());
+        item.setFileMeterNo(device.getFileNo());
+        item.setApprovalStatus("0");
+        item.setLocation(device.getAddress());
+        // 1,获取上次结算记录
+        MeasurementRecord lastClearingRecordItem = getDeviceLastClearingRecordItem(device,measurementSettlement,clearingDate);
+        // 2,获取结算周期内的数据
+        Integer clearingPeriod = measurementSettlement.getBillingCycle();
+        Date clearingEndDate = getClearingEndDate(clearingDate);
+        Date clearingStartDate = getClearingStartDate(clearingEndDate,clearingPeriod);
+        List<MeterReadRecord> recordList = meterReadRecordDao.querySettlementWaterConsumption(device,clearingStartDate,clearingEndDate);
+        // 3,获取结算周期内开始数据
+        MeterReadRecordDTO clearingStartMeterRecord = getClearingStartMeterRecord(device,clearingStartDate,lastClearingRecordItem,recordList);
+        item.setLastReading(clearingStartMeterRecord.getReadData()+"");
+        item.setLastPeriodDate(clearingStartMeterRecord.getReadDateTime());
+        // 4,获取结算周期内结束数据
+        MeterReadRecordDTO clearingEndMeterRecord = getClearingEndMeterRecord(device,clearingEndDate,lastClearingRecordItem,recordList);
+        item.setCurrentReading(clearingEndMeterRecord.getReadData()+"");
+        item.setCurrentPeriodDate(clearingEndMeterRecord.getReadDateTime());
+        // 5,计算用水量,本期-上期
+        double currenntWsv = Double.parseDouble(item.getCurrentReading());
+        double lastWsv = Double.parseDouble(item.getLastReading());
+        item.setWaterConsumption(currenntWsv-lastWsv);
+        return item ;
+    }
+    /**
+     *  获取设备上一次结算的数据
+     * @param device
+     * @param clearingPlan
+     * @param clearingDate
+     * @return
+     */
+    protected MeasurementRecord getDeviceLastClearingRecordItem(Device device ,MeasurementSettlementDto clearingPlan,Date clearingDate ) {
+        // 1,获取上次的结算记录
+        Date lastClearingDate = getLastClearingDate(clearingDate,clearingPlan.getBillingCycle());
+        Integer lastClearingDay = Integer.parseInt(DateUtil.format(lastClearingDate, "yyyyMMdd"));
+        MeasurementInstance lastClearingRecord = measurementInstanceMapper.findClearingRecord(clearingPlan.getId(), lastClearingDay);
+        if(lastClearingRecord == null) {
+            return null ;
+        }
+        else {
+            MeasurementRecord lastClearingRecordItem = measurementRecordMapper.findClearingRecordItem(device.getId(), lastClearingRecord.getId());
+            return lastClearingRecordItem ;
+        }
+    }
+    /**
+     * 获取上次结算日期
+     * @param clearingDate
+     * @param period
+     * @return
+     */
+    protected Date getLastClearingDate(Date clearingDate ,Integer period ) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(clearingDate);
+        calendar.add(Calendar.MONTH, period*-1);
+        Date beginDate = calendar.getTime();
+        return beginDate ;
+    }
+    /**
+     * 获取结算开始日期的抄表数据
+     * @param device 设备
+     * @param clearingStartDate 本次月结开始时间
+     * @param lastItem 上次月结数据
+     * @param
+     * @return
+     */
+    protected MeterReadRecordDTO getClearingStartMeterRecord(Device device,Date clearingStartDate ,MeasurementRecord lastItem,List<MeterReadRecord> records) {
+        MeterReadRecordDTO r = new MeterReadRecordDTO();
+        if(device.getDeviceStatus() == 5) { // 设备为未启动则直接设置为 0
+            r.setReadDateTime(clearingStartDate);
+            r.setReadData(0d);
+        }
+        else {
+            if(lastItem != null) { // 将上期抄表止度作为本期抄表开始起度
+                r.setReadDateTime(lastItem.getCurrentPeriodDate());
+                r.setReadData(Double.valueOf(lastItem.getCurrentReading()));
+            }
+            else { // 没有上一期数据则取距离结算开始日期最近的数据
+                List<MeterReadRecord> mrs = meterReadRecordDao.queryDeviceMeterReadRecordWithCondtion(
+                        device.getId(), Integer.parseInt(DateUtil.formatDate(clearingStartDate, "yyyyMMdd"))
+                );
+                if(mrs.size() == 0 ) { // 获取不到数据,从取距离结算结束日期最远的数据
+                    if(records.size() == 0) {
+                        r.setReadDateTime(clearingStartDate);
+                        r.setReadData(0d);
+                    }
+                    else {
+                        MeterReadRecord mr = records.get(records.size() - 1);
+                        r.setReadDateTime(mr.getData().get(0).getReadTime());
+                        r.setReadData(mr.getData().get(0).getReadData());
+                    }
+                }
+                else {
+                    MeterReadRecord mr = mrs.get(0);
+                    r.setReadDateTime(mr.getData().get(0).getReadTime());
+                    r.setReadData(mr.getData().get(0).getReadData());
+                }
+            }
+        }
+        return r;
+    }
+    /**
+     *  获取结算结束日期的抄表数据
+     * @param device 设备
+     * @param clearingEndDate 本次月结结束时间
+     * @param lastItem 上次月结数据
+     * @param
+     * @return
+     */
+    protected MeterReadRecordDTO getClearingEndMeterRecord(Device device,Date clearingEndDate ,MeasurementRecord lastItem,List<MeterReadRecord> records) {
+        MeterReadRecordDTO r = new MeterReadRecordDTO();
+        if(device.getDeviceStatus() == 5) { // 设备为未启动则直接设置为 0
+            r.setReadDateTime(clearingEndDate);
+            r.setReadData(0d);
+        }
+        else {
+            if(records.size() == 0) { // 本期结算周期内无数据,则直接取上期的结束数据
+                if(lastItem != null) {
+                    r.setReadDateTime(lastItem.getCurrentPeriodDate());
+                    r.setReadData(Double.valueOf(lastItem.getCurrentReading()));
+                }
+                else { // 无上期数据时,则取距离结算结束日期最近的数据
+
+                    List<MeterReadRecord> mrs = meterReadRecordDao.queryDeviceMeterReadRecordWithCondtion( device.getId()
+                            , Integer.parseInt(DateUtil.formatDate(clearingEndDate, "yyyyMMdd")));
+                    if(mrs.size() == 0 ) {
+                        r.setReadDateTime(clearingEndDate);
+                        r.setReadData(0D);
+                    }
+                    else {
+                        MeterReadRecord mr = mrs.get(0);
+                        r.setReadDateTime(mr.getData().get(0).getReadTime());
+                        r.setReadData(mr.getData().get(0).getReadData());
+                    }
+                }
+            }
+            else { // 取结算周期内距离结算结束日期最近的数据
+                MeterReadRecord mr = records.get(0);
+                r.setReadDateTime(mr.getData().get(0).getReadTime());
+                r.setReadData(mr.getData().get(0).getReadData());
+            }
+        }
+        return r ;
+    }
 }