package doumeemes.api.common;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import doumeemes.api.BaseController;
|
import doumeemes.core.annotation.trace.Trace;
|
import doumeemes.core.model.ApiResponse;
|
import doumeemes.core.model.LoginUserInfo;
|
import doumeemes.core.utils.Constants;
|
import doumeemes.core.utils.dingding.DingCallbackCrypto;
|
import doumeemes.core.utils.dingding.DingDingUtil;
|
import doumeemes.core.utils.redis.RedisUtil;
|
import doumeemes.dao.ext.CompanyUserExtMapper;
|
import doumeemes.dao.ext.vo.CompanyExtListVO;
|
import doumeemes.service.business.BackorderService;
|
import doumeemes.service.ext.CompanyExtService;
|
import doumeemes.service.ext.CompanyUserExtService;
|
import doumeemes.service.ext.DepartmentExtService;
|
import doumeemes.service.system.SystemLoginService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Map;
|
|
/**
|
* 钉钉相关接口
|
*/
|
@Api(tags = "钉钉相关接口")
|
@Trace(withRequestResult = false,withRequestParameters = false)
|
@RestController
|
@RequestMapping("/dingding")
|
public class DingdingController extends BaseController {
|
|
@Autowired
|
private RedisTemplate<String, Object> redisTemplate;
|
@Autowired
|
private CompanyExtService companyExtService;
|
@Autowired
|
private CompanyUserExtService companyUserExtService;
|
@Autowired
|
private BackorderService backorderService;
|
@Autowired
|
private DepartmentExtService departmentExtService;
|
@Autowired
|
private SystemLoginService systemLoginService;
|
@ApiOperation(value = "获取钉钉jsapi_ticket",httpMethod = "POST" )
|
@PostMapping("/jsapiTicket")
|
public ApiResponse<String> jsapiTicket(HttpServletRequest request) {
|
// int time = request.getSession().getServletContext().getSessionTimeout();
|
// int time1 = request.getSession().getMaxInactiveInterval();
|
// System.out.println(time1+"====================="+time);
|
LoginUserInfo user = this.getLoginUser();
|
if(user!=null&& user.getCompany()!=null){
|
return ApiResponse.success(companyExtService.getDingdingTicekt(user.getCompany().getId()));
|
}else {
|
return ApiResponse.failed("无效获取");
|
}
|
}
|
|
/**
|
* @author Eva.Caesar Liu
|
* @date 2022/04/18 18:12
|
*/
|
@ApiOperation(value ="钉钉推送",httpMethod = "POST" )
|
@RequestMapping("/push")
|
public Map<String, String> callBack(
|
@RequestParam(value = "msg_signature", required = false) String msg_signature,
|
@RequestParam(value = "timestamp", required = false) String timeStamp,
|
@RequestParam(value = "signature", required = false) String signature,
|
@RequestParam(value = "nonce", required = false) String nonce,
|
@RequestParam(value = "companyId", required = false) String companyId,
|
@RequestBody(required = false) JSONObject json) throws Exception{
|
try {
|
// 1. 从http请求中获取加解密参数
|
// 2. 使用加解密类型
|
// Constant.OWNER_KEY 说明:
|
// 1、开发者后台配置的订阅事件为应用级事件推送,此时OWNER_KEY为应用的APP_KEY。
|
// 2、调用订阅事件接口订阅的事件为企业级事件推送,
|
// 此时OWNER_KEY为:企业的appkey(企业内部应用)或SUITE_KEY(三方应用)
|
CompanyExtListVO com = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.COM_INFO_KEY+companyId,CompanyExtListVO.class);
|
if(com!=null) {
|
String ddinfo = com.getDingdingInfo();
|
JSONObject j = JSONObject.parseObject(ddinfo);
|
String aes_key = j .getString("aes_key");
|
String aes_token = j .getString("aes_token");
|
String app_key = j .getString("app_key");
|
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(aes_token, aes_key, app_key);
|
String encryptMsg = json.getString("encrypt");
|
String decryptMsg = callbackCrypto.getDecryptMsg(msg_signature, timeStamp, nonce, encryptMsg);
|
// 3. 反序列化回调事件json数据
|
JSONObject eventJson = JSON.parseObject(decryptMsg);
|
// -------------------测试开始-------------------
|
// JSONObject eventJson = new JSONObject();
|
// eventJson.put("EventType","bpms_instance_change");
|
// eventJson.put("type","finish");
|
// eventJson.put("processInstanceId","6keqDppjRme8fYyLjgtcmg06791659085082");
|
// eventJson.put("result","agree");
|
// -------------------测试结束-------------------
|
String eventType = eventJson.getString("EventType");
|
// 4. 根据EventType分类处理
|
if ("check_url".equals(eventType)) {
|
// 测试回调url的正确性
|
|
} else if ("user_add_org".equals(eventType)) {
|
// 审批实例开始,结束
|
}else if ("bpms_instance_change".equals(eventType)) {
|
// 处理审批实例开始,结束 //实例ID
|
String processInstanceId = eventJson.getString("processInstanceId");
|
String type= eventJson.getString("type");
|
String result= eventJson.getString("result");
|
backorderService.dealProcessInstance(processInstanceId,type,result);
|
}else if ("user_add_org".equals(eventType)) {
|
//加入企业后用户激活。。
|
JSONArray jsonArray = eventJson.getJSONArray("UserId");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
String userId = jsonArray.getString(i);
|
companyUserExtService.syncCompanyUser(Long.valueOf(userId),Integer.valueOf(companyId),"add");
|
}
|
}else if ("user_modify_org".equals(eventType)) {
|
//通讯录用户更改。
|
JSONArray jsonArray = eventJson.getJSONArray("UserId");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
String userId = jsonArray.getString(i);
|
companyUserExtService.syncCompanyUser(Long.valueOf(userId),Integer.valueOf(companyId),"edit");
|
}
|
}else if ("user_leave_org".equals(eventType)) {
|
//通讯录用户离职。
|
JSONArray jsonArray = eventJson.getJSONArray("UserId");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
String userId = jsonArray.getString(i);
|
companyUserExtService.syncCompanyUser(Long.valueOf(userId),Integer.valueOf(companyId),"delete");
|
}
|
}else if ("org_dept_create".equals(eventType)) {
|
//通讯录企业部门创建。
|
JSONArray jsonArray = eventJson.getJSONArray("DeptId");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
String deptId = jsonArray.getString(i);
|
departmentExtService.syncDepartment(Long.valueOf(deptId),Integer.valueOf(companyId),"add");
|
}
|
}else if ("org_dept_modify".equals(eventType)) {
|
//通讯录企业部门修改。
|
JSONArray jsonArray = eventJson.getJSONArray("DeptId");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
String deptId = jsonArray.getString(i);
|
departmentExtService.syncDepartment(Long.valueOf(deptId),Integer.valueOf(companyId),"edit");
|
}
|
}else if ("org_dept_remove".equals(eventType)) {
|
//通讯录企业部门删除。
|
JSONArray jsonArray = eventJson.getJSONArray("DeptId");
|
for (int i = 0; i < jsonArray.size(); i++) {
|
String deptId = jsonArray.getString(i);
|
departmentExtService.syncDelDepartment(Long.valueOf(deptId));
|
}
|
} else {
|
// 添加其他已注册的
|
}
|
// 5. 返回success的加密数据
|
Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
|
return successMap;
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
/**
|
* @author Eva.Caesar Liu
|
* @date 2022/04/18 18:12
|
*/
|
@ApiOperation(value = "钉钉免密登录",httpMethod = "POST" )
|
@RequestMapping("/ddLogin")
|
public ApiResponse<String> ddLogin(@RequestParam("companyId") Integer companyId , @RequestParam("code") String code , HttpServletRequest request) throws Exception{
|
return ApiResponse.success(systemLoginService.loginByDingdingCode(companyId ,code, request));
|
}
|
@ApiOperation(value = "获取钉钉corpId",httpMethod = "POST" )
|
@RequestMapping("/getDingdingCorpId")
|
public ApiResponse<String> getDingdingCorpId(@RequestParam("companyId") Integer companyId , HttpServletRequest request) throws Exception{
|
return ApiResponse.success(systemLoginService.getDingdingCorpId(companyId));
|
}
|
}
|