xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -418,7 +418,7 @@ public UserCouponListVo getUserCouponList(BigDecimal orderMoney, String uid) { List<CouponVo> usableCouponList = new ArrayList<>(); List<CouponVo> notUsableCouponList = new ArrayList<>(); List<XpAppUserCoupon> list = this.list(new QueryWrapper<XpAppUserCoupon>().eq("app_user_id", uid).eq("status", 1).eq("is_deleted", 0)); List<XpAppUserCoupon> list = this.list(new QueryWrapper<XpAppUserCoupon>().eq("app_user_id", Long.valueOf(uid)).eq("status", 1).eq("is_deleted", 0)); for (XpAppUserCoupon xpAppUserCoupon : list) { XpCoupon data = xpCouponClient.getCouponById(xpAppUserCoupon.getCouponId()).getData(); if(null == data){ xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/account/XpOperationsUserPositionDTO.java
@@ -6,6 +6,8 @@ import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.geo.GeoJsonPoint; import org.springframework.data.mongodb.core.index.CompoundIndex; import org.springframework.data.mongodb.core.index.CompoundIndexes; import org.springframework.data.mongodb.core.index.GeoSpatialIndexType; import org.springframework.data.mongodb.core.index.GeoSpatialIndexed; import org.springframework.data.mongodb.core.mapping.Document; @@ -18,6 +20,10 @@ @Data @ApiModel("运维人员状态") @Document(collection = "xp_operations_user_position") @CompoundIndexes({ @CompoundIndex(name = "idx_status", def = "{'status': 1}"), @CompoundIndex(name = "idx_location", def = "{'location': '2dsphere'}") }) public class XpOperationsUserPositionDTO { @ApiModelProperty(value = "运维人员id") xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/operation/XpActivityDto.java
@@ -3,12 +3,14 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.api.model.operation.XpActicityStrategy; import com.xiaopeng.api.model.operation.XpActicityUser; import com.xiaopeng.api.model.operation.XpActivityNotice; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @@ -26,6 +28,12 @@ @ApiModelProperty(value = "活动类型 如新人活动、媒体邀约活动、日常提频等") private Integer activityType; @ApiModelProperty(value = "是否开启活动总限额") private boolean enableTotalLimit; @ApiModelProperty(value = "是否开启活动总限额") private BigDecimal totalLimit; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @@ -59,4 +67,7 @@ @ApiModelProperty(value = "发放用户") List<XpActicityUser> activityUser; @ApiModelProperty(value = "活动通知") XpActivityNotice notice; } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpTask.java
@@ -112,7 +112,7 @@ public Reject reject(String msg) { Reject reject = new Reject(); reject.setRejectTime(LocalDateTime.now()); reject.setRejectTime(LocalDateTime.now().toString()); reject.setRejectUserId(handleUserId); reject.setRejectReason(msg); return reject; @@ -125,7 +125,7 @@ @ApiModelProperty(value = "拒绝时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime rejectTime; private String rejectTime; @ApiModelProperty(value = "拒绝人id") private String rejectUserId; xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActicityStrategy.java
@@ -12,6 +12,7 @@ import lombok.experimental.Accessors; import java.time.LocalDateTime; import java.util.List; /** * <p> @@ -28,8 +29,6 @@ @ApiModel(value="XpActicityStrategy对象", description="活动策略配置") public class XpActicityStrategy extends BaseModel { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @@ -43,8 +42,9 @@ @ApiModelProperty(value = "发放规则(1=每日循环发放,2=仅发放一次,3=使用后发放)") private Integer distributionRules; @ApiModelProperty(value = "使用后发放规则json") private String distributionRulesAfterUse; @ApiModelProperty(value = "发放时间点") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime distributionTime; @ApiModelProperty(value = "生效规则(1=次日0点失效,2=指定有效天数,3=指定日期失效)") private Integer effectiveRules; @@ -59,8 +59,14 @@ @ApiModelProperty(value = "是否叠加使用(0=否,1=是)") private Integer stackedUsage; @ApiModelProperty(value = "使用时段json") private String usagePeriod; @ApiModelProperty(value = "叠加使用,不可超出总金额的百分比") private Integer repPercent; @ApiModelProperty(value = "优惠券类型") private Integer CouponTypeId; @ApiModelProperty(value = "使用时间段,时间字符串,开始和结束用,分割拼接成一个字符串,如果只有结束时间还是需要保持逗号,如:[',2007-05-03 05:00:00']") private List<String> usagePeriod; @ApiModelProperty(value = "每人限领数量") private Integer limitNumber; xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivity.java
@@ -12,6 +12,7 @@ import lombok.experimental.Accessors; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** @@ -38,6 +39,12 @@ @ApiModelProperty(value = "活动类型 如新人活动、媒体邀约活动、日常提频等") private Integer activityType; @ApiModelProperty(value = "是否开启活动总限额") private boolean enableTotalLimit; @ApiModelProperty(value = "是否开启活动总限额") private BigDecimal totalLimit; @ApiModelProperty(value = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime startTime; xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/operation/XpActivityNotice.java
New file @@ -0,0 +1,82 @@ package com.xiaopeng.api.model.operation; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * <p> * 活动管理 * </p> * * @author mitao * @since 2026-02-03 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("xp_activity_notice") @ApiModel(value="XpActicity对象", description="活动管理") public class XpActivityNotice extends BaseModel { @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "通知方式,微信=1,短信=2,小程序=4,多选,设置选项的和") private Integer noticeType; @ApiModelProperty(value = "活动id") private Long activityId; @ApiModelProperty(value = "触达时机,券到账=1,即将过期=2,活动开始=4,多选,设置选项的和") private Integer wechatTriggerTiming; @ApiModelProperty(value = "触达时机,券到账=1,即将过期=2,活动开始=4,多选,设置选项的和") private Integer smsTriggerTiming; @ApiModelProperty(value = "触达时机,券到账=1,即将过期=2,活动开始=4,多选,设置选项的和") private Integer miniProgramTriggerTiming; @ApiModelProperty(value = "wx临近到期天数") private Integer wechatDaysBeforeExpiry; @ApiModelProperty(value = "wx临近生效分钟数") private Integer wechatMinutesBeforeEffective; @ApiModelProperty(value = "sms临近到期天数") private Integer smsDaysBeforeExpiry; @ApiModelProperty(value = "sms临近生效分钟数") private Integer smsMinutesBeforeEffective; @ApiModelProperty(value = "miniProgram临近到期天数") private Integer miniProgramDaysBeforeExpiry; @ApiModelProperty(value = "miniProgram临近生效分钟数") private Integer miniProgramBeforeEffective; @ApiModelProperty(value = "屏蔽时间段,时间字符串,开始和结束用,分割拼接成一个字符串,如果只有结束时间还是需要保持逗号,如:[',2007-05-03 05:00:00']") private List<String> blockTime; @ApiModelProperty(value = "miniProgram临近到期toast") private Integer toastBeforeExpiry; @ApiModelProperty(value = "miniProgram临近生效toast") private Integer toastBeforeEffective; @ApiModelProperty(value = "是否开启浮窗") private Boolean enableFloatingWindow; @ApiModelProperty(value = "浮窗优先级权重1-100") @Min(1) @Max(100) private Integer floatingWindowPriority; @ApiModelProperty(value = "跳转链接") private Boolean linkUrl; } xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -283,7 +283,7 @@ List<XpOperationsUser> data = xpOperationsUserClient.getByPhoneNumber(dto.getPhoneNumber()).getData(); ids.addAll(data.stream().map(XpOperationsUser::getId).collect(Collectors.toList())); } if(!list().isEmpty()){ if(!ids.isEmpty()){ List<XpCruiseCheckInRuleOperationsUser> operationsUserId = xpCruiseCheckInRuleOperationsUserMapper.selectList(new QueryWrapper<XpCruiseCheckInRuleOperationsUser>().in("operations_user_id", ids)); List<Integer> ruleIds = operationsUserId.stream().map(XpCruiseCheckInRuleOperationsUser::getCruiseCheckInRuleId).collect(Collectors.toList()); dto.setIds(ruleIds); xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpActicityController.java
@@ -2,6 +2,7 @@ import com.xiaopeng.api.dto.operation.XpActivityDto; import com.xiaopeng.api.model.operation.XpActicityCoupon; import com.xiaopeng.api.model.operation.XpActivity; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.api.query.operation.XpActivityPageListQuery; @@ -10,6 +11,7 @@ import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.bean.BeanUtils; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.operation.service.IXpActicityCouponService; import com.xiaopeng.operation.service.IXpActicityService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -67,23 +69,26 @@ * @return 活动信息,id 和 img */ @PostMapping("/logan/inner/acticity/firstEnter") @ApiOperation(value = "获取活动信息ids", tags = {"管理后台-活动首次进入情况"}) public R<XpActivity> firstEnter(HttpServletRequest request){ @ApiOperation(value = "获取是否第一次推送活动", tags = {"管理后台-活动首次进入情况"}) public R<XpActivityVo> firstEnter(HttpServletRequest request){ String uid = request.getHeader("XP-Uid"); ValueOperations<String, String> ops = redisTemplate.opsForValue(); XpActivity activity = service.activiting(); List<XpActicityCoupon> cps = couponService.lambdaQuery().eq(XpActicityCoupon::getActivityId, activity.getId()).list(); XpActivityVo ret = new XpActivityVo(); if (activity !=null) { BeanUtils.copyBeanProp(ret, activity); Duration duration = Duration.between(LocalDateTime.now(), activity.getEndTime()); Boolean isFirst = ops.setIfAbsent(CacheConstants.firstEnterActivity(String.valueOf(activity.getId()), uid),"1", duration); ret.setIsFirst(isFirst); ret.setCoupons(cps); } return R.ok(activity); return R.ok(ret); } IXpActicityCouponService couponService; @PostMapping("/v1/api/appUserCoupon/pageList") @ApiOperation(value = "活动列表",tags = {"管理后台-活动管理"},response = XpActivity.class) xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/mapper/XpActivityNoticeMapper.java
New file @@ -0,0 +1,16 @@ package com.xiaopeng.operation.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.xiaopeng.api.model.operation.XpActivityNotice; /** * <p> * 活动通知配置 Mapper 接口 * </p> * * @author mitao * @since 2026-02-03 */ public interface XpActivityNoticeMapper extends BaseMapper<XpActivityNotice> { } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpActivityNoticeService.java
New file @@ -0,0 +1,16 @@ package com.xiaopeng.operation.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.api.model.operation.XpActivityNotice; /** * <p> * 活动通知配置 服务类 * </p> * * @author mitao * @since 2026-02-03 */ public interface IXpActivityNoticeService extends IService<XpActivityNotice> { } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActicityServiceImpl.java
@@ -5,6 +5,7 @@ import com.xiaopeng.api.model.operation.XpActicityStrategy; import com.xiaopeng.api.model.operation.XpActicityUser; import com.xiaopeng.api.model.operation.XpActivity; import com.xiaopeng.api.model.operation.XpActivityNotice; import com.xiaopeng.api.query.operation.XpActivityPageListQuery; import com.xiaopeng.common.core.utils.bean.BeanUtils; import com.xiaopeng.common.core.web.page.PageInfo; @@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.operation.service.IXpActicityStrategyService; import com.xiaopeng.operation.service.IXpActicityUserService; import com.xiaopeng.operation.service.IXpActivityNoticeService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,6 +42,9 @@ @Resource private IXpActicityUserService userService; @Resource private IXpActivityNoticeService activityNotice; @Override public PageInfo<XpActivity> pageList(XpActivityPageListQuery query) { @@ -80,9 +85,9 @@ List<XpActicityStrategy> strategy = dto.getStrategy(); List<XpActicityUser> activityUser = dto.getActivityUser(); XpActivityNotice notice = dto.getNotice(); strategy.forEach(e -> e.setActitcityId(activity.getId().intValue())); strategyService.saveBatch(strategy); Map<String, XpActicityStrategy> strategyMap = strategy.stream().collect(Collectors.toMap( XpActicityStrategy::getName, Function.identity() @@ -91,7 +96,9 @@ item.setActitcityId(activity.getId().intValue()); item.setActitcityStrategeId(strategyMap.get(item.getStrategyName()).getId()); }); notice.setActivityId(activity.getId()); userService.saveBatch(activityUser); activityNotice.save(notice); } @Override xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpActivityNoticeServiceImpl.java
New file @@ -0,0 +1,20 @@ package com.xiaopeng.operation.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.api.model.operation.XpActivityNotice; import com.xiaopeng.operation.mapper.XpActivityNoticeMapper; import com.xiaopeng.operation.service.IXpActivityNoticeService; import org.springframework.stereotype.Service; /** * <p> * 活动通知配置 服务实现类 * </p> * * @author mitao * @since 2026-02-03 */ @Service public class XpActivityNoticeServiceImpl extends ServiceImpl<XpActivityNoticeMapper, XpActivityNotice> implements IXpActivityNoticeService { } xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpActivityNoticeMapper.xml
New file @@ -0,0 +1,8 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xiaopeng.operation.mapper.XpActivityNoticeMapper"> </mapper>