Browse Source

Merge remote-tracking branch 'origin/20210223' into 20210223

wangyangyang 3 years ago
parent
commit
8d6f083992

+ 3 - 4
common/src/main/java/com/huaxu/util/DESUtil.java

@@ -15,8 +15,6 @@ import java.util.Date;
 public class DESUtil {
 
 
-    public final static String DES_KEY_STRING = "ABSujsuu" ;
-
     public static String encrypt(String message, String key) throws Exception {
         Cipher cipher = Cipher.getInstance( "DES/CBC/PKCS5Padding" );
 
@@ -93,9 +91,10 @@ public class DESUtil {
     }
 
     public static void main(String[] args) {
-        String  code = "134376";
+        String  code = "788171";
         try {
-            System.out.println(encrypt(code + "_1001_12345678_202104010935", "12345678"));
+            System.out.println(encrypt(code + "_1001_12345678_1617243720187", "12345678"));
+            System.out.println(decrypt("nnwClDmIxmIJkx90eOCql6D511/ZXXbTNSsU5mY/iJuN/YTwnzojgA==", "12345678"));
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 34 - 6
common/src/main/java/com/huaxu/util/DatesUtil.java

@@ -23,7 +23,7 @@ import java.util.*;
 public class DatesUtil {
 	public static final String DATE_TIME_FORMAT="yyyy-MM-dd HH:mm:ss";
 	public static final String DATE_FORMAT = "yyyy-MM-dd";
-	
+
 	// 获取当天的开始时间
 	public static Date getDayBegin() {
 		Calendar cal = new GregorianCalendar();
@@ -553,6 +553,36 @@ public class DatesUtil {
 		int days = rightNow.getActualMaximum(Calendar.DAY_OF_MONTH);//根据年月 获取月份天数
 		return days;
 	}
+
+	public static boolean isInTime(String startTime, String endTime, String inTime, String pattern) {
+		SimpleDateFormat simpleDate = new SimpleDateFormat(pattern);
+		try {
+			//  10:00  11:00 = > 10:15
+			Date startDate = simpleDate.parse(startTime);
+			Date endDate   = simpleDate.parse(endTime);
+			Date inDate    = simpleDate.parse(inTime);
+			return startDate.before(inDate) && endDate.after(inDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+
+	public static boolean isInTime(String startTime, String endTime, Date inTime, String pattern) {
+		SimpleDateFormat simpleDate = new SimpleDateFormat(pattern);
+		try {
+			//  10:00  11:00 = > 10:15
+			Date startDate = simpleDate.parse(startTime);
+			Date endDate   = simpleDate.parse(endTime);
+			Date inDate    = simpleDate.parse(simpleDate.format(inTime));
+			return startDate.before(inDate) && endDate.after(inDate);
+		} catch (ParseException e) {
+			e.printStackTrace();
+		}
+		return false;
+	}
+
+
 	public static void main(String[] args) {
 		//String d = "2019-11-14 13:10:16";
 		//System.out.println(DatesUtil.parseDate(d, DatesUtil.DATE_TIME_FORMAT));
@@ -563,10 +593,8 @@ public class DatesUtil {
 //		Set<String> iter1 = DatesUtil.betweenMonth(DatesUtil.beforeYear(1),new Date());
 //		System.out.println(JSON.toJSONString(iter));
 //		System.out.println(JSON.toJSONString(iter1));
-		LocalDate  startDate =
-				LocalDate.parse("2017-02-02 08:59:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-		LocalDate  endDate =
-				LocalDate.parse("2018-03-02 08:59:12", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
-		System.out.println(startDate.getYear());
+		String startTime = "10:00:30";
+		String endTime   = "13:30:30";
+		System.out.println(DatesUtil.isInTime(startTime, endTime, new Date(), "HH:mm:ss"));
 	}
 }

+ 85 - 0
sms_water/src/main/java/com/huaxu/config/AsyncConfig.java

@@ -0,0 +1,85 @@
+package com.huaxu.config;
+
+import com.alibaba.fastjson.JSON;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+@Configuration
+@Slf4j
+@Data
+public class AsyncConfig implements AsyncConfigurer {
+
+    /**
+     * 核心线程池大小
+     */
+    @Value("${aysnc.pool.core-size}")
+    private Integer coreSize;
+    /**
+     * 最大线程池大小
+     */
+    @Value("${aysnc.pool.max-size}")
+    private Integer maxSize;
+    /**
+     * 线程池队列容量(默认Integer.MAX_VALUE)
+     */
+    @Value("${aysnc.queue-capacity}")
+    private Integer queueCapacity;
+    /**
+     * 线程池空闲时长(秒)
+     */
+    @Value("${aysnc.pool.keep-alive}")
+    private Integer keepAlive;
+    /**
+     * 线程池名称
+     */
+    @Value("${aysnc.thread-name-prefix}")
+    private String threadNamePrefix;
+
+    /**
+     * 配置异步线程池
+     *
+     * @return
+     */
+    @Override
+    public Executor getAsyncExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(getCoreSize());
+        executor.setMaxPoolSize(getMaxSize());
+        //queueCapacity Integer.Max= 21 4748 3647
+        executor.setQueueCapacity(getQueueCapacity());
+        executor.setThreadNamePrefix(getThreadNamePrefix());
+        executor.setKeepAliveSeconds(getKeepAlive());
+        /** 拒绝异常处理 - 在调用线程中执行(当线程池中线程都以被占用且queue已满,则拒绝新提交的task,
+         * 默认为ThreadPoolExecutor.AbortPolicy抛出异常到上层应用 - 导致异步调用死掉,无法再处理新任务,
+         * 此处实现照搬ThreadPoolExecutor.CallerRunsPolicy且添加日志记录
+         * */
+        executor.setRejectedExecutionHandler((r, e) -> {
+            log.error("Async thread pool over load - caller run - queue.size={} - 请devops人员考虑扩展服务实例", e.getQueue().size());
+            if (!e.isShutdown()) {
+                r.run();
+            }
+        });
+        //如果不初始化,导致找到不到执行器(此语句需放到最后)
+        executor.initialize();
+        return executor;
+    }
+
+    /**
+     * 异步线程池 - 全局异常处理
+     *
+     * @return
+     */
+    @Override
+    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
+        return (ex, method, params) -> {
+            log.info("Async method: {} has uncaught exception, params:{}", method.getName(), JSON.toJSONString(params), ex);
+        };
+    }
+}

+ 17 - 16
sms_water/src/main/java/com/huaxu/controller/AppPageReportController.java

@@ -157,7 +157,7 @@ public class AppPageReportController {
 
         List<DeviceWaterSupply> sellerWaterList = appPageReportService.deviceSellerAmountReportForMonth(companyOrgId,1);
         BigDecimal sum = sellerWaterList.get(0).getGeneralUserAmount().add(sellerWaterList.get(0).getBigUserAmount());
-        BigDecimal generalRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:sellerWaterList.get(0).getGeneralUserAmount().multiply(new BigDecimal(100)).divide(sum,3);
+        BigDecimal generalRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:sellerWaterList.get(0).getGeneralUserAmount().multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sum,3);
 
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("totalReceivable", sellerWaterList.get(0).getReceivableAmount());
@@ -167,7 +167,7 @@ public class AppPageReportController {
         map.put("bigUser",sellerWaterList.get(0).getBigUserAmount());
         map.put("generalUserRate",generalRate);
         map.put("bigUserRate",new BigDecimal(100).subtract(generalRate));
-        map.put("recoveryRate", sellerWaterList.get(0).getReceivableAmount().compareTo(BigDecimal.ZERO)==0? 0 : sellerWaterList.get(0).getReceivedAmount().multiply(new BigDecimal(100)).divide(sellerWaterList.get(0).getReceivableAmount(),3));
+        map.put("recoveryRate", sellerWaterList.get(0).getReceivableAmount().compareTo(BigDecimal.ZERO)==0? 0 : sellerWaterList.get(0).getReceivedAmount().multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sellerWaterList.get(0).getReceivableAmount(),3));
         return new AjaxMessage<>(ResultStatus.OK,map);
     }
 
@@ -188,7 +188,7 @@ public class AppPageReportController {
         map.put("receivableAmount", sellerWaterList.get(0).getReceivableAmount());
         map.put("receivedAmount", sellerWaterList.get(0).getReceivedAmount());
         map.put("sellerAmount",sellerAmountList.get(0).getAmount());
-        map.put("recoveryRate", sellerWaterList.get(0).getReceivableAmount().compareTo(BigDecimal.ZERO)==0? 0 : sellerWaterList.get(0).getReceivedAmount().multiply(new BigDecimal(100)).divide(sellerWaterList.get(0).getReceivableAmount(),3));
+        map.put("recoveryRate", sellerWaterList.get(0).getReceivableAmount().compareTo(BigDecimal.ZERO)==0? 0 : sellerWaterList.get(0).getReceivedAmount().multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sellerWaterList.get(0).getReceivableAmount(),3));
         return new AjaxMessage<>(ResultStatus.OK,map);
     }
 
@@ -213,10 +213,10 @@ public class AppPageReportController {
             totalReceivedAmount=totalReceivedAmount.add(amount.getReceivedAmount());
             totalGeneralUser=totalGeneralUser.add(amount.getGeneralUserAmount());
             totalBigUser=totalBigUser.add(amount.getBigUserAmount());
-            amount.setRecoveryRate(totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? BigDecimal.ZERO : totalReceivedAmount.multiply(new BigDecimal(100)).divide(totalReceivableAmount,3));
+            amount.setRecoveryRate(totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? BigDecimal.ZERO : totalReceivedAmount.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(totalReceivableAmount,3));
         }
         BigDecimal sum =totalBigUser.add(totalGeneralUser);
-        BigDecimal generalRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:totalGeneralUser.multiply(new BigDecimal(100)).divide(sum,2);
+        BigDecimal generalRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:totalGeneralUser.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sum,2);
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("totalReceivable", totalReceivableAmount);
         map.put("totalReceived",totalReceivedAmount);
@@ -225,7 +225,7 @@ public class AppPageReportController {
         map.put("bigUser",totalBigUser);
         map.put("generalUserRate",generalRate);
         map.put("bigUserRate",new BigDecimal(100).subtract(generalRate));
-        map.put("recoveryRate", totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? 0 : totalReceivedAmount.multiply(new BigDecimal(100)).divide(totalReceivableAmount,3));
+        map.put("recoveryRate", totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? 0 : totalReceivedAmount.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(totalReceivableAmount,3));
         return new AjaxMessage<>(ResultStatus.OK,map);
     }
 
@@ -250,12 +250,12 @@ public class AppPageReportController {
             totalReceivedAmount=totalReceivedAmount.add(amount.getReceivedAmount());
             totalGeneralUser=totalGeneralUser.add(amount.getGeneralUserAmount());
             totalBigUser=totalBigUser.add(amount.getBigUserAmount());
-            amount.setRecoveryRate(totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? BigDecimal.ZERO : totalReceivedAmount.multiply(new BigDecimal(100)).divide(totalReceivableAmount,3));
+            amount.setRecoveryRate(totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? BigDecimal.ZERO : totalReceivedAmount.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(totalReceivableAmount,3));
         }
 
         BigDecimal sum =totalBigUser.add(totalGeneralUser);
-        BigDecimal generalRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:totalGeneralUser.multiply(new BigDecimal(100)).divide(sum,3);
-        BigDecimal bigUserRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:totalBigUser.multiply(new BigDecimal(100)).divide(sum,3);
+        BigDecimal generalRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:totalGeneralUser.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sum,3);
+        BigDecimal bigUserRate =sum.compareTo(BigDecimal.ZERO)==0?BigDecimal.ZERO:totalBigUser.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sum,3);
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("totalReceivable", totalReceivableAmount);
         map.put("totalReceived",totalReceivedAmount);
@@ -264,7 +264,7 @@ public class AppPageReportController {
         map.put("bigUser",totalBigUser);
         map.put("generalUserRate",generalRate);
         map.put("bigUserRate",bigUserRate);
-        map.put("recoveryRate", totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? 0 : totalReceivedAmount.multiply(new BigDecimal(100)).divide(totalReceivableAmount,3));
+        map.put("recoveryRate", totalReceivableAmount.compareTo(BigDecimal.ZERO)==0? 0 : totalReceivedAmount.multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(totalReceivableAmount,3));
         return new AjaxMessage<>(ResultStatus.OK,map);
     }
 
@@ -274,8 +274,9 @@ public class AppPageReportController {
     public AjaxMessage<Object> getSellerComparisonForSameMonth(@ApiParam(value = "公司id,总公司传空值") @RequestParam(required = false) Integer companyOrgId){
 
         List<DeviceWaterSupply> sellerWaterList = appPageReportService.deviceSellerAmountReportForMonth(companyOrgId,2);
-        BigDecimal receivableComparison = sellerWaterList.get(1).getReceivableAmount().compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:sellerWaterList.get(0).getReceivableAmount().subtract(sellerWaterList.get(1).getReceivableAmount()).multiply(new BigDecimal(100)).divide(sellerWaterList.get(1).getReceivableAmount(),3);
-        BigDecimal receivedComparison = sellerWaterList.get(1).getReceivedAmount().compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:sellerWaterList.get(0).getReceivedAmount().subtract(sellerWaterList.get(1).getReceivedAmount()).multiply(new BigDecimal(100)).divide(sellerWaterList.get(1).getReceivedAmount(),3);
+        BigDecimal receivableComparison = sellerWaterList.get(0).getReceivableAmount().compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:sellerWaterList.get(1).getReceivableAmount().subtract(sellerWaterList.get(0).getReceivableAmount()).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sellerWaterList.get(0).getReceivableAmount(),3);
+
+        BigDecimal receivedComparison = sellerWaterList.get(0).getReceivedAmount().compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:sellerWaterList.get(1).getReceivedAmount().subtract(sellerWaterList.get(0).getReceivedAmount()).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(sellerWaterList.get(0).getReceivedAmount(),3);
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("receivableComparison",receivableComparison);
         map.put("receivedComparison",receivedComparison);
@@ -303,8 +304,8 @@ public class AppPageReportController {
             }
         }
 
-        BigDecimal receivedComparison = receivedLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivedSameYearComparison.subtract(receivedLastYearComparison).multiply(new BigDecimal(100)).divide(receivedLastYearComparison,3);
-        BigDecimal receivableComparison = receivableLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivableSameYearComparison.subtract(receivableLastYearComparison).multiply(new BigDecimal(100)).divide(receivableLastYearComparison,3);
+        BigDecimal receivedComparison = receivedLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivedSameYearComparison.subtract(receivedLastYearComparison).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(receivedLastYearComparison,3);
+        BigDecimal receivableComparison = receivableLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivableSameYearComparison.subtract(receivableLastYearComparison).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(receivableLastYearComparison,3);
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("receivableComparison",receivableComparison);
         map.put("receivedComparison",receivedComparison);
@@ -331,8 +332,8 @@ public class AppPageReportController {
                 receivableLastYearComparison =receivableLastYearComparison.add(sellerWaterList.get(i).getReceivableAmount());
             }
         }
-        BigDecimal receivedComparison = receivedLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivedSameYearComparison.subtract(receivedLastYearComparison).multiply(new BigDecimal(100)).divide(receivedLastYearComparison,3);
-        BigDecimal receivableComparison = receivableLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivableSameYearComparison.subtract(receivableLastYearComparison).multiply(new BigDecimal(100)).divide(receivableLastYearComparison,3);
+        BigDecimal receivedComparison = receivedLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivedSameYearComparison.subtract(receivedLastYearComparison).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(receivedLastYearComparison,3);
+        BigDecimal receivableComparison = receivableLastYearComparison.compareTo(BigDecimal.ZERO)==0 ?BigDecimal.ZERO:receivableSameYearComparison.subtract(receivableLastYearComparison).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(receivableLastYearComparison,3);
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("receivableComparison",receivableComparison);
         map.put("receivedComparison",receivedComparison);

+ 1 - 1
sms_water/src/main/java/com/huaxu/controller/TestDataController.java

@@ -28,7 +28,7 @@ public class TestDataController {
     private TestDataService testDataService;
 
     @RequestMapping(value="createDataByDay" , method = RequestMethod.GET)
-    @ApiOperation(value = "生成日数据")
+    @ApiOperation(value = "生成日、月、年数据")
     public void createDataByDay(
             @ApiParam("设备id") @RequestParam List<Long> ids,
              @ApiParam("开始时间,yyyy-MM-dd") @RequestParam String beginDate,

+ 1 - 0
sms_water/src/main/java/com/huaxu/dto/AlarmDetailsDto.java

@@ -80,4 +80,5 @@ public class AlarmDetailsDto extends AlarmDetailsEntity {
 
     @ApiModelProperty(value = "报警范围")
     private String alarmRange;
+
 }

+ 6 - 0
sms_water/src/main/java/com/huaxu/dto/DeviceCheckAlarmDto.java

@@ -46,6 +46,12 @@ public class DeviceCheckAlarmDto {
     private String attributeName; //属性名称
     private String unit; //属性单位
 
+    @ApiModelProperty(value = "报警设置开始时间",hidden = true)
+    private String startTime;
+
+    @ApiModelProperty(value = "报警设置结束时间" ,hidden = true)
+    private String endTime;
+
     // 识别符号 >、≥、<、≤、=、≠
     public Boolean checkdeviceOffLine(){
         if(this.duration != null && this.alarmValue != null

+ 225 - 0
sms_water/src/main/java/com/huaxu/rabbitmq/AlarmDataHandler.java

@@ -0,0 +1,225 @@
+package com.huaxu.rabbitmq;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.client.OperationManagerClient;
+import com.huaxu.client.UserCenterClient;
+import com.huaxu.common.CalcUtil;
+import com.huaxu.common.StringUtils;
+import com.huaxu.dao.AlarmDetailMapper;
+import com.huaxu.dto.AlarmDetailsDto;
+import com.huaxu.dto.DeviceCheckAlarmDto;
+import com.huaxu.dto.WorkOrderManageByAlarmDto;
+import com.huaxu.entity.AlarmDetailsEntity;
+import com.huaxu.entity.Message;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.util.DatesUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.AmqpTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName AlarmDataHandler
+ * @Description: 报警数据处理
+ * @Author lihui
+ * @Date 2021/4/8
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class AlarmDataHandler {
+
+    @Resource(name = "messageRabbitTemplate")
+    private AmqpTemplate messageRabbitTemplate;
+
+    @Resource
+    private AlarmDetailMapper alarmDetailMapper;
+
+    @Autowired
+    private OperationManagerClient operationManagerClient;
+
+    @Autowired
+    private UserCenterClient userCenterClient;
+
+    @Value("${receive.exchange.name}")
+    private String receiveExchangeName;
+
+    @Value("${dispath.routing.key}")
+    private String dispathRoutingKey;
+
+    @Async
+    public void hanlder(MonitorDataEntity monitorDataEntity, JSONObject receiveData, Date receiveDateTime){
+        // 校验各参数异常情况
+        Double receivedValue            = null;
+        List<AlarmDetailsEntity> insert = null;
+        List<AlarmDetailsEntity> update = null;
+        // 获取需要验证的报警条件
+        List<DeviceCheckAlarmDto> deviceCheckAlarmDtos = alarmDetailMapper.selectDeviceForCheckAlarm(monitorDataEntity.getDeviceId(),"参数报警");
+        // 有设置报警参数
+        if (deviceCheckAlarmDtos.size() == 0 || StringUtils.isBlank(deviceCheckAlarmDtos.get(0).getIdentifiter())){
+            return;
+        }
+        insert = new ArrayList<>();
+        update = new ArrayList<>();
+        // 系统中已存在的报警信息
+        List<AlarmDetailsDto> alarmDetailsDtos = alarmDetailMapper.selectStateAlarm(deviceCheckAlarmDtos.get(0).getDeviceId(),"参数报警",null);
+        // 已存在的报警信息转为map方便匹配alarmSettingId
+        Map<Integer,AlarmDetailsDto> alarmDetailsDtoMap = alarmDetailsDtos.stream().collect(Collectors.toMap(AlarmDetailsDto::getAlarmSettingId, a -> a,(k1, k2)->k1));
+        for (DeviceCheckAlarmDto deviceCheckAlarmDto : deviceCheckAlarmDtos){
+            // 获取参数接收值
+            receivedValue = receiveData.getDouble(deviceCheckAlarmDto.getIdentifiter());
+            if (!deviceCheckAlarmDto.checkdeviceAttributeAlarm(receivedValue)) {
+                continue;
+            }
+            // 如果设置了报警时间,需要检查当前系统时间是否在设置的时间范围内
+            if (!isInTime(deviceCheckAlarmDto.getStartTime(), deviceCheckAlarmDto.getEndTime(), new Date())){
+                continue;
+            }
+            // 判断报警是否已存在
+            if (alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())) {
+                AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(deviceCheckAlarmDto.getAlarmSettingId());
+                alarmDetailsDto.setAlarmValue(receivedValue);
+                alarmDetailsDto.setMinValue(CalcUtil.compareBySign(alarmDetailsDto.getMinValue(),receivedValue, "<")?alarmDetailsDto.getMinValue():receivedValue);
+                alarmDetailsDto.setMaxValue(CalcUtil.compareBySign(alarmDetailsDto.getMaxValue(),receivedValue,">")?alarmDetailsDto.getMaxValue():receivedValue);
+                alarmDetailsDto.setDateUpdate(new Date());
+                alarmDetailMapper.update(alarmDetailsDto);
+                update.add(alarmDetailsDto);
+                // 已存在的修改后从集合移除
+                alarmDetailsDtoMap.remove(deviceCheckAlarmDto.getAlarmSettingId());
+            } else {
+                AlarmDetailsEntity alarmDetailsEntity = getAlarmDetailsEntity(deviceCheckAlarmDto, receivedValue, receiveDateTime);
+                sendMessage(deviceCheckAlarmDto);
+                insert.add(alarmDetailsEntity);
+            }
+        }
+        // 批量插入新增报警
+        if (insert.size() > 0) {
+            alarmDetailMapper.batchInsert(insert);
+        }
+        if (alarmDetailsDtoMap.values().size() == 0) {
+            return;
+        }
+        // 处理完成后,剩下的标记为历史数据
+        List<Long> deviceIds = new ArrayList<>();
+        deviceIds.add(monitorDataEntity.getDeviceId().longValue());
+        List<WorkOrderManageByAlarmDto> workOrders = operationManagerClient.findWorkOrderByDeviceIds(deviceIds);
+        if (CollectionUtils.isEmpty(workOrders)) {
+            return;
+        }
+        WorkOrderManageByAlarmDto orderManageByAlarmDto = workOrders.get(0);
+        String taskDesc = orderManageByAlarmDto.getTaskDesc();
+        // 标记为历史数据 并 修改工单描述
+        for (AlarmDetailsDto alarmDetailsDto : alarmDetailsDtoMap.values()){
+            alarmDetailsDto.setState(0);
+            alarmDetailsDto.setAlarmEndTime(receiveDateTime);
+            alarmDetailsDto.setDateUpdate(new Date());
+            alarmDetailMapper.update(alarmDetailsDto);
+            taskDesc = taskDesc.replace(";"+alarmDetailsDto.getAlarmContent(),"")
+                    .replace(alarmDetailsDto.getAlarmContent(),"");
+        }
+        orderManageByAlarmDto.setTaskDesc(taskDesc);
+        // 工单未派单且无报警信息,删除工单
+        if (orderManageByAlarmDto != null
+                && (orderManageByAlarmDto.getOrderStatus() == null || orderManageByAlarmDto.getOrderStatus() == 0)
+                && StringUtils.isBlank(taskDesc)) {
+            operationManagerClient.batchDeleteByAlarms(new ArrayList<>(deviceIds));
+            return;
+        }
+        // 其他情况修改描述
+        operationManagerClient.updateByAlarms(workOrders);
+    }
+
+    /**
+    * @Author lihui
+    * @Description //TODO
+    * @Date 14:27 2021/4/16
+    * @Param [deviceCheckAlarmDto]
+    * @return boolean
+    **/
+    private boolean isInTime(String startTime, String endTime, Date date){
+        if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {
+            return true;
+        }
+        return DatesUtil.isInTime(startTime, endTime, date,"HH:mm:ss");
+    }
+
+    /**
+     * @Author lihui
+     * @Description 设置报警信息
+     * @Date 17:29 2021/4/7
+     * @Param [deviceCheckAlarmDto, receivedValue, receiveDateTime]
+     * @return com.huaxu.entity.AlarmDetailsEntity
+     **/
+    private AlarmDetailsEntity getAlarmDetailsEntity(DeviceCheckAlarmDto deviceCheckAlarmDto, Double receivedValue, Date receiveDateTime){
+        AlarmDetailsEntity alarmDetailsEntity = new AlarmDetailsDto();
+        alarmDetailsEntity.setTenantId(deviceCheckAlarmDto.getTenantId());
+        alarmDetailsEntity.setParentSceneId(deviceCheckAlarmDto.getParentSceneId());
+        alarmDetailsEntity.setParentSceneName(deviceCheckAlarmDto.getParentSceneName());
+        alarmDetailsEntity.setSceneId(deviceCheckAlarmDto.getSceneId());
+        alarmDetailsEntity.setSceneName(deviceCheckAlarmDto.getSceneName());
+        alarmDetailsEntity.setDeviceId(deviceCheckAlarmDto.getDeviceId());
+        alarmDetailsEntity.setCompanyOrgId(deviceCheckAlarmDto.getCompanyOrgId());
+        alarmDetailsEntity.setDeptOrgId(deviceCheckAlarmDto.getDeptOrgId());
+        alarmDetailsEntity.setAlarmType(deviceCheckAlarmDto.getAlarmType());
+        alarmDetailsEntity.setAttributeId(deviceCheckAlarmDto.getAttributeId());
+        alarmDetailsEntity.setAlarmValue(receivedValue);
+        alarmDetailsEntity.setAlarmStartTime(receiveDateTime);
+        alarmDetailsEntity.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
+        alarmDetailsEntity.setAlarmSettingId(deviceCheckAlarmDto.getAlarmSettingId());
+        alarmDetailsEntity.setState(1);
+        alarmDetailsEntity.setOpState(1);
+        alarmDetailsEntity.setMinValue(receivedValue);
+        alarmDetailsEntity.setMaxValue(receivedValue);
+        alarmDetailsEntity.setStatus(1);
+        alarmDetailsEntity.setDateCreate(new Date());
+        alarmDetailsEntity.setDateUpdate(new Date());
+        alarmDetailsEntity.setCreateBy("system");
+        alarmDetailsEntity.setUpdateBy("system");
+        return alarmDetailsEntity;
+    }
+
+    private void sendMessage(DeviceCheckAlarmDto deviceCheckAlarmDto){
+        Message message = new Message();
+        message.setStatus(1);
+        message.setTenantId(deviceCheckAlarmDto.getTenantId());
+        message.setMessageId(UUID.randomUUID().toString());
+        JSONObject jsonContent = new JSONObject();
+        // ${场景名称}${设备名称}【${报警字段}】异常报警
+        jsonContent.put("场景名称",deviceCheckAlarmDto.getSceneName());
+        jsonContent.put("设备名称",deviceCheckAlarmDto.getDeviceName());
+        jsonContent.put("报警字段",deviceCheckAlarmDto.getAttributeName());
+        // 消息内容,如果需要动态使用,配合模板使用{key:value}
+        message.setMessageContent(jsonContent.toJSONString());
+        // 消息类型、模板id、渠道
+        message.setMessageType(1);
+        message.setMessageTemplateId(1);
+        message.setChannel(0);
+        Integer companyOrgId = deviceCheckAlarmDto.getCompanyOrgId();
+        Integer departmentOrgId = deviceCheckAlarmDto.getDeptOrgId();
+        try{
+            List<Integer> taskUsers = userCenterClient.findUserIdsByPermissonOrg(deviceCheckAlarmDto.getTenantId(),companyOrgId,departmentOrgId);
+            if (taskUsers == null) {
+                return;
+            }
+            taskUsers.forEach(id -> {
+                message.setUserId(id);
+                this.send(message);
+            });
+        } catch (Exception e) {
+            log.error ("推送报警消息失败:{}",e);
+        }
+    }
+
+    private void send(Message message){
+        log.debug("消息发送 exchange={}  routingkey={} 用户id={}",receiveExchangeName,dispathRoutingKey,message.getUserId());
+        messageRabbitTemplate.convertAndSend(receiveExchangeName, dispathRoutingKey, JSONObject.toJSONString(message));
+    }
+
+}

+ 144 - 0
sms_water/src/main/java/com/huaxu/rabbitmq/ReceiveClearData.java

@@ -0,0 +1,144 @@
+package com.huaxu.rabbitmq;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huaxu.common.StringUtils;
+import com.huaxu.dao.AlarmDetailMapper;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonitorDataValueEntity;
+import com.huaxu.service.MonitorDataService;
+import com.huaxu.util.DatesUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.springframework.amqp.rabbit.annotation.RabbitHandler;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName ReceiveClearData
+ * @Description: 监听rabbitmq队列消息,获取设备报警信息 (优化版)
+ * @Author lihui
+ * @Date 2021/4/7
+ * @Version V1.0
+ **/
+@Component
+@Slf4j
+public class ReceiveClearData {
+
+    @Autowired
+    private AlarmDataHandler alarmDataHandler;
+
+    @Resource
+    private AlarmDetailMapper alarmDetailMapper;
+
+    @Value("${receiveData.spring.rabbitmq.listener.queue}")
+    private String rabbitmqQueue;
+
+    @Autowired
+    private MonitorDataService monitorDataService;
+
+    /**
+     * 先注入,然后再通过SPEL取值
+     * @return
+     */
+    @Bean
+    public String rabbitmqQueue(){
+        return rabbitmqQueue;
+    }
+
+    @RabbitHandler
+    @RabbitListener(queues = "#{rabbitmqQueue}", containerFactory = "receiveDataContainerFactory")
+    public void received(byte[] receivedData) {
+        try {
+            log.debug("rabbitMq接收消息:"+new String(receivedData));
+            receivedDataHandle(receivedData);
+        } catch (Exception e) {
+            log.error(ExceptionUtils.getStackTrace(e));
+            // 发送异常时消息返回队列
+//            receiveDataRabbitTemplate.convertAndSend(rabbitmqQueue, receivedData);
+        }
+
+    }
+
+    public void receivedDataHandle(byte[] receivedData){
+        long begin = System.currentTimeMillis();
+        JSONObject jsonObject = JSONObject.parseObject(new String(receivedData));
+        String eventTime      = jsonObject.getString("eventTime");
+        // 对象有时间、有设备编码、有数据则解析,任何一个位空直接退出
+        if (!jsonObject.containsKey("eventTime") || !jsonObject.containsKey("unitIdentifier") ||
+                !jsonObject.containsKey("parsedData")) {
+            return;
+        }
+        Date receiveDateTime = DatesUtil.parseDate(eventTime, "yyyy-MM-dd HH:mm:ss");
+        if (receiveDateTime == null) {
+            log.error("报警信息查询时间转换错误,原数据:eventTime:{}", eventTime);
+            return;
+        }
+
+        String deviceCode      = jsonObject.getString("unitIdentifier");
+        JSONObject receiveData = JSONObject.parseObject(jsonObject .getString("parsedData"));
+        if (StringUtils.isBlank(deviceCode)) {
+            log.error("deviceCode为空退出。");
+            return;
+        }
+
+        MonitorDataEntity monitorDataEntity = monitorDataService.getDeviceMonitorInfoByDeviceCode(deviceCode);
+        // 查询不到设备或者设备属性为空
+        if (monitorDataEntity == null || CollectionUtils.isEmpty(monitorDataEntity.getDataValues())){
+            return;
+        }
+        List<MonitorDataValueEntity> monitorDataValueEntities = monitorDataEntity.getDataValues();
+        Integer number = 0;
+        for (MonitorDataValueEntity monitorDataValueEntity : monitorDataValueEntities) {
+            if (!receiveData.containsKey(monitorDataValueEntity.getIdentifier())) {
+                continue;
+            }
+            BigDecimal bigDecimal = new BigDecimal(receiveData.getDouble(monitorDataValueEntity.getIdentifier()));
+            // 整数超过10位直接变更为0
+            if (String.valueOf(bigDecimal).length() > 10 ){
+                monitorDataValueEntity.setDataValue(0.0);
+            } else {
+                // 小数保留5位
+                Double dataValue = bigDecimal.setScale(5, BigDecimal.ROUND_HALF_UP).doubleValue();
+                monitorDataValueEntity.setDataValue(dataValue);
+            }
+            number++;
+        }
+        // 没有匹配到属性,视为垃圾数据忽略
+        if (number == 0) {
+            return;
+        }
+        // 保存到缓存和mongodb数据库
+        saveToCacheAndMongodb(monitorDataEntity, receiveDateTime);
+        // 修改设备上报时间
+        alarmDetailMapper.udpateLastUpdateTime(monitorDataEntity.getDeviceId(),receiveDateTime);
+        // 异步处理报警信息
+        alarmDataHandler.hanlder(monitorDataEntity, receiveData, receiveDateTime);
+        long end = System.currentTimeMillis();
+        log.info("rabbitmq队列消息处理完成,耗时:" + (end-begin) + "毫秒");
+    }
+
+
+    private void saveToCacheAndMongodb(MonitorDataEntity monitorDataEntity, Date receiveDateTime){
+        monitorDataEntity.setCollectDate(receiveDateTime);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(receiveDateTime);
+        monitorDataEntity.setYear(cal.get(Calendar.YEAR));
+        monitorDataEntity.setMonth(cal.get(Calendar.MONTH)+1);
+        monitorDataEntity.setDay(cal.get(Calendar.DAY_OF_MONTH));
+        monitorDataEntity.setHour(cal.get(Calendar.HOUR_OF_DAY));
+        monitorDataService.save(monitorDataEntity);
+    }
+}

+ 4 - 4
sms_water/src/main/java/com/huaxu/rabbitmq/ReceiveData.java

@@ -5,7 +5,6 @@ package com.huaxu.rabbitmq;
  * @auto wangli
  * @data 2020-11-18 21:23
  */
-
 import com.alibaba.fastjson.JSONObject;
 import com.huaxu.client.OperationManagerClient;
 import com.huaxu.client.UserCenterClient;
@@ -44,6 +43,7 @@ import java.util.stream.Collectors;
 public class ReceiveData {
 
 
+
     @Resource(name = "messageRabbitTemplate")
     private AmqpTemplate messageRabbitTemplate;
 
@@ -68,7 +68,7 @@ public class ReceiveData {
      * 先注入,然后再通过SPEL取值
      * @return
      */
-    @Bean
+    //@Bean
     public String rabbitmqQueue(){
         return rabbitmqQueue;
     }
@@ -84,8 +84,8 @@ public class ReceiveData {
         messageRabbitTemplate.convertAndSend(receiveExchangeName,dispathRoutingKey, JSONObject.toJSONString(message));
     }
 
-    @RabbitHandler
-    @RabbitListener(queues = "#{rabbitmqQueue}",containerFactory = "receiveDataContainerFactory")
+    //@RabbitHandler
+    //@RabbitListener(queues = "#{rabbitmqQueue}",containerFactory = "receiveDataContainerFactory")
     public void received(byte[] receivedData) {
 
         try {

+ 3 - 3
sms_water/src/main/java/com/huaxu/service/impl/AppPageReportServiceImpl.java

@@ -158,7 +158,7 @@ public class AppPageReportServiceImpl implements AppPageReportService {
         for(DeviceWaterSupply water : sellerWaterList){
             sellerWaterAmount = sellerWaterAmount.add(water.getAmount());
         }
-        BigDecimal nrw = makingWaterAmount.compareTo(BigDecimal.ZERO) == 0  ? BigDecimal.ZERO : makingWaterAmount.subtract(sellerWaterAmount).multiply(new BigDecimal(100)).divide(makingWaterAmount,2);
+        BigDecimal nrw = makingWaterAmount.compareTo(BigDecimal.ZERO) == 0  ? BigDecimal.ZERO : makingWaterAmount.subtract(sellerWaterAmount).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(makingWaterAmount,2);
         map.put("totalIntake",supplyWaterAmount);
         map.put("totalMaking",makingWaterAmount);
         map.put("totallSeller",sellerWaterAmount);
@@ -181,7 +181,7 @@ public class AppPageReportServiceImpl implements AppPageReportService {
         for(DeviceWaterSupply water : lastWaterList){
             lastWaterAmount = lastWaterAmount.add(water.getAmount());
         }
-        BigDecimal comparison = lastWaterAmount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : sameWaterAmount.subtract(lastWaterAmount).multiply(new BigDecimal(100)).divide(lastWaterAmount,2);
+        BigDecimal comparison = lastWaterAmount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : sameWaterAmount.subtract(lastWaterAmount).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(lastWaterAmount,2);
         return comparison;
     }
 
@@ -210,7 +210,7 @@ public class AppPageReportServiceImpl implements AppPageReportService {
         }
 
 
-        BigDecimal comparison = lastWaterAmount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : sameWaterAmount.subtract(lastWaterAmount).multiply(new BigDecimal(100)).divide(lastWaterAmount,2);
+        BigDecimal comparison = lastWaterAmount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO : sameWaterAmount.subtract(lastWaterAmount).multiply(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).divide(lastWaterAmount,2);
         return comparison;
     }
 

+ 5 - 6
sms_water/src/main/resources/application-dev.properties

@@ -153,18 +153,17 @@ receiveData.spring.rabbitmq.publisher-confirm-type=correlated
 receiveData.spring.rabbitmq.publisher-confirms=true
 receiveData.spring.rabbitmq.publisher-returns=true
 
-#=====================新增参数
+#=====================新增参数线程池配置
 #核心线程数
-aysnc.pool.core-size=10
+aysnc.pool.core-size=50
 #最大线程数
-aysnc.pool.max-size=20
+aysnc.pool.max-size=200
 #空闲线程保留时间
-aysnc.pool.keep-alive=5
+aysnc.pool.keep-alive=200
 #队列容量
-aysnc.queue-capacity=100
+aysnc.queue-capacity=100000
 #线程名称前缀
 aysnc.thread-name-prefix=aysnc-thread-
-#===========================对账信息begin===================================
 
 
 

+ 11 - 0
sms_water/src/main/resources/application-prd.properties

@@ -149,4 +149,15 @@ receiveData.spring.rabbitmq.publisher-confirms=true
 receiveData.spring.rabbitmq.publisher-returns=true
 
 
+#=====================新增参数线程池配置
+#核心线程数
+aysnc.pool.core-size=50
+#最大线程数
+aysnc.pool.max-size=200
+#空闲线程保留时间
+aysnc.pool.keep-alive=200
+#队列容量
+aysnc.queue-capacity=100000
+#线程名称前缀
+aysnc.thread-name-prefix=aysnc-thread-
 

+ 11 - 0
sms_water/src/main/resources/application-sit.properties

@@ -151,3 +151,14 @@ receiveData.spring.rabbitmq.publisher-confirms=true
 receiveData.spring.rabbitmq.publisher-returns=true
 
 
+#=====================新增参数线程池配置
+#核心线程数
+aysnc.pool.core-size=50
+#最大线程数
+aysnc.pool.max-size=200
+#空闲线程保留时间
+aysnc.pool.keep-alive=200
+#队列容量
+aysnc.queue-capacity=100000
+#线程名称前缀
+aysnc.thread-name-prefix=aysnc-thread-

+ 2 - 0
sms_water/src/main/resources/mapper/AlarmDetailMapper.xml

@@ -617,6 +617,8 @@
             ,a.ALARM_CONDITION as "alarmCondition"
             ,a.ALARM_VALUE as "alarmValue"
             ,a.id as "alarmSettingId"
+            ,a.START_TIME as "startTime"
+            ,a.END_TIME as "endTime"
         <if test="deviceId != null">
             ,da.id as "attributeId"
             ,da.IDENTIFIER as "identifiter"