From 2c22b0913fc5bf1c00e01cc1c459ae60fe060560 Mon Sep 17 00:00:00 2001 From: wangchao Date: Fri, 31 Jul 2020 16:46:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=A0=B8=E9=94=80=20=20?= =?UTF-8?q?=E5=B1=85=E6=B0=91=E7=AB=AF=E3=80=81=E5=B7=A5=E4=BD=9C=E7=AB=AF?= =?UTF-8?q?=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epmet/commons/tools/redis/RedisKeys.java | 6 + .../epmet/commons/tools/redis/RedisUtils.java | 6 +- .../PointExchangeResponseResultDTO.java | 37 ++++++ .../main/java/dto/form/SendPointFormDTO.java | 10 ++ .../controller/MqPointCallbackController.java | 3 + .../epmet/controller/ResiPointController.java | 13 ++ .../main/java/com/epmet/dao/PointRuleDao.java | 3 + .../com/epmet/dao/UserPointActionLogDao.java | 8 ++ .../main/java/com/epmet/redis/PointRedis.java | 15 +++ .../com/epmet/service/PointRuleService.java | 10 ++ .../service/PointVerificationLogService.java | 10 ++ .../service/UserPointActionLogService.java | 9 ++ .../service/impl/PointRuleServiceImpl.java | 13 ++ .../impl/PointVerificationLogServiceImpl.java | 39 +++++- .../impl/UserPointActionLogServiceImpl.java | 112 +++++++++++++++++- .../java/com/epmet/utils/ModuleConstant.java | 2 + .../main/resources/mapper/PointRuleDao.xml | 8 ++ .../mapper/UserPointActionLogDao.xml | 18 +++ 18 files changed, 315 insertions(+), 7 deletions(-) create mode 100644 epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/result/PointExchangeResponseResultDTO.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java index 457788f5a9..3c883ea2ac 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisKeys.java @@ -271,4 +271,10 @@ public class RedisKeys { return rootPrefix.concat("oper:user:shorId:").concat(shortUserId); } + /** + * 居民端积分核销结果 + * */ + public static String getPointVerificationResultKey(String userId){ + return rootPrefix.concat("resi:point:exchange:").concat(userId); + } } diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java index 2f08f03683..27a081dacc 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/redis/RedisUtils.java @@ -171,6 +171,10 @@ public class RedisUtils { } } + public Object lindex(String key,Long index){ + return redisTemplate.opsForList().index(key,index); + } + public Object rightPop(String key) { return redisTemplate.opsForList().rightPop(key); } @@ -190,7 +194,7 @@ public class RedisUtils { } public String getString(String key) { - return getString(key, DEFAULT_EXPIRE); + return stringRedisTemplate.opsForValue().get(key); } /** diff --git a/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/result/PointExchangeResponseResultDTO.java b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/result/PointExchangeResponseResultDTO.java new file mode 100644 index 0000000000..76de81a0a1 --- /dev/null +++ b/epmet-module/epmet-point/epmet-point-client/src/main/java/com/epmet/dto/result/PointExchangeResponseResultDTO.java @@ -0,0 +1,37 @@ +package com.epmet.dto.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Description + * @ClassName PointExchangeResponseResultDTO + * @Auth wangc + * @Date 2020-07-31 16:07 + */ +@Data +public class PointExchangeResponseResultDTO implements Serializable { + private static final long serialVersionUID = -6342757960284704496L; + /** + * 核销成功标识 + * */ + private boolean resultFlag; + + /** + * 失败原因 + * */ + private String failureReason; + + private Integer point; + + /** + * 工作人员昵称 + * */ + private String operatorName; + + /** + * 工作人员头像 + * */ + private String operatorProfile; +} diff --git a/epmet-module/epmet-point/epmet-point-client/src/main/java/dto/form/SendPointFormDTO.java b/epmet-module/epmet-point/epmet-point-client/src/main/java/dto/form/SendPointFormDTO.java index fef7e11cc5..2002f18597 100644 --- a/epmet-module/epmet-point/epmet-point-client/src/main/java/dto/form/SendPointFormDTO.java +++ b/epmet-module/epmet-point/epmet-point-client/src/main/java/dto/form/SendPointFormDTO.java @@ -4,8 +4,11 @@ package dto.form;/** * @date 2020-07-17 17:16 **/ +import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** * desc:发送积分dto * @author lyn @@ -13,6 +16,9 @@ import lombok.Data; */ @Data public class SendPointFormDTO { + + public interface SendPointGroup extends CustomerClientShowGroup{} + private String pointDesc; /** @@ -33,15 +39,18 @@ public class SendPointFormDTO { /** * 客户Id */ + @NotBlank(message = "客户Id不能为空", groups = SendPointGroup.class) private String customerId; /** * 被操作用户id */ + @NotBlank(message = "用户Id不能为空", groups = SendPointGroup.class) private String userId; /** * 加减分标识 plus/minus */ + @NotBlank(message = "加减标识不能为空", groups = SendPointGroup.class) private String actionFlag; @@ -53,6 +62,7 @@ public class SendPointFormDTO { /** * 备注 */ + @NotBlank(message = "积分备注不能为空", groups = SendPointGroup.class) private String remark; /** diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/MqPointCallbackController.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/MqPointCallbackController.java index 443716268d..14aab6e47a 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/MqPointCallbackController.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/MqPointCallbackController.java @@ -3,6 +3,7 @@ package com.epmet.controller; import com.alibaba.fastjson.JSON; import com.epmet.commons.tools.dto.form.mq.ReceiveMqMsg; import com.epmet.commons.tools.dto.form.mq.eventmsg.BasePointEventMsg; +import com.epmet.commons.tools.enums.EventEnum; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.RenException; import com.epmet.commons.tools.utils.ConvertUtils; @@ -75,6 +76,7 @@ public class MqPointCallbackController { BasePointEventMsg formDTO = ConvertUtils.sourceToTarget(mqMsg.getMsg(), BasePointEventMsg.class); try { //TODO 调用调整积分方法去给用户加减积分 userPointActionLogService. + userPointActionLogService.grantPointByEvent(EventEnum.REGISTER_VOLUNTEER.getEventTag(),formDTO); } catch (Exception e) { logger.error("registerVolunteer consume fail", e); throw new RenException(EpmetErrorCode.SERVER_ERROR.getMsg()); @@ -99,6 +101,7 @@ public class MqPointCallbackController { BasePointEventMsg formDTO = ConvertUtils.sourceToTarget(mqMsg.getMsg(), BasePointEventMsg.class); try { //TODO 调用调整积分方法去给用户加减积分 userPointActionLogService. + userPointActionLogService.grantPointByEvent(EventEnum.ACTIVE_INSERT_LIVE.getEventTag(),formDTO); } catch (Exception e) { logger.error("pubActiveLive consume fail", e); throw new RenException(EpmetErrorCode.SERVER_ERROR.getMsg()); diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/ResiPointController.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/ResiPointController.java index f58da5b0fa..bca69b050a 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/ResiPointController.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/controller/ResiPointController.java @@ -7,6 +7,7 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.form.CommonPageUserFormDTO; import com.epmet.dto.form.ResiCommonUserIdFormDTO; import com.epmet.dto.form.ResiPointRankFormDTO; +import com.epmet.dto.result.PointExchangeResponseResultDTO; import com.epmet.dto.result.ResiPointDetailResultDTO; import com.epmet.dto.result.ResiPointLogListResultDTO; import com.epmet.dto.result.ResiPointRankListResultDTO; @@ -129,4 +130,16 @@ public class ResiPointController { ValidatorUtils.validateEntity(pageUserParam,CommonPageUserFormDTO.PageUserGroup.class); return new Result>().ok(pointVerificationLogService.getMyExchangeRecord(pageUserParam)); } + + /** + * @Description 居民端积分兑换响应 + * @param tokenDto + * @return + * @author wangc + * @date 2020.07.31 16:17 + **/ + @PostMapping("exchangecallback") + public Result exchangeCallback(@LoginUser TokenDto tokenDto){ + return new Result().ok(pointVerificationLogService.resiExchangeCallback(tokenDto.getUserId())); + } } diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/PointRuleDao.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/PointRuleDao.java index 2c8f5a214a..9361d09442 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/PointRuleDao.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/PointRuleDao.java @@ -22,6 +22,7 @@ import com.epmet.dto.form.PointRuleListFormDTO; import com.epmet.entity.PointRuleEntity; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @@ -51,4 +52,6 @@ public interface PointRuleDao extends BaseDao { List selectListByFunctionId(PointRuleListFormDTO formDTO); int updateByCustomerId(PointRuleEntity entity); + + PointRuleEntity selectByEventCodeAndCustomerId(@Param("customerId") String customerId, @Param("eventCode") String eventCode); } \ No newline at end of file diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/UserPointActionLogDao.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/UserPointActionLogDao.java index 6f9ac3fb4c..821bb2e443 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/UserPointActionLogDao.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/dao/UserPointActionLogDao.java @@ -43,4 +43,12 @@ public interface UserPointActionLogDao extends BaseDao **/ List selectPointActionLogList(@Param("userId") String userId); + /** + * @Description 查询指定用户在某条规则下所得的积分总和 + * @param + * @return + * @author wangc + * @date 2020.07.31 15:11 + **/ + Integer selectSumByEvent(@Param("userId") String userId,@Param("eventId") String eventId, @Param("sourceId") String sourceId,@Param("customerId") String customerId); } \ No newline at end of file diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/redis/PointRedis.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/redis/PointRedis.java index 4e868d150f..e22fe14ca6 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/redis/PointRedis.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/redis/PointRedis.java @@ -1,6 +1,8 @@ package com.epmet.redis; +import com.epmet.commons.tools.redis.RedisKeys; import com.epmet.commons.tools.redis.RedisUtils; +import com.epmet.dto.result.PointExchangeResponseResultDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -15,4 +17,17 @@ public class PointRedis { @Autowired private RedisUtils redisUtils; + + + public void lpush(String userId , PointExchangeResponseResultDTO verificationResult){ + redisUtils.leftPush(RedisKeys.getPointVerificationResultKey(userId),verificationResult); + } + public Object lindex(String userId,Long index){ + return redisUtils.lindex(RedisKeys.getPointVerificationResultKey(userId),index); + } + + public String checkIfQrCodeExpire(String shortId){ + String userId = (String)redisUtils.getString(RedisKeys.getShortUserIdKey(shortId)); + return userId; + } } diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java index fa53b5be05..f0e58de53e 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointRuleService.java @@ -56,4 +56,14 @@ public interface PointRuleService extends BaseService { void update(TokenDto tokenDTO, PointRuleFormDTO formDTO); void add(TokenDto tokenDTO, PointRuleFormDTO formDTO); + + /** + * @Description 根据evetCode和客户Id查找积分规则详情 + * @param customerId + * @param eventCode + * @return + * @author wangc + * @date 2020.07.31 14:54 + **/ + PointRuleEntity getByEventCodeAndCustomerId(String customerId,String eventCode); } \ No newline at end of file diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointVerificationLogService.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointVerificationLogService.java index d8610aa2b0..be79309eec 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointVerificationLogService.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/PointVerificationLogService.java @@ -23,6 +23,7 @@ import com.epmet.dto.PointVerificationLogDTO; import com.epmet.dto.form.CommonPageUserFormDTO; import com.epmet.dto.form.PointVerificationFormDTO; import com.epmet.dto.form.WorkPointVerificationFormDTO; +import com.epmet.dto.result.PointExchangeResponseResultDTO; import com.epmet.dto.result.PointVerificationResultDTO; import com.epmet.dto.result.ResiPointLogListResultDTO; import com.epmet.dto.result.WorkPointVerficationListResultDTO; @@ -125,4 +126,13 @@ public interface PointVerificationLogService extends BaseService grantPointParam); + /** + * @Description 通过事件推送进行积分加减 + * @param event + * @return + * @author wangc + * @date 2020.07.31 13:45 + **/ + void grantPointByEvent(String eventCode,BasePointEventMsg event); } \ No newline at end of file diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java index 68c14c2739..c46ec497b7 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java +++ b/epmet-module/epmet-point/epmet-point-server/src/main/java/com/epmet/service/impl/PointRuleServiceImpl.java @@ -169,6 +169,19 @@ public class PointRuleServiceImpl extends BaseServiceImpl 【】", JSON.toJSON(verificationParam))); + throw new RenException("用户二维码失效"); + } + DimIdGenerator.DimIdBean dim = DimIdGenerator.getDimIdBean(new Date()); PointVerificationResultDTO result = new PointVerificationResultDTO(); ResiCommonUserIdFormDTO userId = new ResiCommonUserIdFormDTO(); @@ -245,6 +255,12 @@ public class PointVerificationLogServiceImpl extends BaseServiceImpl [epmet:point:verification:userId] lpush #新元素插入表头 lindex key 0 #表头 + PointExchangeResponseResultDTO resultCache = new PointExchangeResponseResultDTO(); + resultCache.setResultFlag(true); + resultCache.setOperatorName(operatorName); + resultCache.setPoint(point * NumConstant.ONE_NEG); + //工作人员没有头像 + pointRedis.lpush(verificationParam.getUserId(),resultCache); + result.setSuccessFlag(true); List userParam = new LinkedList<>(); userParam.add(verificationParam.getUserId()); Result> userResult = - epmetUserOpenFeignClient.queryUserBaseInfo(userParam); + epmetUserOpenFeignClient.queryUserBaseInfo(userParam); String userHeadPhoto = ModuleConstant.EMPTY_STR; String userNickname = ModuleConstant.EMPTY_STR; if(userResult.success() && null != userResult.getData() && !userResult.getData().isEmpty()){ @@ -337,6 +360,18 @@ public class PointVerificationLogServiceImpl extends BaseServiceImpl implements UserPointActionLogService { - + private static Logger logger = LoggerFactory.getLogger(UserPointActionLogServiceImpl.class); @Autowired private UserPointTotalService userPointTotalService; @Autowired private UserPointStatisticalDailyService userPointStatisticalDailyService; - + @Autowired + private PointRuleServiceImpl pointRuleService; @Override public PageData page(Map params) { IPage page = baseDao.selectPage( @@ -168,7 +179,100 @@ public class UserPointActionLogServiceImpl extends BaseServiceImpl【%s】", JSON.toJSON(event))); + throw new RenException("无法识别事件类型与积分规则"); + } + + PointRuleEntity ruleInfo = pointRuleService.getByEventCodeAndCustomerId(event.getCustomerId(),eventCode); + if(null != ruleInfo && StringUtils.equals(NumConstant.ONE_STR,ruleInfo.getEnabledFlag())){ + //校验是否达到上限 + if(ruleInfo.getUpLimit() > NumConstant.ZERO){ + Integer sum = baseDao.selectSumByEvent(event.getUserId(),eventCode,event.getSourceId(),event.getCustomerId()); + if(null == sum) sum = NumConstant.ZERO; + if(StringUtils.equals(ModuleConstant.OPERATION_TYPE_PLUS,ruleInfo.getOperateType())){ + sum += ruleInfo.getPoint(); + if(ruleInfo.getPoint() < NumConstant.ZERO){ + //保证要加的积分是正数 + ruleInfo.setPoint(ruleInfo.getPoint() * NumConstant.ONE_NEG); + } + }else{ + //actionLog中存的是正负数,如果是减操作,则算出来的是负数相加 + sum -= ruleInfo.getPoint() * NumConstant.ONE_NEG; + sum *= NumConstant.ONE_NEG; + if(ruleInfo.getPoint() > NumConstant.ZERO){ + //保证要扣减的积分是负数 + ruleInfo.setPoint(ruleInfo.getPoint() * NumConstant.ONE_NEG); + } + } + //这里sum一定是正数 + if(ruleInfo.getUpLimit() < (sum + ruleInfo.getPoint())){ + log.info(String.format("该用户获取此类事件的积分已达上限,详细数据->【%s】", JSON.toJSON(event))); + return ; + } + } + + //完成校验,可以进行积分操作 + + + + //1.新增用户积分行为记录 + UserPointActionLogEntity action = new UserPointActionLogEntity(); + action.setCustomerId(event.getCustomerId()); + action.setPoint(ruleInfo.getPoint()); + action.setEventStatement(event.getRemark()); + action.setEventName(EventEnum.getEnum(eventCode).getEventDesc()); + action.setEventId(eventCode); + action.setActionFlag(event.getActionFlag()); + action.setUserId(event.getUserId()); + action.setCreatedBy(StringUtils.isBlank(event.getOperatorId()) ? ModuleConstant.CREATED_BY_SYSTEM : event.getOperatorId()); + action.setUpdatedBy(StringUtils.isBlank(event.getOperatorId()) ? ModuleConstant.CREATED_BY_SYSTEM : event.getOperatorId()); + action.setSourceId(event.getSourceId()); + action.setOperatorAgencyId(event.getOpAgencyId()); + baseDao.insert(action); + //2.新增/修改用户积分日统计 + DimIdGenerator.DimIdBean dimVal = DimIdGenerator.getDimIdBean(new Date()); + UserPointStatisticalDailyEntity statistical = ConvertUtils.sourceToTarget(dimVal,UserPointStatisticalDailyEntity.class); + statistical.setPointChange(ruleInfo.getPoint()); + statistical.setActionFlag(event.getActionFlag()); + statistical.setCustomerId(event.getCustomerId()); + statistical.setUserId(event.getUserId()); + statistical.setCreatedBy(StringUtils.isBlank(event.getOperatorId()) ? ModuleConstant.CREATED_BY_SYSTEM : event.getOperatorId()); + statistical.setUpdatedBy(StringUtils.isBlank(event.getOperatorId()) ? ModuleConstant.CREATED_BY_SYSTEM : event.getOperatorId()); + userPointStatisticalDailyService.insertOrUpdate(statistical); + //3.新增/修改用户积分日统计 + UserPointTotalEntity point = new UserPointTotalEntity(); + point.setCustomerId(event.getCustomerId()); + point.setUserId(event.getUserId()); + point.setTotalPoint(ruleInfo.getPoint()); + point.setUsablePoint(ruleInfo.getPoint()); + point.setUsedPoint(NumConstant.ZERO); + point.setCreatedBy(StringUtils.isBlank(event.getOperatorId()) ? ModuleConstant.CREATED_BY_SYSTEM : event.getOperatorId()); + point.setUpdatedBy(StringUtils.isBlank(event.getOperatorId()) ? ModuleConstant.CREATED_BY_SYSTEM : event.getOperatorId()); + userPointTotalService.insertOrUpdate(point); + + + }else{ + log.error(String.format("未检测到该用户下有效的积分规则,消息体->【%s】", JSON.toJSON(event))); + throw new RenException("未检测到该用户下有效的积分规则"); + } + + + } + private void plusPoint(SendPointFormDTO grantPoint) { + ValidatorUtils.validateEntity(grantPoint, SendPointFormDTO.SendPointGroup.class); + if(StringUtils.equals(ModuleConstant.OPERATION_TYPE_MINUS,grantPoint.getActionFlag())){ //减 if(grantPoint.getPoint() > NumConstant.ZERO){ @@ -186,7 +290,7 @@ public class UserPointActionLogServiceImpl extends BaseServiceImpl + + \ No newline at end of file diff --git a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml index b8baa6c47f..bc529cc420 100644 --- a/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml +++ b/epmet-module/epmet-point/epmet-point-server/src/main/resources/mapper/UserPointActionLogDao.xml @@ -40,4 +40,22 @@ CREATED_TIME DESC + + \ No newline at end of file