diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/ShuYunConstants.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/ShuYunConstants.java new file mode 100644 index 0000000..2807d61 --- /dev/null +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/ShuYunConstants.java @@ -0,0 +1,12 @@ +package com.flossom.common.core.constant; + +/** + * 数云 常量 + */ +public class ShuYunConstants { + /** + * 平台内系统用户的唯一标志 + */ + public static final String POINT_SERIAL_NUMBER_PREFIX = "hz_serial_number-"; + +} diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/shuyun/ShuYunMember.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/shuyun/ShuYunMember.java index 48621af..f3dacfe 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/shuyun/ShuYunMember.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/domain/shuyun/ShuYunMember.java @@ -89,12 +89,13 @@ public class ShuYunMember { * @param name * @param mobile */ - public ShuYunMember(String id, String platCode, String shopId, String name, String mobile) { + public ShuYunMember(String id, String platCode, String shopId, String name, String mobile, String created) { this.id = id; this.platCode = platCode; this.shopId = shopId; this.name = name; this.mobile = mobile; + this.created = created; } /** diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/utils/DateUtils.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/utils/DateUtils.java index f0c8ed3..1794248 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/utils/DateUtils.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/utils/DateUtils.java @@ -26,6 +26,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + public static String YYYYMMDDHHMMSSS = "yyyyMMddHHmmssSSS"; + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; private static String[] parsePatterns = { diff --git a/flossom-modules/flossom-mini-program/pom.xml b/flossom-modules/flossom-mini-program/pom.xml index 4811904..3b54448 100644 --- a/flossom-modules/flossom-mini-program/pom.xml +++ b/flossom-modules/flossom-mini-program/pom.xml @@ -101,6 +101,20 @@ spring-boot-starter-test test + + + + com.shuyun.open + open-platform-sdk + 1.0.1 + system + ${project.basedir}/src/main/resources/lib/open-platform-sdk-1.0.1.jar + + + + cn.hutool + hutool-core + @@ -109,6 +123,17 @@ org.springframework.boot spring-boot-maven-plugin + + + true + + + + + repackage + + + diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegralController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegralController.java index 364bcb0..956983c 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegralController.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/WxUserIntegralController.java @@ -1,13 +1,12 @@ package com.flossom.miniProgram.controller; -import com.flossom.common.core.domain.entity.WxUserIntegralLog; import com.flossom.common.core.web.controller.BaseController; import com.flossom.common.core.web.page.TableDataInfo; import com.flossom.miniProgram.service.IWxUserIntegralService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import java.util.List; +import javax.validation.constraints.NotNull; /** * 微信用户积分 Controller @@ -29,10 +28,9 @@ public class WxUserIntegralController extends BaseController { * @return */ @GetMapping("/obtainUserIntegral") - public TableDataInfo obtainUserIntegral() { - startPage(); - List list = wxUserIntegralLogService.obtainUserIntegral(); - return getDataTable(list); + public TableDataInfo obtainUserIntegral(@NotNull(message = "pageSize 不能为空") @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize, + @NotNull(message = "pageNum 不能为空") @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) { + return wxUserIntegralLogService.obtainUserIntegral(pageNum, pageSize); } } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java index 0cebe02..a4cc2a0 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserIntegralService.java @@ -1,11 +1,9 @@ package com.flossom.miniProgram.service; -import com.flossom.common.core.domain.entity.WxUserIntegralLog; - -import java.util.List; +import com.flossom.common.core.web.page.TableDataInfo; public interface IWxUserIntegralService { - List obtainUserIntegral(); + TableDataInfo obtainUserIntegral(Integer pageNum, Integer pageSize); } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java index fd38a59..c545cd5 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserIntegralServiceImpl.java @@ -1,25 +1,78 @@ package com.flossom.miniProgram.service.impl; +import com.flossom.common.core.constant.HttpStatus; import com.flossom.common.core.domain.entity.WxUserIntegralLog; import com.flossom.common.core.domain.entity.WxUserMember; +import com.flossom.common.core.domain.shuyun.ShuYunPageReq; +import com.flossom.common.core.domain.shuyun.ShuYunPageUtil; +import com.flossom.common.core.domain.shuyun.ShuYunPointChangeLog; +import com.flossom.common.core.enums.IntegralChangeTypeEnum; +import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.mapper.WxUserIntegralLogMapper; +import com.flossom.common.core.utils.DateUtils; +import com.flossom.common.core.web.page.TableDataInfo; import com.flossom.common.security.utils.SecurityUtils; import com.flossom.miniProgram.service.IWxUserIntegralService; +import com.flossom.miniProgram.utils.shuyun.ShuYunApiUtils; +import com.flossom.miniProgram.utils.shuyun.ShuYunConfig; +import com.github.pagehelper.PageInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; @Service public class WxUserIntegralServiceImpl implements IWxUserIntegralService { + protected final Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired private WxUserIntegralLogMapper wxUserIntegralLogMapper; + @Autowired + private ShuYunConfig shuYunConfig; + @Override - public List obtainUserIntegral() { + public TableDataInfo obtainUserIntegral(Integer pageNum, Integer pageSize) { + /** + * TODO:积分操作记录由数云提供(已完成) + */ WxUserMember wxUserMember = SecurityUtils.getLoginUser().getWxUserMember(); - return wxUserIntegralLogMapper.obtainUserIntegral(wxUserMember.getId()); + ShuYunPageReq req = new ShuYunPageReq(SecurityUtils.getLoginUser().getWxUserMember().getUnionid(), shuYunConfig.getPlatCode(), shuYunConfig.getShopId(), + String.valueOf(pageSize), String.valueOf(pageNum)); + ShuYunPageUtil pointChangeLogShuYunPageUtil = ShuYunApiUtils.pointChangeLogSearch(req); + if (pointChangeLogShuYunPageUtil == null) { + logger.error("积分查询失败,用户id:{},用户名:{},用户unionid:{},分页参数:pageNum={},pageSize={}", + wxUserMember.getId(), wxUserMember.getNickname(), wxUserMember.getUnionid(), pageNum, pageSize); + throw new ServiceException("积分查询失败"); + } + List userIntegralLogList = new ArrayList<>(); + WxUserIntegralLog userIntegralLog = null; + if (pointChangeLogShuYunPageUtil.getList() != null && pointChangeLogShuYunPageUtil.getList().size() > 0) { + for (ShuYunPointChangeLog shuYunPointChangeLog : pointChangeLogShuYunPageUtil.getList()) { + userIntegralLog = new WxUserIntegralLog(); + userIntegralLog.setRemarkContent(shuYunPointChangeLog.getDesc()); + // 变更积分 + if (Integer.valueOf(shuYunPointChangeLog.getChangePoint()) > 0) { + userIntegralLog.setSource(IntegralChangeTypeEnum.INCREASE.getCode()); + } else { + userIntegralLog.setSource(IntegralChangeTypeEnum.REDUCE.getCode()); + } + userIntegralLog.setFloatScore(Math.abs(Long.valueOf(shuYunPointChangeLog.getChangePoint()))); + // 变更时间 + userIntegralLog.setCreateTime(DateUtils.parseDate(shuYunPointChangeLog.getCreated())); + } + userIntegralLogList.add(userIntegralLog); + } + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setRows(userIntegralLogList); + rspData.setMsg("查询成功"); + rspData.setTotal(pointChangeLogShuYunPageUtil.getTotals()); + return rspData; } } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java index 109d00f..0dd744c 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java @@ -1,13 +1,18 @@ package com.flossom.miniProgram.service.impl; +import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSON; import com.flossom.common.core.constant.CacheConstants; import com.flossom.common.core.constant.HttpStatus; +import com.flossom.common.core.constant.ShuYunConstants; import com.flossom.common.core.constant.UserConstants; import com.flossom.common.core.domain.R; import com.flossom.common.core.domain.entity.*; +import com.flossom.common.core.domain.shuyun.ShuYunMember; +import com.flossom.common.core.domain.shuyun.ShuYunPointChange; import com.flossom.common.core.enums.IntegralChangeTypeEnum; import com.flossom.common.core.enums.MessageTypeEnum; +import com.flossom.common.core.enums.ShuYunPointSourceEnum; import com.flossom.common.core.enums.WxUserIntegralMessageTypeEnum; import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.mapper.*; @@ -18,6 +23,8 @@ import com.flossom.common.security.utils.SecurityUtils; import com.flossom.miniProgram.domain.vo.*; import com.flossom.miniProgram.service.IWxUserMemberService; import com.flossom.miniProgram.utils.MiniProgramUtils; +import com.flossom.miniProgram.utils.shuyun.ShuYunApiUtils; +import com.flossom.miniProgram.utils.shuyun.ShuYunConfig; import com.flossom.system.api.RemoteAuthService; import com.flossom.system.api.model.LoginUser; import org.slf4j.Logger; @@ -28,6 +35,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -61,6 +72,9 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { @Autowired private WxUserIntegralLogMapper wxUserIntegralLogMapper; + @Autowired + private ShuYunConfig shuYunConfig; + @Override @Transactional @@ -176,8 +190,11 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { } /** - * TODO: 新用户注册,需要对接数云,将用户信息传给数云 + * TODO: 1、新用户注册,需要对接数云,将用户信息传给数云(已完成,待添加操作日志) */ + WxUserMember wxUserMember = wxUserMemberMapper.selectWxUserMemberById(SecurityUtils.getLoginUser().getWxUserMember().getId()); + ShuYunApiUtils.registerMember(new ShuYunMember(wxUserMember.getUnionid(), shuYunConfig.getPlatCode(), shuYunConfig.getShopId(), + "用户" + wxUserMember.getId(), wxUserMember.getMobile(), DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, wxUserMember.getCreateTime()))); return wxCode2PhoneRet.getPhoneInfo().getPhoneNumber(); } @@ -189,15 +206,13 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { if (wxUserMember == null) { throw new ServiceException("用户不存在"); } - int floatScore = 0; + List integralGlobalList = integralGlobalMapper.selectIntegralGlobalList(new IntegralGlobal()); + IntegralGlobal integralGlobal = integralGlobalList.get(0); Boolean isCompleteInformation = false; if (wxUserMember.getIsCompleteInformation() == null || wxUserMember.getIsCompleteInformation() == 0) { isCompleteInformation = true; // 修改完善状态 wxUserMember.setIsCompleteInformation(1); - List integralGlobalList = integralGlobalMapper.selectIntegralGlobalList(new IntegralGlobal()); - IntegralGlobal integralGlobal = integralGlobalList.get(0); - floatScore = integralGlobal.getIntegral().intValue(); wxUserMember.setCredit(wxUserMember.getCredit() + integralGlobal.getIntegral().intValue()); // 保存积分详情 @@ -212,7 +227,7 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { wxUserIntegralLog.setCreateTime(DateUtils.getNowDate()); wxUserIntegralLogMapper.insertWxUserIntegralLog(wxUserIntegralLog); - // 2.4、用户注册成功发送消息 + // 2.4、用户升级会员成功发送消息 WxScriptMessage wxScriptMessage = wxScriptMessageMapper.selectOneByMessageType(MessageTypeEnum.COMPLETE_USER_INFORMATION.getCode()); if (wxScriptMessage != null) { WxUserScriptLog wxUserScriptLog = new WxUserScriptLog(); @@ -229,17 +244,32 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { wxUserScriptLog.setUpdateBy(null); wxUserScriptLogMapper.insertWxUserScriptLog(wxUserScriptLog); } - - // TODO: 首次完善,增加加分 (对接数云未完成) } BeanUtils.copyProperties(userMemberUpdateVo, wxUserMember); wxUserMember.setUpdateTime(DateUtils.getNowDate()); wxUserMemberMapper.updateWxUserMember(wxUserMember); - // 刷新用户信息 + // 首次完善用户信息,增加积分,刷新了缓存 LoginUserVo loginUserVo = refreshWxUserInfo(); + // TODO: 2、更新用户信息,同步到数云 (已完成,未保存记录) + // 1、完善用户信息 + ShuYunMember member = new ShuYunMember(); + member.setId(wxUserMember.getUnionid()); + member.setPlatCode(shuYunConfig.getPlatCode()); + member.setShopId(shuYunConfig.getShopId()); + member.setName(userMemberUpdateVo.getNickname()); + member.setBirthday(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, userMemberUpdateVo.getBirthday())); + ShuYunApiUtils.modifyMember(member); + if (isCompleteInformation) { - loginUserVo.setIntegralText("您已完善个人信息,获得" + floatScore + "积分"); + loginUserVo.setIntegralText("您已完善个人信息,获得" + integralGlobal.getIntegral().intValue() + "积分"); + // TODO: 3、首次完善,通知数云增加积分 (已完成,未保存记录) + // 2、完善会员信息增加积分 + String sequence = ShuYunConstants.POINT_SERIAL_NUMBER_PREFIX + LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.YYYYMMDDHHMMSSS)) + RandomUtil.randomInt(1000, 9999); + ShuYunPointChange shuYunPointChange = new ShuYunPointChange(wxUserMember.getUnionid(), shuYunConfig.getPlatCode(), shuYunConfig.getShopId(), + sequence, ShuYunPointSourceEnum.OTHER.getSource(), integralGlobal.getIntegral().intValue(), + LocalDateTime.now().format(DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS)), "首次完善用户信息"); + ShuYunApiUtils.pointChange(shuYunPointChange); } return loginUserVo; } @@ -250,7 +280,7 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { * @return */ @Override - @Transactional(propagation = Propagation.SUPPORTS) + @Transactional(propagation = Propagation.NOT_SUPPORTED) public LoginUserVo refreshWxUserInfo() { LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -266,6 +296,16 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { BeanUtils.copyProperties(wxUserMember, loginUserVo); loginUserVo.setToken(null); loginUserVo.setIntegralText(null); + // TODO:调用数云接口获取最新的积分值(已完成,未保存操作记录) + ShuYunMember shuYunMember = ShuYunApiUtils.queryMember(wxUserMember.getUnionid(), shuYunConfig.getPlatCode(), shuYunConfig.getShopId()); + loginUserVo.setCredit(Integer.valueOf(shuYunMember.getPoint())); + // TODO: 调用数云接口获取即将过期的积分值(未完成。。。。) + LocalDateTime now = LocalDateTime.now(); + String startTime = now.plusHours(1).format(DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS)); + String endTime = now.with(TemporalAdjusters.lastDayOfYear()).with(LocalTime.MAX).format(DateTimeFormatter.ofPattern(DateUtils.YYYY_MM_DD_HH_MM_SS)); + // tenant 租户名称 数云说写死 + Integer expireCredit = ShuYunApiUtils.pointWillDueSearch("zzsstest", wxUserMember.getUnionid(), "100000184001", "RELATIVE", startTime, endTime); + loginUserVo.setExpireCredit(expireCredit); // 刷新缓存信息 String userKey = CacheConstants.LOGIN_TOKEN_KEY + loginUser.getToken(); diff --git a/flossom-modules/flossom-mini-program/src/main/resources/lib/open-platform-sdk-1.0.1.jar b/flossom-modules/flossom-mini-program/src/main/resources/lib/open-platform-sdk-1.0.1.jar new file mode 100644 index 0000000..45e534e Binary files /dev/null and b/flossom-modules/flossom-mini-program/src/main/resources/lib/open-platform-sdk-1.0.1.jar differ