From b3a60ae2f32f9ef251ecb5f3630472dfd648a11a Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Fri, 29 Nov 2024 15:00:49 +0800
Subject: [PATCH] refactor(mall): 优化退款金额计算逻辑
---
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 347 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 317 insertions(+), 30 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index 0e4af18..eb90623 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -1,15 +1,16 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.entity.FebsResponse;
-import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
+import cc.mrbird.febs.common.enumerates.ScoreFlowTypeEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.properties.XcxProperties;
import cc.mrbird.febs.common.utils.*;
import cc.mrbird.febs.mall.conversion.MallMemberConversion;
import cc.mrbird.febs.mall.conversion.MallShopApplyConversion;
+import cc.mrbird.febs.mall.conversion.MallStoreConversion;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
@@ -17,8 +18,13 @@
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
import cc.mrbird.febs.pay.service.IXcxPayService;
+import cc.mrbird.febs.pay.util.MD5;
+import cc.mrbird.febs.vip.VipSettingUnAliveSettingBo;
+import cc.mrbird.febs.vip.entity.MallVipConfig;
+import cc.mrbird.febs.vip.mapper.MallVipConfigMapper;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -26,6 +32,7 @@
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
+import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -36,14 +43,13 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.security.SecurityProperties;
-import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
+import java.util.stream.Collectors;
/**
* @author wzy
@@ -77,6 +83,11 @@
private final MallMemberCouponMapper mallMemberCouponMapper;
private final MallGoodsMapper mallGoodsMapper;
+ private final MallVipConfigMapper mallVipConfigMapper;
+ private final MallStoreMapper mallStoreMapper;
+ private final MallStoreItemMapper mallStoreItemMapper;
+ private final MallStoreMemberMapper mallStoreMemberMapper;
+
@Value("${spring.profiles.active}")
private String active;
@@ -84,20 +95,21 @@
@Transactional(rollbackFor = Exception.class)
@Override
public FebsResponse register(RegisterDto registerDto) {
- MallMember mallMember = this.baseMapper.selectInfoByAccount(registerDto.getAccount());
- if (mallMember != null) {
- throw new FebsException("该账号已被占用");
- }
-
- List<MallMember> mallMembers = this.baseMapper.selectMemberByName(registerDto.getName());
- if (CollUtil.isNotEmpty(mallMembers)) {
- MallRegisterAppeal registerAppeal = mallRegisterAppealMapper.selectByPhoneAndName(registerDto.getName(), registerDto.getAccount());
- if (registerAppeal == null || registerAppeal.getStatus() != 1) {
- return new FebsResponse().code(HttpStatus.ACCEPTED).message("用户名已存在");
- }
- }
-
String account = registerDto.getAccount();
+ MallMember mallMember = this.baseMapper.selectInfoByAccount(account);
+ if (mallMember != null) {
+ throw new FebsException("手机号已注册");
+ }
+ /**
+ * 验证两次密码是否一致
+ */
+ String password = registerDto.getPassword();
+ String passwordAgain = registerDto.getPasswordAgain();
+ if(!password.equals(passwordAgain)){
+ throw new FebsException("密码不一致");
+ }
+
+ //邀请码为admin的时候(后台添加用户),不需要验证验证码
if (!"admin".equals(registerDto.getRegistType())) {
String code = registerDto.getCode();
boolean flags = commonService.verifyCode(account, code);
@@ -115,23 +127,23 @@
} else {
mallMember.setEmail(registerDto.getAccount());
}
-
+ //对于邀请码的验证和上级联系人的验证
Integer count = this.baseMapper.selectCount(null);
if (count != null && count != 0) {
- MallMember inviteMember = this.baseMapper.selectInfoByInviteId(registerDto.getInviteId());
- if (inviteMember == null) {
- throw new FebsException("邀请码不存在");
+ if(!StrUtil.isEmpty(registerDto.getInviteId())){
+ String inviteId = registerDto.getInviteId();
+ MallMember inviteMember = this.baseMapper.selectInfoByInviteId(inviteId);
+ if (inviteMember == null) {
+ throw new FebsException("邀请码不存在");
+ }
+ mallMember.setReferrerId(registerDto.getInviteId());
}
-
- mallMember.setReferrerId(registerDto.getInviteId());
-
}
- mallMember.setName(registerDto.getName());
+ mallMember.setName(account);
mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
- mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name());
mallMember.setSex("男");
- mallMember.setBindPhone(registerDto.getAccount());
+ mallMember.setBindPhone(account);
this.baseMapper.insert(mallMember);
@@ -163,6 +175,12 @@
if (StrUtil.isNotBlank(ids)) {
mallMember.setReferrerIds(ids);
+ }
+ //会员VIP等级
+ List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList();
+ if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(configs)) {
+ MallVipConfig mallVipConfig = configs.get(0);
+ mallMember.setLevel(mallVipConfig.getCode());
}
this.baseMapper.updateById(mallMember);
@@ -285,9 +303,13 @@
mallMemberVo.setChildCnt(CollUtil.isNotEmpty(mallMembers) ? mallMembers.size() : 0);
MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId());
+
+ MallVipConfig mallVipConfig = mallVipConfigMapper.selectVipConfigByCode(mallMember.getLevel());
+
+ mallMemberVo.setVipInfo(mallVipConfig);
mallMemberVo.setBalance(wallet.getBalance());
// mallMemberVo.setScore(wallet.getScore());
-// mallMemberVo.setPrizeScore(wallet.getPrizeScore());
+ mallMemberVo.setPrizeScore(wallet.getPrizeScore());
// mallMemberVo.setTotalCost(mallOrderInfoMapper.selectTotalAmount(id));
return new FebsResponse().success().data(mallMemberVo);
}
@@ -377,6 +399,12 @@
Long id = LoginUserUtil.getLoginUser().getId();
moneyFlowDto.setMemberId(id);
IPage<MoneyFlowVo> pages = mallMoneyFlowMapper.selectApiMoneyFlowInPage(page, moneyFlowDto);
+
+ if (moneyFlowDto.getFlowType() == 3) {
+ pages.getRecords().forEach(item -> {
+ item.setDescription(ScoreFlowTypeEnum.getDescByValue(item.getType()));
+ });
+ }
return new FebsResponse().success().data(pages);
}
@@ -609,7 +637,6 @@
mallMember = new MallMember();
mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
- mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name());
mallMember.setOpenId(openId);
mallMember.setSessionKey(sessionKey);
@@ -711,6 +738,13 @@
if (apiXcxSaveInfoDto.getBirthday() != null) {
mallMember.setBirthday(apiXcxSaveInfoDto.getBirthday());
}
+
+ List<MallVipConfig> configs = mallVipConfigMapper.selectVipConfigList();
+ if (StrUtil.isBlank(mallMember.getLevel()) && CollUtil.isNotEmpty(configs)) {
+ MallVipConfig mallVipConfig = configs.get(0);
+ mallMember.setLevel(mallVipConfig.getCode());
+ }
+
mallMember.setSex(1 == apiXcxSaveInfoDto.getGender() ? "女" : "男");
this.baseMapper.updateById(mallMember);
return new FebsResponse().success();
@@ -731,7 +765,6 @@
mallMember.setPhone(phone);
mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
- mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name());
this.baseMapper.insert(mallMember);
String inviteId = ShareCodeUtil.toSerialCode(mallMember.getId());
@@ -986,7 +1019,10 @@
Long memberId = LoginUserUtil.getLoginUser().getId();
mallMemberCouponDto.setMemberId(memberId);
mallMemberCouponDto.setExpireTime(DateUtil.date());
- List<Long> couponIds = couponGoodsMapper.selectByGoodId(mallMemberCouponDto.getGoodsId());
+// List<Long> couponIds = couponGoodsMapper.selectByGoodId(mallMemberCouponDto.getGoodsId());
+ List<Long> goodsIdList = mallMemberCouponDto.getGoodsIdList();
+ List<Long> couponIds = couponGoodsMapper.selectByGoodIdList(goodsIdList);
+
List<MallMemberCouponVo> mallMemberCouponVos = new ArrayList<>();
if(CollUtil.isNotEmpty(couponIds)){
mallMemberCouponVos = mallMemberCouponMapper.selectListCreateInPage(mallMemberCouponDto,couponIds);
@@ -1060,4 +1096,255 @@
String wechatLoginUrl =xcxProperties.getWecharLoginUrl();
return String.format(wechatLoginUrl, xcxProperties.getXcxAppid(), xcxProperties.getXcxSecret(), code);
}
+
+ @Override
+ public Map<String, Object> loginEvent() {
+ MallMember loginUser = LoginUserUtil.getLoginUser();
+
+ MallMember member = this.baseMapper.selectById(loginUser.getId());
+
+ MallMember mallMember = new MallMember();
+ mallMember.setId(member.getId());
+ mallMember.setLastLoginTime(new Date());
+ this.baseMapper.updateById(mallMember);
+
+ DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNALIVE_COUPON.getType(), DataDictionaryEnum.UNALIVE_COUPON.getCode());
+ if (dic == null || StrUtil.isBlank(dic.getValue())) {
+ return new HashMap<>();
+ }
+
+ Date today = new Date();
+ Date lastLoginTime = member.getLastLoginTime();
+ if (lastLoginTime == null) {
+ lastLoginTime = new Date();
+ }
+
+ long days = DateUtil.between(DateUtil.endOfDay(lastLoginTime), DateUtil.endOfDay(today), DateUnit.DAY);
+
+ List<VipSettingUnAliveSettingBo> list = JSONObject.parseArray(dic.getValue(), VipSettingUnAliveSettingBo.class);
+ List<Long> couponIds = list.stream().filter(item -> {
+ return item.getDay() <= days && item.getCouponId() != null;
+ }).map(VipSettingUnAliveSettingBo::getCouponId).collect(Collectors.toList());
+ if (CollUtil.isEmpty(couponIds)) {
+ return new HashMap<>();
+ }
+
+ LambdaQueryWrapper<MallGoodsCoupon> query = new LambdaQueryWrapper<>();
+ query.in(MallGoodsCoupon::getId, couponIds)
+ .eq(MallGoodsCoupon::getState, 2);
+ List<MallGoodsCoupon> coupons = mallGoodsCouponMapper.selectList(query);
+
+ LambdaQueryWrapper<MallMemberCoupon> memberCouponQuery = new LambdaQueryWrapper<>();
+ memberCouponQuery.in(MallMemberCoupon::getCouponId, couponIds)
+ .eq(MallMemberCoupon::getMemberId, member.getId())
+ .eq(MallMemberCoupon::getFromType, 3)
+ .ge(MallMemberCoupon::getCreatedTime, DateUtil.beginOfDay(new Date()))
+ .le(MallMemberCoupon::getCreatedTime, DateUtil.endOfDay(new Date()));
+ List<MallMemberCoupon> mallMemberCoupons = mallMemberCouponMapper.selectList(memberCouponQuery);
+ if (CollUtil.isNotEmpty(mallMemberCoupons)) {
+ Map<Long, MallMemberCoupon> map = mallMemberCoupons.stream().collect(Collectors.toMap(MallMemberCoupon::getCouponId, MallMemberCoupon -> MallMemberCoupon));
+ coupons = coupons.stream().filter(item -> {
+ return map.get(item.getId()) == null;
+ }).collect(Collectors.toList());
+ }
+
+ if (CollUtil.isEmpty(coupons)) {
+ return new HashMap<>();
+ }
+
+ coupons.forEach(item -> {
+ MallMemberCoupon memberCoupon = new MallMemberCoupon();
+ memberCoupon.setCouponId(item.getId());
+ memberCoupon.setCouponName(item.getName());
+ memberCoupon.setInviteId(member.getInviteId());
+ memberCoupon.setCouponUuid(IdUtil.simpleUUID());
+ memberCoupon.setState(1);
+ memberCoupon.setFromType(3);
+ memberCoupon.setExpireTime(DateUtil.offsetDay(DateUtil.date(), item.getExpireDay()));
+ memberCoupon.setMemberId(member.getId());
+ mallMemberCouponMapper.insert(memberCoupon);
+ });
+
+ Map<String, Object> result = new HashMap<>();
+ result.put("coupon", coupons);
+ return result;
+ }
+
+ @Override
+ public FebsResponse storeList(MallStoreDto mallStoreDto) {
+ QueryWrapper<MallStore> mallStoreQueryWrapper = new QueryWrapper<>();
+ if(StrUtil.isNotEmpty(mallStoreDto.getName())){
+ mallStoreQueryWrapper.like("name",mallStoreDto.getName());
+ }
+ List<MallStore> mallStores = mallStoreMapper.selectList(mallStoreQueryWrapper);
+ List<MallStoreVo> mallStoreVos = MallStoreConversion.INSTANCE.entitysToVos(mallStores);
+ return new FebsResponse().success().data(mallStoreVos);
+ }
+
+ @Override
+ public FebsResponse storeItemList(MallStoreItemDto mallStoreItemDto) {
+ QueryWrapper<MallStoreItem> mallStoreQueryWrapper = new QueryWrapper<>();
+ mallStoreQueryWrapper.like("store_id",mallStoreItemDto.getStoreId());
+ List<MallStoreItem> mallStores = mallStoreItemMapper.selectList(mallStoreQueryWrapper);
+ return new FebsResponse().success().data(mallStores);
+ }
+
+ @Override
+ public FebsResponse bindStoreMember(BindStoreMemberDto bindStoreMemberDto) {
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+ Long storeItemId = bindStoreMemberDto.getStoreItemId();
+
+ QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>();
+ objectQueryWrapper.eq("member_id",memberId);
+ List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper);
+ if(CollUtil.isNotEmpty(mallStoreMembers)){
+ mallStoreMemberMapper.delete(objectQueryWrapper);
+ }
+
+ MallMember mallMember = this.baseMapper.selectById(memberId);
+ Integer sex = "女".equals(mallMember.getSex()) ? 3 : 2;
+
+ MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId);
+ HashMap<String, String> objectObjectHashMap = new HashMap<>();
+ String shopAccount = mallStoreItem.getAccount();
+ String shopPwd = mallStoreItem.getPassword();
+ String name = bindStoreMemberDto.getName();
+ String address = bindStoreMemberDto.getAddress();
+ Integer age = bindStoreMemberDto.getAge();
+ String phoneNumber = bindStoreMemberDto.getPhone();
+
+ objectObjectHashMap.put("shopAccount",shopAccount);
+ objectObjectHashMap.put("shopPwd",shopPwd);
+ objectObjectHashMap.put("name",name);
+ objectObjectHashMap.put("address",address);
+ objectObjectHashMap.put("age",age.toString());
+ objectObjectHashMap.put("phoneNumber",phoneNumber);
+ objectObjectHashMap.put("sex",sex.toString());
+
+ //sign= MD5(address+age+name+phoneNumber+shopAccount+shopPwd)
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append(address);
+ stringBuffer.append(age);
+ stringBuffer.append(name);
+ stringBuffer.append(phoneNumber);
+ stringBuffer.append(sex);
+ stringBuffer.append(shopAccount);
+ stringBuffer.append(shopPwd);
+ String sign = MD5.MD5Encode(stringBuffer.toString());
+ objectObjectHashMap.put("sign",sign);
+ String url = "https://data.muchun.co/api/bindCustomer";
+ String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
+ Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
+ String message = JSONUtil.parseObj(result).getStr("message");
+ if(0 != retCode || !"绑定成功".equals(message)){
+ return new FebsResponse().fail().message(message);
+ }
+ Long bindId = JSONUtil.parseObj(result).getJSONObject("data").getLong("userId");
+
+ MallStoreMember mallStoreMember = new MallStoreMember();
+ mallStoreMember.setMemberId(memberId);
+ mallStoreMember.setBindId(bindId);
+ mallStoreMember.setStoreId(mallStoreItem.getStoreId());
+ mallStoreMember.setStoreItemId(mallStoreItem.getId());
+
+ mallStoreMember.setAccount(shopAccount);
+ mallStoreMember.setPassword(shopPwd);
+
+ mallStoreMember.setName(name);
+ mallStoreMember.setAddress(address);
+ mallStoreMember.setAge(age);
+ mallStoreMember.setPhone(phoneNumber);
+ mallStoreMemberMapper.insert(mallStoreMember);
+ return new FebsResponse().success().message("绑定成功");
+ }
+
+ @Override
+ public FebsResponse bindList() {
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+ QueryWrapper<MallStoreMember> objectQueryWrapper = new QueryWrapper<>();
+ objectQueryWrapper.eq("member_id",memberId);
+ List<MallStoreMember> mallStoreMembers = mallStoreMemberMapper.selectList(objectQueryWrapper);
+
+ ArrayList<MallStoreMemberVo> mallStoreMemberVos = new ArrayList<>();
+ for(MallStoreMember mallStoreMember : mallStoreMembers){
+ MallStoreMemberVo mallStoreMemberVo = new MallStoreMemberVo();
+ Long storeId = mallStoreMember.getStoreId();
+ Long storeItemId = mallStoreMember.getStoreItemId();
+ MallStore mallStore = mallStoreMapper.selectById(storeId);
+ MallStoreItem mallStoreItem = mallStoreItemMapper.selectById(storeItemId);
+ mallStoreMemberVo.setId(mallStoreMember.getId());
+ mallStoreMemberVo.setBindInfo(mallStore.getName()+"-"+mallStoreItem.getCode());
+ mallStoreMemberVos.add(mallStoreMemberVo);
+ }
+ return new FebsResponse().success().data(mallStoreMemberVos);
+ }
+
+ @Override
+ public FebsResponse bindResult(BindResultDto bindResultDto) {
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+ MallStoreMember mallStoreMember = mallStoreMemberMapper.selectById(bindResultDto.getBindId());
+ Long userld = mallStoreMember.getBindId();
+ String shopAccount = mallStoreMember.getAccount();
+ String shopPwd = mallStoreMember.getPassword();
+
+ HashMap<String, String> objectObjectHashMap = new HashMap<>();
+
+ objectObjectHashMap.put("shopAccount",shopAccount);
+ objectObjectHashMap.put("shopPwd",shopPwd);
+ objectObjectHashMap.put("userId",userld.toString());
+
+ //sign= MD5(shopAccount+shopPwd+userId)
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append(shopAccount);
+ stringBuffer.append(shopPwd);
+ stringBuffer.append(userld);
+ String sign = MD5.MD5Encode(stringBuffer.toString());
+ objectObjectHashMap.put("sign",sign);
+
+ String url = "https://data.muchun.co/api/getCustomerCheckRecords";
+ String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
+ Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
+ String message = JSONUtil.parseObj(result).getStr("message");
+ if(0 != retCode){
+ return new FebsResponse().fail().message(message);
+ }
+ JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
+ return new FebsResponse().success().data(data);
+ }
+
+ public static void main(String[] args) {
+ Long userld = 173L;
+ String shopAccount = "luohu";
+ String shopPwd = "123456";
+
+ HashMap<String, String> objectObjectHashMap = new HashMap<>();
+
+ objectObjectHashMap.put("shopAccount",shopAccount);
+ objectObjectHashMap.put("shopPwd",shopPwd);
+ objectObjectHashMap.put("userId",userld.toString());
+
+ //sign= MD5(shopAccount+shopPwd+userId)
+ StringBuffer stringBuffer = new StringBuffer();
+ stringBuffer.append(shopAccount);
+ stringBuffer.append(shopPwd);
+ stringBuffer.append(userld);
+ String sign = MD5.MD5Encode(stringBuffer.toString());
+ objectObjectHashMap.put("sign",sign);
+
+ System.out.println(sign);
+
+ System.out.println(objectObjectHashMap);
+ String url = "https://data.muchun.co/api/getCustomerCheckRecords";
+ String result = HttpCurlUtil.sendPost(url, objectObjectHashMap);
+ Integer retCode = JSONUtil.parseObj(result).getInt("retCode");
+ String message = JSONUtil.parseObj(result).getStr("message");
+ if(0 != retCode){
+ System.out.println(message);
+ }
+
+ JSONArray data = JSONUtil.parseObj(result).getJSONArray("data");
+ System.out.println(data);
+ }
+
+
}
--
Gitblit v1.9.1