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(exclude = true) @RestController @RequestMapping("/dingding") public class DingdingController extends BaseController { @Autowired private RedisTemplate 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 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 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 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 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 getDingdingCorpId(@RequestParam("companyId") Integer companyId , HttpServletRequest request) throws Exception{ return ApiResponse.success(systemLoginService.getDingdingCorpId(companyId)); } }