接入微信服务号消息完成!

master
3y 3 years ago
parent 17ad0282f1
commit a66f7d6aae

@ -5,8 +5,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;
/**
*
*
@ -21,25 +19,10 @@ import java.util.Map;
@NoArgsConstructor
public class WeChatOfficialAccount {
/**
* url
*/
private String url;
/**
* appid
*/
private String miniProgramId;
/**
*
*/
private String path;
/**
*
*/
private String appId;
private String secret;
private String templateId;
}

@ -19,11 +19,26 @@ public class OfficialAccountsContentModel extends ContentModel {
/**
*
*/
Map<String, String> map;
private Map<String, String> officialAccountParam;
/**
* url
*/
String url;
private String url;
/**
* Id
*/
private String templateId;
/**
* appid
*/
private String miniProgramId;
/**
*
*/
private String path;
}

@ -1,37 +0,0 @@
package com.java3y.austin.handler.domain.wechat;
import lombok.Builder;
import lombok.Data;
import java.util.Map;
import java.util.Set;
/**
* @author sunql
* @date 20220506 9:56
*
*
*/
@Data
@Builder
public class WeChatOfficialParam {
/**
* Id
*/
private Long messageTemplateId;
/**
*
*/
private Set<String> openIds;
/**
*
*/
private Map<String, String> data;
/**
*
*/
private Integer sendAccount;
}

