Browse Source

水量第天同步:增加同步未开户用户

oppadmin 4 years ago
parent
commit
49ef67b4eb

+ 14 - 0
smart-city-platform/src/main/java/com/bz/smart_city/dao/pay/AmountWaterUsedAmountMapper.java

@@ -68,6 +68,8 @@ public interface AmountWaterUsedAmountMapper {
 
     List<PayBaseCustomerandmeterrela> getCustIdAndSiteId();
 
+    List<PayBaseCustomerandmeterrela> getCustIdAndSiteIdByDevice();
+
     //换表明细 list:设备ID
     List<ReplaceMeterDto> getRepalceRecordDetail(@Param("stTime")LocalDateTime stTime,@Param("etTime")LocalDateTime etTime,@Param("list")List<BigInteger> list,@Param("siteId")Integer siteId,@Param("customerId")Integer customerId);
 
@@ -77,4 +79,16 @@ public interface AmountWaterUsedAmountMapper {
 
     Integer getwaterUserdAmount(@Param("year")Integer year,@Param("month")Integer month,@Param("siteId")Integer siteId,
          @Param("customerId")Integer customerId, @Param("id")BigInteger id);
+
+
+    List<BigInteger> getNoOpenWaterMeterIdByDay(@Param("siteId") Integer siteId, @Param("customerId")Integer customerId);
+
+    //生成抄表记录初始数据(未开户用户)
+    Integer createdNoOpenAmountByDay(@Param("siteId") Integer siteId, @Param("customerId")Integer customerId);
+
+    //未生成抄表记录的用户(未开户用户)
+    Integer getNoOpenAmountCountByDay( @Param("siteId") Integer siteId, @Param("customerId")Integer customerId);
+
+    //未开户用户的抄表数据
+    List<AmountWaterUsedAmountByDay> getNoOpenAmountRecordByDay(@Param("siteId") Integer siteId,@Param("customerId")Integer customerId);
 }

+ 51 - 1
smart-city-platform/src/main/java/com/bz/smart_city/service/impl/pay/AmountSynByDayServiceImpl.java

@@ -98,9 +98,11 @@ public class AmountSynByDayServiceImpl implements AmountSynByDayService, Initial
     }
 
     public void start(){
-        List<PayBaseCustomerandmeterrela> payBaseCustomerandmeterrelas = amountWaterUsedAmountMapper.getCustIdAndSiteId();
+        List<PayBaseCustomerandmeterrela> payBaseCustomerandmeterrelas = amountWaterUsedAmountMapper.getCustIdAndSiteIdByDevice();
         for (PayBaseCustomerandmeterrela payBaseCustomerandmeterrela: payBaseCustomerandmeterrelas){
             this.amountUpdateByDay(payBaseCustomerandmeterrela.getSiteId().intValue(),payBaseCustomerandmeterrela.getCustomerId().intValue());
+
+            this.noOpenUpdateByDay(payBaseCustomerandmeterrela.getSiteId().intValue(),payBaseCustomerandmeterrela.getCustomerId().intValue());
         }
     }
 
@@ -114,6 +116,7 @@ public class AmountSynByDayServiceImpl implements AmountSynByDayService, Initial
             int a = amountWaterUsedAmountMapper.createdAmountByDay(siteId, customerId);
             log.info("成功条数" + i + ":" + a);
         }
+
         log.info("抄表计划生成完成:" + LocalDateTime.now());
 
         log.info("每天水量同步开始:" + LocalDateTime.now());
@@ -271,5 +274,52 @@ public class AmountSynByDayServiceImpl implements AmountSynByDayService, Initial
 
     }
 
