Commit 858108fe4d35051e979febf1a37ca00a609a92b1
1 parent
088fb44d
优化发送接口并新增批量发送接口
Showing
6 changed files
with
208 additions
and
33 deletions
README.md
... | ... | @@ -13,17 +13,17 @@ |
13 | 13 | ## 2. 接口 |
14 | 14 | |
15 | 15 | ### 发送模板消息 |
16 | -`IMessageCenterService#send` | |
16 | +`IMessageCenterService#send` 单条 | |
17 | +`IMessageCenterService#sendBatch` 批量 。批量的情况参数为List, 返回值也为List | |
17 | 18 | |
18 | 19 | **参数** |
19 | 20 | |
20 | 21 | |参数名|必须|类型|说明| |
21 | 22 | |----|:----:|:----:|:----| |
22 | -|memberIdSet|是 | Set<Long>| 会员id集合| | |
23 | +|memberId|是 | Long| 会员id| | |
23 | 24 | |title| 是 | String| 标题| |
24 | 25 | |content|是|String|内容| |
25 | -|changeType| 是 | String| 变更类型| | |
26 | -|changeResult| 是 | String| 变更结果。| | |
26 | +|extraMap| 否 | HashMap<String,String>| 额外附带数据| | |
27 | 27 | |remark| 否 | String| 备注。| |
28 | 28 | |path| 否 | String| 小程序页面路径。| |
29 | 29 | |paramMap| 否 | HashMap<String,String>| 跳转小程序所携带的参数。| | ... | ... |
fw-hestia-sdk/src/main/java/cn/fw/hestia/sdk/api/IMessageCenterService.java
... | ... | @@ -2,6 +2,7 @@ package cn.fw.hestia.sdk.api; |
2 | 2 | |
3 | 3 | import cn.fw.data.base.domain.common.Message; |
4 | 4 | import cn.fw.hestia.sdk.params.TemplateMessageParam; |
5 | +import cn.fw.hestia.sdk.params.ValidList; | |
5 | 6 | import cn.fw.hestia.sdk.result.SendResult; |
6 | 7 | import org.springframework.cloud.openfeign.FeignClient; |
7 | 8 | import org.springframework.web.bind.annotation.DeleteMapping; |
... | ... | @@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.PostMapping; |
9 | 10 | import org.springframework.web.bind.annotation.RequestBody; |
10 | 11 | |
11 | 12 | import javax.validation.Valid; |
13 | +import javax.validation.constraints.NotEmpty; | |
12 | 14 | import javax.validation.constraints.NotNull; |
13 | 15 | import java.util.List; |
14 | 16 | |
... | ... | @@ -28,7 +30,16 @@ public interface IMessageCenterService { |
28 | 30 | * @return |
29 | 31 | */ |
30 | 32 | @PostMapping("/send") |
31 | - Message<List<SendResult>> send(@Valid @RequestBody TemplateMessageParam templateMessageParam); | |
33 | + Message<SendResult> send(@Valid @RequestBody TemplateMessageParam templateMessageParam); | |
34 | + | |
35 | + /** | |
36 | + * 批量发送模板消息 | |
37 | + * | |
38 | + * @param paramList | |
39 | + * @return | |
40 | + */ | |
41 | + @PostMapping("/sendBatch") | |
42 | + Message<List<SendResult>> sendBatch(@RequestBody @NotEmpty(message = "消息列表不能为空") @Valid ValidList<TemplateMessageParam> paramList); | |
32 | 43 | |
33 | 44 | /** |
34 | 45 | * 撤回消息 | ... | ... |
fw-hestia-sdk/src/main/java/cn/fw/hestia/sdk/params/TemplateMessageParam.java
... | ... | @@ -7,7 +7,6 @@ import javax.validation.constraints.NotBlank; |
7 | 7 | import javax.validation.constraints.NotNull; |
8 | 8 | import javax.validation.constraints.Size; |
9 | 9 | import java.util.Map; |
10 | -import java.util.Set; | |
11 | 10 | |
12 | 11 | /** |
13 | 12 | * 模板消息param |
... | ... | @@ -27,8 +26,8 @@ public class TemplateMessageParam { |
27 | 26 | /** |
28 | 27 | * 会员id |
29 | 28 | */ |
30 | - @Size(min = 1, message = "会员id不能为空") | |
31 | - private Set<Long> memberIdSet; | |
29 | + @NotNull(message = "会员id不能为空") | |
30 | + private Long memberId; | |
32 | 31 | /** |
33 | 32 | * 标题 小程序展示用 |
34 | 33 | * maxLength 32 |
... | ... | @@ -42,19 +41,13 @@ public class TemplateMessageParam { |
42 | 41 | @NotBlank(message = "消息内容不能为空") |
43 | 42 | private String content; |
44 | 43 | /** |
45 | - * 备注 | |
46 | - */ | |
47 | - private String remark; | |
48 | - /** | |
49 | - * 变更类型 | |
44 | + * 额外展示内容 | |
50 | 45 | */ |
51 | - @NotBlank(message = "变更类型不能为空") | |
52 | - private String changeType; | |
46 | + private Map<String, String> extraMap; | |
53 | 47 | /** |
54 | - * 变更结果 | |
48 | + * 备注 | |
55 | 49 | */ |
56 | - @NotBlank(message = "变更结果不能为空") | |
57 | - private String changeResult; | |
50 | + private String remark; | |
58 | 51 | /** |
59 | 52 | * 如需跳转小程序,则是小程序页面路径 |
60 | 53 | */ | ... | ... |
fw-hestia-sdk/src/main/java/cn/fw/hestia/sdk/params/ValidList.java
0 → 100644
1 | +package cn.fw.hestia.sdk.params; | |
2 | + | |
3 | +import javax.validation.Valid; | |
4 | +import java.util.*; | |
5 | + | |
6 | +public class ValidList<E> implements List<E> { | |
7 | + | |
8 | + @Valid | |
9 | + private List<E> list; | |
10 | + | |
11 | + public ValidList() { | |
12 | + this.list = new ArrayList<>(); | |
13 | + } | |
14 | + | |
15 | + public ValidList(List<E> list) { | |
16 | + this.list = list; | |
17 | + } | |
18 | + | |
19 | + public List<E> getList() { | |
20 | + return list; | |
21 | + } | |
22 | + | |
23 | + public void setList(List<E> list) { | |
24 | + this.list = list; | |
25 | + } | |
26 | + | |
27 | + //重写List方法,可省略 | |
28 | + @Override | |
29 | + public int size() { | |
30 | + return list.size(); | |
31 | + } | |
32 | + | |
33 | + @Override | |
34 | + public boolean isEmpty() { | |
35 | + return list.isEmpty(); | |
36 | + } | |
37 | + | |
38 | + @Override | |
39 | + public boolean contains(Object o) { | |
40 | + return list.contains(o); | |
41 | + } | |
42 | + | |
43 | + @Override | |
44 | + public Iterator<E> iterator() { | |
45 | + return list.iterator(); | |
46 | + } | |
47 | + | |
48 | + @Override | |
49 | + public Object[] toArray() { | |
50 | + return list.toArray(); | |
51 | + } | |
52 | + | |
53 | + @Override | |
54 | + public <T> T[] toArray(T[] a) { | |
55 | + return list.toArray(a); | |
56 | + } | |
57 | + | |
58 | + @Override | |
59 | + public boolean add(E e) { | |
60 | + return list.add(e); | |
61 | + } | |
62 | + | |
63 | + @Override | |
64 | + public boolean remove(Object o) { | |
65 | + return list.remove(o); | |
66 | + } | |
67 | + | |
68 | + @Override | |
69 | + public boolean containsAll(Collection<?> c) { | |
70 | + return list.contains(c); | |
71 | + } | |
72 | + | |
73 | + @Override | |
74 | + public boolean addAll(Collection<? extends E> c) { | |
75 | + return list.addAll(c); | |
76 | + } | |
77 | + | |
78 | + @Override | |
79 | + public boolean addAll(int index, Collection<? extends E> c) { | |
80 | + return list.addAll(index, c); | |
81 | + } | |
82 | + | |
83 | + @Override | |
84 | + public boolean removeAll(Collection<?> c) { | |
85 | + return list.removeAll(c); | |
86 | + } | |
87 | + | |
88 | + @Override | |
89 | + public boolean retainAll(Collection<?> c) { | |
90 | + return list.retainAll(c); | |
91 | + } | |
92 | + | |
93 | + @Override | |
94 | + public void clear() { | |
95 | + list.clear(); | |
96 | + } | |
97 | + | |
98 | + @Override | |
99 | + public E get(int index) { | |
100 | + return list.get(index); | |
101 | + } | |
102 | + | |
103 | + @Override | |
104 | + public E set(int index, E element) { | |
105 | + return list.set(index, element); | |
106 | + } | |
107 | + | |
108 | + @Override | |
109 | + public void add(int index, E element) { | |
110 | + list.add(index, element); | |
111 | + } | |
112 | + | |
113 | + @Override | |
114 | + public E remove(int index) { | |
115 | + return list.remove(index); | |
116 | + } | |
117 | + | |
118 | + @Override | |
119 | + public int indexOf(Object o) { | |
120 | + return list.indexOf(o); | |
121 | + } | |
122 | + | |
123 | + @Override | |
124 | + public int lastIndexOf(Object o) { | |
125 | + return list.lastIndexOf(o); | |
126 | + } | |
127 | + | |
128 | + @Override | |
129 | + public ListIterator<E> listIterator() { | |
130 | + return list.listIterator(); | |
131 | + } | |
132 | + | |
133 | + @Override | |
134 | + public ListIterator<E> listIterator(int index) { | |
135 | + return list.listIterator(index); | |
136 | + } | |
137 | + | |
138 | + @Override | |
139 | + public List<E> subList(int fromIndex, int toIndex) { | |
140 | + return list.subList(fromIndex, toIndex); | |
141 | + } | |
142 | +} | |
0 | 143 | \ No newline at end of file | ... | ... |
fw-hestia-server/src/main/java/cn/fw/hestia/server/controller/api/MessageCenterServiceImpl.java
... | ... | @@ -4,6 +4,7 @@ import cn.fw.common.web.annotation.ControllerMethod; |
4 | 4 | import cn.fw.data.base.domain.common.Message; |
5 | 5 | import cn.fw.hestia.sdk.api.IMessageCenterService; |
6 | 6 | import cn.fw.hestia.sdk.params.TemplateMessageParam; |
7 | +import cn.fw.hestia.sdk.params.ValidList; | |
7 | 8 | import cn.fw.hestia.sdk.result.SendResult; |
8 | 9 | import cn.fw.hestia.service.buz.MessageCenterBizService; |
9 | 10 | import lombok.extern.slf4j.Slf4j; |
... | ... | @@ -12,9 +13,9 @@ import org.springframework.web.bind.annotation.*; |
12 | 13 | |
13 | 14 | import javax.validation.Valid; |
14 | 15 | import javax.validation.constraints.NotNull; |
15 | - | |
16 | 16 | import java.util.List; |
17 | 17 | |
18 | +import static cn.fw.common.businessvalidator.Validator.BV; | |
18 | 19 | import static cn.fw.common.web.util.ResultBuilder.success; |
19 | 20 | |
20 | 21 | /** |
... | ... | @@ -37,10 +38,18 @@ public class MessageCenterServiceImpl implements IMessageCenterService { |
37 | 38 | @PostMapping("/send") |
38 | 39 | @Override |
39 | 40 | @ControllerMethod("发送模板消息") |
40 | - public Message<List<SendResult>> send(@Valid @RequestBody TemplateMessageParam templateMessageParam) { | |
41 | + public Message<SendResult> send(@Valid @RequestBody TemplateMessageParam templateMessageParam) { | |
41 | 42 | return success(messageCenterBizService.saveMessage(templateMessageParam)); |
42 | 43 | } |
43 | 44 | |
45 | + @PostMapping("/sendBatch") | |
46 | + @Override | |
47 | + @ControllerMethod("批量发送模板消息") | |
48 | + public Message<List<SendResult>> sendBatch(@RequestBody @Valid ValidList<TemplateMessageParam> paramList) { | |
49 | + BV.isNotEmpty(paramList, () -> "消息列表不能为空"); | |
50 | + return success(messageCenterBizService.saveBatchMessage(paramList)); | |
51 | + } | |
52 | + | |
44 | 53 | @Override |
45 | 54 | @DeleteMapping("/revoke") |
46 | 55 | @ControllerMethod("撤回消息") | ... | ... |
fw-hestia-service/src/main/java/cn/fw/hestia/service/buz/MessageCenterBizService.java
... | ... | @@ -64,8 +64,21 @@ public class MessageCenterBizService { |
64 | 64 | * @return token |
65 | 65 | */ |
66 | 66 | @Transactional(rollbackFor = Exception.class) |
67 | - public List<SendResult> saveMessage(TemplateMessageParam templateMessageParam) { | |
68 | - List<MessageHistory> messageHistory = createBeans(templateMessageParam); | |
67 | + public SendResult saveMessage(TemplateMessageParam templateMessageParam) { | |
68 | + MessageHistory messageHistory = createBeans(templateMessageParam); | |
69 | + messageHistoryService.save(messageHistory); | |
70 | + return new SendResult(messageHistory.getId(), messageHistory.getMemberId()); | |
71 | + } | |
72 | + | |
73 | + /** | |
74 | + * 批量发送 | |
75 | + * | |
76 | + * @param paramList | |
77 | + * @return token | |
78 | + */ | |
79 | + @Transactional(rollbackFor = Exception.class) | |
80 | + public List<SendResult> saveBatchMessage(List<TemplateMessageParam> paramList) { | |
81 | + List<MessageHistory> messageHistory = createBeans(paramList); | |
69 | 82 | messageHistoryService.saveBatch(messageHistory); |
70 | 83 | List<SendResult> list = new ArrayList<>(); |
71 | 84 | for (MessageHistory history : messageHistory) { |
... | ... | @@ -228,23 +241,30 @@ public class MessageCenterBizService { |
228 | 241 | return result; |
229 | 242 | } |
230 | 243 | |
231 | - private List<MessageHistory> createBeans(TemplateMessageParam param) { | |
244 | + private List<MessageHistory> createBeans(List<TemplateMessageParam> paramList) { | |
232 | 245 | List<MessageHistory> list = new ArrayList<>(); |
233 | - Set<Long> idSet = param.getMemberIdSet(); | |
234 | - BV.isNotEmpty(idSet, () -> "发送的目标用户不能为空"); | |
235 | - for (Long memberId : idSet) { | |
236 | - createBeans(param, memberId); | |
237 | - list.add(createBeans(param, memberId)); | |
246 | + for (TemplateMessageParam param : paramList) { | |
247 | + list.add(createBeans(param)); | |
238 | 248 | } |
239 | 249 | return list; |
240 | 250 | } |
241 | 251 | |
242 | - private MessageHistory createBeans(TemplateMessageParam param, Long memberId) { | |
252 | + private MessageHistory createBeans(TemplateMessageParam param) { | |
243 | 253 | MessageHistory messageHistory = new MessageHistory(); |
244 | - messageHistory.setMemberId(memberId); | |
254 | + messageHistory.setMemberId(param.getMemberId()); | |
245 | 255 | messageHistory.setTemplateCode(getTemplateCode()); |
246 | 256 | messageHistory.setTitle(param.getTitle()); |
247 | - messageHistory.setContent(param.getContent()); | |
257 | + StringBuilder content = new StringBuilder(param.getContent()); | |
258 | + if (!CollectionUtils.isEmpty(param.getExtraMap())) { | |
259 | + content.append("\n"); | |
260 | + for (Map.Entry<String, String> mapEntry : param.getExtraMap().entrySet()) { | |
261 | + content.append("\n") | |
262 | + .append(mapEntry.getKey()) | |
263 | + .append(":") | |
264 | + .append(mapEntry.getValue()); | |
265 | + } | |
266 | + } | |
267 | + messageHistory.setContent(content.toString()); | |
248 | 268 | messageHistory.setRemark(param.getRemark()); |
249 | 269 | messageHistory.setPagePath(param.getPath()); |
250 | 270 | messageHistory.setReadz(Boolean.FALSE); |
... | ... | @@ -253,8 +273,8 @@ public class MessageCenterBizService { |
253 | 273 | messageHistory.setSendTime(new Date()); |
254 | 274 | messageHistory.setState(MessageStateEnum.MADA); |
255 | 275 | List<WxMpTempMessageData> keywords = Arrays.asList( |
256 | - new WxMpTempMessageData(param.getChangeType()), | |
257 | - new WxMpTempMessageData(param.getChangeResult()) | |
276 | + new WxMpTempMessageData(param.getTitle()), | |
277 | + new WxMpTempMessageData("无") | |
258 | 278 | ); |
259 | 279 | messageHistory.setKeywords(JSONArray.toJSONString(keywords)); |
260 | 280 | if (!CollectionUtils.isEmpty(param.getParamMap())) { | ... | ... |