فهرست منبع

企业微信的邀请人员加入时授权处理

seyason 2 سال پیش
والد
کامیت
e15cf5d72d

+ 26 - 11
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/AuthRedirectController.java

@@ -9,6 +9,7 @@ import com.management.platform.mapper.SysConfigMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.mapper.WxCorpInfoMapper;
 import com.management.platform.service.UserService;
+import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
 import com.management.platform.util.UserAgentUtils;
@@ -53,6 +54,9 @@ public class AuthRedirectController {
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     CompanyMapper companyMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+
 
     @RequestMapping("/corpWXAuth")
     public ModelAndView auth(String code, String state) {
@@ -90,17 +94,26 @@ public class AuthRedirectController {
             } else {
                 User curUser = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", wxCorpInfo.getCompanyId()).eq("corpwx_userid", wxUserId));
                 if (curUser == null) {
-                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
-                } else if (curUser.getIsActive() == 1) {
-                    companyId = curUser.getCompanyId();
-                    reqParam.put("userId", curUser.getId());
-//                    HttpRespMsg httpRespMsg = userService.loginByUserId(curUser.getId(), request);
-//                    reqParam.put("userInfo", httpRespMsg.data);
+//                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
+                    //用户不存在,去生成该用户
+                    if (wxCorpInfo.getSaasSyncContact() == 1) {
+                        curUser = wxCorpInfoService.generateUserInfo(wxCorpInfo.getCompanyId(), openUserId);
+                    }
+                }
+                if (curUser != null) {
+                    if (curUser.getIsActive() == 1) {
+                        companyId = curUser.getCompanyId();
+                        reqParam.put("userId", curUser.getId());
+                    } else {
+                        //提示账号已停用
+                        //reqParam.put("errorMsg", "您的账号已停用,无法登录");
+                        reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    }
                 } else {
-                    //提示账号已停用
-                    //reqParam.put("errorMsg", "您的账号已停用,无法登录");
-                    reqParam.put("errorMsg", MessageUtils.message("user.inactive"));
+                    System.err.println("==生成企业微信User失败==");
+                    reqParam.put("errorMsg", MessageUtils.message("user.accountNoExist"));
                 }
+
             }
         }
         reqParam.put("hasTriedAutoLogin", 1);
@@ -120,9 +133,9 @@ public class AuthRedirectController {
             }
         }
         if (isMobile) {
-            redirecUrl = "https://mobworktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "http://mobworktime.ttkuaiban.com/#/" + router;
         } else {
-            redirecUrl = "https://worktime.ttkuaiban.com/#/" + router;
+            redirecUrl = "http://worktime.ttkuaiban.com/#/" + router;
         }
         ModelAndView modelAndView = new ModelAndView(
                 new RedirectView(redirecUrl), reqParam);
@@ -131,6 +144,8 @@ public class AuthRedirectController {
     }
 
 
