xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/config/ThreadPoolConfig.java
New file @@ -0,0 +1,39 @@ package com.xiaopeng.account.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; @Configuration @EnableAsync public class ThreadPoolConfig { @Bean(name = "couponSendExecutor") public ThreadPoolTaskExecutor couponSendExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心参数 executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(20); // 增大队列容量 executor.setKeepAliveSeconds(60); // 线程名称前缀 executor.setThreadNamePrefix("sendCoupon-"); // 拒绝策略:调用者线程执行 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 等待所有任务结束后再关闭线程池 executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAwaitTerminationSeconds(60); // 初始化 executor.initialize(); return executor; } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -59,19 +59,19 @@ @PostMapping("/inner/appUserCoupon/getUserCoupon") public R<UserCouponVo> getUserCoupon(@RequestBody GetUserCouponDto dto) { String phone ="18888888888"; if(dto.getUserId()>1){ UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(dto.getUserId().toString()); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } } // String phone ="18888888888"; // if(dto.getUserId()>1){ // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(dto.getUserId().toString()); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } // } UserCouponVo userCouponVo = new UserCouponVo(); // 获取用户所有优惠券 List<XpAppUserCoupon> couponList = xpAppUserCouponService.list(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getStatus, 1).eq(XpAppUserCoupon::getPhone,phone).apply("FIND_IN_SET({0}, open_city_id)", dto.getOpenCityId()) ); List<XpAppUserCoupon> couponList = xpAppUserCouponService.list(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getStatus, 1).eq(XpAppUserCoupon::getAppUserId,dto.getUserId()).apply("FIND_IN_SET({0}, open_city_id)", dto.getOpenCityId()) ); if(couponList.isEmpty()){ return R.ok(userCouponVo); } @@ -116,14 +116,14 @@ public R<XpAppUserCouponVo> list(@RequestBody XpUserCouponListQuery query, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); String phone ="18888888888"; UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } // String phone ="18888888888"; // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } XpAppUserCouponVo vo = xpAppUserCouponService.userCouponList(query, phone); XpAppUserCouponVo vo = xpAppUserCouponService.userCouponList(query, uid); return R.ok(vo); } @@ -154,14 +154,14 @@ public R<XpAppUserCouponListVo> detail(@PathVariable("couponId") Long couponId, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); String phone ="18888888888"; UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } // String phone ="18888888888"; // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } XpAppUserCoupon coupon = xpAppUserCouponService.getById(couponId); if(phone.equals(coupon.getPhone())){ if(uid.equals(coupon.getAppUserId().toString())){ XpAppUserCouponListVo vo = new XpAppUserCouponListVo(); vo.setCouponId(coupon.getId().toString()); vo.setTitle(coupon.getCouponName()); @@ -189,13 +189,13 @@ public R<XpAppUserCouponTotalVo> total(HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); String phone ="18888888888"; UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(phone); // String phone ="18888888888"; // UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); // if(baseUserByUid!=null){ // Object data = baseUserByUid.getData(); // phone = JSONObject.parseObject(data.toString()).getString("mobile"); // } XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(uid); return R.ok(vo); } @@ -206,7 +206,8 @@ @PostMapping("/api/v1/appUserCoupon/send") @ApiOperation(value = "发放优惠券", tags = {"管理后台-发放优惠券"}) public R<String> send(@RequestBody SendCouponDto dto) { return xpAppUserCouponService.send(dto); xpAppUserCouponService.send(dto); return R.ok(); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java
@@ -17,6 +17,6 @@ */ public interface XpAppUserCouponMapper extends BaseMapper<XpAppUserCoupon> { Page<XpAppUserCouponListVo> userCouponList(@Param("page") Page<XpAppUserCouponListVo> page, @Param("query") XpUserCouponListQuery query, @Param("phone") String phone); Page<XpAppUserCouponListVo> userCouponList(@Param("page") Page<XpAppUserCouponListVo> page, @Param("query") XpUserCouponListQuery query, @Param("uid") String uid); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
@@ -1,17 +1,16 @@ package com.xiaopeng.account.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.dto.SendCouponDto; import com.xiaopeng.account.model.query.XpUserCouponListQuery; import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.common.core.domain.R; import java.util.List; import java.util.concurrent.CompletableFuture; /** * <p> @@ -26,17 +25,17 @@ /** * 获取用户优惠券列表 * @param query * @param phone * @param uid * @return */ XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String phone); XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String uid); /**+ * 获取用户优惠券数量total * @param phone * @param uid * @return */ XpAppUserCouponTotalVo userCouponTotal(String phone); XpAppUserCouponTotalVo userCouponTotal(String uid); /** * 领取优惠券 @@ -56,9 +55,10 @@ /** * 发送优惠券 * * @param dto * @return */ R<String> send(SendCouponDto dto); CompletableFuture<R<String>> send(SendCouponDto dto); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -14,20 +14,22 @@ import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.account.service.IXpAppUserCouponService; import com.xiaopeng.account.util.holiday.HolidayUtil; import com.xiaopeng.api.dto.account.UserResourcesDto; import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.operation.XpCouponClient; import com.xiaopeng.api.feignClient.operation.XpWhiteListClient; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; /** * <p> @@ -49,16 +51,20 @@ @Autowired private XpWhiteListClient xpWhiteListClient; @Autowired private UserResourcesClient userResourcesClient; /** * 获取用户优惠券列表 * @param query * @param phone * @param uid * @return */ @Override public XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String phone) { public XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String uid) { Page<XpAppUserCouponListVo> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<XpAppUserCouponListVo> list = baseMapper.userCouponList(page, query, phone); Page<XpAppUserCouponListVo> list = baseMapper.userCouponList(page, query, uid); XpAppUserCouponVo vo = new XpAppUserCouponVo(); vo.setTotal((int) page.getTotal()); vo.setList(list.getRecords()); @@ -67,12 +73,12 @@ /** * 获取用户优惠券数量total * @param phone * @param uid * @return */ @Override public XpAppUserCouponTotalVo userCouponTotal(String phone) { List<XpAppUserCoupon> couponList = baseMapper.selectList(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getPhone, phone)); public XpAppUserCouponTotalVo userCouponTotal(String uid) { List<XpAppUserCoupon> couponList = baseMapper.selectList(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getAppUserId, uid)); XpAppUserCouponTotalVo vo = new XpAppUserCouponTotalVo(); vo.setAvailableNum((int) couponList.stream().filter(e -> e.getStatus() == 1).count()); vo.setUsedNum((int) couponList.stream().filter(e -> e.getStatus() == 2).count()); @@ -89,7 +95,7 @@ @Override public boolean receive(ReceiveCouponDto dto, String uid) { XpAppUserCoupon coupon = baseMapper.selectById(dto.getCouponId()); if(coupon.getAppUserId().toString().equals(uid)){ if (coupon.getAppUserId().toString().equals(uid)) { coupon.setStatus(1); return updateById(coupon); @@ -104,12 +110,12 @@ */ @Override public List<XpAppUserCoupon> timeRule(List<XpAppUserCoupon> couponList) { List<XpAppUserCoupon> xpAppUserCoupons = new ArrayList<>(); List<XpAppUserCoupon> xpAppUserCoupons = new ArrayList<>(); for (XpAppUserCoupon coupon : couponList) { String timeJson = coupon.getTimeJson(); Boolean inOperationTime = isInOperationTime(timeJson); if(inOperationTime){ if (inOperationTime) { xpAppUserCoupons.add(coupon); } } @@ -119,42 +125,49 @@ /** * 发送优惠券 * * @param dto * @return */ @Override public R<String> send(SendCouponDto dto) { @Async("couponSendExecutor") public CompletableFuture<R<String>> send(SendCouponDto dto) { R<XpCoupon> coupon = xpCouponClient.getCouponById(dto.getCouponId()); if(coupon!=null){ if (coupon != null) { XpCoupon xpCoupon = coupon.getData(); if(dto.getPhone()==null){ if (dto.getPhone() == null) { // 全部发放 R<List<String>> allWhiteList = xpWhiteListClient.getAllWhiteList(); if(allWhiteList!=null){ if (allWhiteList != null) { List<String> phoneList = allWhiteList.getData(); dto.setPhone(phoneList); } } for (String phone : dto.getPhone()) { XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon(); xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount()); xpAppUserCoupon.setMoney(xpCoupon.getAmount()); xpAppUserCoupon.setCouponId(dto.getCouponId()); UserResourcesDto userByMobile = userResourcesClient.getUserByMobile(phone); if (userByMobile != null) { Long uid = JSONObject.parseObject(userByMobile.getData().toString()).getLong("uid"); XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon(); xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount()); xpAppUserCoupon.setMoney(xpCoupon.getAmount()); xpAppUserCoupon.setCouponId(dto.getCouponId()); xpAppUserCoupon.setAppUserId(uid); xpAppUserCoupon.setExpirationTime(LocalDateTime.now().plusDays(100)); xpAppUserCoupon.setStatus(0); xpAppUserCoupon.setCouponType(xpCoupon.getCouponType()); xpAppUserCoupon.setPhone(phone); xpAppUserCoupon.setExpirationTime(LocalDateTime.now().plusDays(100)); xpAppUserCoupon.setStatus(0); xpAppUserCoupon.setCouponType(xpCoupon.getCouponType()); xpAppUserCoupon.setPhone( phone); xpAppUserCoupon.setCouponName(xpCoupon.getCouponName()); xpAppUserCoupon.setOpenCityId("0"); xpAppUserCoupon.setTimeJson("[{\"time\": [\"00:00-23:59\"], \"type\": 3, \"typeStr\": 0}]"); baseMapper.insert(xpAppUserCoupon); xpAppUserCoupon.setCouponName(xpCoupon.getCouponName()); xpAppUserCoupon.setOpenCityId("0"); xpAppUserCoupon.setTimeJson("[{\"time\": [\"00:00-23:59\"], \"type\": 3, \"typeStr\": 0}]"); baseMapper.insert(xpAppUserCoupon); } } } return null; return CompletableFuture.completedFuture(null); } @@ -167,9 +180,9 @@ JSONArray jsonArray = JSONArray.parseArray(timeJson); Integer holidayToday = holidayUtil.isHolidayToday(); for (Object o : jsonArray) { JSONObject jsonObject =JSONObject.parseObject(o.toString()); JSONObject jsonObject = JSONObject.parseObject(o.toString()); String type = jsonObject.getString("type"); if(type.equals(holidayToday.toString())){ if (type.equals(holidayToday.toString())) { JSONArray time = jsonObject.getJSONArray("time"); // 判断当前时间 是否在time时间段中 for (Object object : time) { @@ -177,17 +190,17 @@ String startTime = timeArray[0]; String endTime = timeArray[1]; boolean currentTimeInRange = DateUtils.isCurrentTimeInRange(startTime, endTime); if(currentTimeInRange){ if (currentTimeInRange) { return true; } } }else if(type.equals("3")){ } else if (type.equals("3")) { // 判断是什么类型 0每天 1-7 想起 String typeStr = jsonObject.getString("typeStr"); // 查看今天周几 Integer week = DateUtils.getWeek(); // 包含每天 或者 包含当天 if(typeStr.contains("0") || typeStr.contains(week.toString())){ if (typeStr.contains("0") || typeStr.contains(week.toString())) { JSONArray time = jsonObject.getJSONArray("time"); // 判断当前时间 是否在time时间段中 for (Object object : time) { @@ -195,7 +208,7 @@ String startTime = timeArray[0]; String endTime = timeArray[1]; boolean currentTimeInRange = DateUtils.isCurrentTimeInRange(startTime, endTime); if(currentTimeInRange){ if (currentTimeInRange) { return true; } } xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
@@ -23,7 +23,7 @@ else status end as `status` FROM xp_app_user_coupon WHERE phone = #{phone} WHERE app_user_id = #{uid} ) as t where 1=1 <if test="query.status != null">