抢红包的功能
定时任务调度-->获取斥候-->探查是否有红包-->获取所有用户-->开始抢红包-->发送谢谢
|
|-->钉钉发送消息告知抢到了多少红包
User
AutherHeader
ID
packetCount
name
Group
groupName
groupID
RedpacketJob
UserMapper
RedpacketExplore
redpacketID explorePacket(User user,Group group)
DingDingSender
boolean SendMessage(String message)
RedpacketGrap
// 所有用户去同一个群组里面抢红包,返回抢到红包的用户
List<user> grapRedpacket(List<User> users,Group group,String redpacketID)
ThanksSender
String randomThanks()
boolean sendThanks(User user,Group group)
伪代码:
class RedpacketJob {
@Autowired
UserMapper userMapper;
@Autowired
GroupMapper groupMapper;
@Autowired
RedpacketExplore redpacketExplore
@Autowired
RedpacketGrap redpacketGrap;
@Autowired
ThanksSender thanksSender;
@Autowired
ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
ThreadPoolTaskExecutor dingdingtaskExecutor;
public void job() {
// 首先获取到群的信息
List<Group> groups = groupMapper.selectAllGroup();
// 获取到对应数量的随机斥候
List<User> users = userMapper.selectRandomUser(groups.size());
// 所有的用户
List<User> allUsers = userMapp.selectAllUsers();
for(int i = 0; i < groups.size(); i++ ) {
threadPoolTaskExecutor.execute(
(group user) -> {
// 进行探查
RedpacketId redpacketId = redpacketExplore.explorePacket(user,group);
if(StingUtils.isNotEmpty(redpacketID)) {
// 抢红包
List<User> users = redpacketGrap.grapRedpacket(allUsers,groups,redpacketID)
// 发送谢谢
for(User users: bingoUser) {
thanksSender.sendThanks(bingoUser,group,thanksSender.randomThanks())
// 异步通知管理员
dingdingtaskExecutor.SendMessage(user.getName + "在" + group.getGroupName +
"群抢到了"+user.getPacketCount()+"红包");
}
}
}
);
}
}
}
单一职责: 每个模块抽象成单独的类
开闭原则: 抽象出接口,探查器,抢红包器
里式替换: 子类不会比父类更加复杂,并且不会违背父类的初衷
接口隔离: 对接口做拆分
依赖倒置: 顶层类注入探查红包和抢红包的
高内聚低耦合:
获取用户可以抽象出一个模块
控制反转
网友评论