Browse Source

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

hym 4 years ago
parent
commit
d4e8bda27f
26 changed files with 866 additions and 70 deletions
  1. 6 1
      common/src/main/java/com/huaxu/model/ResultStatus.java
  2. 208 0
      common/src/main/java/com/huaxu/util/AESUtils.java
  3. 103 0
      common/src/main/java/com/huaxu/util/DESUtil.java
  4. 4 0
      common/src/main/java/com/huaxu/util/Util.java
  5. 15 2
      operation_manager/src/main/java/com/huaxu/order/controller/WorkOrderManageController.java
  6. 6 0
      operation_manager/src/main/java/com/huaxu/order/dao/WorkOrderManageMapper.java
  7. 4 0
      operation_manager/src/main/java/com/huaxu/order/service/WorkOrderManageService.java
  8. 5 0
      operation_manager/src/main/java/com/huaxu/order/service/impl/WorkOrderManageServiceImpl.java
  9. 31 16
      operation_manager/src/main/resources/mapper/order/WorkOrderManageMapper.xml
  10. 3 3
      sms_water/src/main/java/com/huaxu/controller/MonitorInfoController.java
  11. 43 0
      sms_water/src/main/java/com/huaxu/controller/RankingController.java
  12. 8 0
      sms_water/src/main/java/com/huaxu/dao/OnlineMonitorMapper.java
  13. 61 0
      sms_water/src/main/java/com/huaxu/dto/ranking/RankingDto.java
  14. 33 0
      sms_water/src/main/java/com/huaxu/dto/ranking/SceneDeviceDto.java
  15. 50 0
      sms_water/src/main/java/com/huaxu/dto/ranking/SceneDeviceQueryDto.java
  16. 1 1
      sms_water/src/main/java/com/huaxu/rabbitmq/ReceiveData.java
  17. 1 1
      sms_water/src/main/java/com/huaxu/service/AppDataService.java
  18. 19 0
      sms_water/src/main/java/com/huaxu/service/RankingService.java
  19. 23 4
      sms_water/src/main/java/com/huaxu/service/SecSupplyService.java
  20. 7 1
      sms_water/src/main/java/com/huaxu/service/impl/OnlineMonitorImpl.java
  21. 101 0
      sms_water/src/main/java/com/huaxu/service/impl/RankingServiceImpl.java
  22. 37 2
      sms_water/src/main/resources/mapper/OnlineMonitorMapper.xml
  23. 18 10
      user_auth/src/main/java/com/huaxu/controller/UserController.java
  24. 18 0
      user_auth/src/main/java/com/huaxu/dto/UserAuthDto.java
  25. 10 2
      user_auth/src/main/java/com/huaxu/service/UserService.java
  26. 51 27
      user_auth/src/main/java/com/huaxu/service/impl/UserServiceImpl.java

+ 6 - 1
common/src/main/java/com/huaxu/model/ResultStatus.java

