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