+    //未开户用户抄表数据
+    public void noOpenUpdateByDay(Integer siteId, Integer customerId){
+        //产生未开户的day基础计划
+        Integer totalNum = amountWaterUsedAmountMapper.getNoOpenAmountCountByDay(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.createdNoOpenAmountByDay(siteId, customerId);
+            log.info("成功条数" + i + ":" + a);
+        }
+        //获取设备id
+        List<BigInteger> idList = amountWaterUsedAmountMapper.getNoOpenWaterMeterIdByDay(siteId, customerId);
+        List<List<BigInteger>> lists = Lists.partition(idList, 500);
+        HashMap<BigInteger, MeterReadRecordDto> meterReadRecordHashMap = new HashMap<>();
+        for (List<BigInteger> bigIntegers : lists) {
+            //获取抄表数据
+            HashMap<BigInteger, MeterReadRecordDto> childMap = amountWaterUsedAmountMapper.getMeterReadRecord(bigIntegers);
+            meterReadRecordHashMap.putAll(childMap);
+        }
+
+        if(meterReadRecordHashMap.size()>0){
+            //批量更新水量信息
+            List<AmountWaterUsedAmountByDay> updates = new ArrayList<>();
+            //待更新数据
+            List<AmountWaterUsedAmountByDay> amountWaterUsedAmountDtos = amountWaterUsedAmountMapper.getNoOpenAmountRecordByDay(siteId, customerId);
+            for (AmountWaterUsedAmountByDay amountWaterUsedAmountDto : amountWaterUsedAmountDtos) {
+                BigInteger watermeterId = amountWaterUsedAmountDto.getWatermeterId();
+                if (watermeterId != null && meterReadRecordHashMap.containsKey(watermeterId)) {
+                    MeterReadRecordDto meterReadRecord = meterReadRecordHashMap.get(watermeterId);
+                    if (meterReadRecord.getReadData() != null) {
+                        amountWaterUsedAmountDto.setReading(new BigDecimal(meterReadRecord.getReadData()).setScale(0, BigDecimal.ROUND_DOWN));
+                        updates.add(amountWaterUsedAmountDto);
+                    }
+                }
+            }
+
+            if(updates.size() > 0){
+                for (AmountWaterUsedAmountByDay amountWaterUsedAmountDto : updates) {
+                    amountWaterUsedAmountMapper.updateByDate(amountWaterUsedAmountDto);
+                }
+            }
+
+        }
+
+    }
+
 
 }

+ 108 - 0
smart-city-platform/src/main/resources/mapper/pay/AmountWaterUsedAmountMapper.xml

@@ -219,6 +219,16 @@
 
 	</select>
 
+	<select id="getNoOpenAmountCountByDay" resultType="java.lang.Integer">
+		select count(1) as num
+		from sc_device scd
+		left join pay_amount_waterusedamount_day amount on amount.watermeter_id = scd.id
+		and amount.read_date =DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 day) ,'%Y%m%d')
+		where scd.status =1 and amount.id is null
+		<if test="customerId!= null" >and scd.customer_id = #{customerId} </if>
+		<if test="siteId!= null" > and scd.site_id = #{siteId} </if>
+	</select>
+
 	<select id="getAllAmountRecord"  resultType="com.bz.smart_city.dto.pay.AmountWaterUsedAmountDto">
 		select  amount.id,
 				amount.lastreading,
@@ -391,6 +401,64 @@
 		limit 500
 	</insert>
 
