package com.huaxu.zoniot.service.impl; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.huaxu.zoniot.dao.BuildingMapper; import com.huaxu.zoniot.dao.CustomerMapper; import com.huaxu.zoniot.dao.PushLogMapper; import com.huaxu.zoniot.entity.PushLog; import com.huaxu.zoniot.model.BuildingData; import com.huaxu.zoniot.model.DeviceData; import com.huaxu.zoniot.service.BuildingSyncService; import com.huaxu.zoniot.service.CcrcService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Date; import java.util.List; @Slf4j @Service public class BuildingSyncServiceImpl implements BuildingSyncService { @Autowired PushLogMapper pushLogMapper; @Autowired CustomerMapper customerMapper; @Autowired BuildingMapper buildingMapper; @Resource private RabbitTemplate rabbitTemplate; @Value("${spring.rabbitmq.exchange}") private String exchange; @Value("${spring.rabbitmq.building.queue}") private String queue; @Autowired private CcrcService ccrcService; @Override public int rabbitSync() { List customerIds = ccrcService.getCustomerIds(); if (customerIds != null && customerIds.size() > 0) { for (Integer customerId : customerIds) { // 1,查询推送记录,1档案;2数据 PushLog lastLog = pushLogMapper.findLastRecordBycustomerId(customerId,5); // 2,计算推送数据时间;如果为首次推送,则判断是否需要将历史数据推送给对方; Date beginDate = null ; Date endDate = new Date(); Integer status = null ; if(lastLog != null) { beginDate = lastLog.getPushTime() ; } else { // 首次推送,只推送有效的设备 status = 1 ; beginDate = DateUtil.parse("1900-01-01", "yyyy-MM-dd"); } // 3,根据推送数据时间进行数据查询 List cIds = customerMapper.getSubId(customerId); String pushCustomers = StringUtils.join(cIds, ","); log.info("begin query push device list , beginDate={}, endDate={}", beginDate, endDate); List dataList = buildingMapper.getPushBuildingList(pushCustomers, status, beginDate, endDate); log.info("end query push device list , size = {}",dataList.size()); if(dataList.size() != 0) { sendRabbitData(dataList); } // 4,定义push日志 PushLog pushLog = new PushLog(); pushLog.setDataSize(dataList.size()); pushLog.setCustomerId(customerId); pushLog.setDateCreate(new Date()); pushLog.setPushTime(endDate); pushLog.setPushContent(5); pushLogMapper.insertSelective(pushLog); } } return 0; } private void sendRabbitData(List dataList) { for (BuildingData data : dataList) { String msg = JSON.toJSONString(data); log.info("transfer mq msg:{}",msg); rabbitTemplate.convertAndSend(exchange, queue,msg.getBytes(Charset.forName("UTF-8"))); } } }