+
+
     private HashMap getCompExpireInfo(Integer companyId) {
         Company company = companyMapper.selectById(companyId);
         int version = 1;

+ 66 - 80
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/WeiXinCorpController.java

@@ -501,48 +501,56 @@ public class WeiXinCorpController {
             WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, corpId);
             String sMsg = wxcpt.DecryptMsg(sReqMsgSig, sReqTimeStamp, sReqNonce, requestBody);
             log.info("解密后===msg: " + sMsg);
-            org.json.JSONObject jsonObject = XML.toJSONObject(sMsg);
-            if(jsonObject.has("Event") && ("subscribe".equals(jsonObject.getString("Event")))){
-                //成员关注应用事件,发生在该企业已经开通应用的情况下。
-                System.out.println("成员关注应用事件!");
-                String corpWxUserId = jsonObject.getString("FromUserName");
-                WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
-                if (wxCorpInfo != null) {
-                    //企业存在,生成对应的用户
-                    Integer companyId = wxCorpInfo.getCompanyId();
-                    JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), corpWxUserId);
-                    SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+            org.json.JSONObject jsonObject = XML.toJSONObject(sMsg).getJSONObject("xml");
+            if(jsonObject.has("Event")){
+                String event = jsonObject.getString("Event");
+                System.out.println("Event=="+event);
+                if (("subscribe".equals(event))) {
+                    //成员关注应用事件,发生在该企业已经开通应用的情况下。
+                    System.out.println("成员关注应用事件!");
+                    String corpWxUserId = jsonObject.getString("FromUserName");
+                    WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
+                    if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
+                        //企业存在,生成对应的用户
+                        Integer companyId = wxCorpInfo.getCompanyId();
+                        User user = wxCorpInfoService.generateUserInfo(companyId, corpWxUserId);
+
+                        new Thread(() -> {
+                            //查询详情进行更新
+                            JSONObject userObj = null;
+                            try {
+                                userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), corpWxUserId);
+                            } catch (Exception exception) {
+                                exception.printStackTrace();
+                            }
+                            System.out.println("关注时获取详情userObj=="+userObj);
+                            //成功获取到通讯录的个人详情
+                            String userId = userObj.getString("userid");
+                            String openUserId = userObj.getString("open_userid");
+                            User userUpdate = new User();
+                            userUpdate.setId(user.getId());
+                            userUpdate.setName(userObj.getString("name"))
+                                    .setPhone(userObj.getString("mobile"))
+                                    .setCorpwxUserid(openUserId)
+                                    .setCorpwxRealUserid(userId)
+                                    .setJobNumber(openUserId.equals(userId)?null:userId);
 
-                    //成功获取到通讯录的个人详情
-                    Long id = SnowFlake.nextId();
-                    //通过getUserInfo接口获取到的json key是小写的
-                    JSONArray department = userObj.getJSONArray("department");
-                    Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
-                    Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
-                    String userId = userObj.getString("userid");
-                    String openUserId = userObj.getString("open_userid");
-                    int cnt = userMapper.selectCount(new QueryWrapper<User>().eq("corpwx_userid", openUserId));
-                    if (cnt == 0) {
-                        //用户不存在
-                        User user = new User()
-                                .setId(id.toString())
-                                .setRoleId(defaultRole.getId())
-                                .setRoleName(defaultRole.getRolename())
-                                .setName(userObj.getString("name"))
-                                .setPhone(userObj.getString("mobile"))
-                                .setPassword(MD5Util.getPassword("000000"))
-                                .setCorpwxUserid(openUserId)
-                                .setCorpwxRealUserid(corpWxUserId)
-                                .setJobNumber(openUserId.equals(userId)?null:userId)
-                                .setColor(ColorUtil.randomColor())
-                                .setCompanyId(companyId);
-                        if (sysDept != null) {
-                            user.setDepartmentId(sysDept.getDepartmentId());
-                            List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                            user.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
-                        }
-                        userMapper.insert(user);
+                            //通过getUserInfo接口获取到的json key是小写的
+                            JSONArray department = userObj.getJSONArray("department");
+                            Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
+                            Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
+                            if (sysDept != null) {
+                                userUpdate.setDepartmentId(sysDept.getDepartmentId());
+                                List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+                                userUpdate.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
+                            }
+                            userMapper.updateById(userUpdate);
+                            System.out.println("======关注时更新人员======");
+                        }).start();
                     }
+                } else if ("enter_agent".equals(event)) {
+
                 }
             }
         } catch (Exception e) {
@@ -550,11 +558,10 @@ public class WeiXinCorpController {
             // 解密失败,失败原因请查看异常
             e.printStackTrace();
         }
+        System.out.println("dataCallback POST立即返回");
         return "success";
     }
 
-
-
     //通用开发回调处理
     @RequestMapping(value = "/commonDevCallback", method = RequestMethod.GET)
     @ResponseBody
