From d1ac2e379d2b56f2b73b579bb54950a547038e99 Mon Sep 17 00:00:00 2001 From: YXY <932687738@qq.com> Date: Thu, 31 Aug 2023 23:26:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=97=B6=E5=90=8C=E6=AD=A5=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LarkHelper/LarkTableSheetHelper.java | 101 ++++++++++++++++ .../flyingbook/LarkHelper/LarkUserHelper.java | 24 ++++ .../controller/LarkActiveController.java | 8 +- .../domain/lark/LarkTableSheetRequest.java | 38 ++++++ .../domain/lark/LarkUserRequest.java | 2 + .../ILarkUserActiveRelatoinService.java | 1 + .../LarkUserActiveRelatoinServiceImpl.java | 110 ++++++++++++++++++ .../LarkUserActiveInviteRelatoinMapper.xml | 2 +- 8 files changed, 278 insertions(+), 8 deletions(-) create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableSheetHelper.java create mode 100644 ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableSheetRequest.java diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableSheetHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableSheetHelper.java new file mode 100644 index 0000000..d89260c --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkTableSheetHelper.java @@ -0,0 +1,101 @@ +package com.ruoyi.flyingbook.LarkHelper; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.lark.oapi.core.response.RawResponse; +import com.lark.oapi.core.token.AccessTokenType; +import com.lark.oapi.service.sheets.v3.model.*; +import com.ruoyi.flyingbook.domain.lark.LarkException; +import com.ruoyi.flyingbook.domain.lark.LarkTableSheetRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayInputStream; +import java.io.ObjectInputStream; +import java.util.List; +import java.util.stream.Collectors; + + +/** + * @author yuxiangyong + * @create 2023-03-12 18:10 + */ +@Slf4j +@Component +public class LarkTableSheetHelper extends LarkHelper { + + static String spreadsheetToken = "LDGnspdy1hYJawtjUOCcXVTZnuc"; + static String sheetID = "2XYmks"; + + + public static void main(String[] args) throws Exception { + LarkTableSheetHelper bk = new LarkTableSheetHelper(); + LarkTableSheetRequest query = new LarkTableSheetRequest("cli_a482a8572cbc9013", "lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos", spreadsheetToken); + QuerySpreadsheetSheetRespBody spreadsheets = bk.getSpreadsheets(query); + Sheet[] sheets = spreadsheets.getSheets(); + query.setSheetId(sheetID); + List arr = bk.getSpreadsheetDetails(query).stream() + .filter(r -> { + String mid = String.valueOf(r); + return !mid.equals("[null]"); + }) + .map(r -> { + return String.valueOf(r).replace("[","").replace("]","").replace("\"",""); + }) + .distinct() + .collect(Collectors.toList()); + int i = 0; + } + + + /** + * 获取工作表 + */ + public QuerySpreadsheetSheetRespBody getSpreadsheets(LarkTableSheetRequest request) { + QuerySpreadsheetSheetResp query = null; + try { + query = buildClient(request).sheets() + .spreadsheetSheet() + .query( + QuerySpreadsheetSheetReq.newBuilder() + .spreadsheetToken(request.getSpreadsheetToken()) + .build() + ); + } catch (Exception e) { + throw new RuntimeException(new LarkException("LarkTableSheetHelper.getSpreadsheets", e.getMessage(), request).getErrorMessageBody()); + } + if (query != null && query.getCode() == 0) { + return query.getData(); + } else { + throw new RuntimeException(new LarkException("LarkTableSheetHelper.getSpreadsheets", query.getMsg(), request).getErrorMessageBody()); + } + } + + /** + * 获取工作表 + */ + public JSONArray getSpreadsheetDetails(LarkTableSheetRequest request) { + JSONObject result = null; + try { + RawResponse response = buildClient(request).get(request.getUrl(), null, AccessTokenType.Tenant); + result = JSONObject.parseObject(new String(response.getBody())); + JSONObject testV = new JSONObject(); + + } catch (Exception e) { + throw new RuntimeException(new LarkException("LarkTableSheetHelper.getSpreadsheetDetails", e.getMessage(), request).getErrorMessageBody()); + } + if (result != null && result.getInteger("code") == 0) { + JSONObject data = result.getJSONObject("data"); + if (data != null) { + JSONObject valueRange = data.getJSONObject("valueRange"); + if (valueRange != null) { + return valueRange.getJSONArray("values"); + } + } + return null; + } else { + throw new RuntimeException(new LarkException("LarkTableSheetHelper.getSpreadsheetDetails", result.getString("msg"), request).getErrorMessageBody()); + } + } + +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java index f9091e2..e65c4e0 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/LarkHelper/LarkUserHelper.java @@ -34,6 +34,8 @@ public class LarkUserHelper extends LarkHelper{ LarkUserHelper bk = new LarkUserHelper(); LarkUserRequest larkUserRequest = new LarkUserRequest(appId, secret, openId); GetUserRespBody userRespBody = bk.getUserInfoDetail(larkUserRequest); + larkUserRequest.setEmails(new String[]{"932687738@qq.com"}); + BatchGetIdUserRespBody userInfoList = bk.getUserInfoList(larkUserRequest); larkUserRequest.setDepartmentId(userRespBody.getUser().getDepartmentIds()[0]); GetDepartmentRespBody departmentsInfoDetail = bk.getDepartmentsInfoDetail(larkUserRequest); @@ -77,6 +79,28 @@ public class LarkUserHelper extends LarkHelper{ } } + public BatchGetIdUserRespBody getUserInfoList(LarkUserRequest request) { + BatchGetIdUserResp batchGetIdUserResp = null; + try { + batchGetIdUserResp = buildClient(request).contact().user() + .batchGetId( + BatchGetIdUserReq.newBuilder() + .batchGetIdUserReqBody(BatchGetIdUserReqBody.newBuilder() + .emails(request.getEmails()) + .build()) + .userIdType(BatchGetIdUserUserIdTypeEnum.USER_ID) + .build() + ); + } catch (Exception e) { + throw new RuntimeException(new LarkException("LarkUserHelper.getUserInfoDetail",e.getMessage(),request).getErrorMessageBody()); + } + if (batchGetIdUserResp != null && batchGetIdUserResp.getCode() == 0){ + return batchGetIdUserResp.getData(); + }else { + throw new RuntimeException(new LarkException("LarkUserHelper.getUserInfoDetail",batchGetIdUserResp.getMsg(),request).getErrorMessageBody()); + } + } + /** * 获取行详情 */ diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/LarkActiveController.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/LarkActiveController.java index 418723a..fc68d9f 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/LarkActiveController.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/controller/LarkActiveController.java @@ -179,8 +179,8 @@ public class LarkActiveController extends BaseController { @GetMapping("/exportActiveFile") public void export(HttpServletResponse response) { try { + larkUserActiveRelatoinService.syncSheet("cli_a482a8572cbc9013","lZNXbCLlOslWbwBIVc4qvgxOdnfA8Mos"); LarkActiveCountVo larkActiveCountVo = larkUserActiveRelatoinService.queryCount(); - List larkActiveExportDetailVos = larkUserActiveRelatoinService.queryExportDetail(APP_ID,APP_SECRET); ExportUtils.writeFile(response, "fileName"); EasyExcel.write(response.getOutputStream()) .head(LarkActiveCountVo.class) @@ -188,12 +188,6 @@ public class LarkActiveController extends BaseController { .excelType(ExcelTypeEnum.XLSX) .sheet(0,"sheetName1") .doWrite(Arrays.asList(larkActiveCountVo)); - EasyExcel.write(response.getOutputStream()) - .head(LarkActiveExportDetailVo.class) - .registerWriteHandler(new CustomMergeStrategy(LarkActiveExportDetailVo.class)) - .excelType(ExcelTypeEnum.XLSX) - .sheet(1,"sheetName2") - .doWrite(larkActiveExportDetailVos); }catch (Exception e){ log.info("导出信息错误",e); } diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableSheetRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableSheetRequest.java new file mode 100644 index 0000000..eb7a630 --- /dev/null +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkTableSheetRequest.java @@ -0,0 +1,38 @@ +package com.ruoyi.flyingbook.domain.lark; + +import lombok.Data; +import lombok.NoArgsConstructor; + + +/** + * @author yuxiangyong + * @create 2023-03-18 0:12 + */ +@Data +@NoArgsConstructor +public class LarkTableSheetRequest extends LarkRequest{ + + private String spreadsheetToken; + private String sheetId; + + + public LarkTableSheetRequest(String appId, String appSecret, String spreadsheetToken) { + super(appId,appSecret); + this.spreadsheetToken = spreadsheetToken; + } + + + public LarkTableSheetRequest(String appId, String appSecret, String spreadsheetToken, String sheetId) { + super(appId,appSecret); + this.spreadsheetToken = spreadsheetToken; + this.sheetId = sheetId; + } + + public String getRange(){ + return String.format("%s!D2:D5000",this.sheetId); + } + + public String getUrl(){ + return String.format("https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/%s/values/%s",this.spreadsheetToken,getRange()); + } +} diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java index 41079d1..492a2d8 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/domain/lark/LarkUserRequest.java @@ -19,9 +19,11 @@ public class LarkUserRequest extends LarkRequest{ private String code; //部门id private String departmentId; + public LarkUserRequest(String appId, String appSecret) { super(appId, appSecret); } + private String[] emails; public LarkUserRequest(String appId, String appSecret, String openId) { super(appId, appSecret); diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkUserActiveRelatoinService.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkUserActiveRelatoinService.java index df1709e..b2394d7 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkUserActiveRelatoinService.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/ILarkUserActiveRelatoinService.java @@ -37,6 +37,7 @@ public interface ILarkUserActiveRelatoinService { public ResponseVo queryPage(LarkActiveUserRelationRequest request); public ResponseVo commitFile(LarkActiveUserRelationRequest request); + public void syncSheet(String appId,String appSecret); public void submit(List list,String appId,String appSecret); /** diff --git a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkUserActiveRelatoinServiceImpl.java b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkUserActiveRelatoinServiceImpl.java index 6c06db1..a0aec32 100644 --- a/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkUserActiveRelatoinServiceImpl.java +++ b/ruoyi-flyingbook/src/main/java/com/ruoyi/flyingbook/service/impl/LarkUserActiveRelatoinServiceImpl.java @@ -1,20 +1,25 @@ package com.ruoyi.flyingbook.service.impl; import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; import com.lark.oapi.service.contact.v3.model.GetDepartmentRespBody; import com.lark.oapi.service.contact.v3.model.GetUserRespBody; +import com.lark.oapi.service.sheets.v3.model.QuerySpreadsheetSheetRespBody; +import com.lark.oapi.service.sheets.v3.model.Sheet; import com.ruoyi.common.enums.FlagStatus; import com.ruoyi.common.enums.LarkActiveEnum; import com.ruoyi.common.enums.LarkActiveStageEnum; import com.ruoyi.common.enums.LarkUserTypeEnum; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.flyingbook.CosHelper.CosHelper; +import com.ruoyi.flyingbook.LarkHelper.LarkTableSheetHelper; import com.ruoyi.flyingbook.LarkHelper.LarkUserHelper; import com.ruoyi.flyingbook.domain.LarkActive; import com.ruoyi.flyingbook.domain.LarkLoginLog; import com.ruoyi.flyingbook.domain.LarkUserActiveImage; import com.ruoyi.flyingbook.domain.LarkUserActiveRelatoin; import com.ruoyi.flyingbook.domain.edi.ResponseVo; +import com.ruoyi.flyingbook.domain.lark.LarkTableSheetRequest; import com.ruoyi.flyingbook.domain.lark.LarkUserRequest; import com.ruoyi.flyingbook.domain.larkactive.*; import com.ruoyi.flyingbook.mapper.LarkActiveMapper; @@ -37,6 +42,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.*; +import java.util.concurrent.CountDownLatch; import java.util.function.Function; import java.util.stream.Collectors; @@ -63,6 +69,8 @@ public class LarkUserActiveRelatoinServiceImpl implements ILarkUserActiveRelatoi private ILarkUserActiveInviteRelatoinService larkUserActiveInviteRelatoinService; @Autowired private LarkUserHelper larkUserHelper; + @Autowired + private LarkTableSheetHelper larkTableSheetHelper; private static final String BUCKET_NAME = "ruoyi-1308275795"; @@ -300,6 +308,108 @@ public class LarkUserActiveRelatoinServiceImpl implements ILarkUserActiveRelatoi return responseVo; } + @Override + public void syncSheet(String appId, String appSecret) { + Map relationMap = new HashMap<>(); + syncSheetDetail(appId,appSecret,"LDGnspdy1hYJawtjUOCcXVTZnuc",LarkActiveEnum.AI,relationMap); + syncSheetDetail(appId,appSecret,"LDGnspdy1hYJawtjUOCcXVTZnuc",LarkActiveEnum.INFORMATION_SECURITY,relationMap); + } + + private void syncSheetDetail(String appId, String appSecret, String spreadsheetToken, LarkActiveEnum active,Map relationMap){ + + try { + List larkActives = larkActiveMapper.selectLarkActiveByDesc(active.getCode(), FlagStatus.OK.getCode()); + if (CollectionUtils.isEmpty(larkActives)) { + return; + } + Long activeId = larkActives.get(0).getId(); + + LarkUserRequest larkUserRequest = new LarkUserRequest(appId, appSecret); + LarkTableSheetRequest larkTableSheetRequest = new LarkTableSheetRequest(appId, appSecret, spreadsheetToken); + QuerySpreadsheetSheetRespBody spreadsheets = larkTableSheetHelper.getSpreadsheets(larkTableSheetRequest); + Sheet[] sheets = spreadsheets.getSheets(); + if (sheets != null && sheets.length > 0){ + Sheet sheet = sheets[0]; + larkTableSheetRequest.setSheetId(sheet.getSheetId()); + List userIdList = larkTableSheetHelper.getSpreadsheetDetails(larkTableSheetRequest).stream() + .filter(r -> { + String mid = String.valueOf(r); + return !mid.equals("[null]"); + }) + .map(r -> { + return String.valueOf(r).replace("[", "").replace("]", "").replace("\"", ""); + }) + .distinct() + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(userIdList)){ + return; + } + List openIdList = new ArrayList<>(); + for (String userId : userIdList) { + try { + String midOpenId = relationMap.get(userId); + if (StringUtils.isNotBlank(midOpenId)){ + openIdList.add(midOpenId); + }else { + larkUserRequest.setOpenId(userId); + GetUserRespBody userInfoDetail = larkUserHelper.getUserInfo(larkUserRequest); + String openId = userInfoDetail.getUser().getOpenId(); + openIdList.add(openId); + relationMap.put(userId, openId); + } + if(openIdList.size() == 200){ + syncTable(openIdList,activeId); + openIdList = new ArrayList<>(); + } + } catch (Exception e) { + log.info("syncSheetDetail error userId:{}", userId, e); + } + } + if(CollectionUtils.isNotEmpty(openIdList)){ + syncTable(openIdList,activeId); + } + } + }catch (Exception e){ + log.info("syncSheetDetail error", e); + } + } + + private void syncTable(List openIdList,Long activeId){ + try { + Map relationMap = larkUserActiveRelatoinMapper.queryByOpenIdList(openIdList, activeId).stream() + .collect(Collectors.toMap(LarkUserActiveRelatoin::getUserName, Function.identity(), (k1, k2) -> k1)); + List waitUpdateList = new ArrayList<>(); + Set inviteOpenIdSet = new HashSet<>(); + for (String openId : openIdList) { + LarkUserActiveRelatoin activeRelatoin = relationMap.get(openId); + inviteOpenIdSet.add(openId); + if (activeRelatoin == null) { + LarkUserActiveRelatoin relatoin = new LarkUserActiveRelatoin(); + relatoin.setCreateTime(new Date()); + relatoin.setCreateBy("system"); + relatoin.setActiveStage(LarkActiveStageEnum.ADJUST.getCode()); + relatoin.setFlag(FlagStatus.OK.getCode()); + relatoin.setActiveId(activeId); + relatoin.setUserName(openId); + relatoin.setCompanyName("安克"); + larkUserActiveRelatoinMapper.insertLarkUserActiveRelatoin(relatoin); + } else { + if (!LarkActiveStageEnum.ADJUST.getCode().equals(activeRelatoin.getActiveStage())) { + waitUpdateList.add(activeRelatoin.getActiveId()); + } + } + } + if (CollectionUtils.isNotEmpty(inviteOpenIdSet)) { + larkUserActiveInviteRelatoinService.inviteSuccess(new ArrayList<>(inviteOpenIdSet)); + } + if (CollectionUtils.isNotEmpty(waitUpdateList)) { + larkUserActiveRelatoinMapper.updateByIdList(waitUpdateList, LarkActiveStageEnum.ADJUST.getCode()); + } + }catch (Exception e){ + log.info("syncTable error",e); + } + } + @Override public void submit(List list, String appId, String appSecret) { LarkUserRequest larkUserRequest = new LarkUserRequest(appId, appSecret); diff --git a/ruoyi-flyingbook/src/main/resources/mapper/LarkUserActiveInviteRelatoinMapper.xml b/ruoyi-flyingbook/src/main/resources/mapper/LarkUserActiveInviteRelatoinMapper.xml index 2061dee..0a6966b 100644 --- a/ruoyi-flyingbook/src/main/resources/mapper/LarkUserActiveInviteRelatoinMapper.xml +++ b/ruoyi-flyingbook/src/main/resources/mapper/LarkUserActiveInviteRelatoinMapper.xml @@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"