| | |
| | | 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.MallAppMember; |
| | | import cc.mrbird.febs.mall.entity.MallMember; |
| | | import cc.mrbird.febs.mall.mapper.MallAppMemberMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallGoodsMapper; |
| | | import cc.mrbird.febs.mall.mapper.MallMemberMapper; |
| | | 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.ApiMallAppMemberInfoVo; |
| | | import cc.mrbird.febs.mall.vo.ApiMallGoodsListVo; |
| | | import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo; |
| | | import cc.mrbird.febs.mall.vo.MallGoodsListVo; |
| | | 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.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; |
| | |
| | | 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()); |
| | |
| | | } |
| | | |
| | | @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); |
| | | |
| | | // return new FebsResponse().success().data(orderId).message("创建订单成功"); |
| | | return new FebsResponse().success().message("创建订单成功"); |
| | | 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) { |