@@ -635,56 +642,35 @@ public class WeiXinCorpController {
                         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectById(corpId);
                         if (wxCorpInfo != null) {
                             Integer companyId = wxCorpInfo.getCompanyId();
-                            SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
-
                             if (wxCorpInfo.getSaasSyncContact() == 1) {
-                                //直接通过企业微信通讯录同步
+                                //先插入表,不然前端用户立马点击进入应用会找不到人,
+                                User user = wxCorpInfoService.generateUserInfo(companyId, authUserId);
+                                //查询详情进行更新
                                 JSONObject userObj = getUserInfo(getCorpAccessToken(wxCorpInfo), authUserId);
                                 System.out.println("userObj=="+userObj);
                                 //成功获取到通讯录的个人详情
-                                Long id = SnowFlake.nextId();
-                                //通过getUserInfo接口获取到的json key是小写的
-                                JSONArray department = userObj.getJSONArray("department");
-                                Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
-                                Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
                                 String userId = userObj.getString("userid");
                                 String openUserId = userObj.getString("open_userid");
-                                User user = new User()
-                                        .setId(id.toString())
-                                        .setRoleId(defaultRole.getId())
-                                        .setRoleName(defaultRole.getRolename())
-                                        .setName(userObj.getString("name"))
+                                User userUpdate = new User();
+                                userUpdate.setId(user.getId());
+                                userUpdate.setName(userObj.getString("name"))
                                         .setPhone(userObj.getString("mobile"))
-                                        .setPassword(MD5Util.getPassword("000000"))
                                         .setCorpwxUserid(openUserId)
                                         .setCorpwxRealUserid(userId)
-                                        .setJobNumber(openUserId.equals(userId)?null:userId)
-                                        .setColor(ColorUtil.randomColor())
-                                        .setCompanyId(companyId);
+                                        .setJobNumber(openUserId.equals(userId)?null:userId);
+
+                                //通过getUserInfo接口获取到的json key是小写的
+                                JSONArray department = userObj.getJSONArray("department");
+                                Integer curUserWXDeptid = getMaxDeptIdFromArray(department);
+                                Department sysDept = departmentMapper.selectOne(new QueryWrapper<Department>().eq("company_id", companyId).eq("corpwx_deptid", curUserWXDeptid));
+
                                 if (sysDept != null) {
-                                    user.setDepartmentId(sysDept.getDepartmentId());
+                                    userUpdate.setDepartmentId(sysDept.getDepartmentId());
                                     List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
-                                    user.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
-                                }
-                                Integer employeeCnt = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active",1));
-                                Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", companyId));
-                                ContactSyncLog contactSyncLog = new ContactSyncLog();
-                                contactSyncLog.setCompanyId(companyId);
-                                System.err.println("企业微信自动同步新增人员日志记录===============================");
-                                if (employeeCnt + 1 > company.getStaffCountMax()){
-                                    contactSyncLog.setResult(0);
-                                    //contactSyncLog.setMsg("公司人员已达上限,请联系客服提高人数上限。");
-                                    contactSyncLog.setMsg(MessageUtils.message("wx.employeeFull"));
-                                    System.err.println("日志信息:"+ contactSyncLog.toString());
-                                    contactSyncLogMapper.insert(contactSyncLog);
-                                }else {
-                                    userMapper.insert(user);
-                                    contactSyncLog.setResult(1);
-                                    //contactSyncLog.setMsg("同步成功");
-                                    contactSyncLog.setMsg(MessageUtils.message("wx.synSuccess"));
-                                    System.err.println("日志信息:"+ contactSyncLog.toString());
-                                    contactSyncLogMapper.insert(contactSyncLog);
+                                    userUpdate.setDepartmentCascade(convertDepartmentIdToCascade(user.getDepartmentId(), allDeptList));
                                 }
+                                userMapper.updateById(userUpdate);
+                                System.out.println("======更新人员======");
                             }
                         }
                     }

+ 6 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Department.java

@@ -1,5 +1,6 @@
 package com.management.platform.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -15,7 +16,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-11-28
+ * @since 2022-07-14
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -51,21 +52,23 @@ public class Department extends Model<Department> {
     /**
      * 部门负责人id
      */
-    @TableField("manager_id")
+    @TableField(value = "manager_id", updateStrategy = FieldStrategy.IGNORED)
     private String managerId;
 
     /**
      * 日报导入审核人
      */
-    @TableField("report_audit_userid")
+    @TableField(value = "report_audit_userid", updateStrategy = FieldStrategy.IGNORED)
     private String reportAuditUserid;
 
+
     /**
      * 企业微信的部门id
      */
     @TableField("corpwx_deptid")
     private Integer corpwxDeptid;
 
+
     /**
      * 企业微信部门的父部门id
      */

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.entity.LeaveSheet;
+import com.management.platform.entity.User;
 import com.management.platform.entity.WxCorpInfo;
 import com.management.platform.util.HttpRespMsg;
 
@@ -52,4 +53,6 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
     HttpRespMsg initSuperManager(String corpid, String name);
 
     String getUserInfoWithDepartment(String accessToken, Integer wxDeptid);
+
+    User generateUserInfo(Integer companyId, String corpwxOpenId);
 }

+ 47 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -122,6 +122,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     TimeTypeMapper timeTypeMapper;
     @Resource
     SysRoleMapper sysRoleMapper;
+    @Resource
+    CompanyMapper companyMapper;
+    @Resource
+    ContactSyncLogMapper contactSyncLogMapper;
 
 
     //获取服务商provider_access_token
@@ -583,6 +587,49 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return result;
     }
 
