简历中场景

场景一

消息的发送、接收。
利用rabbitmq的单通道模式,实现专家端发送消息,老师端监听消息

 流程:

  1. subject-accept-server中producer消息
  2. mq-message中consumer监听消息,并保存在数据库中
  3. 调用mq-message中接口查询在数据库中的消息


需求:增加应用标识字段,vo类中对应字段上加@NotBlank即可

实现思路:

  1. producer者调用sendmessage()发送消息。
  2. mq项目监听对应消息,保存在数据库中。
  3. 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 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 saveResult = saveMessageNotified(notifiedPoList);
        if (CollectionUtil.isEmpty(saveResult)) {
            return false;
        }
        return true;
    }

场景二

统计,根据当天、本周、本月、本年统计出对应的结果

xml文件

第一种    


    

    

    




第二种
    
    

    
    

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 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);
    }

你可能感兴趣的:(ruby,sql,数据库)