| 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<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)); | 
|     } | 
| } |