+    @Override
+    public synchronized User generateUserInfo(Integer companyId, String corpwxOpenId) {
+        User find = userMapper.selectOne(new QueryWrapper<User>().eq("company_id", companyId).eq("corpwx_userid", corpwxOpenId));
+        if (find == null) {
+            SysRole defaultRole = sysRoleMapper.selectOne(new QueryWrapper<SysRole>().eq("company_id", companyId).eq("is_default", 1));
+            Long id = SnowFlake.nextId();
+            User user = new User()
+                    .setId(id.toString())
+                    .setRoleId(defaultRole.getId())
+                    .setRoleName(defaultRole.getRolename())
+                    .setName(corpwxOpenId)
+                    .setPassword(MD5Util.getPassword("000000"))
+                    .setCorpwxUserid(corpwxOpenId)
+                    .setColor(ColorUtil.randomColor())
+                    .setCompanyId(companyId);
+            Integer employeeCnt = userMapper.selectCount(new QueryWrapper<User>().eq("company_id", companyId).eq("is_active",1));
+            Company company = companyMapper.selectOne(new QueryWrapper<Company>().eq("id", companyId));
+            ContactSyncLog contactSyncLog = new ContactSyncLog();
+            contactSyncLog.setCompanyId(companyId);
+            System.err.println("企业微信自动同步新增人员日志记录===============================");
+            if (employeeCnt + 1 > company.getStaffCountMax()){
+                contactSyncLog.setResult(0);
+                //contactSyncLog.setMsg("公司人员已达上限,请联系客服提高人数上限。");
+                contactSyncLog.setMsg(MessageUtils.message("wx.employeeFull"));
+                System.err.println("日志信息:"+ contactSyncLog.toString());
+                contactSyncLogMapper.insert(contactSyncLog);
+                user.setIsActive(0);//先同步过来,但是停用
+                userMapper.insert(user);
+            }else {
+                userMapper.insert(user);
+                contactSyncLog.setResult(1);
+                //contactSyncLog.setMsg("同步成功");
+                contactSyncLog.setMsg(MessageUtils.message("wx.synSuccess"));
+                System.err.println("日志信息:"+ contactSyncLog.toString());
+                contactSyncLogMapper.insert(contactSyncLog);
+            }
+            System.out.println("插入人员成功");
+            find = user;
+        }
+        System.out.println("返回find == "+find);
+        return find;
+    }
+
 
     public void reqPunchRecord(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects, boolean showLog,String userId,LocalDate date)throws Exception {
         DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");

+ 94 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/DepartmentMapper.xml

@@ -18,5 +18,99 @@
     <sql id="Base_Column_List">
         department_id, department_name, superior_id, company_id, manager_id, report_audit_userid, corpwx_deptid, corpwx_deptpid
     </sql>
+    <!--根据部门获取成本-->
+    <select id="getCostByDepartment" resultType="java.util.Map">
+        SELECT SUM(b.working_time) AS time, SUM(b.cost) AS money
+        FROM report AS b
+        WHERE b.state = 1
+        <if test="departmentIds != null and departmentIds.size()>0">
+            AND b.dept_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+    </select>
 
+    <!--根据人员获取成本-->
+    <select id="getCostByUser" resultType="java.util.Map">
+        SELECT a.id as id, a.name AS user,a.corpwx_userid as corpwxUserId, a.job_number as jobNumber, c.project_name AS project, SUM(b.working_time) AS time, SUM(b.cost) AS
+        money
+        FROM user AS a
+        LEFT JOIN report AS b ON a.id = b.creator_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="departmentIds != null and departmentIds.size()>0">
+            AND b.dept_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="userIds != null">
+            AND a.id IN
+            <foreach collection="userIds" item="userId" index="index" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="companyId != null">
+            AND a.company_id = #{companyId}
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.id order by a.department_id
+    </select>
+
+    <!-- 根据人员获取自定义的日报数值 -->
+    <select id="getCustomDataByUser" resultType="java.util.Map">
+        SELECT a.id as id, a.name AS user,a.corpwx_userid as corpwxUserid, a.job_number as jobNumber,c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
+        FROM user AS a
+        LEFT JOIN report AS b ON a.id = b.creator_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="departmentIds != null">
+            AND a.department_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="userIds != null">
+            AND a.id IN
+            <foreach collection="userIds" item="userId" index="index" open="(" close=")" separator=",">
+                #{userId}
+            </foreach>
+        </if>
+        <if test="companyId != null">
+            AND a.company_id = #{companyId}
+        </if>
+        <if test="startDate != null and endDate != null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.id
+        having IFNULL(SUM(b.custom_data),0) > 0
+    </select>
+    <!-- 根据部门获取自定义的日报数值 -->
+    <select id="getDeptCustomDataStatistic" resultType="java.util.Map">
+        SELECT a.department_id as id, a.department_name AS department, c.project_name AS project, IFNULL(SUM(b.custom_data),0) AS cost
+        FROM department AS a
+        LEFT JOIN report AS b ON a.department_id = b.dept_id
+        LEFT JOIN project AS c ON b.project_id = c.id
+        WHERE b.state = 1
+        <if test="companyId!=null">
+            AND a.company_id =#{companyId}
+        </if>
+        <if test="departmentIds != null">
+            AND a.department_id IN
+            <foreach collection="departmentIds" item="departmentId" index="index" open="(" close=")" separator=",">
+                #{departmentId}
+            </foreach>
+        </if>
+        <if test="startDate!=null and endDate!=null">
+            AND b.create_date between #{startDate} and #{endDate}
+        </if>
+        GROUP BY b.project_id, a.department_id
+        having IFNULL(SUM(b.custom_data),0) > 0
+    </select>
 </mapper>