package com.zcxk.service; import com.google.common.collect.Sets; import com.zcxk.config.QuartzManager; import com.zcxk.config.SnowflakeIdWorker; import com.zcxk.dao.mysql.SendDao; import com.zcxk.dao.sqlserver.ReceiveDao; import com.zcxk.entity.Device; import com.zcxk.entity.DeviceType; import com.zcxk.entity.WaterMeterBaseEntity; import com.zcxk.job.SyncMeterDataJob; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; @EnableScheduling @Service public class SyncService { @Autowired ReceiveDao receiveDao; @Autowired SendDao sendDao; @Value("${customerId}") Integer customerId; @Value("${siteId}") Integer siteId; @Value("${sysId}") Integer sysId; @Value("${buildingId}") Integer buildingId; @Autowired private QuartzManager quartzManager; @Scheduled(cron = "0/10 * * * * ?") public void countPlanDevice(){ WaterMeterBaseEntity waterMeterBaseEntity=new WaterMeterBaseEntity(); List> meterInfor = receiveDao.getMeterInfor(waterMeterBaseEntity); ListneedAddWaterMeter=new ArrayList<>(); setNeddWaterMeters(meterInfor,needAddWaterMeter); if(needAddWaterMeter.size()>0){ sendDao.insertDeviceInfo(needAddWaterMeter); } } private void setNeddWaterMeters(List> meterInfor, ListneedAddWaterMeter){ List deviceTypes = sendDao.selectDeviceType(); Sets.SetView difference =needSyncDeviceNo(meterInfor); SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0); MapmapDeviceType=new HashMap<>(); deviceTypes.forEach(deviceType -> { mapDeviceType.put(deviceType.getModel(),deviceType); }); meterInfor.forEach(map->{ String deviceNo=(String) map.get("releationId"); deviceNo=StringUtils.lowerCase(deviceNo); if(difference.contains(deviceNo)){ needAddWaterMeter.add(setDeviceInfo(idWorker,deviceNo,mapDeviceType,map)); } }); } private Device setDeviceInfo(SnowflakeIdWorker idWorker,String deviceNo,Map mapDeviceType, Map map){ Device device = new Device(); device.setId(idWorker.nextId()); device.setDeviceNo(StringUtils.lowerCase(deviceNo)); DeviceType deviceType = mapDeviceType.get(map.get("model")); if(deviceType!=null){ device.setDeviceType(deviceType.getDeviceType() ); device.setManufacturerId(deviceType.getManufacturerId()); } device.setSysId(sysId); device.setSiteId(siteId); device.setBuildingId(buildingId); device.setLocDesc((String) map.get("address")); device.setDeviceStatus(5+"");//未启用 device.setStatus(1); device.setDateCreate(new Date()); device.setCreateBy("system"); device.setCustomerId(customerId); device.setWaterMeterNo((String) map.get("meterNo")); device.setRegisterStatus(0); return device; } private Sets.SetViewneedSyncDeviceNo(List> meterInfor){ Mapargs=new HashMap<>(); args.put("customerId",customerId); Set hasDeviceNos = sendDao.selectDevice(args); List deviceTypes = sendDao.selectDeviceType(); Set allDeviceNos=new HashSet<>(); meterInfor.forEach(map->{ String deviceNo=(String) map.get("releationId"); allDeviceNos.add(StringUtils.lowerCase(deviceNo)); }); Sets.SetView difference = Sets.difference(allDeviceNos, hasDeviceNos); return difference; } public void uploadData(){ Mapargs2=new HashMap<>(); List> uploadPlan = receiveDao.getUploadPlan(args2); uploadPlan.forEach(map->{ String planId=(String) map.get("PlanId"); if(!quartzManager.checkExists(planId)){ quartzManager.addJob(planId, SyncMeterDataJob.class,setCron((Date) map.get("UploadTime")),map); } }); } private String setCron(Date planDateTime){ LocalDateTime dateTime =dateToLocateDateTime(planDateTime); StringBuffer cron=new StringBuffer(); cron.append(dateTime.getSecond()); cron.append(" "); cron.append(dateTime.getMinute()); cron.append(" "); cron.append(dateTime.getHour()); cron.append(" "); cron.append(dateTime.getDayOfMonth()); cron.append(" "); cron.append(dateTime.getMonth()); cron.append(" ?"); return cron.toString(); } private LocalDateTime dateToLocateDateTime(Date date) { Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); return LocalDateTime.ofInstant(instant, zoneId); } // @GetMapping("/addJob") public void addJob(){ Mapargs=new HashMap<>(); args.put("readDate","20210107"); args.put("customerId",customerId); //quartzManager.addJob("test", SyncMeterDataJob.class,cron.toString(),666); } }