优惠券+异常全局处理

This commit is contained in:
19991905653
2024-04-10 18:16:28 +08:00
parent 342d0d82e1
commit 3a90299b64
43 changed files with 1374 additions and 579 deletions

View File

@@ -1,17 +1,38 @@
package com.chaozhanggui.system.cashierservice.task;
import com.chaozhanggui.system.cashierservice.dao.TbOrderInfoMapper;
import com.chaozhanggui.system.cashierservice.dao.TbUserInfoMapper;
import com.chaozhanggui.system.cashierservice.dao.TbWiningParamsMapper;
import com.chaozhanggui.system.cashierservice.dao.TbWiningUserMapper;
import com.chaozhanggui.system.cashierservice.entity.TbOrderInfo;
import com.chaozhanggui.system.cashierservice.entity.TbUserInfo;
import com.chaozhanggui.system.cashierservice.entity.TbWiningParams;
import com.chaozhanggui.system.cashierservice.entity.TbWiningUser;
import com.chaozhanggui.system.cashierservice.util.DateUtils;
import com.chaozhanggui.system.cashierservice.util.NicknameGenerator;
import com.chaozhanggui.system.cashierservice.util.RandomUtil;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException;
import java.util.*;
import java.util.concurrent.*;
@Component
public class TaskScheduler {
@Autowired
private TbWiningUserMapper tbWiningUserMapper;
@Autowired
private TbOrderInfoMapper orderInfoMapper;
@Autowired
private TbWiningParamsMapper winingParamsMapper;
@Autowired
private TbUserInfoMapper userInfoMapper;
//更新订单状态
// @Scheduled(fixedRate = 1000, initialDelay = 5000)
public void orderStatus() throws InterruptedException {
@@ -20,9 +41,81 @@ public class TaskScheduler {
}
// @Scheduled(fixedRate = 1000)
public void winningUser(){
System.out.println("恭喜您中奖了"+DateUtils.getTime());
public void winningUser() {
String day = DateUtils.getDay();
List<TbWiningParams> list = winingParamsMapper.selectAll();
ThreadPoolExecutor es = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
for (TbWiningParams winingParams : list) {
es.submit(new winingUser(winingParams, day));
}
es.shutdown();
}
class winingUser implements Runnable {
private TbWiningParams winingParams;
private String day;
public winingUser(TbWiningParams winingParams, String day) {
this.winingParams = winingParams;
this.day = day;
}
@Override
public void run() {
try {
List<TbOrderInfo> list = orderInfoMapper.selectByTradeDay(day, winingParams.getMinPrice(), winingParams.getMaxPrice());
int num = winingParams.getWiningUserNum();
List<TbOrderInfo> newList = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
int noUserNum = winingParams.getWiningNum() - num;
if (list.size() < num) {
noUserNum = winingParams.getWiningNum();
} else {
for (int i = 0; i < num; i++) {
TbOrderInfo orderInfo = RandomUtil.selectWinner(list, map);
newList.add(orderInfo);
map.put(orderInfo.getId(), 1);
}
}
for (int i = 0; i < noUserNum; i++) {
long endDate = DateUtils.convertDate1(day + " 00:00:00").getTime();
long startDate = DateUtils.convertDate1(DateUtils.getTimes(DateUtils.getNewDate(new Date(), 3, -1)) + " 00:00:00").getTime();
String orderNo = generateOrderNumber(startDate, endDate);
String userName = NicknameGenerator.generateRandomWeChatNickname();
BigDecimal orderAmount = RandomUtil.getRandomBigDecimal(winingParams.getMinPrice(), winingParams.getMaxPrice());
TbWiningUser winingUser = new TbWiningUser(userName, orderNo, orderAmount, "false", day);
tbWiningUserMapper.insert(winingUser);
}
for (TbOrderInfo orderInfo:newList){
TbUserInfo userInfo = userInfoMapper.selectByPrimaryKey(Integer.valueOf(orderInfo.getUserId()));
TbWiningUser winingUser = new TbWiningUser(userInfo.getNickName(), orderInfo.getOrderNo(), orderInfo.getPayAmount(), "true", day);
tbWiningUserMapper.insert(winingUser);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
public String generateOrderNumber(long startTimestamp, long endTimestamp) {
long date = getRandomTimestamp(startTimestamp, endTimestamp);
Random random = new Random();
int randomNum = random.nextInt(900) + 100;
return "WX" + date + randomNum;
}
public static long getRandomTimestamp(long startTimestamp, long endTimestamp) {
long randomMilliseconds = ThreadLocalRandom.current().nextLong(startTimestamp, endTimestamp);
return randomMilliseconds;
}
}