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 lombok.extern.slf4j.Slf4j; 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 @Slf4j 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; @Value("${model}") String model; @Autowired private QuartzManager quartzManager; //@Scheduled(cron = "0 0 * * * ?") public void countPlanDevice(){ WaterMeterBaseEntity waterMeterBaseEntity=new WaterMeterBaseEntity(); log.info("获取泗水水表列表"); List> meterInfor = receiveDao.getMeterInfor(waterMeterBaseEntity); ListneedAddWaterMeter=new ArrayList<>(); setNeddWaterMeters(meterInfor,needAddWaterMeter); if(needAddWaterMeter.size()>0){ log.info("增加新增泗水水表"); 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)); String deviceModel= (String) map.get("model"); DeviceType deviceType = mapDeviceType.get(deviceModel); if(deviceType==null){ deviceType= mapDeviceType.get(model); } if(deviceType!=null){ device.setDeviceType(deviceType.getId() ); 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); 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; } //@Scheduled(cron = "* 0/30 * * * ?") public void uploadData(){ Mapargs2=new HashMap<>(); List> uploadPlan = receiveDao.getUploadPlan(args2); uploadPlan.forEach(map->{ String planId=(String) map.get("PlanId"); log.info("获取泗水上传计划"); if(!quartzManager.checkExists(planId)){ quartzManager.addJob(planId, SyncMeterDataJob.class,setCron((Date) map.get("UploadTime")),map); //quartzManager.addJob(planId, SyncMeterDataJob.class,"15 41 15 * * ?", map); log.info("设置泗水上传计划定时任务"); } }); } 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); } }