Jelajahi Sumber

1.修改单点登录
2.同步考勤,人脸,卡号数据
3.定时推送考勤数据
4.定时获取车牌及门禁设备,并返回用户数据时一并返回

sss 3 tahun lalu
induk
melakukan
58064e96fb

+ 35 - 2
eladmin-common/src/main/java/me/zhengjie/utils/SecurityUtils.java

@@ -31,8 +31,8 @@ import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Arrays;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 /**
  * 获取当前登录的用户
@@ -129,4 +129,37 @@ public class SecurityUtils {
             }
         }
     }
+
+    /**
+     * 根据key获取token
+     */
+    public static Map<String,Object> getToken(String key){
+        //获取11位随机数
+        double rand = Math.random();
+        String randStr = String.valueOf(rand).replace("0.", "");
+        String nonce = randStr.substring(0, 11);
+        System.out.println("nonce:"+nonce);
+        //获取当前时间
+        SimpleDateFormat sdf = new SimpleDateFormat();
+        sdf.applyPattern("yyyy-MM-dd HH:mm");
+        Date date = new Date();
+        String timestamp =sdf.format(date);
+        System.out.println("timestamp:"+timestamp);
+        //排序
+        String[] arr = {key, timestamp, nonce};
+        Arrays.sort(arr);
+        //获取token
+        String str = "";
+        for (int i = 0; i < arr.length; i++) {
+            str += arr[i];
+        }
+        String token = EncryptUtils.sha1(str);
+        System.out.println("token:"+token);
+        Map<String,Object> data = new HashMap<String, Object>(1) {{
+            put("nonce", nonce);
+            put("timestamp", timestamp);
+            put("token", token);
+        }};
+        return data;
+    }
 }

+ 0 - 4
eladmin-logging/eladmin-logging.iml

@@ -7,9 +7,6 @@
     <facet type="web" name="Web">
       <configuration>
         <webroots />
-        <sourceRoots>
-          <root url="file://$MODULE_DIR$/src/main/java" />
-        </sourceRoots>
       </configuration>
     </facet>
   </component>
@@ -18,7 +15,6 @@
     <output-test url="file://$MODULE_DIR$/target/test-classes" />
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" generated="true" />
       <excludeFolder url="file://$MODULE_DIR$/target" />
     </content>
     <orderEntry type="inheritedJdk" />

+ 0 - 1
eladmin-system/eladmin-system.iml

@@ -21,7 +21,6 @@
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
       <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
       <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
-      <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" generated="true" />
       <excludeFolder url="file://$MODULE_DIR$/target" />
     </content>
     <orderEntry type="inheritedJdk" />

+ 9 - 2
eladmin-system/src/main/java/me/zhengjie/modules/dm/user/domain/DmUser.java

@@ -25,6 +25,7 @@ import javax.persistence.Entity;
 import javax.persistence.Table;
 
 import me.zhengjie.base.BaseEntity;
+import me.zhengjie.modules.dm.plateNumber.domain.DmPlateNumber;
 import me.zhengjie.modules.system.domain.Dept;
 import me.zhengjie.modules.system.domain.Job;
 import me.zhengjie.modules.system.domain.Role;
