xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.dto.SendCouponDto; import com.xiaopeng.account.model.query.XpUserCouponListQuery; @@ -11,6 +12,8 @@ import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.account.service.IXpAppUserCouponService; import com.xiaopeng.account.vo.CouponReceiptRecordDto; import com.xiaopeng.account.vo.CouponReceiptRecordVo; import com.xiaopeng.account.vo.UserCouponListVo; import com.xiaopeng.api.dto.account.GetUserCouponDto; import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest; @@ -372,4 +375,20 @@ .eq("activity_id", activityId).eq("is_deleted", 0)); return R.ok(list); } @GetMapping("/api/v1/activity/getCouponReceiptRecord") @ApiOperation(value = "获取活动领取记录", tags = {"管理后台-活动管理"}) public R<PageInfo<CouponReceiptRecordDto>> getCouponReceiptRecord(@RequestBody CouponReceiptRecordVo vo){ PageInfo<CouponReceiptRecordDto> pageInfo = new PageInfo<CouponReceiptRecordDto>(vo.getPageNum(), vo.getPageSize()); List<CouponReceiptRecordDto> couponReceiptRecord = xpAppUserCouponService.getCouponReceiptRecord(pageInfo, vo); pageInfo.setRecords(couponReceiptRecord); return R.ok(pageInfo); } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java
@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.account.model.query.XpUserCouponListQuery; import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.vo.CouponReceiptRecordDto; import com.xiaopeng.account.vo.CouponReceiptRecordVo; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.query.account.XpAppUserCouponPageListQuery; import com.xiaopeng.common.core.web.page.PageInfo; @@ -26,4 +28,8 @@ List<XpAppUserCouponListVo> pageList(@Param("pageInfo") PageInfo<XpAppUserCouponListVo> pageInfo, @Param("query") XpAppUserCouponPageListQuery query); List<XpAppUserCoupon> getCouponReceiptRecord(@Param("pageInfo") PageInfo<CouponReceiptRecordDto> pageInfo, @Param("query") CouponReceiptRecordVo vo); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
@@ -7,6 +7,8 @@ import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.account.vo.CouponReceiptRecordDto; import com.xiaopeng.account.vo.CouponReceiptRecordVo; import com.xiaopeng.account.vo.UserCouponListVo; import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest; import com.xiaopeng.api.dto.account.UseUserCouponDto; @@ -101,4 +103,12 @@ * @return */ UserCouponListVo getUserCouponList(BigDecimal orderMoney, String uid); /** * 获取管理后台活动领取记录列表 * @param vo * @return */ List<CouponReceiptRecordDto> getCouponReceiptRecord(PageInfo<CouponReceiptRecordDto> pageInfo, CouponReceiptRecordVo vo); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -16,6 +16,9 @@ import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.account.service.IXpAppUserCouponService; import com.xiaopeng.account.util.holiday.HolidayUtil; import com.xiaopeng.account.vo.CouponReceiptRecordDto; import com.xiaopeng.account.vo.CouponReceiptRecordVo; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.api.vo.account.CouponVo; import com.xiaopeng.account.vo.UserCouponListVo; import com.xiaopeng.api.dto.account.NavigationCouponPickerRequest; @@ -37,6 +40,7 @@ import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.enums.MessageTemplateEnum; import com.xiaopeng.common.core.utils.DateUtils; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.core.web.page.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; @@ -46,10 +50,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.*; import java.util.stream.Collectors; /** @@ -589,4 +590,44 @@ userCouponListVo.setNotUsableCouponList(notUsableCouponList); return userCouponListVo; } /** * 获取管理后台活动领取人员记录 * @param vo * @return */ public List<CouponReceiptRecordDto> getCouponReceiptRecord(PageInfo<CouponReceiptRecordDto> pageInfo, CouponReceiptRecordVo vo) { List<Long> appUserIds = new ArrayList<Long>(); if(StringUtils.isNotEmpty(vo.getName())){ List<XpWhitelist> data = xpWhiteListClient.getXpWhitelistByName(vo.getName()).getData(); if(!data.isEmpty()){ appUserIds.addAll(data.stream().map(XpWhitelist::getAppUserId).collect(Collectors.toList())); } } if(StringUtils.isNotEmpty(vo.getPhone())){ List<XpWhitelist> data = xpWhiteListClient.getXpWhitelistByPhone(vo.getPhone()).getData(); if(!data.isEmpty()){ appUserIds.addAll(data.stream().map(XpWhitelist::getAppUserId).collect(Collectors.toList())); } } List<XpAppUserCoupon> couponReceiptRecord = this.baseMapper.getCouponReceiptRecord(pageInfo, vo); List<CouponReceiptRecordDto> list = new ArrayList<CouponReceiptRecordDto>(); for (XpAppUserCoupon xpAppUserCoupon : couponReceiptRecord) { CouponReceiptRecordDto dto = new CouponReceiptRecordDto(); dto.setId(xpAppUserCoupon.getId()); dto.setCreateTime(xpAppUserCoupon.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); XpWhitelist data = xpWhiteListClient.getXpWhitelistByUid(xpAppUserCoupon.getAppUserId()).getData(); if(null != data){ dto.setName(data.getNickName()); dto.setPhone(data.getAccount()); } dto.setNum(1); dto.setExpireTime(xpAppUserCoupon.getExpirationTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); dto.setStatus(xpAppUserCoupon.getStatus()); list.add(dto); } return list; } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/vo/CouponReceiptRecordDto.java
New file @@ -0,0 +1,24 @@ package com.xiaopeng.account.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel public class CouponReceiptRecordDto { @ApiModelProperty("领取记录id") private Long id; @ApiModelProperty("领取时间") private String createTime; @ApiModelProperty("领取人") private String name; @ApiModelProperty("领取人电话") private String phone; @ApiModelProperty("领取数量") private Integer num; @ApiModelProperty("到期时间") private String expireTime; @ApiModelProperty("状态(1=未使用,2=已使用,3=已过期 0=待领取)") private Integer status; } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/vo/CouponReceiptRecordVo.java
New file @@ -0,0 +1,28 @@ package com.xiaopeng.account.vo; import com.xiaopeng.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel public class CouponReceiptRecordVo extends BasePage { @ApiModelProperty("活动id") private Integer activityId; @ApiModelProperty("领取开始时间yyyy-MM-dd HH:mm:ss") private String startTime; @ApiModelProperty("领取结束时间yyyy-MM-dd HH:mm:ss") private String endTime; @ApiModelProperty("领取人") private String name; @ApiModelProperty("领取电话") private String phone; @ApiModelProperty("状态(1=未使用,2=已使用,3=已过期 0=待领取)") private Integer status; private List<Long> appUserIds; } xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
@@ -66,4 +66,22 @@ </select> <select id="getCouponReceiptRecord" resultType="com.xiaopeng.api.model.account.XpAppUserCoupon"> select * from xp_app_user_coupon where activity_id = #{query.activityId} <if test="null != query.startTime and '' != query.startTime and null != query.endTime and '' != query.endTime"> and create_time between #{query.startTime} and #{query.endTime} </if> <if test="null != query.appUserIds and query.appUserIds.size() > 0"> and app_user_id in <foreach collection="query.appUserIds" item="item" open="(" close=")" separator=","> #{item} </foreach> </if> <if test="null != query.status"> and status = #{query.status} </if> order by create_time desc </select> </mapper> xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpWhiteListClientFallbackFactory.java
@@ -3,6 +3,7 @@ import com.xiaopeng.api.feignClient.operation.XpCouponClient; import com.xiaopeng.api.feignClient.operation.XpWhiteListClient; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @@ -21,6 +22,18 @@ public R<List<String>> getAllWhiteList() { return null; } public R<List<XpWhitelist>> getXpWhitelistByName(String name) { return R.fail("获取白名单失败"); } public R<List<XpWhitelist>> getXpWhitelistByPhone(String phone) { return R.fail(); } public R<XpWhitelist> getXpWhitelistByUid(Long uid) { return R.fail("根据用户id查询白名单失败"); } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpWhiteListClient.java
@@ -5,6 +5,7 @@ import com.xiaopeng.api.factory.operation.XpPricingClientFallbackFactory; import com.xiaopeng.api.factory.operation.XpWhiteListClientFallbackFactory; import com.xiaopeng.api.model.operation.XpPricing; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; @@ -26,4 +27,29 @@ @PostMapping("/logan/api/v1/whitelist/inner/getAllWhiteList") R<List<String>> getAllWhiteList(); /** * 根据名称模糊搜索 * @param name * @return */ @PostMapping("/logan/api/v1/whitelist/inner/getXpWhitelistByName") R<List<XpWhitelist>> getXpWhitelistByName(@RequestParam String name); /** * 根据手机号查询 * @param phone * @return */ @PostMapping("/logan/api/v1/whitelist/inner/getXpWhitelistByPhone") R<List<XpWhitelist>> getXpWhitelistByPhone(@RequestParam String phone); /** * 根据账号查询 * @return */ @PostMapping("/logan/api/v1/whitelist/inner/getXpWhitelistByUid") R<XpWhitelist> getXpWhitelistByUid(@RequestParam Long uid); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -174,6 +174,9 @@ @ApiModelProperty(value = "优惠券id") private Long couponId; @ApiModelProperty(value = "活动id") private Integer activityId; /** * {@link OrderStatusEnum } */ xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
@@ -69,15 +69,15 @@ private XpAppUserCouponClient appUserCouponClient; /** * 获取所有白名单手机号 * * @return */ @PostMapping("/logan/inner/acticity/findListToIds") @ApiOperation(value = "获取活动信息ids", tags = {"管理后台-获取活动信息ids"}) public R<List<String>> findListToIds(@RequestParam String acticityName){ if(acticityName == null){ public R<List<String>> findListToIds(@RequestParam String acticityName) { if (acticityName == null) { return R.ok(); } return R.ok(service.findListToIds(acticityName)); @@ -90,19 +90,20 @@ /** * 是否第一次进入某活动 * * @return 活动信息,id 和 img */ @GetMapping("/api/v1/mini-program/acticity/firstEnter") @ApiOperation(value = "获取是否第一次推送活动", tags = {"小程序-首页活动"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R<XpActivity> firstEnter(HttpServletRequest request){ public R<XpActivity> firstEnter(HttpServletRequest request) { String uid = request.getHeader("XP-Uid"); ValueOperations<String, String> ops = redisTemplate.opsForValue(); XpActivity activity = service.activiting(Long.valueOf(uid)); if (activity !=null) { if (activity != null) { List<XpAppUserCoupon> couponList = appUserCouponClient.getXpAppUserCoupon(activity.getId()).getData(); Set<Long> longSet = couponList.stream().map(XpAppUserCoupon::getCouponId).collect(Collectors.toSet()); if(longSet.isEmpty()){ if (longSet.isEmpty()) { return R.ok(); } List<XpCoupon> xpCoupons1 = xpCouponService.listByIds(longSet); @@ -122,7 +123,7 @@ couponVos.add(vo); } Duration duration = Duration.between(LocalDateTime.now(), activity.getEndTime()); Boolean isFirst = ops.setIfAbsent(CacheConstants.firstEnterActivity(String.valueOf(activity.getId()), uid),"1", duration); Boolean isFirst = ops.setIfAbsent(CacheConstants.firstEnterActivity(String.valueOf(activity.getId()), uid), "1", duration); activity.setIsFirst(isFirst); activity.setCoupons(couponVos); } @@ -132,17 +133,17 @@ /** * 是否第一次进入某活动 * * @return 活动信息,id 和 img */ @GetMapping("/api/v1/mini-program/acticity/getFloatActicity") @ApiOperation(value = "获取首页活动悬浮图标数据", tags = {"小程序-首页活动"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R<XpActivity> getFloatActicity(HttpServletRequest request){ public R<XpActivity> getFloatActicity(HttpServletRequest request) { String uid = request.getHeader("XP-Uid"); XpActivity activity = service.getFloatActicity(Long.valueOf(uid)); return R.ok(activity); } @Resource @@ -153,7 +154,7 @@ IXpActivityNoticeService noticeService; @PostMapping("/v1/api/appUserCoupon/pageList") @ApiOperation(value = "活动列表",tags = {"管理后台-活动管理"},response = XpActivity.class) @ApiOperation(value = "活动列表", tags = {"管理后台-活动管理"}, response = XpActivity.class) public R<PageInfo<XpActivityDto>> pageList(@RequestBody XpActivityPageListQuery query) { PageInfo<XpActivityDto> pageList = service.pageList(query); for (XpActivityDto dto : pageList.getRecords()) { @@ -167,19 +168,19 @@ @PostMapping("/v1/api/appUserCoupon/add") @ApiOperation(value = "添加活动",tags = {"管理后台-活动管理"},response = XpCoupon.class) public R<?> add(@RequestBody XpActivityDto dto){ @ApiOperation(value = "添加活动", tags = {"管理后台-活动管理"}, response = XpCoupon.class) public R<?> add(@RequestBody XpActivityDto dto) { service.save(dto); return R.ok(); } @PostMapping("/v1/api/appUserCoupon/{op}") @ApiOperation(value = "修改活动状态,release,pause,resume,stop,del",tags = {"管理后台-活动管理"},response = XpCoupon.class) public R<XpActivity> updateById(@PathVariable String op,@RequestParam Long id){ @ApiOperation(value = "修改活动状态,release,pause,resume,stop,del", tags = {"管理后台-活动管理"}, response = XpCoupon.class) public R<XpActivity> updateById(@PathVariable String op, @RequestParam Long id) { XpActivity activity = service.getById(id); switch (op){ switch (op) { case "release": activity.setStatus(2); break; @@ -199,28 +200,30 @@ throw new UnsupportedOperationException("Unsupported" + op); } service.updateById(activity); log.info("修改活动状态:{}",activity); log.info("修改活动状态:{}", activity); return R.ok(); } @GetMapping("/v1/api/appUserCoupon/detail") @ApiOperation(value = "活动详情",tags = {"管理后台-活动管理"},response = XpCoupon.class) public R<XpActivityDto> queryById(@RequestParam Long id){ @ApiOperation(value = "活动详情", tags = {"管理后台-活动管理"}, response = XpCoupon.class) public R<XpActivityDto> queryById(@RequestParam Long id) { return R.ok(service.detail(id)); } /** * 根据活动id和优惠券id获取活动策略 * * @param activityId * @param couponId * @return */ @PostMapping("/logan/inner/acticity/getXpActicityStrategy") public R<XpActicityStrategy> getXpActicityStrategy(@RequestParam("activityId") Long activityId, @RequestParam("couponId") Long couponId){ public R<XpActicityStrategy> getXpActicityStrategy(@RequestParam("activityId") Long activityId, @RequestParam("couponId") Long couponId) { XpActicityCoupon one = xpActicityCouponService.lambdaQuery().eq(XpActicityCoupon::getActivityId, activityId).eq(XpActicityCoupon::getCouponId, couponId).one(); if(one == null){ if (one == null) { return R.ok(); } return R.ok(xpActicityStrategyService.getById(one.getActicityStrategyId())); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
@@ -6,6 +6,7 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.ImportParams; import cn.hutool.core.util.PhoneUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xiaopeng.api.model.account.SysUser; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.api.model.operation.XpWhitelistOperlog; @@ -464,6 +465,41 @@ /** * 根据名称模糊搜索 * @param name * @return */ @PostMapping("/logan/api/v1/whitelist/inner/getXpWhitelistByName") public R<List<XpWhitelist>> getXpWhitelistByName(@RequestParam String name){ List<XpWhitelist> list = xpWhitelistService.list(new QueryWrapper<XpWhitelist>().like("nick_name", name) .eq("status", 1).eq("is_deleted", 0)); return R.ok(list); } /** * 根据手机号查询 * @param phone * @return */ @PostMapping("/logan/api/v1/whitelist/inner/getXpWhitelistByPhone") public R<List<XpWhitelist>> getXpWhitelistByPhone(@RequestParam String phone){ List<XpWhitelist> list = xpWhitelistService.list(new QueryWrapper<XpWhitelist>().eq("account", phone) .eq("status", 1).eq("is_deleted", 0)); return R.ok(list); } /** * 根据账号查询 * @return */ @PostMapping("/logan/api/v1/whitelist/inner/getXpWhitelistByUid") public R<XpWhitelist> getXpWhitelistByUid(@RequestParam Long uid){ XpWhitelist one = xpWhitelistService.getOne(new QueryWrapper<XpWhitelist>().eq("app_user_id", uid).eq("is_deleted", 0)); return R.ok(one); } } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpOrderController.java
@@ -221,7 +221,7 @@ * @param query 分页查询参数 * @return 分页结果 */ @ApiOperation(value = "订单分页列表", tags = {"管理后台-交易管理-订单管理"}) @ApiOperation(value = "订单分页列表", tags = {"管理后台-交易管理-订单管理", "管理后台-活动管理"}) @PostMapping("/api/v1/order/pageList") public R<PageInfo<XpOrderPageVO>> pageList( @RequestBody XpOrderPageQuery query) { PageInfo<XpOrderPageVO> pageInfo = xpOrderService.pageList(query); xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/query/XpOrderPageQuery.java
@@ -50,4 +50,7 @@ @ApiModelProperty(value = "用户ID") private Long uid; @ApiModelProperty("活动id") private Integer activityId; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderPageVO.java
@@ -66,4 +66,13 @@ @ApiModelProperty(value = "下单终点站点名称") private String endPointName; @ApiModelProperty("优惠金额") private BigDecimal discountAmount; @ApiModelProperty("订单金额合计") private BigDecimal orderTotalAmount; @ApiModelProperty("优惠金额合计") private BigDecimal discountTotalAmount; } xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -261,6 +261,13 @@ } wrapper.eq(Objects.nonNull(query.getUid()), XpOrder::getAppUserId, query.getUid()); wrapper.orderByDesc(XpOrder::getCreateTime); if(null != query.getActivityId()){ wrapper.eq(XpOrder::getActivityId, query.getActivityId()); } List<XpOrder> list = this.list(wrapper); BigDecimal orderMoney = list.stream().map(XpOrder::getOrderMoney).collect(Collectors.toList()).stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO); BigDecimal couponMoney = list.stream().map(XpOrder::getCouponMoney).collect(Collectors.toList()).stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO); // 2. 分页查询 Page<XpOrder> page = new Page<>(query.getPageNum(), query.getPageSize()); @@ -293,7 +300,7 @@ // 5. 组装 VO List<XpOrderPageVO> voList = pageResult.getRecords().stream() .map(order -> convertToPageVO(order, userInfoMap, vehicleMap, fleetMap)) .map(order -> convertToPageVO(order, userInfoMap, vehicleMap, fleetMap, orderMoney, couponMoney)) .collect(Collectors.toList()); // 6. 返回分页结果 @@ -612,7 +619,9 @@ private XpOrderPageVO convertToPageVO(XpOrder order, Map<String, UcUserInfo> userInfoMap, Map<Long, XpVehicle> vehicleMap, Map<Long, XpFleet> fleetMap) { Map<Long, XpFleet> fleetMap, BigDecimal orderMoney, BigDecimal couponMoney) { XpOrderPageVO vo = new XpOrderPageVO(); vo.setId(order.getId()); vo.setOrderNumber(order.getOrderNumber()); @@ -625,6 +634,8 @@ vo.setStatus(order.getStatus()); vo.setStartPointName(order.getStartPointName()); vo.setEndPointName(order.getEndPointName()); vo.setOrderTotalAmount(orderMoney); vo.setDiscountTotalAmount(couponMoney); // 用户信息 if (Objects.nonNull(order.getAppUserId()) && userInfoMap != null && userInfoMap.containsKey(order.getAppUserId().toString())) {