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