@ -5,16 +5,20 @@ import com.google.common.base.Throwables;
import com.java3y.austin.common.domain.TaskInfo;
import com.java3y.austin.common.dto.model.OfficialAccountsContentModel;
import com.java3y.austin.common.enums.ChannelType;
import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam;
import com.java3y.austin.handler.handler.BaseHandler;
import com.java3y.austin.handler.handler.Handler;
import com.java3y.austin.handler.wechat.OfficialAccountService;
import com.java3y.austin.support.domain.MessageTemplate;
import com.java3y.austin.support.utils.WxServiceUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author zyg
@ -24,36 +28,60 @@ import java.util.List;
@Slf4j
public class OfficialAccountHandler extends BaseHandler implements Handler {
@Autowired
private OfficialAccountService officialAccountService;
public OfficialAccountHandler() {
channelCode = ChannelType.OFFICIAL_ACCOUNT.getCode();
}
@Override
public boolean handler(TaskInfo taskInfo) {
// 构建微信模板消息
OfficialAccountsContentModel contentModel = (OfficialAccountsContentModel) taskInfo.getContentModel();
WeChatOfficialParam officialParam = WeChatOfficialParam.builder()
.openIds(taskInfo.getReceiver())
.messageTemplateId(taskInfo.getMessageTemplateId())
.sendAccount(taskInfo.getSendAccount())
.data(contentModel.getMap())
.build();
// 微信模板消息需要记录响应结果
try {
List<String> messageIds = officialAccountService.send(officialParam);
log.info("OfficialAccountHandler#handler successfully messageIds:{}", messageIds);
OfficialAccountsContentModel contentModel = (OfficialAccountsContentModel) taskInfo.getContentModel();
WxMpService wxMpService = WxServiceUtils.wxMpServiceMap.get(taskInfo.getSendAccount().longValue());
List<WxMpTemplateMessage> messages = assembleReq(taskInfo.getReceiver(), contentModel);
for (WxMpTemplateMessage message : messages) {
try {
wxMpService.getTemplateMsgService().sendTemplateMsg(message);
} catch (Exception e) {
log.info("OfficialAccountHandler#handler fail! param:{},e:{}", JSON.toJSONString(taskInfo), Throwables.getStackTraceAsString(e));
}
}
return true;
} catch (Exception e) {
log.error("OfficialAccountHandler#handler fail:{},params:{}",
Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo));
log.error("OfficialAccountHandler#handler fail:{},params:{}", Throwables.getStackTraceAsString(e), JSON.toJSONString(taskInfo));
}
return false;
}
/**
*
*/
private List<WxMpTemplateMessage> assembleReq(Set<String> receiver, OfficialAccountsContentModel contentModel) {
List<WxMpTemplateMessage> wxMpTemplateMessages = new ArrayList<>(receiver.size());
for (String openId : receiver) {
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(openId)
.templateId(contentModel.getTemplateId())
.url(contentModel.getUrl())
.data(getWxMpTemplateData(contentModel.getOfficialAccountParam()))
.miniProgram(new WxMpTemplateMessage.MiniProgram(contentModel.getMiniProgramId(), contentModel.getPath(), false))
.build();
wxMpTemplateMessages.add(templateMessage);
}
return wxMpTemplateMessages;
}
/**
*
*
* @return
*/
private List<WxMpTemplateData> getWxMpTemplateData(Map<String, String> data) {
List<WxMpTemplateData> templateDataList = new ArrayList<>(data.size());
data.forEach((k, v) -> templateDataList.add(new WxMpTemplateData(k, v)));
return templateDataList;
}
@Override
public void recall(MessageTemplate messageTemplate) {

@ -1,22 +0,0 @@
package com.java3y.austin.handler.wechat;
import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import java.util.List;
/**
* @author zyg
*/
public interface OfficialAccountService {
/**
*
*
* @param weChatOfficialParam
* @return
* @throws Exception
*/
List<String> send(WeChatOfficialParam weChatOfficialParam) throws Exception;
}

@ -1,90 +0,0 @@
package com.java3y.austin.handler.wechat.impl;
import com.java3y.austin.common.dto.account.WeChatOfficialAccount;
import com.java3y.austin.handler.domain.wechat.WeChatOfficialParam;
import com.java3y.austin.handler.wechat.OfficialAccountService;
import com.java3y.austin.support.utils.AccountUtils;
import com.java3y.austin.support.utils.WxServiceUtils;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author zyg
*/
@Service
@Slf4j
public class OfficialAccountServiceImpl implements OfficialAccountService {
@Autowired
private AccountUtils accountUtils;
@Override
public List<String> send(WeChatOfficialParam officialParam) throws Exception {
WxMpService wxMpService = WxServiceUtils.wxMpServiceMap.get(officialParam.getSendAccount());
WeChatOfficialAccount officialAccount = WxServiceUtils.accountHashMap.get(officialParam.getSendAccount());
List<WxMpTemplateMessage> messages = assembleReq(officialParam, officialAccount);
List<String> messageIds = new ArrayList<>(messages.size());
for (WxMpTemplateMessage wxMpTemplateMessage : messages) {
String msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);
messageIds.add(msgId);
}
return messageIds;
}
/**
*
*/
private List<WxMpTemplateMessage> assembleReq(WeChatOfficialParam officialParam, WeChatOfficialAccount officialAccount) {
Set<String> receiver = officialParam.getOpenIds();
List<WxMpTemplateMessage> wxMpTemplateMessages = new ArrayList<>(receiver.size());
// 构建微信模板消息
for (String openId : receiver) {
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(openId)
.templateId(officialAccount.getTemplateId())
.url(officialAccount.getUrl())
.data(getWxMpTemplateData(officialParam.getData()))
.miniProgram(new WxMpTemplateMessage.MiniProgram(officialAccount.getMiniProgramId(), officialAccount.getPath(), false))
.build();
wxMpTemplateMessages.add(templateMessage);
}
return wxMpTemplateMessages;
}
/**
*
*
* @return
*/
private List<WxMpTemplateData> getWxMpTemplateData(Map<String, String> data) {
List<WxMpTemplateData> templateDataList = new ArrayList<>(data.size());
data.forEach((k, v) -> templateDataList.add(new WxMpTemplateData(k, v)));
return templateDataList;
}
/**
*
*
* @return
*/
public WxMpService initService(WeChatOfficialAccount officialAccount) {
WxMpService wxMpService = new WxMpServiceImpl();
WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
config.setAppId(officialAccount.getAppId());
config.setSecret(officialAccount.getSecret());
wxMpService.setWxMpConfigStorage(config);
return wxMpService;
}
}

