|
@@ -0,0 +1,229 @@
|
|
|
+package com.bz.smart_city.quartz.service.impl;
|
|
|
+
|
|
|
+import com.bz.smart_city.commom.util.DateTimeUtil;
|
|
|
+import com.bz.smart_city.dao.pay.AmountWaterUsedAmountMapper;
|
|
|
+import com.bz.smart_city.dao.pay.BaseClosingAccountInfoMapper;
|
|
|
+import com.bz.smart_city.dao.pay.PayBaseConfigMapper;
|
|
|
+import com.bz.smart_city.dto.pay.*;
|
|
|
+import com.bz.smart_city.quartz.service.AmountSynService;
|
|
|
+import com.bz.smart_city.quartz.service.JobAndTriggerService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.time.Duration;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @description
|
|
|
+ * @auto wangli
|
|
|
+ * @data 2020-09-27 10:51
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class AmountSynServiceImpl implements AmountSynService {
|
|
|
+
|
|
|
+ @Value("1")
|
|
|
+ private BigInteger createBy;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private BaseClosingAccountInfoMapper baseClosingAccountInfoMapper;
|
|
|
+ @Resource
|
|
|
+ private AmountWaterUsedAmountMapper amountWaterUsedAmountMapper;
|
|
|
+ @Resource
|
|
|
+ private PayBaseConfigMapper payBaseConfigMapper;
|
|
|
+ @Resource
|
|
|
+ private JobAndTriggerService jobAndTriggerService;
|
|
|
+ @Override
|
|
|
+ public void saveQrtzTask(PayBaseConfigDto payBaseConfigDto) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void amountUpdate(Integer siteId, Integer customerId) {
|
|
|
+
|
|
|
+
|
|
|
+ //获取水表信息
|
|
|
+ //调取接口获取水量信息
|
|
|
+ //保存水量信息
|
|
|
+ }
|
|
|
+
|
|
|
+ /* public void amountUpdate(Integer siteId, Integer customerId){
|
|
|
+
|
|
|
+ //获取最新账期
|
|
|
+
|
|
|
+ List<BaseClosingAccountInfoDto> baseClosingAccountInfoDtos = baseClosingAccountInfoMapper.getList(null,null, BigInteger.valueOf(siteId),BigInteger.valueOf(customerId),0);
|
|
|
+ if(baseClosingAccountInfoDtos.size()>0){
|
|
|
+ //customerId accountPeriod 是否有结算计划
|
|
|
+ BaseClosingAccountInfoDto baseClosingAccountInfoDto = baseClosingAccountInfoDtos.get(0);
|
|
|
+ Integer year = baseClosingAccountInfoDto.getYear();
|
|
|
+ Integer month = baseClosingAccountInfoDto.getMonth();
|
|
|
+
|
|
|
+ String accountPeriod = year + String.format("%02d",month);
|
|
|
+
|
|
|
+
|
|
|
+ ClearingRecord clearingRecord = //clearingRecordMapper.findClearingRecordByAccoutPeriodAndCust(accountPeriod,Integer.valueOf(customerId));
|
|
|
+ if(clearingRecord!=null){
|
|
|
+ //产生水量基础计划
|
|
|
+ Integer totalNum = amountWaterUsedAmountMapper.getAllAmountCount(year,month,siteId,customerId);
|
|
|
+ Integer num = totalNum / 500 + (totalNum % 500 > 0 ? 1 : 0);
|
|
|
+ log.info("抄表计划生成开始:" + LocalDateTime.now() + ",计划条数" + totalNum);
|
|
|
+ for (int i = 0; i < num; i++)
|
|
|
+ {
|
|
|
+ int a = amountWaterUsedAmountMapper.createdAmount(year,month,siteId,customerId);
|
|
|
+ log.info("成功条数" + i + ":" + a);
|
|
|
+ }
|
|
|
+ log.info("抄表计划生成完成:" + LocalDateTime.now());
|
|
|
+
|
|
|
+ //获取结算水量
|
|
|
+ log.info("水量同步开始:" + LocalDateTime.now());
|
|
|
+ HashMap<BigInteger, ClearingDataInfoDto> clearingDataHashMap = clearingRecordItemMapper.findClearingDataHashMap(clearingRecord.getId(),1);
|
|
|
+ if(clearingDataHashMap!=null&&clearingDataHashMap.size()>0) {
|
|
|
+ //同步水量
|
|
|
+ List<AmountWaterUsedAmountDto> amountWaterUsedAmountDtos = amountWaterUsedAmountMapper.getAllAmountRecord(year, month,siteId, customerId);
|
|
|
+ //批量更新水量信息
|
|
|
+ List<AmountWaterUsedAmountDto> updates = new ArrayList<>();
|
|
|
+
|
|
|
+ //换表记录
|
|
|
+ HashMap<BigInteger, ReplaceMeterCountDto> replaceMap = new HashMap<>();
|
|
|
+ if(amountWaterUsedAmountDtos.size() > 0){
|
|
|
+ LocalDateTime stTime = LocalDateTime.ofInstant(baseClosingAccountInfoDtos.get(0).getStartTime().toInstant(), ZoneId.systemDefault());
|
|
|
+ HashMap<BigInteger, ReplaceMeterCountDto> childReplaceMap = amountWaterUsedAmountMapper.getRepalceRecordCount(stTime,null,null,null,customerId);
|
|
|
+ if(childReplaceMap.size() >0){
|
|
|
+ List<ReplaceMeterDto> replaceMeterDtoList = amountWaterUsedAmountMapper.getRepalceRecordDetail(stTime,null,null,null,customerId);
|
|
|
+ if(replaceMeterDtoList.size() >0){
|
|
|
+ for(int i=0;i<replaceMeterDtoList.size();i++){
|
|
|
+ if(childReplaceMap.containsKey(replaceMeterDtoList.get(i).getDeviceId())){
|
|
|
+ ReplaceMeterCountDto replaceMeterCountDto = childReplaceMap.get(replaceMeterDtoList.get(i).getDeviceId());
|
|
|
+ if(replaceMeterCountDto.getReplaceMeterDtoList() == null)
|
|
|
+ {
|
|
|
+ replaceMeterCountDto.setReplaceMeterDtoList(new ArrayList<>());
|
|
|
+ }
|
|
|
+ replaceMeterCountDto.getReplaceMeterDtoList().add(replaceMeterDtoList.get(i));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ replaceMap.putAll(childReplaceMap);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (AmountWaterUsedAmountDto amountWaterUsedAmountDto : amountWaterUsedAmountDtos) {
|
|
|
+ BigInteger watermeterId = amountWaterUsedAmountDto.getWatermeterId();
|
|
|
+ if (watermeterId != null && clearingDataHashMap.containsKey(watermeterId)) {
|
|
|
+ ClearingDataInfoDto clearingDataDTO = clearingDataHashMap.get(watermeterId);
|
|
|
+ BigInteger amountId = amountWaterUsedAmountDto.getId();//水量id
|
|
|
+ BigDecimal readingOld = amountWaterUsedAmountDto.getLastreading();//上期止度
|
|
|
+ if (clearingDataDTO.getCurrentPeriodData() != null) {
|
|
|
+ BigDecimal readingNew = new BigDecimal(clearingDataDTO.getCurrentPeriodData()).setScale(0, BigDecimal.ROUND_DOWN);//本期止度
|
|
|
+ BigInteger meterid = amountWaterUsedAmountDto.getWatermeterId();//水表id
|
|
|
+ BigDecimal payAmount = BigDecimal.ZERO;//结算水量
|
|
|
+ Date lastAmountDate = amountWaterUsedAmountDto.getLastrecorddate();
|
|
|
+ BigDecimal Amount = BigDecimal.ZERO;//实际用水量
|
|
|
+ BigDecimal tempReading = BigDecimal.ZERO;
|
|
|
+ tempReading = readingOld;//起度或上期的止度
|
|
|
+ String readDate = clearingDataDTO.getMeterReadDate();
|
|
|
+ Integer calculateway = amountWaterUsedAmountDto.getCalculateway();
|
|
|
+
|
|
|
+ //换表记录计算
|
|
|
+ boolean replace = false;
|
|
|
+ ReplaceMeterCountDto replaceMeterCountDto=null;
|
|
|
+ if(replaceMap.containsKey(watermeterId)){
|
|
|
+ replaceMeterCountDto = replaceMap.get(watermeterId);
|
|
|
+ //有换表记录且换表时间在两次同步之间 用水量=(换表中的旧表止度-上次抄表止度) + (本次止度-换表中的新表起度)
|
|
|
+ if(replaceMeterCountDto != null){
|
|
|
+ LocalDateTime currTime = LocalDateTime.parse(readDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));//本次抄表时间
|
|
|
+ LocalDateTime previousTime = LocalDateTime.ofInstant(amountWaterUsedAmountDto.getLastrecorddate().toInstant(),ZoneId.systemDefault()); //上个帐期的结算抄表时间
|
|
|
+
|
|
|
+ ReplaceMeterDto oldReplaceMeterDto = null;
|
|
|
+ for(int i = 0;i<replaceMeterCountDto.getReplaceMeterDtoList().size();i++){
|
|
|
+ LocalDateTime replaceTime = replaceMeterCountDto.getReplaceMeterDtoList().get(i).getReplaceTime(); //换表时间
|
|
|
+
|
|
|
+ Duration duration1 = Duration.between(previousTime,replaceTime);
|
|
|
+ Duration duration2 = Duration.between(replaceTime,currTime);
|
|
|
+ if(duration1.toMillis() > 0 && duration2.toMinutes() > 0){
|
|
|
+ BigDecimal replaceEndData = new BigDecimal(replaceMeterCountDto.getReplaceMeterDtoList().get(i).getOldEnd()).setScale(2,BigDecimal.ROUND_DOWN);//换表中的旧表止度
|
|
|
+ BigDecimal replaceData = BigDecimal.ZERO;
|
|
|
+ if(oldReplaceMeterDto == null)
|
|
|
+ replaceData = tempReading;
|
|
|
+ else
|
|
|
+ replaceData = new BigDecimal(oldReplaceMeterDto.getNewBegin()).setScale(0,BigDecimal.ROUND_DOWN);//换表中的起度
|
|
|
+ BigDecimal oldMeterUse = replaceEndData.subtract(replaceData); //旧表用量
|
|
|
+
|
|
|
+ Amount = Amount.add(oldMeterUse);
|
|
|
+ replace = true;
|
|
|
+
|
|
|
+ oldReplaceMeterDto = replaceMeterCountDto.getReplaceMeterDtoList().get(i);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //新表用量
|
|
|
+ if(oldReplaceMeterDto != null){
|
|
|
+ BigDecimal replaceNewDate = new BigDecimal(oldReplaceMeterDto.getNewBegin()).setScale(0,BigDecimal.ROUND_DOWN);//换表中的新表起度
|
|
|
+ BigDecimal newMeterUse = readingNew.subtract(replaceNewDate);//新表用量
|
|
|
+ Amount = Amount.add(newMeterUse);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!replace){
|
|
|
+ if (readingNew.compareTo(tempReading) > 0)
|
|
|
+ Amount = Amount.add(readingNew.subtract(tempReading));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //计量方式判断
|
|
|
+
|
|
|
+ if (calculateway.equals(1))//按实际用量
|
|
|
+ payAmount = Amount;
|
|
|
+ else if (calculateway.equals(2))//按固定量
|
|
|
+ payAmount = BigDecimal.valueOf(amountWaterUsedAmountDto.getFixedamount());
|
|
|
+ else
|
|
|
+ payAmount = Amount;
|
|
|
+
|
|
|
+ if (payAmount.compareTo(BigDecimal.ZERO) < 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ amountWaterUsedAmountDto.setReading(readingNew);
|
|
|
+ amountWaterUsedAmountDto.setRecorddate(DateTimeUtil.parseDate(readDate, DateTimeUtil.DATE_TIME_FORMAT_SECOND));
|
|
|
+ amountWaterUsedAmountDto.setAmount(Amount);
|
|
|
+ amountWaterUsedAmountDto.setPayamount(payAmount);
|
|
|
+
|
|
|
+ updates.add(amountWaterUsedAmountDto);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ if (updates.size() > 0) {
|
|
|
+ //List<List<AmountWaterUsedAmountDto>> lists = Lists.partition(updates, 500);
|
|
|
+ for (AmountWaterUsedAmountDto amountWaterUsedAmountDto : updates) {
|
|
|
+ amountWaterUsedAmountMapper.batchUpdate(amountWaterUsedAmountDto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ log.info("水量同步结束:" + LocalDateTime.now());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }*/
|
|
|
+}
|