+	<insert id ="createdNoOpenAmountByDay" useGeneratedKeys="false">
+		INSERT INTO pay_amount_waterusedamount_day (
+		customerandmeterrela_id,
+		office_id,
+		lastreading,
+		lastrecorddate,
+		metercode,
+		watermeter_id,
+		payamount,
+		reading,
+		recorddate,
+		amount,
+		waterproperty_id,
+		account_id,
+		create_by,
+		create_date,
+		update_by,
+		update_date,
+		remarks,
+		del_flag,
+		site_id,
+		customer_id,
+		read_date,
+		debt
+		) SELECT
+		NULL,
+		NULL,
+		NULL,
+		NULL,
+		c.metercode,
+		c.id,
+		NULL,
+		NULL,
+		NULL,
+		NULL,
+		NULL,
+		NULL,
+		1,
+		NOW(),
+		1,
+		now(),
+		'每天抄表计划',
+		0,
+		c.site_id,
+		c.customer_id,
+		DATE_FORMAT( DATE_SUB( now(), INTERVAL 1 DAY ), '%Y%m%d' ),
+		NULL
+		FROM
+		sc_device c
+		LEFT JOIN pay_amount_waterusedamount_day amount ON amount.watermeter_id = c.id
+		AND amount.read_date = DATE_FORMAT( DATE_SUB( now(), INTERVAL 1 DAY ), '%Y%m%d' )
+		WHERE
+		amount.id IS NULL
+		<if test="customerId!= null" >AND c.customer_id = #{customerId}</if>
+		<if test="siteId!= null" > and c.site_id = #{siteId} </if>
+		limit 500
+	</insert>
+
 	<resultMap id="MeterReadRecordResultMap" type="com.bz.smart_city.dto.pay.MeterReadRecordDto">
 		<result column="device_id" property="deviceId" />
 		<result column="read_time" property="readTime" />
@@ -467,6 +535,25 @@
 		<if test="siteId!= null" > and rela.site_id = #{siteId} </if>
 	</select>
 
+	<select id="getNoOpenAmountRecordByDay"  resultType="com.bz.smart_city.entity.pay.AmountWaterUsedAmountByDay">
+		select  amount.id,
+		amount.lastreading,
+		amount.lastrecorddate,
+		rela.calculateway,
+		rela.fixedamount,
+		amount.watermeter_id watermeterId,
+		amount.recorddate,
+		rela.id customerandmeterrelaId,
+		amount.waterproperty_id waterpropertyId,
+		rela.account_id as accountId
+		from  pay_amount_waterusedamount_day amount
+		left join pay_base_customerandmeterrela rela on rela.id= amount.customerandmeterrela_id
+		where amount.read_date =DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 day) ,'%Y%m%d')
+		and rela.id is null
+		<if test="customerId!= null" > and amount.customer_id =#{customerId}</if>
+		<if test="siteId!= null" > and amount.site_id = #{siteId} </if>
+	</select>
+
 	<select id="getWaterMeterIdByDay" resultType="java.math.BigInteger">
 		select
 		amount.watermeter_id
@@ -477,6 +564,17 @@
 		<if test="siteId!= null" > and amount.site_id = #{siteId} </if>
 	</select>
 
+	<select id="getNoOpenWaterMeterIdByDay" resultType="java.math.BigInteger">
+		select scd.id
+		from sc_device scd
+		left join pay_amount_waterusedamount_day amount on amount.watermeter_id = scd.id
+		and amount.read_date =DATE_FORMAT(DATE_SUB(now(),INTERVAL 1 day) ,'%Y%m%d')
+		left join pay_base_customerandmeterrela pba on pba.watermeter_id = scd.id
+		where scd.status =1 and amount.reading is null and pba.id  is null
+		<if test="customerId!= null" >and scd.customer_id = #{customerId} </if>
+		<if test="siteId!= null" > and scd.site_id = #{siteId} </if>
+	</select>
+
 	<select id="getCustIdAndSiteId" resultType="com.bz.smart_city.entity.pay.archives.PayBaseCustomerandmeterrela">
 	select
 	c.customer_id customerId,
@@ -487,6 +585,16 @@
 	group by c.customer_id, c.site_id
 	</select>
 
+	<select id="getCustIdAndSiteIdByDevice" resultType="com.bz.smart_city.entity.pay.archives.PayBaseCustomerandmeterrela">
+	select
+	c.customer_id customerId,
+	c.site_id siteId
+	from sc_device c
+	where c.status =1
+	and c.customer_id is not null  and c.site_id is not null
+	group by c.customer_id, c.site_id
+	</select>
+
 	<resultMap id="ReplaceMeterMap" type="com.bz.smart_city.dto.pay.ReplaceMeterDto">
 
 	</resultMap>