@ -16,9 +16,10 @@ import com.java3y.austin.service.api.service.RecallService;
import com.java3y.austin.service.api.service.SendService;
import com.java3y.austin.support.domain.MessageTemplate;
import com.java3y.austin.web.service.MessageTemplateService;
import com.java3y.austin.web.utils.ConvertMap;
import com.java3y.austin.web.utils.Convert4Amis;
import com.java3y.austin.web.vo.MessageTemplateParam;
import com.java3y.austin.web.vo.MessageTemplateVo;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@ -76,7 +77,7 @@ public class MessageTemplateController {
@GetMapping("/list")
@ApiOperation("/列表页")
public BasicResultVO queryList(@Validated MessageTemplateParam messageTemplateParam) {
List<Map<String, Object>> result = ConvertMap.flatList(messageTemplateService.queryList(messageTemplateParam));
List<Map<String, Object>> result = Convert4Amis.flatListMap(messageTemplateService.queryList(messageTemplateParam));
long count = messageTemplateService.count();
MessageTemplateVo messageTemplateVo = MessageTemplateVo.builder().count(count).rows(result).build();
@ -89,7 +90,7 @@ public class MessageTemplateController {
@GetMapping("query/{id}")
@ApiOperation("/根据Id查找")
public BasicResultVO queryById(@PathVariable("id") Long id) {
Map<String, Object> result = ConvertMap.flatSingle(messageTemplateService.queryById(id));
Map<String, Object> result = Convert4Amis.flatSingleMap(messageTemplateService.queryById(id));
return BasicResultVO.success(result);
}
@ -137,6 +138,21 @@ public class MessageTemplateController {
return BasicResultVO.success(response);
}
/**
* Amis
*/
@PostMapping("test/content")
@ApiOperation("/测试发送接口")
public BasicResultVO test(Long id) {
MessageTemplate messageTemplate = messageTemplateService.queryById(id);
CommonAmisVo commonAmisVo = Convert4Amis.getTestContent(messageTemplate.getMsgContent());
if (commonAmisVo != null) {
return BasicResultVO.success(commonAmisVo);
}
return BasicResultVO.success();
}
/**
*
*/

@ -1,12 +1,12 @@
package com.java3y.austin.web.controller;
import cn.hutool.core.util.StrUtil;
import com.google.common.base.Throwables;
import com.java3y.austin.common.constant.AustinConstant;
import com.java3y.austin.common.enums.RespStatusEnum;
import com.java3y.austin.common.vo.BasicResultVO;
import com.java3y.austin.support.utils.WxServiceUtils;
import com.java3y.austin.web.utils.Convert4Amis;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -71,7 +71,7 @@ public class OfficialAccountController {
try {
WxMpService wxMpService = WxServiceUtils.wxMpServiceMap.get(id);
List<WxMpTemplate> allPrivateTemplate = wxMpService.getTemplateMsgService().getAllPrivateTemplate();
CommonAmisVo wxMpTemplateParam = getWxMpTemplateParam(wxTemplateId, allPrivateTemplate);
CommonAmisVo wxMpTemplateParam = Convert4Amis.getWxMpTemplateParam(wxTemplateId, allPrivateTemplate);
return BasicResultVO.success(wxMpTemplateParam);
} catch (Exception e) {
log.error("OfficialAccountController#queryList fail:{}", Throwables.getStackTraceAsString(e));
@ -80,43 +80,5 @@ public class OfficialAccountController {
}
/**
* amis
*
* @param wxTemplateId
* @param allPrivateTemplate
* @return
*/
private CommonAmisVo getWxMpTemplateParam(String wxTemplateId, List<WxMpTemplate> allPrivateTemplate) {
CommonAmisVo officialAccountParam = null;
for (WxMpTemplate wxMpTemplate : allPrivateTemplate) {
if (wxTemplateId.equals(wxMpTemplate.getTemplateId())) {
String[] data = wxMpTemplate.getContent().split(StrUtil.LF);
officialAccountParam = CommonAmisVo.builder()
.type("input-table")
.name("officialAccountParam")
.label("新增一行,输入模板对应的文案")
.addable(true)
.editable(true)
.needConfirm(false)
.build();
List<CommonAmisVo.ColumnsDTO> columnsDTOS = new ArrayList<>();
for (String datum : data) {
String name = datum.substring(datum.indexOf("{{") + 2, datum.indexOf("."));
CommonAmisVo.ColumnsDTO.ColumnsDTOBuilder dtoBuilder = CommonAmisVo.ColumnsDTO.builder().name(name).type("input-text").required(true).quickEdit(true);
if (datum.contains("first")) {
dtoBuilder.label("名字");
} else if (datum.contains("remark")) {
dtoBuilder.label("备注");
} else {
dtoBuilder.label(datum.split("")[0]);
}
columnsDTOS.add(dtoBuilder.build());
}
officialAccountParam.setColumns(columnsDTOS);
}
}
return officialAccountParam;
}
}

@ -0,0 +1,263 @@
package com.java3y.austin.web.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.java3y.austin.web.vo.amis.CommonAmisVo;
import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* for Amis!!! amis!!
* List/Object Map
* https://baidu.gitee.io/amis/zh-CN/components/form/index#%E8%A1%A8%E5%8D%95%E9%A1%B9%E6%95%B0%E6%8D%AE%E5%88%9D%E5%A7%8B%E5%8C%96
*
* @author 3y
* @date 2022/1/23
*/
public class Convert4Amis {
// 标识忽略
public static final int ignoreTg = 0;
// 标识已读取到'$'字符
public static final int startTg = 1;
// 标识已读取到'{'字符
public static final int readTg = 2;
/**
* (json
* ()
*/
private static final List<String> FLAT_FIELD_NAME = Arrays.asList("msgContent");
/**
* jsonArray
* (JSONArray)
*/
private static final List<String> PARSE_JSON_ARRAY = Arrays.asList("feedCards", "btns");
/**
* (JSONObjectJSONArray)
*/
private static final List<String> PARSE_JSON_OBJ_TO_ARRAY = Arrays.asList("officialAccountParam");
/**
* OA
*/
private static final List<String> DING_DING_OA_FIELD = Arrays.asList("dingDingOaHead", "dingDingOaBody");
/**
* OA
*/
private static final Map<String, String> DING_DING_OA_NAME_MAPPING = new HashMap<>();
static {
DING_DING_OA_NAME_MAPPING.put("bgcolor", "dingDingOaHeadBgColor");
DING_DING_OA_NAME_MAPPING.put("text", "dingDingOaHeadTitle");
DING_DING_OA_NAME_MAPPING.put("title", "dingDingOaTitle");
DING_DING_OA_NAME_MAPPING.put("image", "media_id");
DING_DING_OA_NAME_MAPPING.put("author", "dingDingOaAuthor");
DING_DING_OA_NAME_MAPPING.put("content", "dingDingOaContent");
}
/**
* ListMap()
*
* @param param
* @return
*/
public static <T> List<Map<String, Object>> flatListMap(List<T> param) {
List<Map<String, Object>> result = new ArrayList<>();
for (T t : param) {
Map<String, Object> map = flatSingleMap(t);
result.add(map);
}
return result;
}
/**
* Map()
* <p>
* amis(amis)
*
* @param obj
* @return
*/
public static Map<String, Object> flatSingleMap(Object obj) {
Map<String, Object> result = MapUtil.newHashMap(32);
Field[] fields = ReflectUtil.getFields(obj.getClass());
for (Field field : fields) {
if (FLAT_FIELD_NAME.contains(field.getName())) {
String fieldValue = (String) ReflectUtil.getFieldValue(obj, field);
JSONObject jsonObject = JSONObject.parseObject(fieldValue);
for (String key : jsonObject.keySet()) {
/**
* OA
*/
if (DING_DING_OA_FIELD.contains(key)) {
JSONObject object = jsonObject.getJSONObject(key);
for (String objKey : object.keySet()) {
result.put(DING_DING_OA_NAME_MAPPING.get(objKey), object.getString(objKey));
}
} else if (PARSE_JSON_ARRAY.contains(key)) {
/**
* ()
*/
result.put(key, JSON.parseArray(jsonObject.getString(key)));
} else if (PARSE_JSON_OBJ_TO_ARRAY.contains(key)) {
/**
* Obj()
*/
String value = "[" + jsonObject.getString(key) + "]";
result.put(key, JSON.parseArray(value));
} else {
result.put(key, jsonObject.getString(key));
}
}
}
result.put(field.getName(), ReflectUtil.getFieldValue(obj, field));
}
return result;
}
/**
* amis
*
* @param wxTemplateId
* @param allPrivateTemplate
* @return
*/
public static CommonAmisVo getWxMpTemplateParam(String wxTemplateId, List<WxMpTemplate> allPrivateTemplate) {
CommonAmisVo officialAccountParam = null;
for (WxMpTemplate wxMpTemplate : allPrivateTemplate) {
if (wxTemplateId.equals(wxMpTemplate.getTemplateId())) {
String[] data = wxMpTemplate.getContent().split(StrUtil.LF);
officialAccountParam = CommonAmisVo.builder()
.type("input-table")
.name("officialAccountParam")
.addable(true)
.editable(true)
.needConfirm(false)
.build();
List<CommonAmisVo.ColumnsDTO> columnsDTOS = new ArrayList<>();
for (String datum : data) {
String name = datum.substring(datum.indexOf("{{") + 2, datum.indexOf("."));
CommonAmisVo.ColumnsDTO.ColumnsDTOBuilder dtoBuilder = CommonAmisVo.ColumnsDTO.builder().name(name).type("input-text").required(true).quickEdit(true);
if (datum.contains("first")) {
dtoBuilder.label("名字");
} else if (datum.contains("remark")) {
dtoBuilder.label("备注");
} else {
dtoBuilder.label(datum.split("")[0]);
}
columnsDTOS.add(dtoBuilder.build());
}
officialAccountParam.setColumns(columnsDTOS);
}
}
return officialAccountParam;
}
/**
* amis
* <p>
*
*
* @param msgContent
* @return
*/
public static CommonAmisVo getTestContent(String msgContent) {
Set<String> placeholderList = getPlaceholderList(msgContent);
if (CollUtil.isEmpty(placeholderList)) {
return null;
}
// placeholderList!=null 说明有占位符
CommonAmisVo testParam = CommonAmisVo.builder()
.type("input-table")
.name("testParam")
.addable(true)
.editable(true)
.needConfirm(false)
.build();
List<CommonAmisVo.ColumnsDTO> columnsDTOS = new ArrayList<>();
for (String param : placeholderList) {
CommonAmisVo.ColumnsDTO dto = CommonAmisVo.ColumnsDTO.builder().name(param).label(param).type("input-text").required(true).quickEdit(true).build();
columnsDTOS.add(dto);
}
testParam.setColumns(columnsDTOS);
return testParam;
}
/**
*
*
* @param content
* @return
*/
public static Set<String> getPlaceholderList(String content) {
char[] textChars = content.toCharArray();
StringBuilder textSofar = new StringBuilder();
StringBuilder sb = new StringBuilder();
// 存储占位符 位置信息集合
List<String> placeholderList = new ArrayList<>();
// 当前标识
int modeTg = ignoreTg;
for (int m = 0; m < textChars.length; m++) {
char c = textChars[m];
textSofar.append(c);
switch (c) {
case '{': {
modeTg = startTg;
sb.append(c);
}
break;
case '$': {
if (modeTg == startTg) {
sb.append(c);
modeTg = readTg;
} else {
if (modeTg == readTg) {
sb = new StringBuilder();
modeTg = ignoreTg;
}
}
}
break;
case '}': {
if (modeTg == readTg) {
modeTg = ignoreTg;
sb.append(c);
String str = sb.toString();
if (StrUtil.isNotEmpty(str)) {
placeholderList.add(str);
textSofar = new StringBuilder();
}
sb = new StringBuilder();
} else if (modeTg == startTg) {
modeTg = ignoreTg;
sb = new StringBuilder();
}
}
default: {
if (modeTg == readTg) {
sb.append(c);
} else if (modeTg == startTg) {
modeTg = ignoreTg;
sb = new StringBuilder();
}
}
}
}
Set<String> result = placeholderList.stream().map(s -> s.replaceAll("\\{", "").replaceAll("\\$", "").replaceAll("\\}", "")).collect(Collectors.toSet());
return result;
}
}

@ -1,102 +0,0 @@
package com.java3y.austin.web.utils;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ReflectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.util.*;
/**
* for Amis!!! amis!!
* List/Object Map
* https://baidu.gitee.io/amis/zh-CN/components/form/index#%E8%A1%A8%E5%8D%95%E9%A1%B9%E6%95%B0%E6%8D%AE%E5%88%9D%E5%A7%8B%E5%8C%96
*
* @author 3y
* @date 2022/1/23
*/
public class ConvertMap {
/**
* (json
* ()
*/
private static final List<String> FLAT_FIELD_NAME = Arrays.asList("msgContent");
/**
* jsonArray
* (JSONArray)
*/
private static final List<String> PARSE_JSON_ARRAY = Arrays.asList("feedCards", "btns");
/**
* OA
*/
private static final List<String> DING_DING_OA_FIELD = Arrays.asList("dingDingOaHead", "dingDingOaBody");
/**
* OA
*/
private static final Map<String, String> DING_DING_OA_NAME_MAPPING = new HashMap<>();
static {
DING_DING_OA_NAME_MAPPING.put("bgcolor", "dingDingOaHeadBgColor");
DING_DING_OA_NAME_MAPPING.put("text", "dingDingOaHeadTitle");
DING_DING_OA_NAME_MAPPING.put("title", "dingDingOaTitle");
DING_DING_OA_NAME_MAPPING.put("image", "media_id");
DING_DING_OA_NAME_MAPPING.put("author", "dingDingOaAuthor");
DING_DING_OA_NAME_MAPPING.put("content", "dingDingOaContent");
}
/**
* ListMap()
*
* @param param
* @return
*/
public static <T> List<Map<String, Object>> flatList(List<T> param) {
List<Map<String, Object>> result = new ArrayList<>();
for (T t : param) {
Map<String, Object> map = flatSingle(t);
result.add(map);
}
return result;
}
/**
* Map()
* <p>
* amis(amis)
*
* @param obj
* @return
*/
public static Map<String, Object> flatSingle(Object obj) {
Map<String, Object> result = MapUtil.newHashMap(32);
Field[] fields = ReflectUtil.getFields(obj.getClass());
for (Field field : fields) {
if (FLAT_FIELD_NAME.contains(field.getName())) {
String fieldValue = (String) ReflectUtil.getFieldValue(obj, field);
JSONObject jsonObject = JSONObject.parseObject(fieldValue);
for (String key : jsonObject.keySet()) {
/**
* OA
*/
if (DING_DING_OA_FIELD.contains(key)) {
JSONObject object = jsonObject.getJSONObject(key);
for (String objKey : object.keySet()) {
result.put(DING_DING_OA_NAME_MAPPING.get(objKey), object.getString(objKey));
}
} else if (PARSE_JSON_ARRAY.contains(key)) {
/**
* ()
*/
result.put(key, JSON.parseArray(jsonObject.getString(key)));
} else{
result.put(key, jsonObject.getString(key));
}
}
}
result.put(field.getName(), ReflectUtil.getFieldValue(obj, field));
}
return result;
}
}
Loading…
Cancel
Save