package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.AppContants;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.common.utils.MallUtils;
|
import cc.mrbird.febs.common.utils.RedisUtils;
|
import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
|
import cc.mrbird.febs.mall.dto.*;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.*;
|
import cc.mrbird.febs.mall.service.IApiMallAppService;
|
import cc.mrbird.febs.mall.vo.*;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.crypto.SecureUtil;
|
import cn.hutool.crypto.asymmetric.KeyType;
|
import cn.hutool.crypto.asymmetric.RSA;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class ApiMallAppServiceImpl extends ServiceImpl<MallAppMemberMapper, MallAppMember> implements IApiMallAppService {
|
|
private final RedisUtils redisUtils;
|
private final MallMemberMapper mallMemberMapper;
|
private final MallGoodsCategoryMapper mallGoodsCategoryMapper;
|
private final MallGoodsMapper mallGoodsMapper;
|
private final MallOrderInfoMapper mallOrderInfoMapper;
|
private final MallOrderItemMapper mallOrderItemMapper;
|
private final MallMemberWalletMapper mallMemberWalletMapper;
|
|
public static void main(String[] args) {
|
System.out.println(SecureUtil.md5("a123456"));
|
}
|
@Override
|
public FebsResponse appToLogin(LoginDto loginDto) {
|
String md5Pwd = SecureUtil.md5(loginDto.getPassword());
|
|
MallMember mallMember = mallMemberMapper.selectInfoByAccountAndPwd(loginDto.getAccount(), md5Pwd);
|
if (mallMember == null) {
|
throw new FebsException("用户不存在或账号密码错误");
|
}
|
|
String redisKey = AppContants.SY_APP_LOGIN_PREFIX + mallMember.getId();
|
String existToken = redisUtils.getString(redisKey);
|
if (StrUtil.isNotBlank(existToken)) {
|
Object o = redisUtils.get(existToken);
|
if (ObjectUtil.isNotEmpty(o)) {
|
redisUtils.del(existToken);
|
}
|
}
|
|
String token = IdUtil.simpleUUID();
|
redisUtils.set(token, JSONObject.toJSONString(mallMember));
|
redisUtils.set(redisKey, token);
|
Map<String, Object> authInfo = new HashMap<>();
|
authInfo.put("token", token);
|
authInfo.put("rasToken", generateAsaToken(token));
|
return new FebsResponse().success().data(authInfo);
|
}
|
|
@Override
|
public FebsResponse appMemberInfo(ApiMallAppMemberInfoDto apiMallAppMemberInfoDto) {
|
Long memberId = LoginUserUtil.getLoginUser().getId();
|
List<ApiMallAppMemberInfoVo> mallMembers = this.baseMapper.selectMemberInfoLikePhone(apiMallAppMemberInfoDto.getPhone());
|
return new FebsResponse().success().data(mallMembers);
|
}
|
|
@Override
|
public FebsResponse findAllCategoryList() {
|
List<MallGoodsCategoryVo> mallGoodsCategoryVos = mallGoodsCategoryMapper.selectAllCategoryListByIsApp(AppContants.IS_APP_CATEGORY);
|
return new FebsResponse().success().data(mallGoodsCategoryVos);
|
}
|
|
@Override
|
public FebsResponse findMallGoodsListNoPage(ApiMallGoodsQueryDto queryDto) {
|
List<ApiMallGoodsListVo> mallGoodsListVos = mallGoodsMapper.selectMallGoodsListQueryNoPageIsApp(queryDto);
|
return new FebsResponse().success().data(mallGoodsListVos);
|
}
|
|
@Override
|
@Transactional
|
public FebsResponse createAppOrder(ApiAddOrderDto addOrderDto) {
|
MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(addOrderDto.getMemberId());
|
if (ObjectUtil.isEmpty(mallMemberWallet)) {
|
throw new FebsException("用户钱包不存在。");
|
}
|
if (CollUtil.isEmpty(addOrderDto.getItems())) {
|
throw new FebsException("商品明细不能为空。");
|
}
|
Integer type = addOrderDto.getType();
|
String orderNo = MallUtils.getOrderNum();
|
MallOrderInfo orderInfo = new MallOrderInfo();
|
orderInfo.setOrderNo(orderNo);
|
orderInfo.setIsApp(AppContants.IS_APP_ORDER);
|
orderInfo.setOrderTime(new Date());
|
orderInfo.setMemberId(addOrderDto.getMemberId());
|
//会员结算
|
orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
|
mallOrderInfoMapper.insert(orderInfo);
|
BigDecimal total = BigDecimal.ZERO;//总支付金额
|
//订单子表记录
|
for (ApiAddOrderItemDto item : addOrderDto.getItems()) {
|
MallOrderItem orderItem = new MallOrderItem();
|
MallGoods mallGoods = mallGoodsMapper.selectById(item.getId());
|
//现价
|
BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
|
BigDecimal amount = presentPrice.multiply(item.getCnt());
|
orderItem.setAmount(amount);
|
orderItem.setOrderId(orderInfo.getId());
|
orderItem.setPrice(presentPrice);
|
orderItem.setAppCnt(item.getCnt());
|
orderItem.setGoodsId(mallGoods.getId());
|
orderItem.setGoodsName(mallGoods.getGoodsName());
|
orderItem.setSkuImage(mallGoods.getThumb());
|
orderItem.setState(1);
|
|
total = total.add(amount);
|
mallOrderItemMapper.insert(orderItem);
|
}
|
orderInfo.setAmount(total);
|
orderInfo.setMemberId(mallMemberWallet.getMemberId());
|
//折扣费用
|
if(AppContants.INSURE_ORDER_MEMBER.equals(type)){
|
BigDecimal score = mallMemberWallet.getScore();//积分
|
BigDecimal balance = mallMemberWallet.getBalance();//余额
|
|
//这里将运费定义成折扣总金额
|
/**
|
* 积分 + 余额 1:1来折扣支付金额
|
*/
|
BigDecimal totalCarriage = BigDecimal.ZERO;//总折扣金额
|
BigDecimal memberAmount = score.add(balance);//用户积分加余额总数
|
if(memberAmount.compareTo(BigDecimal.ZERO) > 0){
|
//折扣金额
|
if(total.compareTo(memberAmount) >= 0){
|
totalCarriage = memberAmount;
|
}else{
|
totalCarriage = total;
|
}
|
//减少用户积分和余额
|
|
BigDecimal avaAmount = totalCarriage;//剩余需要折扣的金额
|
if(avaAmount.compareTo(memberAmount) >= 0){
|
//清零用户的积分和余额
|
mallMemberWallet.setBalance(BigDecimal.ZERO);
|
mallMemberWallet.setScore(BigDecimal.ZERO);
|
mallMemberWalletMapper.updateBalanceScoreWithId(mallMemberWallet);
|
}else{
|
/**
|
* 先扣积分,再扣余额
|
*/
|
if(avaAmount.compareTo(score) >= 0){
|
mallMemberWallet.setScore(BigDecimal.ZERO);
|
avaAmount = avaAmount.subtract(score);
|
}else{
|
mallMemberWallet.setScore(score.subtract(avaAmount));
|
avaAmount = BigDecimal.ZERO;
|
}
|
//积分不够
|
if(avaAmount.compareTo(BigDecimal.ZERO) > 0){
|
mallMemberWallet.setBalance(balance.subtract(avaAmount));
|
}else{
|
mallMemberWallet.setBalance(balance);
|
}
|
mallMemberWalletMapper.updateBalanceScoreWithId(mallMemberWallet);
|
}
|
}
|
orderInfo.setCarriage(totalCarriage);
|
}
|
mallOrderInfoMapper.updateById(orderInfo);
|
Map<String, Object> orderInfoMap = new HashMap<>();
|
orderInfoMap.put("orderId", orderInfo.getId());
|
orderInfoMap.put("totalAmount", orderInfo.getAmount());
|
orderInfoMap.put("totalCarriage", orderInfo.getCarriage());
|
return new FebsResponse().success().data(orderInfoMap);
|
}
|
|
@Override
|
public FebsResponse registAppOrder(ApiRegistAppOrderDto addOrderDto) {
|
String orderNo = MallUtils.getOrderNum();
|
MallOrderInfo orderInfo = new MallOrderInfo();
|
orderInfo.setOrderNo(orderNo);
|
orderInfo.setIsApp(AppContants.IS_APP_ORDER);
|
orderInfo.setOrderTime(new Date());
|
orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
|
if (CollUtil.isEmpty(addOrderDto.getItems())) {
|
throw new FebsException("商品明细不能为空。");
|
}
|
mallOrderInfoMapper.insert(orderInfo);
|
BigDecimal total = BigDecimal.ZERO;//总支付金额
|
//订单子表记录
|
for (ApiAddOrderItemDto item : addOrderDto.getItems()) {
|
MallOrderItem orderItem = new MallOrderItem();
|
MallGoods mallGoods = mallGoodsMapper.selectById(item.getId());
|
//现价
|
BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
|
BigDecimal amount = presentPrice.multiply(item.getCnt());
|
orderItem.setAmount(amount);
|
orderItem.setOrderId(orderInfo.getId());
|
orderItem.setPrice(presentPrice);
|
orderItem.setAppCnt(item.getCnt());
|
orderItem.setGoodsId(mallGoods.getId());
|
orderItem.setGoodsName(mallGoods.getGoodsName());
|
orderItem.setSkuImage(mallGoods.getThumb());
|
orderItem.setState(1);
|
mallOrderItemMapper.insert(orderItem);
|
|
total = total.add(amount);
|
}
|
orderInfo.setAmount(total);
|
mallOrderInfoMapper.updateById(orderInfo);
|
return new FebsResponse().success().message("操作成功");
|
}
|
|
@Override
|
public FebsResponse normalInsure(ApiNormalInsureDto addOrderDto) {
|
String orderNo = MallUtils.getOrderNum();
|
MallOrderInfo orderInfo = new MallOrderInfo();
|
orderInfo.setOrderNo(orderNo);
|
orderInfo.setIsApp(AppContants.IS_APP_ORDER);
|
orderInfo.setOrderTime(new Date());
|
orderInfo.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
|
if (CollUtil.isEmpty(addOrderDto.getItems())) {
|
throw new FebsException("商品明细不能为空。");
|
}
|
mallOrderInfoMapper.insert(orderInfo);
|
BigDecimal total = BigDecimal.ZERO;//总支付金额
|
//订单子表记录
|
for (ApiAddOrderItemDto item : addOrderDto.getItems()) {
|
MallOrderItem orderItem = new MallOrderItem();
|
MallGoods mallGoods = mallGoodsMapper.selectById(item.getId());
|
//现价
|
BigDecimal presentPrice = new BigDecimal(mallGoods.getPresentPrice());
|
BigDecimal amount = presentPrice.multiply(item.getCnt());
|
orderItem.setAmount(amount);
|
orderItem.setOrderId(orderInfo.getId());
|
orderItem.setPrice(presentPrice);
|
orderItem.setAppCnt(item.getCnt());
|
orderItem.setGoodsId(mallGoods.getId());
|
orderItem.setGoodsName(mallGoods.getGoodsName());
|
orderItem.setSkuImage(mallGoods.getThumb());
|
orderItem.setState(1);
|
|
total = total.add(amount);
|
mallOrderItemMapper.insert(orderItem);
|
}
|
orderInfo.setCarriage(BigDecimal.ZERO);//折扣费用
|
orderInfo.setAmount(total);
|
mallOrderInfoMapper.updateById(orderInfo);
|
Map<String, Object> orderInfoMap = new HashMap<>();
|
orderInfoMap.put("orderId", orderInfo.getId());
|
orderInfoMap.put("totalAmount", orderInfo.getAmount());
|
orderInfoMap.put("totalCarriage", orderInfo.getCarriage());
|
return new FebsResponse().success().data(orderInfoMap);
|
}
|
|
@Override
|
public FebsResponse getOrderList(ApiGetOrderListDto orderListDto) {
|
IPage<ApiGetOrderListVo> page = new Page<>(orderListDto.getPageNum(), orderListDto.getPageSize());
|
orderListDto.setStatus(OrderStatusEnum.WAIT_PAY.getValue());
|
IPage<ApiGetOrderListVo> apiGetOrderListVos = mallOrderInfoMapper.getAppOrderListInPage(page, orderListDto);
|
if (CollUtil.isNotEmpty(apiGetOrderListVos.getRecords())) {
|
apiGetOrderListVos.getRecords().forEach(item -> {
|
item.setItems(mallOrderItemMapper.getAppOrderItemByOrderId(item.getId()));
|
});
|
}
|
return new FebsResponse().success().data(apiGetOrderListVos);
|
}
|
|
@Override
|
public FebsResponse getOrder(ApiGetOrderDto apiGetOrderDto) {
|
ApiGetOrderListVo apiGetOrderListVo = mallOrderInfoMapper.getAppOrderByOrderId(apiGetOrderDto.getOrderId());
|
if(ObjectUtil.isNotEmpty(apiGetOrderListVo)){
|
apiGetOrderListVo.setItems(mallOrderItemMapper.getAppOrderItemByOrderId(apiGetOrderListVo.getId()));
|
}
|
return new FebsResponse().success().data(apiGetOrderListVo);
|
}
|
|
public String generateAsaToken(String token) {
|
RSA rsa = new RSA(null, AppContants.PUBLIC_KEY);
|
return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey);
|
}
|
|
}
|