@@ -51,7 +52,7 @@ public class DmUser extends BaseEntity implements Serializable {
     private String id;
 
     @Column(name = "name",nullable = false)
-    @NotBlank
+    //@NotBlank
     @ApiModelProperty(value = "姓名")
     private String name;
 
@@ -64,7 +65,7 @@ public class DmUser extends BaseEntity implements Serializable {
     private String contacts;
 
     @Column(name = "email",nullable = false)
-    @NotBlank
+    //@NotBlank
     @ApiModelProperty(value = "邮箱")
     private String email;
 
@@ -95,6 +96,12 @@ public class DmUser extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "用户部门")
     private Dept dept;
 
+//    @OneToMany
+//    @ApiModelProperty(value = "用户车牌")
+//    @JoinTable(name = "dm_plate_number",
+//            joinColumns = {@JoinColumn(name = "user_number",referencedColumnName = "id")})
+//    private Set<DmPlateNumber> plateNumbers;
+
     @Column(name = "is_approver")
     @ApiModelProperty(value = "是否是审批人")
     private Boolean isApprover = false;

+ 1 - 1
eladmin-system/src/main/java/me/zhengjie/modules/dm/user/service/dto/DmUserQueryCriteria.java

@@ -33,7 +33,7 @@ import me.zhengjie.annotation.Query;
 public class DmUserQueryCriteria{
 
     @Query
-    private Long id;
+    private String id;
 
     @Query(propName = "id", type = Query.Type.IN, joinName = "dept")
     private Set<String> deptIds = new HashSet<>();

+ 56 - 0
eladmin-system/src/main/java/me/zhengjie/modules/quartz/task/ZkDataPushTask.java

@@ -0,0 +1,56 @@
+package me.zhengjie.modules.quartz.task;
+
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.utils.SecurityUtils;
+import me.zhengjie.utils.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+@Slf4j
+@RequiredArgsConstructor
+@Component
+public class ZkDataPushTask {
+
+    private final String key = "DMERPYT!@#$QWER2021+{:>";
+
+    public void run() {
+        log.info("pushAttendanceData 执行开始");
+        pushAttendanceData();
+        log.info("pushAttendanceData 执行结束");
+    }
+
+    private void pushAttendanceData(){
+        String yktAttendanceApi = "http://192.168.1.25:8000/api/thirdparty/v2/user/getAttendance";
+        String erpAttendanceApi = "http://10.22.2.65:16000/attendance-api/device/identify/callback";
+        Map<String,Object> newToken = SecurityUtils.getToken(key);
+        JSONObject param = new JSONObject();
+        param.put("timestamp",newToken.get("timestamp"));
+        param.put("nonce",newToken.get("nonce"));
+        String res = HttpRequest.get(yktAttendanceApi)
+                .header("X_YT_ACCESS_TOKEN",newToken.get("token").toString() )
+                .body(param.toJSONString()).execute().body();
+        if(StringUtils.isNotEmpty(res)) {
+            log.info("res:"+res);
+            JSONArray attendanceArray = JSONArray.parseArray(res);
+            for(int i = 0;i<attendanceArray.size();i++){
+                JSONObject attendance = attendanceArray.getJSONObject(i);
+                //组装返回数据
+                JSONObject ertAttendanceJSON = new JSONObject();
+                ertAttendanceJSON.put("deviceKey",attendance.getString("roomDevice"));
+                ertAttendanceJSON.put("personId",attendance.getString("userNumber"));
+                ertAttendanceJSON.put("time",attendance.getString("attendanceTime"));
+                ertAttendanceJSON.put("type","face_0");
+                HttpRequest.get(erpAttendanceApi).body(ertAttendanceJSON.toJSONString()).execute().body();
+            }
+        } else {
+            log.info("res is null.");
+        }
+    }
+}

+ 57 - 3
eladmin-system/src/main/java/me/zhengjie/modules/quartz/task/ZkDataSyncTask.java

@@ -20,6 +20,10 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import me.zhengjie.modules.dm.plateNumber.domain.DmPlateNumber;
+import me.zhengjie.modules.dm.plateNumber.repository.DmPlateNumberRepository;
+import me.zhengjie.modules.dm.roomDevice.domain.DmRoomDevice;
+import me.zhengjie.modules.dm.roomDevice.repository.DmRoomDeviceRepository;
 import me.zhengjie.modules.dm.user.domain.DmUser;
 import me.zhengjie.modules.dm.user.service.DmUserService;
 import me.zhengjie.modules.dm.user.service.dto.DmUserDto;
@@ -31,13 +35,13 @@ import me.zhengjie.modules.system.service.DeptService;
 import me.zhengjie.modules.system.service.UserService;
 import me.zhengjie.modules.system.service.dto.DeptDto;
 import me.zhengjie.modules.system.service.dto.UserDto;
+import me.zhengjie.utils.SecurityUtils;
 import me.zhengjie.utils.StringUtils;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
+import java.util.*;
 
 /**
  * ERP 数据同步
@@ -52,11 +56,14 @@ public class ZkDataSyncTask {
     private final String sign = "e34b2f59-0e9d-45ed-a32a-f4abd4381000";
     private final String header_key = "X_AUTO_USER_INFO_HEAD";
     private final String header_value = "{\"id\":\"anonymous\",\"tenantId\":\"caih\"}";
+    private final String key = "DMERPYT!@#$QWER2021+{:>";
 
     private final DeptService deptService;
     private final UserService userService;
     private final DmUserService dmUserService;
     private final PasswordEncoder passwordEncoder;
+    private final DmPlateNumberRepository dmPlateNumberRepository;
+    private final DmRoomDeviceRepository dmRoomDeviceRepository;
 
     public void run() {
         log.info("deptsync 执行开始");
@@ -68,6 +75,12 @@ public class ZkDataSyncTask {
         log.info("usersync 执行结束");
     }
 
+    public void run2(){
+        log.info("plateNumberSync 执行开始");
+        plateNumberSync();
+        log.info("plateNumberSync 执行结束");
+    }
+
     private JSONObject getDatas(String api, int pagenum, int pagesize) {
         String res = HttpRequest.get(erpApiUrl + api)
                 .header(header_key, header_value)
@@ -244,4 +257,45 @@ public class ZkDataSyncTask {
             }
         }
     }
+
+    //车牌及门禁设备数据同步
+    private void plateNumberSync(){
+        String url = "http://192.168.1.19:8000/api/thirdparty/v1/openInterface/getPlateNumber";
+        //根据key拿到token
+        Map<String,Object> newToken = SecurityUtils.getToken(key);
+        //组装请求参数
+        JSONObject param = new JSONObject();
+        param.put("timestamp",newToken.get("timestamp"));
+        param.put("nonce",newToken.get("nonce"));
+        //请求车牌接口
+        String res = HttpRequest.get(url)
+                .header("X_YT_ACCESS_TOKEN",newToken.get("token").toString() )
+                .body(param.toJSONString()).execute().body();
+        if(StringUtils.isNotEmpty(res)) {
+            log.info("res:"+res);
+            JSONObject dataJSON = JSONObject.parseObject(res);
+            String plateRumberArray = dataJSON.getString("data");
+            if(!ObjectUtils.isEmpty(plateRumberArray)){
+                //新增之前清空表数据
+                dmPlateNumberRepository.deleteAll();
+                dmRoomDeviceRepository.deleteAll();
+                //进行新增
+                JSONArray dataJSONArray = JSONArray.parseArray(plateRumberArray);
+                for(int i = 0;i<dataJSONArray.size();i++){
+                    String plateNumberJSON = dataJSONArray.getString(i);
+                    DmPlateNumber plateNumber = JSONObject.parseObject(plateNumberJSON,DmPlateNumber.class);
+                    Set<DmRoomDevice> dmRoomDevices = plateNumber.getDmRoomDevices();
+                    dmRoomDeviceRepository.saveAll(dmRoomDevices);
+                    dmPlateNumberRepository.save(plateNumber);
+                }
+//                List<DmPlateNumber> dmPlateNumberList = JSONArray.parseArray(plateRumberArray, DmPlateNumber.class);
+//                dmPlateNumberRepository.saveAll(dmPlateNumberList);
+            } else {
+                log.info("plateRumberArray is null.");
+            }
+        } else {
+            log.info("res is null.");
+        }
+
+    }
 }

+ 92 - 30
eladmin-system/src/main/java/me/zhengjie/modules/thirdparty/v1/UserApiController.java

@@ -13,6 +13,7 @@ import me.zhengjie.annotation.rest.AnonymousPostMapping;
 import me.zhengjie.base.BaseResponse;
 import me.zhengjie.base.QueryPageParams;
 import me.zhengjie.exception.BadRequestException;
+import me.zhengjie.modules.dm.user.domain.DmUser;
 import me.zhengjie.modules.dm.user.service.DmUserService;
 import me.zhengjie.modules.dm.user.service.dto.DmUserDto;
 import me.zhengjie.modules.dm.user.service.dto.DmUserQueryCriteria;
@@ -23,6 +24,7 @@ import me.zhengjie.modules.security.service.OnlineUserService;
 import me.zhengjie.modules.security.service.dto.JwtUserDto;
 import me.zhengjie.modules.system.service.*;
 import me.zhengjie.modules.system.service.dto.*;
+import me.zhengjie.utils.EncryptUtils;
 import me.zhengjie.utils.SecurityUtils;
 import me.zhengjie.utils.StringUtils;
 import org.hibernate.Criteria;
@@ -45,9 +47,8 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @RestController
 @RequiredArgsConstructor
@@ -70,6 +71,8 @@ public class UserApiController {
 
     private final String erpapiUrl = "http://222.84.157.37:30170";
 
+    private final String key = "DMERPYT!@#$QWER2021+{:>";
+
     @Log("获取ERP用户数据")
     @ApiOperation("获取ERP用户数据")
     @AnonymousGetMapping(value = "/busi/comm/usky/queryUser")
@@ -90,46 +93,95 @@ public class UserApiController {
         return new ResponseEntity<>(json, HttpStatus.OK);
     }
 
+//    @Log("单点登录")
+//    @ApiOperation("单点登录")
+//    @AnonymousGetMapping(value = "/sso")
+//    public ResponseEntity<Object> sso(HttpServletRequest request) {
+//        String token = request.getParameter("token");
+//        String url = request.getParameter("url");
+//
+//        if (StringUtils.isBlank(token) || StringUtils.isBlank(url)) {
+//            throw new BadRequestException("参数错误");
+//        }
+//
+//        String res = HttpRequest.get(erpapiUrl + "/api-third-party/busi/comm/authLogin/api/verifyToken?token=" + token).execute().body();
+//        JSONObject json = JSONObject.parseObject(res);
+//
+//        if (json != null) {
+//            JSONObject data = json.getJSONObject("data");
+//
+//            if (data != null) {
+//
+//                UserDto userDto = userService.findByName(data.getString("username"));
+//
+//                if (userDto != null) {
+//                    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(data.getString("username"), userDto.getPassword());
+//                    Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
+//                    SecurityContextHolder.getContext().setAuthentication(authentication);
+//                    // 生成令牌
+//                    String n_token = tokenProvider.createToken(authentication);
+//                    final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal();
+//                    // 保存在线信息
+//                    onlineUserService.save(jwtUserDto, n_token, request);
+//                    // 返回 token 与 用户信息
+//                    Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
+//                        put("token", properties.getTokenStartWith() + n_token);
+//                        put("user", jwtUserDto);
+//                    }};
+//                    if (loginProperties.isSingleLogin()) {
+//                        //踢掉之前已经登录的token
+//                        onlineUserService.checkLoginOnUser(data.getString("username"), n_token);
+//                    }
+//                    return ResponseEntity.ok(authInfo);
+//                }
+//            }
+//        }
+//        throw new BadRequestException("认证失败");
+//    }
+
     @Log("单点登录")
     @ApiOperation("单点登录")
-    @AnonymousGetMapping(value = "/sso")
-    public ResponseEntity<Object> sso(HttpServletRequest request) {
-        String token = request.getParameter("token");
-        String url = request.getParameter("url");
+    @AnonymousGetMapping(value = "/sso11")
+    public BaseResponse<Object> sso11(String token) {
+        Map<String,Object> newToken = SecurityUtils.getToken(key);
+        UserDto userDto = userService.findByName("chaoshengqin");
+        //组装返回值
+        JSONObject returnData = new JSONObject();
+        returnData.put("nonce",newToken.get("nonce"));
+        returnData.put("timestamp",newToken.get("timestamp"));
+        returnData.put("token",newToken.get("token"));
+        returnData.put("user", userDto);
+        Map<String, Object> authInfo = new HashMap<String, Object>(1) {{
+            put("data", returnData);
+        }};
+        return new BaseResponse<>(authInfo);
+    }
 
-        if (StringUtils.isBlank(token) || StringUtils.isBlank(url)) {
+    @Log("单点登录")
+    @ApiOperation("单点登录")
+    @AnonymousGetMapping(value = "/sso")
+    public BaseResponse<Object> sso(String token) {
+        if (StringUtils.isBlank(token)) {
             throw new BadRequestException("参数错误");
         }
-
         String res = HttpRequest.get(erpapiUrl + "/api-third-party/busi/comm/authLogin/api/verifyToken?token=" + token).execute().body();
         JSONObject json = JSONObject.parseObject(res);
-
         if (json != null) {
             JSONObject data = json.getJSONObject("data");
-
             if (data != null) {
-
                 UserDto userDto = userService.findByName(data.getString("username"));
-
                 if (userDto != null) {
-                    UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(data.getString("username"), userDto.getPassword());
-                    Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
-                    SecurityContextHolder.getContext().setAuthentication(authentication);
-                    // 生成令牌
-                    String n_token = tokenProvider.createToken(authentication);
-                    final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal();
-                    // 保存在线信息
-                    onlineUserService.save(jwtUserDto, n_token, request);
-                    // 返回 token 与 用户信息
-                    Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
-                        put("token", properties.getTokenStartWith() + n_token);
-                        put("user", jwtUserDto);
+                    Map<String,Object> newToken = SecurityUtils.getToken(key);
+                    //组装返回值
+                    JSONObject returnData = new JSONObject();
+                    returnData.put("nonce",newToken.get("nonce"));
+                    returnData.put("timestamp",newToken.get("timestamp"));
+                    returnData.put("token",newToken.get("token"));
+                    returnData.put("user", userDto);
+                    Map<String, Object> authInfo = new HashMap<String, Object>(1) {{
+                        put("data", returnData);
                     }};
-                    if (loginProperties.isSingleLogin()) {
-                        //踢掉之前已经登录的token
-                        onlineUserService.checkLoginOnUser(data.getString("username"), n_token);
-                    }
-                    return ResponseEntity.ok(authInfo);
+                    return new BaseResponse<>(authInfo);
                 }
             }
         }
@@ -175,4 +227,14 @@ public class UserApiController {
 
         return new BaseResponse<>(list);
     }
+
+    @Log("修改人员数据")
+    @ApiOperation("修改人员数据")
+    @AnonymousPostMapping(value = "/updateZkUsers")
+    public BaseResponse<Object> updateZkUsers(@RequestBody QueryPageParams<DmUser> params) {
+        SecurityUtils.CheckApiAuth(params);
+        System.out.println("params:"+params.getQuery().getId());
+        dmUserService.update(params.getQuery());
+        return new BaseResponse<>(null);
+    }
 }

+ 3 - 3
eladmin-system/src/main/resources/config/application.yml

@@ -25,10 +25,10 @@ spring:
   redis:
     #数据库索引
     database: ${REDIS_DB:2}
-#    host: ${REDIS_HOST:172.16.159.48}
+    host: ${REDIS_HOST:114.55.24.6}
 #    port: ${REDIS_PORT:6386}
-    host: ${REDIS_HOST:127.0.0.1}
-    port: ${REDIS_PORT:6379}
+#    host: ${REDIS_HOST:127.0.0.1}
+    port: ${REDIS_PORT:6384}
     password: ${REDIS_PWD:}
     #连接超时时间
     timeout: 5000ms

+ 0 - 4
eladmin-tools/eladmin-tools.iml

@@ -7,9 +7,6 @@
     <facet type="web" name="Web">
       <configuration>
         <webroots />
-        <sourceRoots>
-          <root url="file://$MODULE_DIR$/src/main/java" />
-        </sourceRoots>
       </configuration>
     </facet>
   </component>
@@ -18,7 +15,6 @@
     <output-test url="file://$MODULE_DIR$/target/test-classes" />
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
-      <sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" generated="true" />
       <excludeFolder url="file://$MODULE_DIR$/target" />
     </content>
     <orderEntry type="inheritedJdk" />