diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SyncDataController.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SyncDataController.java new file mode 100644 index 000000000..0dda76aec --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/controller/SyncDataController.java @@ -0,0 +1,40 @@ +package com.jero.modules.system.controller; + +import com.jero.common.api.vo.Result; +import com.jero.modules.system.service.ISyncDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author: liyawei + * @Description: + * @Date: Created in 15:50 2022/5/24 + */ +@RestController +@RequestMapping("/sys/people") +@Api(tags="people同步") +@Slf4j +public class SyncDataController { + @Autowired + private ISyncDataService syncDataService; + + @ApiOperation(value = "通过people同步部门信息") + @GetMapping("/syncDepartInfo") + public Result syncDepartInfo() throws Exception { + syncDataService.synchronPPDepartInfo(); + return Result.OK("开始同步部门信息"); + } + + + @ApiOperation(value = "通过people同步用户信息") + @GetMapping("/syncUserInfo") + public Result syncUserInfo() throws Exception { + syncDataService.synchronPPUserInfo(); + return Result.OK("开始同步用户信息"); + } +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/OtSyncInfoEO.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/OtSyncInfoEO.java new file mode 100644 index 000000000..fc5cdb49d --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/OtSyncInfoEO.java @@ -0,0 +1,83 @@ +package com.jero.modules.system.entity; + +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import com.jero.common.aspect.annotation.Dict; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + + +/** + * @Description: 同步时间记录表 + * @Author: jero-boot + * @Date: 2022-05-25 + * @Version: V1.0 + */ +@Data +@TableName("ot_sync_info") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="ot_sync_info对象", description="同步时间记录表") +public class OtSyncInfoEO implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "主键") + private String id; + + /**创建人*/ + @ApiModelProperty(value = "创建人") + private String createBy; + + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建日期") + private java.util.Date createTime; + + /**更新人*/ + @ApiModelProperty(value = "更新人") + private String updateBy; + + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新日期") + private java.util.Date updateTime; + + /**所属部门*/ + @ApiModelProperty(value = "所属部门") + private String sysOrgCode; + + /**同步时间*/ + @Excel(name = "同步时间", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "同步时间") + private java.util.Date syncTime; + + /**上次同步时间*/ + @Excel(name = "上次同步时间", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") + @ApiModelProperty(value = "上次同步时间") + private java.util.Date lastSyncTime; + + /**同步类型*/ + @Excel(name = "同步类型", width = 15) + @ApiModelProperty(value = "同步类型") + private String syncType; + +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPDepartment.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPDepartment.java index c1e1e4b59..7f0ff581e 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPDepartment.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPDepartment.java @@ -9,10 +9,10 @@ import lombok.Data; */ @Data public class PPDepartment { - private String ref_id; //部门ID ----id + private String ref_id; //部门ID ----id, org_code(因为org_code不能为空) private String name_en; //部门英文名 ----depart_name_en private String name_cn; //部门中文名 ----depart_name - private String code; //部门code ----org_code + private String code; //部门code ----depart_order private String manager_id; //部门负责人员工号 private String manager_wk_uid; //部门负责人域账号 private String hr_partner; //部门 HRBP(多个会用";"隔开) diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPEmployee.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPEmployee.java index f76e8e2d0..54538a10a 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPEmployee.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/PPEmployee.java @@ -11,14 +11,15 @@ import java.util.Date; */ @Data public class PPEmployee { + // people_info private String data_difference; //数据来源[WORKDAY,XPT,NIOCAPITAL] private String employee_difference; // 员工来源[CN, EU_US,EU] - private String employee_id; // 员工编号(员工唯一标识) - private String worker_user_id; //WD帐号创建SSO账号 / AD账户 - private String user_name; // WD同步到people的域帐号 - private String foreign_employee_id; // 兼职公司对应的员工编号 + private String employee_id; // 员工编号(员工唯一标识) ----workNo + private String worker_user_id; //WD帐号创建SSO账号 / AD账户 ----thirdId + private String user_name; // WD同步到people的域帐号 ----username +// private String foreign_employee_id; // 兼职公司对应的员工编号 private String name; // 全名 - private String formatted_name; // 全名-拼音及中文 + private String formatted_name; // 全名-拼音及中文 ----realname private String preferred_first_name; // 首选-名 private String preferred_last_name; // 首选-姓 private String first_name; //法定-名-拼音 @@ -28,13 +29,13 @@ public class PPEmployee { private String name_in_local_script; // 法定-姓名-中文 private String first_name_in_local_script; // 名-中文 private String last_name_in_local_script; // 姓-中文 - private String delete_flag; // 删除标记[1:存在;0:删除] + private String delete_flag; // 删除标记[1:存在;0:删除] ----delFlag private String delete_time; // 删除时间 private String delay_flag; // 延期标记(0:延期,1:未延期,2:未操作) private String delay_time; // 延期时间 - private String employee_status; // 员工状态[Active,Terminated] + private String employee_status; // 员工状态[Active,Terminated] ----statue private String outsourcing_type; // 外包形式 - private String worker_type; // 员工种类 Employee,Contingent Worker + private String worker_type; // 员工种类 Employee,Contingent Worker ----workerType private String hire_date; // 员工入职日期 private String original_hire_date; // 员工原始入职日期 private String rehire; // 重新雇用[1:是;0:否] @@ -53,8 +54,23 @@ public class PPEmployee { private String domain; // 账号所属域 private String ad_failed; // 创建ad失败原账号 private String have_employees; // 是否有下属员工 - private String id; // id - private Date creation_time; // 创建时间 - private Date update_time; // 修改时间 + private String id; // id ----id + private Date creation_time; // 创建时间 ----createTime + private Date update_time; // 修改时间 ----updateTime + + // people_job_info 多个 取第一个 + private String job_code; + private String job_title; + private String supervisory_organization_ref_id; // 部门id + + + // people_contact_email 多个 取第一个WORK邮箱 + private String email_type; // HOME/WORK + private String email_address; + + // people_contact_phone 多个 取第一个Mobile的WORK电话 + private String phone_type; // HOME/WORK + private String phone_device_type; // Mobile/Landline + private String formatted_phone_number; } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java index ce1f0c578..e36617f10 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/entity/SysUser.java @@ -164,6 +164,7 @@ public class SysUser implements Serializable { private String clientId; private String thirdId;//用户域账号 + private String thirdType;//用户数据来源 @Excel(name = "员工类型", width = 15, dicCode = "worker_type") @Dict(dicCode = "worker_type") @@ -182,4 +183,8 @@ public class SysUser implements Serializable { @TableField(exist = false) private String cut; //中英文切换标识 + + //新添加的字段 + private String jobCode; + private String jobTitle; } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/OtSyncInfoEOMapper.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/OtSyncInfoEOMapper.java new file mode 100644 index 000000000..f4c567432 --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/OtSyncInfoEOMapper.java @@ -0,0 +1,17 @@ +package com.jero.modules.system.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.jero.modules.system.entity.OtSyncInfoEO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 同步时间记录表 + * @Author: jero-boot + * @Date: 2022-05-25 + * @Version: V1.0 + */ +public interface OtSyncInfoEOMapper extends BaseMapper { + +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/OtSyncInfoEOMapper.xml b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/OtSyncInfoEOMapper.xml new file mode 100644 index 000000000..9909fb30f --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/mapper/xml/OtSyncInfoEOMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/IOtSyncInfoEOService.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/IOtSyncInfoEOService.java new file mode 100644 index 000000000..ad64702d6 --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/IOtSyncInfoEOService.java @@ -0,0 +1,63 @@ +package com.jero.modules.system.service; + +import com.jero.modules.system.entity.OtSyncInfoEO; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: 同步时间记录表 + * @Author: jero-boot + * @Date: 2022-05-25 + * @Version: V1.0 + */ +public interface IOtSyncInfoEOService extends IService { + + /** + * 保存 + * + * @param otSyncInfoEO + * @return + */ + void add(OtSyncInfoEO otSyncInfoEO); + + /** + * 更新 + * + * @param otSyncInfoEO + * @return + */ + void editById(OtSyncInfoEO otSyncInfoEO); + + /** + * 通过id删除 + * + * @param id + * @return + */ + void deleteById(String id); + + /** + * 批量删除 + * + * @param ids + * @return + */ + void deleteByIds(List ids); + + /** + * 通过id查询 + * + * @param id + * @return + */ + OtSyncInfoEO queryById(String id); + + /** + * 列表查询 + * + * @return + */ + List queryList(); + + OtSyncInfoEO getLastSyncInfo(String syncType); +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISyncDataService.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISyncDataService.java index 93d7bac1e..c02eaca9e 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISyncDataService.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISyncDataService.java @@ -13,6 +13,12 @@ import java.security.NoSuchAlgorithmException; * @Date: Created in 15:37 2022/2/28 */ public interface ISyncDataService { + + void synchronPPDepartInfo() throws Exception; + + void synchronPPUserInfo() throws Exception; + + void syncDepartInfo() throws IOException, NoSuchAlgorithmException, InvalidKeyException; int insertDepartFromTree(PPOrganization root, int i); @@ -22,6 +28,4 @@ public interface ISyncDataService { void syncDepartRoleInfo() throws IOException, NoSuchAlgorithmException, InvalidKeyException; void syncDepartRoleUserInfo() throws IOException, NoSuchAlgorithmException, InvalidKeyException; - - String getResultDataOfGet(String uri, String queryString) throws IOException, NoSuchAlgorithmException, InvalidKeyException; } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java index 39b72e4e7..667744bd1 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysDepartService.java @@ -140,8 +140,24 @@ public interface ISysDepartService extends IService{ */ void updateAllParentId(); + /** + * 获取从people同步过来的部门列表 + * @return + */ List getPPDepartList(); + + /** + * 添加从people同步过来的部门 + * @param ppDepartment + * @return + */ SysDepart addPPDepart(PPDepartment ppDepartment); - void updatePPDepart(PPDepartment ppDepartment); + + /** + * 修改从people同步过来的部门 + * @param sysDepart + * @param ppDepartment + */ + void updatePPDepart(SysDepart sysDepart, PPDepartment ppDepartment); } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java index 6603a5aa5..b1bc67a27 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/ISysUserService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.jero.common.api.vo.Result; import com.jero.common.system.vo.SysUserCacheInfo; +import com.jero.modules.system.entity.PPEmployee; import com.jero.modules.system.entity.SysUser; import com.jero.modules.system.model.DepartIdModel; import com.jero.modules.system.model.SysUserSysDepartModel; @@ -254,4 +255,11 @@ public interface ISysUserService extends IService { * 根据用户名usernameList查询id */ List queryUserIdListByNameList(List usernameList); + + List getPPEmployeeList(); + + SysUser addPPUserInfo(PPEmployee ppEmployee); + + void updatePPUserInfo(SysUser sysUser, PPEmployee ppEmployee); + } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/OtSyncInfoEOServiceImpl.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/OtSyncInfoEOServiceImpl.java new file mode 100644 index 000000000..62f9244d0 --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/OtSyncInfoEOServiceImpl.java @@ -0,0 +1,107 @@ +package com.jero.modules.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.jero.modules.system.entity.OtSyncInfoEO; +import com.jero.modules.system.mapper.OtSyncInfoEOMapper; +import com.jero.modules.system.service.IOtSyncInfoEOService; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Date; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 同步时间记录表 + * @Author: jero-boot + * @Date: 2022-05-25 + * @Version: V1.0 + */ +@Service +public class OtSyncInfoEOServiceImpl extends ServiceImpl implements IOtSyncInfoEOService { + + /** + * 保存 + * + * @param otSyncInfoEO + * @return + */ + @Override + public void add(OtSyncInfoEO otSyncInfoEO) { + Date now = new Date(); + otSyncInfoEO.setCreateTime(now); + otSyncInfoEO.setUpdateTime(now); + save(otSyncInfoEO); + } + + /** + * 更新 + * + * @param otSyncInfoEO + * @return + */ + @Override + public void editById(OtSyncInfoEO otSyncInfoEO) { + Date now = new Date(); + otSyncInfoEO.setUpdateTime(now); + saveOrUpdate(otSyncInfoEO); + } + + /** + * 通过id删除 + * + * @param id + * @return + */ + @Override + public void deleteById(String id) { + removeById(id); + } + + /** + * 批量删除 + * + * @param ids + * @return + */ + @Override + public void deleteByIds(List ids) { + removeByIds(ids); + } + + /** + * 通过id查询 + * + * @param id + * @return + */ + @Override + public OtSyncInfoEO queryById(String id) { + return getById(id); + } + + /** + * 列表查询 + * + * @return + */ + @Override + public List queryList() { + return list(); + } + + /** + * 获取上一次同步的信息 + * @param syncType + * @return + */ + public OtSyncInfoEO getLastSyncInfo(String syncType){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(OtSyncInfoEO::getSyncType, syncType) + .orderByDesc(OtSyncInfoEO::getSyncTime); + List syncInfoEOList = list(queryWrapper); + if(syncInfoEOList!=null && !syncInfoEOList.isEmpty()){ + return syncInfoEOList.get(0); + }else{ + return null; + } + } +} diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SyncDataServiceImpl.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SyncDataServiceImpl.java index 570c34db2..aa96f5627 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SyncDataServiceImpl.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SyncDataServiceImpl.java @@ -1,6 +1,7 @@ package com.jero.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.jero.common.constant.CommonConstant; @@ -8,6 +9,7 @@ import com.jero.common.system.vo.LoginUser; import com.jero.common.util.PasswordUtil; import com.jero.common.util.oConvertUtils; import com.jero.modules.system.entity.*; +import com.jero.modules.system.enums.PPSyncEnum; import com.jero.modules.system.service.*; import com.jero.modules.system.util.HmacSignUtil; import com.jero.modules.system.util.HttpRequestUtil; @@ -16,15 +18,15 @@ import org.apache.commons.lang.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.stream.Collectors; /** @@ -54,12 +56,283 @@ public class SyncDataServiceImpl implements ISyncDataService{ private ISysDepartRoleService sysDepartRoleService; @Autowired private ISysDepartRoleUserService sysDepartRoleUserService; + @Autowired + private IOtSyncInfoEOService otSyncInfoEOService; + + /** + * 同步部门信息 + * @throws Exception + */ + @Async + @Transactional(readOnly = false, rollbackFor = Exception.class) + public void synchronPPDepartInfo() throws Exception { + Date nowTime = new Date(); + // 本地组织机构MAP + Map localDepartMap = new HashMap(); + // 获取上次同步状态 + OtSyncInfoEO lastSyncInfo = otSyncInfoEOService.getLastSyncInfo(PPSyncEnum.PP_DEPART.getValue()); + //首先获取系统内的所有PP组织机构 + List sysDepartList = sysDepartService.getPPDepartList(); + //将List转化成Map结构 + if (sysDepartList != null && !sysDepartList.isEmpty()) { + for (SysDepart eo : sysDepartList) { + localDepartMap.put(eo.getId(), eo); + } + } + // 取PP数据 + String path = "/people/v1/base/department/list"; + String queryStr = "app_id=" + appId +"&hash_type=sha256&offset=0&limit=100"; + String response = getResultDataOfGet(path, queryStr); + JSONObject myJson = JSONObject.parseObject(response); + log.debug(myJson.toJSONString()); + if (!myJson.get("result_code").toString().equals("success")) { + log.error("请求出现异常:" + myJson.get("message") + " " + myJson); + } else { + log.debug("打印输出本次同步信息返回结果:" + myJson.get("data").toString()); + JSONObject resultJson = (JSONObject) myJson.get("data"); + List ppDepartList = JSONObject.parseArray(resultJson.get("list").toString(), PPDepartment.class); + //获取总记录数 + int total = (int) resultJson.get("amount"); + if (total > 100) { + int pageSum = total / 100; // 总页数 + if ((total % 100) > 0) { + pageSum += 1; + } + //循环查询统一认证系统所有账户信息(从第二页开始) + for (int page = 1; page < pageSum; page++) { + path = "/people/v1/base/department/list"; + queryStr = "app_id=" + appId +"&hash_type=sha256&limit=100&offset=" + (page*100); + response = getResultDataOfGet(path, queryStr); + myJson = JSONObject.parseObject(response.toString()); + resultJson = (JSONObject) myJson.get("data"); + log.debug("打印输出本次同步信息返回结果:" + myJson.get("data").toString()); + List currentPPDepartList = JSONObject.parseArray(resultJson.get("list").toString(), PPDepartment.class); + ppDepartList.addAll(currentPPDepartList); + } + } + + //开始循环遍历数据 + /*** + * 判断PP数据是否存在,不存在:插入,存在:更新 + */ + if (ppDepartList != null && !ppDepartList.isEmpty()) { + for (PPDepartment ppDepart : ppDepartList) { + try { + // 判断当前SSO组织机构是否在本地存在 不存在先将数据添加到数据中 + if (!localDepartMap.containsKey(ppDepart.getRef_id())) { + if (StringUtils.isNotBlank(ppDepart.getRef_id())) { // 排除ref_id为空的情况 + SysDepart sysDepart = sysDepartService.addPPDepart(ppDepart); + localDepartMap.put(ppDepart.getRef_id(), sysDepart); + } + } else { + SysDepart sysDepart = localDepartMap.get(ppDepart.getRef_id()); + sysDepartService.updatePPDepart(sysDepart, ppDepart); + } + }catch (Exception e){ + log.error("同步部门数据出现异常,异常信息为:"+e.getMessage(), e); + continue; + } + } + } + //记录同步规则 + // 写入本次同步记录 + OtSyncInfoEO syncInfoEO = new OtSyncInfoEO(); + syncInfoEO.setSyncTime(nowTime); + syncInfoEO.setSyncType(PPSyncEnum.PP_DEPART.getValue()); + syncInfoEO.setLastSyncTime(lastSyncInfo != null ? lastSyncInfo.getSyncTime() : null); + otSyncInfoEOService.save(syncInfoEO); + } + + } + + /** + * 同步用户信息 + * @throws Exception + */ + @Async + @Transactional(readOnly = false, rollbackFor = Exception.class) + public void synchronPPUserInfo() throws Exception { +// 获取当前时间 + Date nowTime = new Date(); +// 获取上次更新时间 + OtSyncInfoEO lastSyncInfo = otSyncInfoEOService.getLastSyncInfo(PPSyncEnum.PP_USER.getValue()); + //本地用户信息Map + Map localUserMap=new HashMap(); + //people获取用户信息Map + Map PPEmployeeMap=new HashMap(); + + String path = "/people/v1/employee/all-info"; + String queryStr = "app_id=" + appId + "&hash_type=sha256&offset=0&limit=100"; + String response = getResultDataOfGet(path, queryStr); + JSONObject myJson = JSONObject.parseObject(response); + log.debug(myJson.toJSONString()); + if(!myJson.get("result_code").toString().equals("success")){ + log.error("请求出现异常:"+myJson.get("message")+" "+myJson); + }else{ + log.debug("打印输出本次同步信息返回结果:"+myJson.get("data").toString()); + JSONObject resultJson = (JSONObject) myJson.get("data"); + //将第一页的账户信息转换为本地dto集合 + List userList = JSONObject.parseArray(resultJson.get("list").toString(), JSONObject.class); + List ppEmployeeList = getPPEmployeeList(userList); + + //获取总记录数 + int total = (int) resultJson.get("amount"); + if(total > 100){ + int pageSum = total / 100; // 总页数 + if((total % 100) > 0){ + pageSum += 1; + } + //循环查询统一认证系统所有账户信息(从第二页开始) + for(int page = 1; page < pageSum; page++){ + path = "/people/v1/employee/all-info"; + queryStr = "app_id=" + appId + "&hash_type=sha256&limit=100&offset=" + (page*100); + response = getResultDataOfGet(path, queryStr); + myJson = JSONObject.parseObject(response); + log.debug("打印输出本次同步信息返回结果:"+myJson.get("data").toString()); + resultJson = (JSONObject) myJson.get("data"); + userList = JSONObject.parseArray(resultJson.get("list").toString(), JSONObject.class); + List currentPPEmployeeList = getPPEmployeeList(userList); + ppEmployeeList.addAll(currentPPEmployeeList); + } + } + + //此处获取全部pp用户信息 + List sysUserList = sysUserService.getPPEmployeeList(); +// log.info("查询到的用户信息结果集为:"+JSONObject.toJSONString(userEOList)); + for(SysUser user:sysUserList){ + localUserMap.put(user.getId(),user); + } +// log.info("将用户信息集合转换为的用户MAP为:"+JSONObject.toJSONString(localUserMap)); + log.info("开始更新数据库信息"); + for(PPEmployee ppEmployee:ppEmployeeList){ + try { + PPEmployeeMap.put(ppEmployee.getId(), ppEmployee); + //1.判断当前账号是否已添加到用户中 + if (!localUserMap.containsKey(ppEmployee.getId())) { + //删除数据库中与该账户相同的数据 + if(StringUtils.isNotBlank(ppEmployee.getId())) { + sysUserService.removeById(ppEmployee.getId()); + log.info("需要新增的用户信息为:" + JSONObject.toJSONString(ppEmployee)); + SysUser newUser = sysUserService.addPPUserInfo(ppEmployee); + localUserMap.put(ppEmployee.getId(), newUser); + } + + } else { + SysUser userEO = localUserMap.get(ppEmployee.getId()); + log.info("需要更新的用户信息为:" + JSONObject.toJSONString(userEO) + " " + JSONObject.toJSONString(ppEmployee)); + if(userEO != null) { + sysUserService.updatePPUserInfo(userEO, ppEmployee); + } + + } + }catch (Exception e){ + e.printStackTrace(); + log.error("同步用户数据出现异常,异常信息为:"+e.getMessage(), e); + } + } + log.info("更新数据结束"); + // 写入本次同步记录 + OtSyncInfoEO syncInfoEO = new OtSyncInfoEO(); + syncInfoEO.setSyncTime(nowTime); + syncInfoEO.setSyncType(PPSyncEnum.PP_USER.getValue()); + syncInfoEO.setLastSyncTime(lastSyncInfo != null ? lastSyncInfo.getSyncTime() : null); + try { + otSyncInfoEOService.save(syncInfoEO); + }catch (Exception e){ + e.printStackTrace(); + log.error("出现异常,异常信息为:"+e.getMessage(), e); + } + log.info("写入同步记录结束"); + } + } + + + private static List getPPEmployeeList(List userList) { + List ppEmployeeList = new ArrayList<>(); + for (JSONObject user : userList) { + PPEmployee userMainInfo = JSONObject.parseObject(user.get("people_info").toString(), PPEmployee.class); + + List userJobInfoList = JSONObject.parseArray(user.get("people_job_info").toString(), PPEmployee.class); + if (CollectionUtil.isNotEmpty(userJobInfoList)) { + userMainInfo.setJob_code(userJobInfoList.get(0).getJob_code()); + userMainInfo.setJob_title(userJobInfoList.get(0).getJob_title()); + userMainInfo.setSupervisory_organization_ref_id(userJobInfoList.get(0).getSupervisory_organization_ref_id()); + } + List userEmailInfoList = JSONObject.parseArray(user.get("people_contact_email").toString(), PPEmployee.class); + if (CollectionUtil.isNotEmpty(userEmailInfoList)) { + PPEmployee userEmailInfo = userEmailInfoList.stream().filter(e->"WORK".equals(e.getEmail_type())).collect(Collectors.toList()).get(0); + if (ObjectUtil.isNotEmpty(userEmailInfo)) { + userMainInfo.setEmail_address(userEmailInfo.getEmail_address()); + } + } + List userPhoneInfoList = JSONObject.parseArray(user.get("people_contact_phone").toString(), PPEmployee.class); + if (CollectionUtil.isNotEmpty(userPhoneInfoList)) { + PPEmployee userPhoneInfo = userPhoneInfoList.stream().filter(e->"WORK".equals(e.getPhone_type()) && "Mobile".equals(e.getPhone_device_type())).collect(Collectors.toList()).get(0); + if (ObjectUtil.isNotEmpty(userPhoneInfo)) { + userMainInfo.setFormatted_phone_number(userPhoneInfo.getFormatted_phone_number()); + } + } + + ppEmployeeList.add(userMainInfo); + } + return ppEmployeeList; + } + + /** + * 发送请求,获取同步数据 + * @param uri + * @param queryString + * @return + * @throws IOException + * @throws NoSuchAlgorithmException + * @throws InvalidKeyException + */ + private String getResultDataOfGet(String uri, String queryString) throws IOException, NoSuchAlgorithmException, InvalidKeyException { + // 获取签名 + String method ="GET"; + String path = uri; + String queryStr = queryString; + Map header = new HashMap<>(); + String timestamp = HmacSignUtil.getSecondTimestamp(new Date()); + queryStr += "×tamp=" + timestamp; + String sign = HmacSignUtil.getSign(secret,method,path,queryStr,header); + String url = host; + url += path + "?"; + url += queryStr; + url += "&sign=" + sign; + Map headerMap = new HashMap<>(); + String response = HttpRequestUtil.getResponseOfGET(url, headerMap); + JSONObject myJson = JSONObject.parseObject(response); + + return myJson.toJSONString(); +// log.debug(myJson.toJSONString()); +// if(!myJson.get("result_code").toString().equals("success")) { +// log.error("请求出现异常:" + myJson.get("result_code") + " " + myJson); +// } +// log.debug("打印输出本次同步信息返回结果:"+myJson.get("data").toString()); +// return myJson.get("data").toString(); + } public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException { + String path = "/people/v1/employee/all-info"; +// String path = "/people/v1/base/department/list"; +// String queryStr = "app_id=100679&hash_type=sha256&employee_id=10438,22705,27785,28617,28617,45143"; +// String queryStr = "app_id=100679&hash_type=sha256&worker_user_id=ning.chen,shanshan.su,frank.qiang,huaming.liu,charles.wang,songran.liu"; + String queryStr = "app_id=100679&hash_type=sha256&worker_user_id=abin.ban1"; + + String response = getResultDataOfGetTest(path, queryStr); +// JSONObject myJson = JSONObject.parseObject(response); +// JSONObject resultJson = (JSONObject) myJson.get("data"); + //将第一页的账户信息转换为本地dto集合 +// List userList = JSONObject.parseArray(resultJson.get("list").toString(), JSONObject.class); +// List ppEmployeeList = getPPEmployeeList(userList); + System.out.println("ok"); } + + /** * 同步组织信息 * @throws IOException @@ -70,7 +343,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ //查询所有组织列表,children为空 String path = "/people/v1/organization/list"; String queryStr = "app_id=100679&hash_type=sha256"; - String resultData = getResultDataOfGet(path, queryStr); + String resultData = getResultDataOfGetTest(path, queryStr); //JSON转实体类 List organizationList = JSONArray.parseArray(resultData, PPOrganization.class); log.info("需要同步的组织数据总数:" + organizationList.size()); @@ -146,7 +419,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ //查询所有角色列表,非树状,children为空 String path = "/people/v1/position/list"; String queryStr = "app_id=100679&hash_type=sha256"; - String resultData = getResultDataOfGet(path, queryStr); + String resultData = getResultDataOfGetTest(path, queryStr); //JSON转实体类 List positionList = JSONArray.parseArray(resultData, PPPosition.class); List positionCodeList = positionList.stream().map(PPPosition :: getCode).collect(Collectors.toList()); @@ -155,7 +428,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ log.info("需要同步的岗位数据总数:" + positionList.size()); for(String code : positionCodeList){ String queryStrDetail = positionDetailQueryStr + code; - String result = getResultDataOfGet(positionDetailPath, queryStrDetail); + String result = getResultDataOfGetTest(positionDetailPath, queryStrDetail); PPPosition position = JSONObject.parseObject(result, PPPosition.class); SysRole sysRole = new SysRole(); sysRole.setId(position.getId()); @@ -181,7 +454,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ public void syncDepartRoleInfo() throws IOException, NoSuchAlgorithmException, InvalidKeyException { String path = "/people/v1/organization-position/all"; String queryStr = "app_id=100679&hash_type=sha256"; - String resultData = getResultDataOfGet(path, queryStr); + String resultData = getResultDataOfGetTest(path, queryStr); //JSON转实体类 List organizationPositionList = JSONArray.parseArray(resultData, PPOrganizationPosition.class); log.info("需要同步的组织岗位关系数据总数:" + organizationPositionList.size()); @@ -211,7 +484,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ //查询所有人员组织岗位 String path = "/people/v1/employee/organization-position/list"; String queryStr = "app_id=100679&hash_type=sha256"; - String resultData = getResultDataOfGet(path, queryStr); + String resultData = getResultDataOfGetTest(path, queryStr); //JSON转实体类 List orgPosEmployeeList = JSONArray.parseArray(resultData, PPOrgPosEmployee.class); log.info("需要同步的组织岗位人员关系数据总数:" + orgPosEmployeeList.size()); @@ -220,7 +493,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ for(PPOrgPosEmployee ope : orgPosEmployeeList){ //查询人员详情 String queryStrDetail = employeeDetailQueryStr + ope.getEmployee_id(); - String result = getResultDataOfGet(employeeDetailPath, queryStrDetail); + String result = getResultDataOfGetTest(employeeDetailPath, queryStrDetail); //JSON转实体类 PPEmployee employee = JSONObject.parseObject(result, PPEmployee.class); //判断用户信息是否已添加,人员-组织岗位关系为多对多 @@ -273,7 +546,7 @@ public class SyncDataServiceImpl implements ISyncDataService{ * @throws NoSuchAlgorithmException * @throws InvalidKeyException */ - public String getResultDataOfGet(String uri, String queryString) throws IOException, NoSuchAlgorithmException, InvalidKeyException { + public static String getResultDataOfGetTest(String uri, String queryString) throws IOException, NoSuchAlgorithmException, InvalidKeyException { String appId = "100679"; // String appSecret = "CDf2D9404C6ac1B0f7c3e3845ae0282a"; String appSecret = "7C3F03170E3ea489df04Ce8DEC7Df4f7"; @@ -290,15 +563,17 @@ public class SyncDataServiceImpl implements ISyncDataService{ url += path + "?"; url += queryStr; url += "&sign=" + sign; + System.out.println(url); Map headerMap = new HashMap<>(); String response = HttpRequestUtil.getResponseOfGET(url, headerMap); JSONObject myJson = JSONObject.parseObject(response); - log.debug(myJson.toJSONString()); - if(!myJson.get("result_code").toString().equals("success")) { - log.error("请求出现异常:" + myJson.get("result_code") + " " + myJson); - } - log.debug("打印输出本次同步信息返回结果:"+myJson.get("data").toString()); - return myJson.get("data").toString(); + return myJson.toJSONString(); +// log.debug(myJson.toJSONString()); +// if(!myJson.get("result_code").toString().equals("success")) { +// log.error("请求出现异常:" + myJson.get("result_code") + " " + myJson); +// } +// log.debug("打印输出本次同步信息返回结果:"+myJson.get("data").toString()); +// return myJson.get("data").toString(); } } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java index 1e17da837..b3a914e79 100644 --- a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/service/impl/SysDepartServiceImpl.java @@ -571,8 +571,7 @@ public class SysDepartServiceImpl extends ServiceImpl getPPDepartList() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysDepart::getDepartSource, PPSyncEnum.PP.getValue()) - .eq(SysDepart::getDelFlag, 0); + queryWrapper.eq(SysDepart::getDepartSource, PPSyncEnum.PP.getValue()); return this.list(queryWrapper); } @@ -612,8 +611,8 @@ public class SysDepartServiceImpl extends ServiceImpl impl List sysUsers = this.baseMapper.selectList(sysUserQueryWrapper); return sysUsers; } + + @Override + public List getPPEmployeeList() { + QueryWrapper sysUserQueryWrapper = new QueryWrapper<>(); + sysUserQueryWrapper.lambda().eq(SysUser::getThirdType, PPSyncEnum.PP.getValue()); + return list(sysUserQueryWrapper); + } + + @Override + public SysUser addPPUserInfo(PPEmployee ppEmployee) { + + SysUser sysUser = new SysUser(); + // 基本信息 + sysUser.setId(ppEmployee.getId()); + sysUser.setUsername(ppEmployee.getUser_name()); + sysUser.setRealname(ppEmployee.getFormatted_name()); + sysUser.setStatus("Active".equals(ppEmployee.getEmployee_status())? CommonConstant.USER_UNFREEZE : CommonConstant.USER_FREEZE); + sysUser.setDelFlag("1".equals(ppEmployee.getDelete_flag())? CommonConstant.DEL_FLAG_0 : CommonConstant.DEL_FLAG_1); + sysUser.setThirdId(ppEmployee.getWorker_user_id()); + sysUser.setActivitiSync(CommonConstant.ACT_SYNC_1); + sysUser.setWorkNo(ppEmployee.getEmployee_id()); + sysUser.setWorkerType("Employee".equals(ppEmployee.getWorker_type())? CommonConstant.WORKER_TYPE_1 : CommonConstant.WORKER_TYPE_2); + sysUser.setCreateTime(ppEmployee.getCreation_time()); + sysUser.setUpdateTime(ppEmployee.getUpdate_time()); + sysUser.setThirdType(PPSyncEnum.PP.getValue()); + // 工作信息 + sysUser.setJobCode(ppEmployee.getJob_code()); + sysUser.setJobTitle(ppEmployee.getJob_title()); + sysUser.setOrgCode(ppEmployee.getSupervisory_organization_ref_id()); + // 联系方式 + sysUser.setEmail(ppEmployee.getEmail_address()); + sysUser.setTelephone(ppEmployee.getFormatted_phone_number()); + + // 设置用户默认密码 + String username = ppEmployee.getUser_name(); + String password = "nio.com123"; // 设置默认密码 + String salt = oConvertUtils.randomGen(8); + String passwordEncode = PasswordUtil.encrypt(username, password, salt); + sysUser.setPassword(passwordEncode); + sysUser.setSalt(salt); + + // 添加用户部门关系 + SysUserDepart sysUserDepart = new SysUserDepart(ppEmployee.getId(), ppEmployee.getSupervisory_organization_ref_id()); + sysUserDepartMapper.insert(sysUserDepart); + // 添加用户信息 + save(sysUser); + return sysUser; + } + + @Override + public void updatePPUserInfo(SysUser sysUser, PPEmployee ppEmployee) { + + // 基本信息 + sysUser.setUsername(ppEmployee.getUser_name()); + sysUser.setRealname(ppEmployee.getFormatted_name()); + sysUser.setStatus("Active".equals(ppEmployee.getEmployee_status())? CommonConstant.USER_UNFREEZE : CommonConstant.USER_FREEZE); + sysUser.setDelFlag("1".equals(ppEmployee.getDelete_flag())? CommonConstant.DEL_FLAG_0 : CommonConstant.DEL_FLAG_1); + sysUser.setThirdId(ppEmployee.getWorker_user_id()); + sysUser.setWorkNo(ppEmployee.getEmployee_id()); + sysUser.setWorkerType("Employee".equals(ppEmployee.getWorker_type())? CommonConstant.WORKER_TYPE_1 : CommonConstant.WORKER_TYPE_2); + sysUser.setCreateTime(ppEmployee.getCreation_time()); + sysUser.setUpdateTime(ppEmployee.getUpdate_time()); + + // 工作信息 + sysUser.setJobCode(ppEmployee.getJob_code()); + sysUser.setJobTitle(ppEmployee.getJob_title()); + sysUser.setOrgCode(ppEmployee.getSupervisory_organization_ref_id()); + // 联系方式 + sysUser.setEmail(ppEmployee.getEmail_address()); + sysUser.setTelephone(ppEmployee.getFormatted_phone_number()); + + if (!StringUtils.equals(sysUser.getOrgCode(), ppEmployee.getSupervisory_organization_ref_id())) { + // 删除原用户部门关系 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(SysUserDepart::getUserId, sysUser.getId()).eq(SysUserDepart::getDepId,sysUser.getOrgCode()); + sysUserDepartMapper.delete(queryWrapper); + + if (StringUtils.isNotEmpty(ppEmployee.getSupervisory_organization_ref_id())) { + // 添加用户部门关系 + SysUserDepart sysUserDepart = new SysUserDepart(ppEmployee.getId(), ppEmployee.getSupervisory_organization_ref_id()); + sysUserDepartMapper.insert(sysUserDepart); + } + } + + updateById(sysUser); + + } } diff --git a/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/timer/PPSyncDataTimer.java b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/timer/PPSyncDataTimer.java new file mode 100644 index 000000000..b67b9da3d --- /dev/null +++ b/jero-boot/jero-boot-module-system/src/main/java/com/jero/modules/system/timer/PPSyncDataTimer.java @@ -0,0 +1,72 @@ +package com.jero.modules.system.timer; + +import com.jero.modules.system.entity.OtSyncInfoEO; +import com.jero.modules.system.service.ISyncDataService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +/** + * 定时同步SSO数据至本地 + */ +@Component +@EnableScheduling +@Slf4j +public class PPSyncDataTimer { + + @Value("${people.cronJobIsOpen}") + private Boolean isOpen; + + @Autowired + private ISyncDataService syncDataService; + +// @Scheduled(cron = "0 10 0 * * ?") //每天凌晨0点10分执行 + public void syncDepartInfo() { + if (isOpen) { + log.info("<======================================启动同步部门信息======================================>"); + try { + log.info("=========================================开始同步部门信息========================================="); + long startTime = System.currentTimeMillis(); + syncDataService.synchronPPDepartInfo(); + long endTime = System.currentTimeMillis(); + log.info("==============同步部门信息结束,同步共用时:"+((endTime-startTime)/1000)+" 秒========================"); + + } catch (Exception e) { + log.error("同步部门信息出现异常,异常信息为:" + e.getMessage(), e); + } + log.info("<======================================结束同步部门信息=======================================>"); + } + } + +// @Scheduled(cron = "0 10 1 * * ?") //每天凌晨1点10分执行 + public void syncUserInfo() { + log.info("<======================================启动同步用户信息=======================================>"); + if (isOpen) { + try { + log.info("=========================================开始同步用户信息========================================="); + long startTime = System.currentTimeMillis(); + syncDataService.synchronPPUserInfo(); + long endTime = System.currentTimeMillis(); + log.info("==============同步用户信息结束,同步共用时:"+((endTime-startTime)/1000)+" 秒========================"); + + //删除重复的用户数据 + /*List repeatUserIdList = userEOService.selectRepeatUserIdList(); + if(CollectionUtils.isNotEmpty(repeatUserIdList)) { + userEOService.delete(repeatUserIdList); + }*/ + } catch (Exception accountException) { + log.error("同步用户信息出现异常,异常信息为:" + accountException.getMessage(), accountException); + } + log.info("<======================================结束同步用户信息=======================================>"); + } + } +} diff --git a/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml b/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml index 52bf174cc..f7d54fc5b 100644 --- a/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml +++ b/jero-boot/jero-boot-single-startup/src/main/resources/application-dev.yml @@ -380,14 +380,15 @@ feign: people: appId: 100679 # 访问域名 CN TEST版 - host: http://napoleon-fab-test.nioint.com +# host: http://napoleon-fab-test.nioint.com # 访问域名 CN PROD版 - # host: http://napoleon.nioint.com + host: http://napoleon.nioint.com # appSecret CN TEST版 - secret: CDf2D9404C6ac1B0f7c3e3845ae0282a +# secret: CDf2D9404C6ac1B0f7c3e3845ae0282a # appSecret CN PROD版 - # secret: 7C3F03170E3ea489df04Ce8DEC7Df4f7 + secret: 7C3F03170E3ea489df04Ce8DEC7Df4f7 + cronJobIsOpen: true ## Feishu Feishu: # 测试 @@ -409,7 +410,6 @@ opensso: clientSecret: CDf2D9404C6ac1B0f7c3e3845ae0282a redirectUri: http%3A%2F%2F139.9.235.66%3A8010 - --- ## space系统 Space: