场景一
消息的发送、接收。
利用rabbitmq的单通道模式,实现专家端发送消息,老师端监听消息
流程:
- subject-accept-server中producer消息
- mq-message中consumer监听消息,并保存在数据库中
- 调用mq-message中接口查询在数据库中的消息
需求:增加应用标识字段,vo类中对应字段上加@NotBlank即可
实现思路:
- producer者调用sendmessage()发送消息。
- mq项目监听对应消息,保存在数据库中。
- consumer者,从数据库中拿到消息
//监听QUEUES_MESSAGE队列
@Component
@RabbitListener(queues = RabbitConfig.QUEUES_MESSAGE)
@Slf4j
public class MessageConsumer {
@Autowired
private IMessageService messageService;
@RabbitHandler
public void received(String jsonMsg) {
try {
log.info("received message instart ",jsonMsg);
MessageAmqp messageAmqp = JSON.parseObject(jsonMsg, MessageAmqp.class);
Boolean success = messageService.addMessage(messageAmqp);
if(success){
log.info("received message success, message:{}",jsonMsg);
}
} catch (Exception e) {
log.error("message received error! msg:{}", e.getMessage());
}
}
}
//保存消息
@Override
public Boolean addMessage(MessageAmqp messageAmqp) {
MessageInfoPo messageInfoPo = new MessageInfoPo();
// 从MessageAmqp中的MessageInfo对象复制所有属性到新创建的MessageInfoPo对象
BeanUtil.copyProperties(messageAmqp.getMessageInfo(), messageInfoPo);
try {
// 将消息时间从字符串转换为日期的对象,使用指定日期格式。
messageInfoPo.setMessageTime(DateUtils.parse(messageAmqp.getMessageInfo().getMessageTime(),DateUtils.YMD_DASH_WITH_TIME));
// 确保消息类型是一个有效的枚举值。如果不是,将抛出ParseException。
MessageTypeEnum.valueOf(messageAmqp.getMessageInfo().getType());
} catch (ParseException ex) {
log.warn("illegal 'type' value!!! please define enum in 'MessageTypeEnum'!");
}
// 将消息信息保存到数据库。如果保存失败,saveMessageInfo将为null
log.info(messageInfoPo.toString());
MessageInfoPo saveMessageInfo = saveMessageInfo(messageInfoPo);
if (null == saveMessageInfo) {
return false;
}
// 创建一个新的列表来存储MessageNotifiedPo对象。这些对象代表关于消息的通知。
Collection<MessageNotifiedPo> notifiedPoList = new ArrayList<>();
// 对于MessageAmqp对象中接收者列表的每个接收者...
messageAmqp.getReceiverList().forEach(e -> {
MessageNotifiedPo notifiedPo = new MessageNotifiedPo();
// 将消息ID设置为保存的消息的ID
notifiedPo.setMessageId(messageInfoPo.getId());
notifiedPo.setUserId(e.getUserId());
notifiedPo.setPhone(e.getPhone());
notifiedPo.setPushEnable(e.getPushEnable());
notifiedPo.setSmsEnable(e.getSmsEnable());
notifiedPoList.add(notifiedPo);
});
Collection<MessageNotifiedPo> saveResult = saveMessageNotified(notifiedPoList);
if (CollectionUtil.isEmpty(saveResult)) {
return false;
}
return true;
}
场景二
统计,根据当天、本周、本月、本年统计出对应的结果
xml文件
第一种
<select id="today" resultType="com.lpk.common.response.statisticsresponse.NewMembershipStatisticsResponse">
SELECT DATE(create_time) AS format, COUNT(*) AS newMemberNumber
FROM eb_user
WHERE user_type = 'routine' AND DATE(create_time) = CURDATE()
GROUP BY DATE(create_time);
</select>
<select id="thisWeek" resultType="com.lpk.common.response.statisticsresponse.NewMembershipStatisticsResponse">
SELECT DATE(create_time) AS format, COUNT(*) AS newMemberNumber
FROM eb_user
WHERE user_type = 'routine' AND YEARWEEK(create_time) = YEARWEEK(CURDATE())
GROUP BY DATE(create_time)
ORDER BY DATE(create_time);
</select>
<select id="thisMonth" resultType="com.lpk.common.response.statisticsresponse.NewMembershipStatisticsResponse">
SELECT DATE(create_time) AS format, COUNT(*) AS newMemberNumber
FROM eb_user
WHERE user_type = 'routine' AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
GROUP BY DATE(create_time)
ORDER BY DATE(create_time);
</select>
<select id="getNewMembersCountByDateRange" resultType="com.lpk.common.response.statisticsresponse.NewMembershipStatisticsResponse">
SELECT DATE(create_time) AS format, COUNT(*) AS newMemberNumber
FROM eb_user
WHERE user_type = 'routine'
AND create_time >= #{startDate}
AND create_time <= #{endDate}
GROUP BY format
ORDER BY format ASC;
</select>
第二种
<!-- 获取指定日期范围内的活跃会员数 -->
<select id="getCustomDateRangeActivity" parameterType="java.util.Map" resultType="com.lpk.common.response.statisticsresponse.ActivityRecord">
SELECT date, COUNT(DISTINCT uid) AS active_members
FROM eb_user_visit_record
WHERE visit_type = 1
AND date BETWEEN #{startDate} AND #{endDate}
GROUP BY date
</select>
<!-- 获取预设时间范围内的活跃会员数 -->
<select id="getPresetTimeRangeActivity" parameterType="java.util.Map" resultType="com.lpk.common.response.statisticsresponse.ActivityRecord">
SELECT date, COUNT(DISTINCT uid) AS active_members
FROM eb_user_visit_record
WHERE visit_type = 1
AND date >=
<choose>
<when test="timeRangeType == 'today'">
CURDATE()
</when>
<when test="timeRangeType == 'thisWeek'">
DATE_SUB(CURDATE(), INTERVAL DAYOFWEEK(CURDATE()) - 1 DAY)
</when>
<when test="timeRangeType == 'thisMonth'">
DATE_FORMAT(CURDATE(), '%Y-%m-01')
</when>
</choose>
GROUP BY date
</select>
service层
// 新会员统计,SQL是写了不同的select
if (request.getAddMember() != null) {
switch (request.getAddMember().getAddFlag()) {
case 0:
response.setNewAddMember(today());
break;
case 1:
response.setNewAddMember(thisWeek());
break;
case 2:
response.setNewAddMember(thisMonth());
break;
default:
Date start = request.getAddMember().getAddStartDate();
Date end = request.getAddMember().getAddEndDate();
response.setGetCustomDateRangeActivity(getCustomDateRangeActivity(start, end));
}
}
// 活动会员统计,SQL是写在一个select中,用choose区分开的
if (request.getActivityMember() != null) {
String timeRangeType = "";
switch (request.getActivityMember().getActivityFlag()) {
case 0:
response.setTimeRangActivity(getPresetTimeRangeActivity("today"));
break;
case 1:
response.setTimeRangActivity(getPresetTimeRangeActivity("thisWeek"));
break;
case 2:
response.setTimeRangActivity(getPresetTimeRangeActivity("thisMonth"));
break;
default:
Date start = request.getActivityMember().getActivityStartDate();
Date end = request.getActivityMember().getActivityEndDate();
response.setTimeRangActivity(getCustomDateRangeActivity(start, end));
}
}
第三种
public List<StaffAttendanceResponse> getVacationDaysByType(String type) {
Calendar cal = Calendar.getInstance();
switch (type) {
case "WEEK":
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
Date weekStart = cal.getTime();
cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Date weekEnd = cal.getTime();
return statisticsStaffDao.getVacationDaysByCustomDateRange(weekStart, weekEnd);
case "MONTH":
cal.set(Calendar.DAY_OF_MONTH, 1);
Date monthStart = cal.getTime();
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
Date monthEnd = cal.getTime();
return statisticsStaffDao.getVacationDaysByCustomDateRange(monthStart, monthEnd);
case "YEAR":
cal.set(Calendar.DAY_OF_YEAR, 1);
Date yearStart = cal.getTime();
cal.set(Calendar.DAY_OF_YEAR, cal.getActualMaximum(Calendar.DAY_OF_YEAR));
Date yearEnd = cal.getTime();
return statisticsStaffDao.getVacationDaysByCustomDateRange(yearStart, yearEnd);
default:
throw new IllegalArgumentException("请输入正确的参数: " + type + "WEEK, MONTH, YEAR.");
}
}
第三种
public int countActivitiesByDateRange(String type) {
LocalDateTime startDate, endDate;
switch (type) {
case "TODAY":
startDate = LocalDate.now().atStartOfDay();
endDate = LocalDate.now().atTime(23, 59, 59);
break;
case "WEEK":
startDate = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)).atStartOfDay();
endDate = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)).atTime(23, 59, 59);
break;
case "MONTH":
startDate = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay();
endDate = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(23, 59, 59);
break;
default:
throw new IllegalArgumentException("Invalid type: " + type + ". Expected values: TODAY, WEEK, MONTH.");
}
return userActivityMapper.countActivitiesByDateRange(startDate, endDate);
}