DingServiceImpl.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package com.fjhx.dingding.service.impl;
  2. import cn.hutool.core.util.RandomUtil;
  3. import cn.hutool.extra.pinyin.PinyinUtil;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.fjhx.dingding.entity.suite.po.SuiteTicketInfo;
  6. import com.fjhx.dingding.service.DingService;
  7. import com.fjhx.dingding.service.suite.SuiteTicketInfoService;
  8. import com.fjhx.tenant.entity.tenant.po.TenantInfo;
  9. import com.fjhx.tenant.service.tenant.impl.TenantInfoServiceImpl;
  10. import com.ruoyi.common.constant.StatusConstant;
  11. import com.ruoyi.common.exception.ServiceException;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.transaction.PlatformTransactionManager;
  15. import org.springframework.transaction.TransactionDefinition;
  16. import org.springframework.transaction.TransactionStatus;
  17. import java.util.List;
  18. import java.util.stream.Collectors;
  19. @Service
  20. public class DingServiceImpl implements DingService {
  21. @Autowired
  22. private SuiteTicketInfoService suiteTicketInfoService;
  23. @Autowired
  24. private TenantInfoServiceImpl tenantInfoService;
  25. @Autowired
  26. private PlatformTransactionManager platformTransactionManager;
  27. @Autowired
  28. private TransactionDefinition transactionDefinition;
  29. /**
  30. * https://open.dingtalk.com/document/isvapp/data-formats
  31. */
  32. @Override
  33. public void saveCallback(JSONObject callBackContent) {
  34. JSONObject bizData = callBackContent.getJSONObject("bizData");
  35. switch (bizData.getInteger("biz_type")) {
  36. case 2:
  37. saveSuiteTicketInfo(bizData);
  38. break;
  39. case 4:
  40. corpAuthorization(bizData);
  41. break;
  42. }
  43. }
  44. /**
  45. * 企业授权
  46. * <p>
  47. * https://open.dingtalk.com/document/isvapp/obtains-the-authorization-information-after-the-enterprise-activates-the-application
  48. */
  49. private void corpAuthorization(JSONObject bizData) {
  50. String syncAction = bizData.getString("syncAction");
  51. switch (syncAction) {
  52. // 企业授权
  53. case "org_suite_auth":
  54. orgSuiteAuth(bizData);
  55. break;
  56. // 企业变更授权范围
  57. case "org_suite_change":
  58. break;
  59. // 表示企业解除授权
  60. case "org_suite_relieve":
  61. break;
  62. }
  63. }
  64. /**
  65. * 保存 suite_ticket
  66. */
  67. private void saveSuiteTicketInfo(JSONObject bizData) {
  68. String corpId = bizData.getString("corp_id");
  69. String suiteTicket = bizData.getJSONObject("biz_data").getString("suiteTicket");
  70. boolean update = suiteTicketInfoService.update(q -> q
  71. .eq(SuiteTicketInfo::getCorpId, corpId)
  72. .set(SuiteTicketInfo::getSuiteTicket, suiteTicket));
  73. if (!update) {
  74. SuiteTicketInfo suiteTicketInfo = new SuiteTicketInfo();
  75. suiteTicketInfo.setCorpId(corpId);
  76. suiteTicketInfo.setSuiteTicket(suiteTicket);
  77. suiteTicketInfoService.save(suiteTicketInfo);
  78. }
  79. }
  80. /**
  81. * 企业授权
  82. */
  83. private void orgSuiteAuth(JSONObject bizData) {
  84. JSONObject authCorpInfo = bizData.getJSONObject("auth_corp_info");
  85. // 企业id
  86. String corpid = authCorpInfo.getString("corpid");
  87. // 企业名称
  88. String corpName = authCorpInfo.getString("corp_name");
  89. // 企业id存在则跳过
  90. if (tenantInfoService.getOne(q -> q.eq(TenantInfo::getCorpid, corpid)) != null) {
  91. return;
  92. }
  93. // 获取tenantId
  94. String firstLetter = PinyinUtil.getFirstLetter(corpName, "");
  95. String tenantId = "dd-" + firstLetter;
  96. List<TenantInfo> list = tenantInfoService.list(q -> q
  97. .likeRight(TenantInfo::getTenantId, "dd-" + firstLetter));
  98. List<String> tenantIdList = list.stream().map(TenantInfo::getTenantId).collect(Collectors.toList());
  99. if (list.size() > 0) {
  100. String tempTenantId;
  101. do {
  102. tempTenantId = tenantId + "-" + RandomUtil.randomString(3);
  103. } while (!tenantIdList.contains(tempTenantId));
  104. tenantId = tempTenantId;
  105. }
  106. TenantInfo tenantInfo = new TenantInfo();
  107. tenantInfo.setTenantId(tenantId);
  108. tenantInfo.setEnterpriseName(corpName);
  109. tenantInfo.setStatus(StatusConstant.ENABLE);
  110. tenantInfo.setFlowStatus(2);
  111. tenantInfo.setCorpid(corpid);
  112. TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
  113. try {
  114. // 保存租户
  115. tenantInfoService.save(tenantInfo);
  116. // 提交事务
  117. platformTransactionManager.commit(transactionStatus);
  118. } catch (Exception e) {
  119. // 回滚事务
  120. platformTransactionManager.rollback(transactionStatus);
  121. throw new ServiceException("保存数据失败");
  122. }
  123. }
  124. }