@@ -121,7 +121,12 @@ public enum ResultStatus {
     SCENE_TYPE_NAME_ALREADY_EXISTS(900015,"场景类型名称重复"),
     SCENE_NAME_ALREADY_EXISTS(900015,"场景名称重复"),
     SCENE_PARENT_ALREADY_EXISTS(900016,"上级场景不能选择当前编辑场景"),
-    DEVICE_PARENT_ALREADY_EXISTS(900017,"未选择任何设备或标签信息")
+    DEVICE_PARENT_ALREADY_EXISTS(900017,"未选择任何设备或标签信息"),
+
+    // 用户授权统一认证
+    USER_AUTH_APPID_NOT_FOUND(910001,"appId不存在"),
+    USER_AUTH_ENCRYPT_VALUE_VERIFY_ERROR(910002,"encrypt value验证不对或已过期!"),
+    USER_AUTH_UNIQID_OR_CODE_ISNULL(910003,"获取不到uniqId或code已过期!"),
     ;
 
     private final int status;

+ 208 - 0
common/src/main/java/com/huaxu/util/AESUtils.java

@@ -0,0 +1,208 @@
+package com.huaxu.util;
+
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+import java.io.*;
+import java.security.SecureRandom;
+import java.util.Date;
+
+/**
+ * AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥长度,并且用128位分组长度加密和解密数据。
+ * AES的加密过程:对数据的加密过程是通过把输入的明文和密钥由轮函数经N轮迭代来实现的,结尾轮与前N-1轮不同。
+ * 前N-1轮依次进行S盒变换、行移位变换、列混淆变换和轮密钥加变换;第N轮与前N-1轮相比去掉了列混淆变换
+ *  @author lihui
+ *  @since 2021-03-23
+ */
+public class AESUtils {
+
+    /** 密钥长度: 128, 192 or 256 */
+    private static final int KEY_SIZE = 128;
+
+    /** 加密/解密算法名称 */
+    private static final String ALGORITHM = "AES";
+
+    /** 随机数生成器(RNG)算法名称 */
+    private static final String RNG_ALGORITHM = "SHA1PRNG";
+
+    /** 允许最大的时间差 */
+    private static final int MAX_TIME = 1;
+
+    /**
+     * 生成密钥对象
+     */
+    private static SecretKey generateKey(byte[] key) throws Exception {
+        // 创建安全随机数生成器
+        SecureRandom random = SecureRandom.getInstance(RNG_ALGORITHM);
+        // 设置 密钥key的字节数组 作为安全随机数生成器的种子
+        random.setSeed(key);
+
+        // 创建 AES算法生成器
+        KeyGenerator gen = KeyGenerator.getInstance(ALGORITHM);
+        // 初始化算法生成器
+        gen.init(KEY_SIZE, random);
+
+        // 生成 AES密钥对象, 也可以直接创建密钥对象: return new SecretKeySpec(key, ALGORITHM);
+        return gen.generateKey();
+    }
+
+    /**
+     * 数据加密: 明文 -> 密文
+     */
+    public static byte[] encryptBye(byte[] plainBytes, byte[] key) throws Exception {
+        // 生成密钥对象
+        SecretKey secKey = generateKey(key);
+
+        // 获取 AES 密码器
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        // 初始化密码器(加密模型)
+        cipher.init(Cipher.ENCRYPT_MODE, secKey);
+
+        // 加密数据, 返回密文
+        byte[] cipherBytes = cipher.doFinal(plainBytes);
+
+        return cipherBytes;
+    }
+
+    /**
+     * 数据加密: 明文 -> 密文
+     */
+    public static String encryptString(byte[] plainBytes, byte[] key) throws Exception {
+        return new BASE64Encoder().encode(encryptBye(plainBytes, key));
+    }
+
+
+    /**
+     * 数据解密: 密文 -> 明文
+     */
+    public static byte[] decryptByte(byte[] cipherBytes, byte[] key) throws Exception {
+        // 生成密钥对象
+        SecretKey secKey = generateKey(key);
+
+        // 获取 AES 密码器
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        // 初始化密码器(解密模型)
+        cipher.init(Cipher.DECRYPT_MODE, secKey);
+
+        // 解密数据, 返回明文
+        byte[] plainBytes = cipher.doFinal(cipherBytes);
+
+        return plainBytes;
+    }
+
+    /**
+     * 数据解密: 密文 -> 明文
+     */
+    public static String decryptString(String cipherString, String key) throws Exception {
+        return new String(decryptByte(new BASE64Decoder().decodeBuffer(cipherString), key.getBytes()), "utf-8");
+    }
+
+    /**
+     * 数据验证:
+     * 解密后的值再根据当前的时间进行加密
+     * 是否等同于
+     * 传过来的加密
+     * @param  date 加密的时间
+     * @param  text 明文
+     * @param  encryptValue 加密后内容
+     * @param  appSecret 秘钥
+     */
+    public static boolean verifyEncrypt(String encryptValue, String text, Long date, String appSecret) {
+        try {
+            // 获取当前时间
+            long differ   = Long.parseLong(DatesUtil.formatDate(new Date(), "yyyyMMddHHmm")) - date;
+            if (differ > MAX_TIME || differ < 0) {
+                return false;
+            }
+            // 重新组装key,验证加密是否相同
+            String encryptValue2 = encryptString((text + "_" + date).getBytes(), appSecret.getBytes());
+            return encryptValue2.equals(encryptValue);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    /**
+     * 加密文件: 明文输入 -> 密文输出
+     */
+    public static void encryptFile(File plainIn, File cipherOut, byte[] key) throws Exception {
+        aesFile(plainIn, cipherOut, key, true);
+    }
+
+    /**
+     * 解密文件: 密文输入 -> 明文输出
+     */
+    public static void decryptFile(File cipherIn, File plainOut, byte[] key) throws Exception {
+        aesFile(plainOut, cipherIn, key, false);
+    }
+
+    /**
+     * AES 加密/解密文件
+     */
+    private static void aesFile(File plainFile, File cipherFile, byte[] key, boolean isEncrypt) throws Exception {
+        // 获取 AES 密码器
+        Cipher cipher = Cipher.getInstance(ALGORITHM);
+        // 生成密钥对象
+        SecretKey secKey = generateKey(key);
+        // 初始化密码器
+        cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secKey);
+
+        // 加密/解密数据
+        InputStream in = null;
+        OutputStream out = null;
+
+        try {
+            if (isEncrypt) {
+                // 加密: 明文文件为输入, 密文文件为输出
+                in = new FileInputStream(plainFile);
+                out = new FileOutputStream(cipherFile);
+            } else {
+                // 解密: 密文文件为输入, 明文文件为输出
+                in = new FileInputStream(cipherFile);
+                out = new FileOutputStream(plainFile);
+            }
+
+            byte[] buf = new byte[1024];
+            int len = -1;
+
+            // 循环读取数据 加密/解密
+            while ((len = in.read(buf)) != -1) {
+                out.write(cipher.update(buf, 0, len));
+            }
+            out.write(cipher.doFinal());    // 最后需要收尾
+
+            out.flush();
+
+        } finally {
+            close(in);
+            close(out);
+        }
+    }
+
+    private static void close(Closeable c) {
+        if (c != null) {
+            try {
+                c.close();
+            } catch (IOException e) {
+                // nothing
+            }
+        }
+    }
+
+    public static void main(String[] args) throws  Exception{
+        String appId      = "868083_1001_123456_202103241637";        // 原文内容
+        String appSecret  = "123456";                    // AES加密/解密用的原始密码
+        // 加密数据, 返回密文
+        String cipherString = AESUtils.encryptString(appId.getBytes(), appSecret.getBytes());
+
+        // 解密数据, 返回明文
+        String plainString  = AESUtils.decryptString(cipherString, appSecret);
+
+        System.out.println(cipherString);
+        System.out.println(plainString);
+        //System.out.println(AESUtils.verifyEncrypt(cipherString, plainString, appSecret));
+    }
+}

+ 103 - 0
common/src/main/java/com/huaxu/util/DESUtil.java

@@ -0,0 +1,103 @@
+package com.huaxu.util;
+
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import javax.crypto.spec.IvParameterSpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+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" );
+
+        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes( "UTF-8" ));
+
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
+        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+        IvParameterSpec iv = new IvParameterSpec(key.getBytes( "UTF-8" ));
+        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
+
+        return encodeBase64(cipher.doFinal(message.getBytes( "UTF-8" )));
+    }
+
+    public static String decrypt(String message, String key) throws Exception {
+
+        byte [] bytesrc = decodeBase64(message); //convertHexString(message);
+        Cipher cipher = Cipher.getInstance( "DES/CBC/PKCS5Padding" );
+        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes( "UTF-8" ));
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance( "DES" );
+        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
+        IvParameterSpec iv = new IvParameterSpec(key.getBytes( "UTF-8" ));
+
+        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
+
+        byte [] retByte = cipher.doFinal(bytesrc);
+        return new String(retByte);
+    }
+
+    public static byte [] convertHexString(String ss) {
+        byte digest[] = new byte [ss.length() / 2 ];
+        for ( int i = 0 ; i < digest.length; i++) {
+            String byteString = ss.substring( 2 * i, 2 * i + 2 );
+            int byteValue = Integer.parseInt(byteString, 16 );
+            digest[i] = ( byte ) byteValue;
+        }
+
+        return digest;
+    }
+
+    public static String toHexString( byte b[]) {
+        StringBuffer hexString = new StringBuffer();
+        for ( int i = 0 ; i < b.length; i++) {
+            String plainText = Integer.toHexString( 0xff & b[i]);
+            if (plainText.length() < 2 )
+                plainText = "0" + plainText;
+            hexString.append(plainText);
+        }
+
+        return hexString.toString();
+    }
+
+    /**
+     * 数据验证:
+     * 传过来的时间跟当前的时间进行比较
+     * @param  date 加密的时间
+     */
+    public static boolean verifyTime(Long date, long effectiveTime) {
+        try {
+            // 获取当前时间
+            long differ   = Long.parseLong(DatesUtil.formatDate(new Date(), "yyyyMMddHHmm")) - date;
+            return !(differ > effectiveTime || differ < 0);
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+
+    public static String encodeBase64( byte [] b) {
+        return Base64.encodeBase64String(b);
+    }
+
+    public static byte [] decodeBase64(String base64String) {
+        return Base64.decodeBase64(base64String);
+    }
+
+    public static void main(String[] args) {
+        String  code = "134376";
+        try {
+            System.out.println(encrypt(code + "_1001_12345678_202104010935", "12345678"));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 4 - 0
common/src/main/java/com/huaxu/util/Util.java

@@ -82,4 +82,8 @@ public class Util {
         }
         return false;
     }
+
+    public static void main(String[] args) {
+        System.out.println("22");
+    }
 }

+ 15 - 2
operation_manager/src/main/java/com/huaxu/order/controller/WorkOrderManageController.java

@@ -389,16 +389,29 @@ public class WorkOrderManageController {
         AjaxMessage<List<UserEntity>> listAjaxMessage = userCenterClient.findUserListByType();
         for(UserEntity userEntity : listAjaxMessage.getData()){
             Map<String, Object> orderStatusMap = workOrderManageService.selectOrderUserStatus(userEntity.getId().toString());
+
+            String orderStatus =  "空闲";
             Map<String, Object> map = new HashMap<>();
             map.put("id", userEntity.getId());
             map.put("userName", userEntity.getUsername());
             map.put("phone", userEntity.getPhone());
             map.put("deptName", userEntity.getDeptOrgName());
             if (orderStatusMap != null) {
-                map.put("status", orderStatusMap.get("S").toString());
+                orderStatus = orderStatusMap.get("S").toString();
+                if(orderStatus.equals("空闲")){
+                    Map<String, Object> planStatusMap = workOrderManageService.selectPlanUserStatus(userEntity.getId().toString());
+                    if(planStatusMap != null){
+                        orderStatus =  planStatusMap.get("S").toString();
+                    }
+                }
+                map.put("status", orderStatus);
             }
             else {
-                map.put("status", "空闲");
+                Map<String, Object> planStatusMap = workOrderManageService.selectPlanUserStatus(userEntity.getId().toString());
+                if(planStatusMap != null){
+                    orderStatus =  planStatusMap.get("S").toString();
+                }
+                map.put("status",orderStatus);
             }
             Map<String, Object> onLineStatusMap = workOrderManageService.selectMaintainUserStatus(userEntity.getId().toString());
             if(onLineStatusMap != null) {

+ 6 - 0
operation_manager/src/main/java/com/huaxu/order/dao/WorkOrderManageMapper.java

@@ -49,8 +49,14 @@ public interface WorkOrderManageMapper {
 
     Map<String,Object> selectOrderUserStatus(@Param("userId") String userId);
 
+    Map<String,Object> selectPlanUserStatus(@Param("userId") String userId);
+
     Map<String,Object> selectMaintainUserStatus(@Param("userId") String userId);
 
+
+
+
+
     /**
      * 待处理权限
      */

+ 4 - 0
operation_manager/src/main/java/com/huaxu/order/service/WorkOrderManageService.java

@@ -77,6 +77,8 @@ public interface WorkOrderManageService {
      */
     Map<String,Object> selectOrderUserStatus(@Param("userId") String userId);
 
+    Map<String,Object> selectPlanUserStatus(@Param("userId") String userId);
+
     Map<String,Object> selectMaintainUserStatus(@Param("userId") String userId);
 
 
@@ -90,5 +92,7 @@ public interface WorkOrderManageService {
     List<WorkOrderManageDto> selectOrderStatus(WorkOrderManageDto workOrderManageDto);
 
 
+
+
     List<WorkOrderManageDto> selectMaintainOrder(WorkOrderManageDto workOrderManageDto);
 }

+ 5 - 0
operation_manager/src/main/java/com/huaxu/order/service/impl/WorkOrderManageServiceImpl.java

@@ -133,6 +133,11 @@ public class WorkOrderManageServiceImpl implements WorkOrderManageService {
         return workOrderManageMapper.selectOrderUserStatus(userId);
     }
 
+    @Override
+    public Map<String, Object> selectPlanUserStatus(String userId) {
+        return workOrderManageMapper.selectPlanUserStatus(userId);
+    }
+
     @Override
     public Map<String, Object> selectMaintainUserStatus(String userId) {
         return workOrderManageMapper.selectMaintainUserStatus(userId);

+ 31 - 16
operation_manager/src/main/resources/mapper/order/WorkOrderManageMapper.xml

@@ -665,25 +665,39 @@
     where order_pid =  #{orderPid,jdbcType=VARCHAR}
   </select>
 
-  <!--查询派单时的用户状态-->
+  <!--查询工单派单时的用户状态-->
    <select id="selectOrderUserStatus" parameterType="java.lang.String" resultType="map">
-    select X, Y, CASE WHEN S IS NULL THEN '空闲' WHEN S='0' THEN '空闲' ELSE '执行中' END S ,
-    case when offlinetime is null then '离线' when offlinetime>10 then '离线' when offlinetime &lt;= 10 THEN '在线' END L FROM
-    (
-        select order_user_id,longtitude X, latitude Y, TIMESTAMPDIFF(second,upload_date, now()) offlinetime from sc_work_order_manage t1 left join sc_gps_data t2
-        on t1.order_user_id = t2.user_id
-        group by order_user_id,longtitude, latitude,upload_date
-    ) a
-     left join
-    (
-      select count(*) S,order_user_id from sc_work_order_manage
-      where order_status = 1
-      group by order_user_id
-    ) b
-    on a.order_user_id=b.order_user_id
-      where a.order_user_id= #{userId,jdbcType=INTEGER}
+      SELECT X, Y,
+       CASE WHEN S IS NULL THEN '空闲' WHEN S='0' THEN '空闲' ELSE '执行中' END S ,
+       CASE WHEN offlinetime IS NULL THEN '离线' WHEN offlinetime>10 THEN '离线' WHEN offlinetime &lt;= 10 THEN '在线' END L
+       FROM
+        (
+       select order_user_id,longtitude X, latitude Y, TIMESTAMPDIFF(second,upload_date, now()) offlinetime from sc_work_order_manage t1 left join sc_gps_data t2
+       on t1.order_user_id = t2.user_id
+       group by order_user_id,longtitude, latitude,upload_date
+       ) a
+      left join
+      (
+       select count(*) S,order_user_id from sc_work_order_manage
+       where order_status = 1
+       group by order_user_id
+       ) b
+       on a.order_user_id=b.order_user_id
+       where a.order_user_id= #{userId,jdbcType=INTEGER}
+  </select>
+  <!--查询任务单派单时的用户状态-->
+  <select id="selectPlanUserStatus" parameterType="java.lang.String" resultType="map">
+     SELECT
+     CASE WHEN S IS NULL THEN '空闲' WHEN S='0' THEN '空闲' ELSE '执行中' END S
+     FROM (
+       select count(*) S,user_id from sc_plan_manage
+       where plan_status = 1
+       group by user_id
+     ) a
+     where a.user_id= #{userId,jdbcType=INTEGER}
   </select>
 
+
   <!--查询维修列表的用户状态-->
   <select id="selectMaintainUserStatus" parameterType="java.lang.String" resultType="map">
     select X, Y,
@@ -795,5 +809,6 @@
         </if>
       </if>
     </where>
+    order by t1.date_create desc
   </select>
 </mapper>

+ 3 - 3
sms_water/src/main/java/com/huaxu/controller/MonitorInfoController.java

@@ -54,7 +54,7 @@ public class MonitorInfoController {
     @Autowired
     private MonitorDataReportService monitorDataReportService;
 
-    @ApiOperation(value = "按场景ID查询供水量出水量耗药量耗电量")
+    @ApiOperation(value = "按场景ID查询供水量出水量耗药量耗电量(已废弃)")
     @RequestMapping(value = "/findTotalUsageBySceneId",method = RequestMethod.GET)
     @ResponseBody
     public  AjaxMessage<SceneUsageDto> findTotalUsageBySceneId(@ApiParam(value = "场景ID", required = true) @RequestParam Long id,@ApiParam(value = "类型(0综合调度 1综合展示)", required = false) @RequestParam(required = false) Integer... type) {
@@ -68,7 +68,7 @@ public class MonitorInfoController {
             sceneUsageDto.setYieldWaterUsage(sceneUsageDto.getYieldWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getYieldWaterUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
             sceneUsageDto.setIntakeWaterUsage(sceneUsageDto.getIntakeWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getIntakeWaterUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
             sceneUsageDto.setPowerUsage(sceneUsageDto.getPowerUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getPowerUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
-            sceneUsageDto.setDrugUsage(sceneUsageDto.getDrugUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getDrugUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
+            sceneUsageDto.setDrugUsage(sceneUsageDto.getDrugUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getDrugUsage()).setScale( 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
         }else {
             sceneUsageDto.setYieldWaterUsage(sceneUsageDto.getYieldWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getYieldWaterUsage()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
             sceneUsageDto.setIntakeWaterUsage(sceneUsageDto.getIntakeWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getIntakeWaterUsage()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
@@ -92,7 +92,7 @@ public class MonitorInfoController {
             sceneUsageDto.setYieldWaterUsage(sceneUsageDto.getYieldWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getYieldWaterUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
             sceneUsageDto.setIntakeWaterUsage(sceneUsageDto.getIntakeWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getIntakeWaterUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
             sceneUsageDto.setPowerUsage(sceneUsageDto.getPowerUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getPowerUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
-            sceneUsageDto.setDrugUsage(sceneUsageDto.getDrugUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getDrugUsage()).divide(BigDecimal.valueOf(10000), 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
+            sceneUsageDto.setDrugUsage(sceneUsageDto.getDrugUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getDrugUsage()).setScale( 3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
         } else {
             sceneUsageDto.setYieldWaterUsage(sceneUsageDto.getYieldWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getYieldWaterUsage()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);
             sceneUsageDto.setIntakeWaterUsage(sceneUsageDto.getIntakeWaterUsage() != null ? BigDecimal.valueOf(sceneUsageDto.getIntakeWaterUsage()).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue() : 0d);

+ 43 - 0
sms_water/src/main/java/com/huaxu/controller/RankingController.java

@@ -0,0 +1,43 @@
+package com.huaxu.controller;
+
+import com.huaxu.dto.ranking.RankingDto;
+import com.huaxu.entity.AlarmDetailsEntity;
+import com.huaxu.model.AjaxMessage;
+import com.huaxu.model.ResultStatus;
+import com.huaxu.service.AlarmDetailsService;
+import com.huaxu.service.RankingService;
+import com.huaxu.service.SceneService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @description
+ * @auto lihui
+ * @data 2021-04-01
+ */
+@RestController
+@RequestMapping("/ranking")
+@Api(tags = "排名")
+@Slf4j
+public class RankingController {
+
+    @Autowired
+    private RankingService rankingService;
+
+    @RequestMapping(value="getPipePressure" , method = RequestMethod.GET)
+    @ApiOperation(value = "管网压力排名")
+    public AjaxMessage<List<RankingDto>> getPipePressure(){
+        return new AjaxMessage<List<RankingDto>>(ResultStatus.OK, rankingService.findPipeRanking("压力", 13));
+    }
+
+}

+ 8 - 0
sms_water/src/main/java/com/huaxu/dao/OnlineMonitorMapper.java

@@ -2,6 +2,8 @@ package com.huaxu.dao;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.huaxu.dto.*;
+import com.huaxu.dto.ranking.SceneDeviceDto;
+import com.huaxu.dto.ranking.SceneDeviceQueryDto;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -110,4 +112,10 @@ public interface OnlineMonitorMapper {
      * @return
      */
     List<OnlineDataDto> selectPipeNetList(OnlineDataDto onlineDataDto);
+
+    /**
+     * 查找场景下的所有设备
+     * @return
+     */
+    List<SceneDeviceDto> selectSceneDevice(SceneDeviceQueryDto sceneDeviceQueryDto);
 }

+ 61 - 0
sms_water/src/main/java/com/huaxu/dto/ranking/RankingDto.java

@@ -0,0 +1,61 @@
+package com.huaxu.dto.ranking;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @description
+ * @auto lihui
+ * @data 2021-04-01
+ */
+@ApiModel("排名实体类")
+@Data
+public class RankingDto implements Comparable<RankingDto>{
+
+    private static final long serialVersionUID = -3866939316262264972L;
+
+    @ApiModelProperty(value = "名字",hidden = true)
+    private String name;
+
+    @ApiModelProperty(value = "得分",hidden = true)
+    private Double score;
+
+    @Override
+    public int compareTo(RankingDto o) {
+        return o.getScore().compareTo(this.getScore());
+    }
+
+    public static void main(String[] args) {
+        List<RankingDto> list = new ArrayList<>();
+        RankingDto dto = new RankingDto();
+        dto.setName("排名5");
+        dto.setScore(55.333);
+        list.add(dto);
+        dto = new RankingDto();
+        dto.setName("排名1");
+        dto.setScore(100.333);
+        list.add(dto);
+        dto = new RankingDto();
+        dto.setName("排名3");
+        dto.setScore(91.333);
+        list.add(dto);
+        dto = new RankingDto();
+        dto.setName("排名2");
+        dto.setScore(92.333);
+        list.add(dto);
+        dto = new RankingDto();
+        dto.setName("排名4");
+        dto.setScore(66.333);
+        list.add(dto);
+        Collections.sort(list);
+        for (RankingDto rankingDto : list){
+            System.out.println(rankingDto.getName() +"=1=1=" + rankingDto.getScore());
+        }
+    }
+
+}

+ 33 - 0
sms_water/src/main/java/com/huaxu/dto/ranking/SceneDeviceDto.java

@@ -0,0 +1,33 @@
+package com.huaxu.dto.ranking;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description
+ * @auto lihui
+ * @data 2021-04-01
+ */
+@ApiModel("场景设备属性实体")
+@Data
+public class SceneDeviceDto {
+
+    private static final long serialVersionUID = -3866939316262264972L;
+
+    @ApiModelProperty(value = "设备ID",hidden = true)
+    private int deviceId;
+
+    @ApiModelProperty(value = "设备CODE",hidden = true)
+    private String deviceCode;
+
+    @ApiModelProperty(value = "设备名字",hidden = true)
+    private String deviceName;
+
+    @ApiModelProperty(value = "设备属性ID",hidden = true)
+    private Long attributeId;
+
+    @ApiModelProperty(value = "设备属性名字",hidden = true)
+    private String attributeName;
+
+}

+ 50 - 0
sms_water/src/main/java/com/huaxu/dto/ranking/SceneDeviceQueryDto.java

@@ -0,0 +1,50 @@
+package com.huaxu.dto.ranking;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.huaxu.common.converter.Double3Serializer;
+import com.huaxu.dto.MonitorDataDto;
+import com.huaxu.model.ProgramItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @description
+ * @auto yjy
+ * @data 2020-12-3
+ */
+@ApiModel("在线监测列表数据")
+@Data
+public class SceneDeviceQueryDto {
+
+    private static final long serialVersionUID = -3866939316262264972L;
+
+    @ApiModelProperty(value = "租户标识",hidden = true)
+    private String tenantId;
+
+    @ApiModelProperty(value ="权限",hidden = true)
+    private List<ProgramItem> programItems;
+
+    @ApiModelProperty(value = "用户类型(-9999 超管 -999普通用户 2普通用户)",hidden = true)
+    private String userType;
+
+    @ApiModelProperty(value="用户权限类型",hidden = true)
+    private Integer permissonType;
+
+    @ApiModelProperty(value = "场景ids" ,hidden = true )
+    private List<Long> sceneIds;
+
+    @ApiModelProperty(value =  "一级场景名字")
+    private String firstSceneTypeName;
+
+    @ApiModelProperty(value =  "二级场景名字")
+    private String secondSceneTypeName;
+
+    @ApiModelProperty(value =  "属性类型")
+    private int parmType;
+}

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

@@ -186,7 +186,7 @@ public class ReceiveData {
                        if(alarmDetailsDtoMap.containsKey(deviceCheckAlarmDto.getAlarmSettingId())){
                            AlarmDetailsDto alarmDetailsDto = alarmDetailsDtoMap.get(deviceCheckAlarmDto.getAlarmSettingId());
                            alarmDetailsDto.setAlarmValue(receivedValue);
-                           alarmDetailsDto.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
+//                           alarmDetailsDto.setAlarmContent(deviceCheckAlarmDto.getAlarminfo(receivedValue));
                            alarmDetailsDto.setMinValue(CalcUtil.compareBySign(alarmDetailsDto.getMinValue(),receivedValue, "<")?alarmDetailsDto.getMinValue():receivedValue);
                            alarmDetailsDto.setMaxValue(CalcUtil.compareBySign(alarmDetailsDto.getMaxValue(),receivedValue,">")?alarmDetailsDto.getMaxValue():receivedValue);
 //                                   update.add(alarmDetailsDto);

+ 1 - 1
sms_water/src/main/java/com/huaxu/service/AppDataService.java

@@ -162,7 +162,7 @@ public class AppDataService {
                 deviceParms.add(deviceParmEntity);
                 parmMap.put(deviceParmEntity.getDeviceCode(), deviceParms);
             } else {
-                parmMap.get(deviceParmEntity.getDeviceId()).add(deviceParmEntity);
+                parmMap.get(deviceParmEntity.getDeviceCode()).add(deviceParmEntity);
             }
         }
         for (String deveiceCode : deviceCodes) {

+ 19 - 0
sms_water/src/main/java/com/huaxu/service/RankingService.java

@@ -0,0 +1,19 @@
+package com.huaxu.service;
+
+import com.huaxu.dto.ranking.RankingDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public interface RankingService {
+
+    /**
+     * 查询管网下的排名
+     * @param sceneTypeName  场景
+     * @param parmType       属性类型
+     * @return
+     */
+    List<RankingDto> findPipeRanking(String sceneTypeName, int parmType);
+
+}

+ 23 - 4
sms_water/src/main/java/com/huaxu/service/SecSupplyService.java

@@ -2,6 +2,7 @@ package com.huaxu.service;
 
 import com.huaxu.dto.*;
 import com.huaxu.entity.*;
+import com.huaxu.service.impl.MonitorDataReportServiceImpl;
 import com.huaxu.util.ByteArrayUtils;
 import com.huaxu.util.RedisUtil;
 import org.bouncycastle.crypto.engines.AESLightEngine;
@@ -23,6 +24,8 @@ public class SecSupplyService {
     @Autowired
     private DeviceParmService deviceParmService;
     @Autowired
+    private MonitorDataReportServiceImpl monitorDataReportServiceImpl;
+    @Autowired
     private RedisUtil redisUtil;
     @Autowired
     private  DayReportService dayReportService;
@@ -71,8 +74,23 @@ public class SecSupplyService {
      * @return
      */
     public AmountTotalDto findAmountTotalByTypeName(SceneEntity sceneEntity) {
+        BigDecimal multipleData;
+        if(sceneEntity.getSceneTypeName().equals("泵站")){
+            multipleData = new BigDecimal("1");
+        }else{
+            multipleData = new BigDecimal("10000");
+        }
         AmountTotalDto amountTotalDto = new AmountTotalDto();
-        List<SceneEntity> sceneEntities = sceneService.selectByTypeName(sceneEntity);
+        BigDecimal  instantFlow = monitorDataReportServiceImpl.getAmountCount(null,null,sceneEntity.getSceneTypeName(),14,1);
+        BigDecimal  dayAmount = monitorDataReportServiceImpl.getAmountCount(null,null,sceneEntity.getSceneTypeName(),3,1);
+        BigDecimal  monthAmount = monitorDataReportServiceImpl.getAmountCount(null,null,sceneEntity.getSceneTypeName(),3,2);
+        BigDecimal  yearAmount = monitorDataReportServiceImpl.getAmountCount(null,null,sceneEntity.getSceneTypeName(),3,3);
+        amountTotalDto.setInstantFlow(instantFlow.setScale(3,BigDecimal.ROUND_HALF_UP).doubleValue());
+        amountTotalDto.setDayAmount(dayAmount.divide(multipleData,3,BigDecimal.ROUND_HALF_UP).doubleValue());
+        amountTotalDto.setMonthAmount(monthAmount.divide(multipleData,3,BigDecimal.ROUND_HALF_UP).doubleValue());
+        amountTotalDto.setYearAmount(yearAmount.divide(multipleData,3,BigDecimal.ROUND_HALF_UP).doubleValue());
+
+        /*List<SceneEntity> sceneEntities = sceneService.selectByTypeName(sceneEntity);
         if (sceneEntities.size() == 0)
             return null;
         Calendar begin = Calendar.getInstance();// 得到一个Calendar的实例
@@ -133,7 +151,7 @@ public class SecSupplyService {
                 }
             }
         }
-        amountTotalDto.setDayAmount(BigDecimal.valueOf(dayAmount).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue());
+        amountTotalDto.setDayAmount(BigDecimal.valueOf(dayAmount).divide(multipleData,3,BigDecimal.ROUND_HALF_UP).doubleValue());
         //本月供水量
         double monthAmount = 0d;
         begin.add(Calendar.DATE, 1);// 恢复到当前日期
@@ -155,7 +173,7 @@ public class SecSupplyService {
         } else {
             monthAmount = dayAmount;
         }
-        amountTotalDto.setMonthAmount(BigDecimal.valueOf(monthAmount).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue());
+        amountTotalDto.setMonthAmount(BigDecimal.valueOf(monthAmount).divide(multipleData,3,BigDecimal.ROUND_HALF_UP).doubleValue());
         //本年供水量
         double yearAmount = 0d;
         begin.add(Calendar.MONTH, 1);// 恢复到当前日期
@@ -172,7 +190,8 @@ public class SecSupplyService {
         } else {
             yearAmount = monthAmount;
         }
-        amountTotalDto.setYearAmount(BigDecimal.valueOf(yearAmount).divide(BigDecimal.valueOf(10000),3,BigDecimal.ROUND_HALF_UP).doubleValue());
+        amountTotalDto.setYearAmount(BigDecimal.valueOf(yearAmount).divide(multipleData,3,BigDecimal.ROUND_HALF_UP).doubleValue());
+       */
         return amountTotalDto;
     }
 

+ 7 - 1
sms_water/src/main/java/com/huaxu/service/impl/OnlineMonitorImpl.java

@@ -103,6 +103,8 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
                     return 0;
                 }
             });
+        }else{
+            GetCalMonitorData(result, new ArrayList<>());
         }
         return result;
     }
@@ -433,7 +435,11 @@ public class OnlineMonitorImpl implements OnlineMonitorService {
         onlineDataDto.setUserType(loginUser.getType());
         //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
         onlineDataDto.setPermissonType(loginUser.getPermissonType());
-        return onlineMonitorMapper.selectPipeNetLayer(onlineDataDto);
+        List<PipeNetLayerDto> result=onlineMonitorMapper.selectPipeNetLayer(onlineDataDto);
+        for(PipeNetLayerDto pipeNetLayerDto :result){
+            GetCalMonitorData(pipeNetLayerDto.getDeviceDataList(), new ArrayList<>());
+        }
+        return result;
     }
 
     /**

+ 101 - 0
sms_water/src/main/java/com/huaxu/service/impl/RankingServiceImpl.java

@@ -0,0 +1,101 @@
+package com.huaxu.service.impl;
+
+import com.huaxu.dao.OnlineMonitorMapper;
+import com.huaxu.dto.ranking.RankingDto;
+import com.huaxu.dto.ranking.SceneDeviceDto;
+import com.huaxu.dto.ranking.SceneDeviceQueryDto;
+import com.huaxu.entity.MonitorDataEntity;
+import com.huaxu.entity.MonitorDataValueEntity;
+import com.huaxu.model.LoginUser;
+import com.huaxu.service.RankingService;
+import com.huaxu.service.SceneService;
+import com.huaxu.util.ByteArrayUtils;
+import com.huaxu.util.RedisUtil;
+import com.huaxu.util.UserUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Service
+public class RankingServiceImpl implements RankingService {
+
+    private  static final String PIPE_NAME = "管网";
+
+    private static final String SMS_WATER_CACHE_KEY = "sms_water_%s";
+
+    @Resource
+    private OnlineMonitorMapper onlineMonitorMapper;
+
+    @Autowired
+    private SceneService sceneService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+
+    @Override
+    public List<RankingDto> findPipeRanking(String secondSceneTypeName, int parmType){
+        List<RankingDto> result = new ArrayList<>();
+        List<SceneDeviceDto> sceneDeviceDtoList = findSceneDevice(PIPE_NAME, secondSceneTypeName, parmType);
+        if (CollectionUtils.isEmpty(sceneDeviceDtoList)){
+            return result;
+        }
+        String cacheKey = null;
+        for (SceneDeviceDto sceneDeviceDto: sceneDeviceDtoList) {
+            if (sceneDeviceDto.getAttributeId() == null) {
+                continue;
+            }
+            cacheKey = String.format(SMS_WATER_CACHE_KEY, sceneDeviceDto.getDeviceCode());
+            byte[] bytes = redisUtil.get(cacheKey.getBytes());
+            if(bytes == null || bytes.length == 0) {
+                continue;
+            }
+            MonitorDataEntity monitorDataEntity = (MonitorDataEntity) ByteArrayUtils.bytesToObject(bytes).get();
+            List<MonitorDataValueEntity> monitorList = monitorDataEntity.getDataValues();
+            if (CollectionUtils.isEmpty(monitorList)){
+                continue;
+            }
+            for (MonitorDataValueEntity monitorEntity:monitorList ) {
+                if (sceneDeviceDto.getAttributeId().equals(monitorEntity.getAttributeId())){
+                    RankingDto rankingDto = new RankingDto();
+                    rankingDto.setName(monitorEntity.getAttributeName());
+                    rankingDto.setScore(monitorEntity.getDataValue());
+                    result.add(rankingDto);
+                    break;
+                }
+            }
+        }
+        if (result.size() > 1){
+            Collections.sort(result);
+        }
+        return result;
+    }
+
+    /**
+     * 查找场景下的所有设备
+     * @param firstSceneTypeName   一级场景名字
+     * @param secondSceneTypeName  二级场景名字
+     * @param parmType             属性类型
+     * @return
+     */
+    private List<SceneDeviceDto> findSceneDevice(String firstSceneTypeName, String secondSceneTypeName, int parmType) {
+        SceneDeviceQueryDto sceneDeviceQueryDto  = new SceneDeviceQueryDto();
+        LoginUser loginUser = UserUtil.getCurrentUser();
+        sceneDeviceQueryDto.setTenantId(loginUser.getTenantId());
+        sceneDeviceQueryDto.setProgramItems(loginUser.getProgramItemList());
+        sceneDeviceQueryDto.setUserType(loginUser.getType());
+        sceneDeviceQueryDto.setSceneIds(sceneService.findByParentIdsLike(null));
+        sceneDeviceQueryDto.setFirstSceneTypeName(firstSceneTypeName);
+        sceneDeviceQueryDto.setSecondSceneTypeName(secondSceneTypeName);
+        sceneDeviceQueryDto.setParmType(parmType);
+        //1是公司,2是公司及以下,3部门,4部门及以下,5自定义
+        sceneDeviceQueryDto.setPermissonType(loginUser.getPermissonType());
+        return onlineMonitorMapper.selectSceneDevice(sceneDeviceQueryDto);
+    }
+
+}

+ 37 - 2
sms_water/src/main/resources/mapper/OnlineMonitorMapper.xml

@@ -75,6 +75,12 @@
             <result property="pointY" column="point_y" jdbcType="VARCHAR"/>
             <result property="address" column="address" jdbcType="VARCHAR"/>
             <result property="deviceState" column="device_state" jdbcType="INTEGER"/>
+            <collection property="MonitorDataEntities" ofType="com.huaxu.dto.MonitorDataDto" javaType="list">
+                <result property="attributeId" column="attribute_id" jdbcType="INTEGER"/>
+                <result property="attributeName" column="attribute_name" jdbcType="VARCHAR"/>
+                <result property="unit" column="unit" jdbcType="VARCHAR"/>
+                <result property="isAlarm" column="is_Alarm" jdbcType="VARCHAR"/>
+            </collection>
         </collection>
     </resultMap>
 
@@ -488,7 +494,7 @@
         <include refid="deviceInnerJoins"/>
         left join(
             select a1.scene_id, a1.device_id from sms_alarm_details a1 where a1.`status` = 1 and a1.state = 1
-            <if test="sceneTypeName != null and sceneTypeName !=''">
+            <if test="(sceneTypeName != null and sceneTypeName !='') or flag == 1">
                 and a1.alarm_type = '参数报警'
             </if>
             group by a1.scene_id, a1.device_id
@@ -642,6 +648,7 @@
     <!--查询管网地图图层及设备-->
     <select id="selectPipeNetLayer" resultMap="layerMap">
         select t4.id scene_id,t4.scene_name,t5.scene_type_name,t6.id device_id,t6.device_code,t6.device_name,t6.point_x,t6.point_y,t6.address
+        ,t8.attribute_id ,ifnull(t8.remark, t9.`name`) attribute_name,t9.unit,case when t8.attribute_id is  null then null when t10.id is null then 0 else 1 end is_alarm
         <if test="flag == null or flag ==0">
             ,if (t7.alarm_count>0, 1, 0) device_state
         </if>
@@ -661,6 +668,9 @@
             </if>
             from sms_alarm_details a1 where a1.`status` = 1 and a1.state = 1 group by a1.scene_id, a1.device_id
         )t7 on t7.scene_id=t2.scene_id and t7.device_id=t2.device_id
+        left join sms_device_parm t8 on t8.scene_id = t2.scene_id and t8.device_id=t2.device_id and t8. status = 1 and t8.is_suspension = 1
+        left join sms_device_attribute t9 on t8.attribute_id=t9.id and t9.status = 1
+        left join sms_alarm_details t10 on t10.scene_id=t2.scene_id and t10.device_id=t2.device_id and t10.attribute_id=t8.attribute_id and t10.status = 1 and t10.state=1
         where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1 and t3.scene_type_name = '管网'
         <choose>
             <when test="sceneTypeName != null and sceneTypeName !=''">
@@ -679,7 +689,7 @@
         <if test="sceneIds == null or sceneIds.size() == 0">
             and t1.id is null
         </if>
-        order by t4.scene_name,t6.date_create
+        order by t4.scene_name,t8.seq
     </select>
     <!--查询昨日水厂制水总量-->
     <select id="selectTotalYieldWater" resultType="java.lang.Double">
@@ -793,4 +803,29 @@
         </if>
         order by field(device_state,1,0,2),t6.last_update_time desc
     </select>
+    <!--查找场景下的设备-->
+    <select id="selectSceneDevice" resultType="com.huaxu.dto.ranking.SceneDeviceDto">
+        select  t6.id deviceId,
+                t6.device_code deviceCode,
+                t6.device_name deviceName,
+                t8.attribute_id attributeId,
+                ifnull(t8.remark, t9.`name`) attribute_name
+        from sms_scene t1
+        <include refid="deviceInnerJoins"/>
+        left join sms_device_parm t8 on t8.scene_id = t2.scene_id and t8.device_id=t2.device_id and t8. status = 1 and t8.PARM_TYPE = #{parmType}
+        left join sms_device_attribute t9 on t8.attribute_id=t9.id and t9.status = 1
+        where t1.parent_scene_id = 0 and t1. status = 1 and t1. enable_state = 1
+        and t3.scene_type_name = #{firstSceneTypeName}
+        and t5.scene_type_name = #{secondSceneTypeName}
+        <if test="sceneIds != null and sceneIds.size() > 0">
+            and t1.id  in
+            <foreach collection="sceneIds" item="item" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
+        <if test="sceneIds == null or sceneIds.size() == 0">
+            and t1.id is null
+        </if>
+        order by t4.scene_name,t8.seq
+    </select>
 </mapper>

+ 18 - 10
user_auth/src/main/java/com/huaxu/controller/UserController.java

@@ -1,13 +1,10 @@
 package com.huaxu.controller;
 
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.huaxu.dto.UserDto;
+import com.huaxu.dto.UserAuthDto;
+import com.huaxu.exception.ServiceException;
 import com.huaxu.model.LoginUser;
 import com.huaxu.entity.User;
 import com.huaxu.model.AjaxMessage;
-import com.huaxu.model.Pagination;
 import com.huaxu.model.ResultStatus;
 import com.huaxu.service.UserService;
 
@@ -19,13 +16,11 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.oauth2.common.OAuth2AccessToken;
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.servlet.http.HttpServletRequest;
 import java.security.Principal;
-import java.util.List;
 import java.util.Optional;
 
 /**
@@ -178,14 +173,27 @@ public class UserController {
         String code=userService.getRangeCode(appId);
         return new AjaxMessage<String>(ResultStatus.OK, code);
     }
-    @RequestMapping(value = "getUniqId", method = RequestMethod.GET)
+
+
+    /*@RequestMapping(value = "getUniqId", method = RequestMethod.GET)
     @ApiOperation(value = "获取用户标识")
     public AjaxMessage<String> getUniqId(@ApiParam(value = "appId", required = true)@RequestParam String appId,
-                                         @ApiParam(value = "appSecret", required = true)@RequestParam String appSecret,
+                                             @ApiParam(value = "APPSECRET", required = true)@RequestParam String appSecret,
                                          @ApiParam(value = "code", required = true)@RequestParam String code                                    ) {
         String uniqId=userService.getUniqId(appId,appSecret,code);
         return new AjaxMessage<String>(ResultStatus.OK, uniqId);
-    }
+    }*/
 
+    @RequestMapping(value = "getUniqId", method = RequestMethod.GET)
+    @ApiOperation(value = "获取用户标识")
+    public AjaxMessage<UserAuthDto> getUniqId(@ApiParam(value = "appId", required = true)@RequestParam String appId,
+                                                 @ApiParam(value = "key", required = true)@RequestParam String key) {
+        try {
+            UserAuthDto userAuthDto  = userService.getUniqId(appId, key);
+            return new AjaxMessage<UserAuthDto>(ResultStatus.OK, userAuthDto);
+        } catch (ServiceException e) {
+            return new AjaxMessage<UserAuthDto>(e.getStatus(),e.getMessage(), null);
+        }
+    }
 
 }

+ 18 - 0
user_auth/src/main/java/com/huaxu/dto/UserAuthDto.java

@@ -0,0 +1,18 @@
+package com.huaxu.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class UserAuthDto {
+
+    @ApiModelProperty(value="用户uniqId")
+    private String uniqId;
+
+    @ApiModelProperty(value="手机号")
+    private String mobile;
+
+    @ApiModelProperty(value="消息")
+    private String message;
+
+}

+ 10 - 2
user_auth/src/main/java/com/huaxu/service/UserService.java

@@ -2,9 +2,8 @@ package com.huaxu.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
-import com.huaxu.dto.UserDto;
+import com.huaxu.dto.UserAuthDto;
 import com.huaxu.entity.User;
-import org.springframework.security.oauth2.common.OAuth2AccessToken;
 
 import java.util.List;
 
@@ -98,4 +97,13 @@ public interface UserService {
 
 
     String getUniqId(String appId, String appSecret, String code);
+
+    /**
+     * 获取用户标识,通过AES解密得到的key获取
+     * @param appId          appid
+     * @param encryptValue   AES加密值
+     * @return
+     */
+    UserAuthDto getUniqId(String appId, String encryptValue);
+
 }

+ 51 - 27
user_auth/src/main/java/com/huaxu/service/impl/UserServiceImpl.java

@@ -2,48 +2,41 @@ package com.huaxu.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-
 import com.huaxu.dao.LoginLogMapper;
 import com.huaxu.dao.UserMapper;
+import com.huaxu.dto.UserAuthDto;
 import com.huaxu.dto.UserDto;
 import com.huaxu.entity.LoginLog;
 import com.huaxu.entity.MenuEntity;
 import com.huaxu.entity.Org;
 import com.huaxu.entity.User;
-import com.huaxu.model.*;
-import com.huaxu.security.config.RedisTokenStore;
-import com.huaxu.security.exception.SecurityException;
+import com.huaxu.exception.ServiceException;
+import com.huaxu.model.LoginUser;
+import com.huaxu.model.Permission;
+import com.huaxu.model.ProgramItem;
+import com.huaxu.model.ResultStatus;
 import com.huaxu.security.mobile.MobileLoginAuthenticationToken;
-import com.huaxu.security.smsCode.SmsCodeException;
 import com.huaxu.service.UserService;
-import com.huaxu.util.ByteArrayUtils;
-import com.huaxu.util.RedisUtil;
-import com.huaxu.util.UserUtil;
-import com.huaxu.util.Util;
+import com.huaxu.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
-
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.connection.RedisConnection;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.oauth2.common.OAuth2AccessToken;
-import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
-import org.springframework.security.oauth2.provider.*;
+import org.springframework.security.oauth2.provider.ClientDetailsService;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
 import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
 import org.springframework.security.oauth2.provider.token.ConsumerTokenServices;
 import org.springframework.security.oauth2.provider.token.TokenStore;
 import org.springframework.stereotype.Service;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
-import org.springframework.util.ReflectionUtils;
 import org.springframework.web.client.RestTemplate;
 import sun.misc.BASE64Encoder;
 
@@ -200,6 +193,7 @@ public class UserServiceImpl implements UserService {
 
     @Override
     public String getRangeCode(String appId) {
+        UserAuthDto userAuthDto = new UserAuthDto();
         LoginUser currentUser = UserUtil.getCurrentUser();
         Integer id = currentUser.getId();
         String appSecret=userMapper.getAppSecret(appId);
@@ -213,12 +207,14 @@ public class UserServiceImpl implements UserService {
 
 
         if(uniqueUserID!=null){
+            userAuthDto.setUniqId(uniqueUserID);
+            userAuthDto.setMobile(currentUser.getPhoneNumber());
             for (int i=0;i<6;i++)
             {
                 code+=random.nextInt(10);
             }
             String key=code+"_"+appId+"_"+appSecret;
-            redisUtil.set(key,uniqueUserID);
+            redisUtil.set(key, JSONObject.toJSONString(userAuthDto));
             redisUtil.setExpire(key,300);
         }
 
@@ -231,6 +227,34 @@ public class UserServiceImpl implements UserService {
         return redisUtil.get(key);
     }
 
+    @Override
+    public UserAuthDto getUniqId(String appId, String encryptValue) {
+        String appSecret = userMapper.getAppSecret(appId);
+        if (StringUtils.isEmpty(appSecret)){
+            throw new ServiceException(ResultStatus.USER_AUTH_APPID_NOT_FOUND);
+        }
+        String key = null;
+        try {
+            // 验证加密的内容是否正确
+            key = DESUtil.decrypt(encryptValue,appSecret);
+            // 截取里面的时间
+            String date = key.substring(key.lastIndexOf("_") + 1, key.length());
+            // 验证在5分钟之内是否是有效的加密
+            if (!DESUtil.verifyTime(Long.parseLong(date), 5)){
+                throw new ServiceException(ResultStatus.USER_AUTH_ENCRYPT_VALUE_VERIFY_ERROR);
+            }
+        } catch (Exception e) {
+            throw new ServiceException(ResultStatus.USER_AUTH_ENCRYPT_VALUE_VERIFY_ERROR);
+        }
+        String value = redisUtil.get(key.substring(0, key.lastIndexOf("_")));
+        if (StringUtils.isEmpty(value)){
+            throw new ServiceException(ResultStatus.USER_AUTH_UNIQID_OR_CODE_ISNULL);
+        }
+        UserAuthDto dto = JSONObject.parseObject(value,UserAuthDto.class);
+        dto.setMessage(key);
+        return dto;
+    }
+
 
     @Override
     public User chooseUser(User user) {
@@ -477,6 +501,16 @@ public class UserServiceImpl implements UserService {
         insertLoginLog(UserUtil.getCurrentUser(),"登出");
         return flag;
     }
+    /**
+     * 新增注册数据
+     * @author yjy
+     * @param user 实例对象
+     * @return 影响行数
+     */
+    @Override
+    public int insertRegister(User user) {
+        return this.userMapper.insertRegister(user);
+    }
     private void insertLoginLog(LoginUser loginUser,String type){
         LoginLog loginLog=new LoginLog();
         loginLog.setName(loginUser.getName());
@@ -489,14 +523,4 @@ public class UserServiceImpl implements UserService {
         loginLog.setLoginIp(Util.getIpAddr(request));
         loginLogMapper.insert(loginLog);
     }
-    /**
-     * 新增注册数据
-     * @author yjy
-     * @param user 实例对象
-     * @return 影响行数
-     */
-    @Override
-    public int insertRegister(User user) {
-        return this.userMapper.insertRegister(user);
-    }
 }