From 70d2a5d0f9c6951b2d4cac954041ed73582ff7eb Mon Sep 17 00:00:00 2001 From: liujie <1793218484@qq.com> Date: 星期一, 09 六月 2025 11:54:00 +0800 Subject: [PATCH] 6.9新增登录失败冻结逻辑 --- springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderBargainServiceImpl.java | 318 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 316 insertions(+), 2 deletions(-) diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderBargainServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderBargainServiceImpl.java index 9be493e..dee84a8 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderBargainServiceImpl.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComBatteryCommodityOrderBargainServiceImpl.java @@ -1,14 +1,30 @@ package com.panzhihua.service_community.service.impl; -import com.panzhihua.service_community.entity.ComBatteryCommodityOrderBargain; -import com.panzhihua.service_community.dao.ComBatteryCommodityOrderBargainMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.panzhihua.common.constants.PayCpmstant; +import com.panzhihua.common.model.vos.common.ComBatteryCommodityOrderBargainRecordVo; +import com.panzhihua.common.model.vos.common.ComBatteryCommodityOrderBargainVo; +import com.panzhihua.common.utlis.DateUtils; +import com.panzhihua.common.utlis.MathUtils; +import com.panzhihua.common.utlis.Snowflake; +import com.panzhihua.common.utlis.WxPayUtils; +import com.panzhihua.service_community.dao.*; +import com.panzhihua.service_community.entity.*; import com.panzhihua.service_community.service.ComBatteryCommodityOrderBargainService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.panzhihua.service_community.service.ComBatteryTradeOrderService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import com.panzhihua.common.model.dtos.common.*; import com.panzhihua.common.model.vos.R; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.*; /** * title: 电动车商城-砍价订单记录表表服务实现类 @@ -20,8 +36,36 @@ * @author lyq * @date 2022-03-29 16:06:35 */ +@Slf4j @Service("comBatteryCommodityOrderBargainService") public class ComBatteryCommodityOrderBargainServiceImpl extends ServiceImpl<ComBatteryCommodityOrderBargainMapper, ComBatteryCommodityOrderBargain> implements ComBatteryCommodityOrderBargainService { + + @Resource + private ComBatteryCommodityActivityMapper commodityActivityMapper; + @Resource + private ComBatteryUserAddressMapper userAddressMapper; + @Resource + private SysUserMapper userMapper; + @Resource + private ComBatteryTradeOrderService tradeOrderService; + @Resource + private ComBatteryCommodityMapper commodityMapper; + @Resource + private ComBatteryCommoditySpecsMapper commoditySpecsMapper; + @Resource + private ComBatteryCommodityOrderMapper commodityOrderMapper; + @Resource + private ComBatteryCommodityOrderBargainRecordMapper orderBargainRecordMapper; + @Value("${min.app.isTest}") + private Boolean isTest; + @Value("${min.app.appid}") + private String appid; + @Value("${min.app.payKey}") + private String payKey; + @Value("${min.app.mchId}") + private String mchId; +// @Value("${min.app.currencyNotifyUrl}") +// private String currencyNotifyUrl; /** * description queryByPage 分页查询 @@ -116,4 +160,274 @@ public R queryByList(PageComBatteryCommodityOrderBargainDto comBatteryCommodityOrderBargain) { return R.ok(this.baseMapper.queryAllByList(comBatteryCommodityOrderBargain)); } + + /** + * 创建砍价订单 + * @param orderDto 请求参数 + * @return 创建订单结果 + */ + @Override + public R startBargain(StartBargainOrderDto orderDto) { + ComBatteryCommodityActivity commodityActivity = commodityActivityMapper.selectById(orderDto.getActivityId()); + if(commodityActivity == null){ + return R.fail("未查询到砍价活动"); + } + if(commodityActivity.getEndTime().getTime() - System.currentTimeMillis() <= 0 + || commodityActivity.getStatus().equals(ComBatteryCommodityActivity.Status.YJS)){ + return R.fail("该活动已结束"); + } + if(commodityActivity.getStatus().equals(ComBatteryCommodityActivity.Status.YXJ)){ + return R.fail("该活动已下架"); + } + if(commodityActivity.getCommodityNum() <= commodityActivity.getCommoditySaleNum()){ + return R.fail("活动商品已售空"); + } + Integer notSaleNum = commodityActivity.getCommodityNum() - commodityActivity.getCommoditySaleNum(); + if(notSaleNum <= orderDto.getCount()){ + return R.fail("活动商品库存不足"); + } + //查询商品 + ComBatteryCommodity commodity = commodityMapper.selectById(orderDto.getCommodityId()); + if(commodity == null){ + return R.fail("未查询到商品信息"); + } + //查询商品规格信息 + ComBatteryCommoditySpecs commoditySpecs = commoditySpecsMapper.selectById(commodityActivity.getSpecsId()); + if(commoditySpecs == null){ + return R.fail("未查询到商品规格信息"); + } + if(commoditySpecs.getStock() < orderDto.getCount()){ + return R.fail("该商品库存不足,无法下单"); + } + //查询用户信息 + SysUser user = userMapper.selectOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getUserId,orderDto.getUserId())); + if(user == null){ + return R.fail("未查询到用户信息"); + } + //查询用户收货地址 + ComBatteryUserAddress userAddress = userAddressMapper.selectById(orderDto.getAddressId()); + if(userAddress == null){ + return R.fail("未查询到用户收货地址"); + } + Date nowDate = new Date(); + //初始化订单数据 + Integer count = commodityOrderMapper.selectCount(new QueryWrapper<ComBatteryCommodityOrder>() + .lambda().eq(ComBatteryCommodityOrder::getStatus,ComBatteryCommodityOrder.Status.DKJ) + .eq(ComBatteryCommodityOrder::getBargainStatus,ComBatteryCommodityOrder.BargainStatus.KJZ) + .eq(ComBatteryCommodityOrder::getIsDel,ComBatteryCommodityOrder.IsDel.NO) + .eq(ComBatteryCommodityOrder::getActivityId,orderDto.getActivityId()) + .eq(ComBatteryCommodityOrder::getUserId,orderDto.getUserId())); + if(count > 0){ + return R.fail("您已存在正在砍价中的订单,不可再发起砍价订单"); + } + ComBatteryCommodityOrder commodityOrder = getCreateOrder(commodity,userAddress,user,commoditySpecs,orderDto,nowDate,commodityActivity); + Map<String,Object> resultMap = new HashMap<>(2); + if(commodityOrderMapper.insert(commodityOrder) > 0){ + //更新活动商品库存 + commodityActivity.setCommoditySaleNum(commodityActivity.getCommoditySaleNum() + orderDto.getCount()); + commodityActivityMapper.updateById(commodityActivity); + //更新商品库存 + commoditySpecs.setStock(commoditySpecs.getStock() - orderDto.getCount()); + commoditySpecsMapper.updateById(commoditySpecs); + //微信支付需要调取小程序微信支付 + String result = getWxPayResult(commodityOrder.getFinalAmount(),commodityOrder.getOpenId() + ,commodityOrder.getOrderNo(),"购买商品",null); + resultMap.put("payResult",result); + resultMap.put("orderId",commodityOrder.getId()); + // 添加微信支付交易流水 + String wxTradeOrderNo = "wx" + Snowflake.getId(); + tradeOrderService.addOrderTradeRecord(user.getUserId(), user.getOpenid(), wxTradeOrderNo, ComBatteryTradeOrder.PayType.WX, + commodityOrder.getFinalAmount(), ComBatteryTradeOrder.TradeType.DDC_SHOP, commodityOrder.getId(), + commodityOrder.getOrderNo(), user.getUserId(), nowDate); + } + return R.ok(resultMap); + } + + + /** + * 初始化订单数据 + * @param commodity 商品数据 + * @param userAddress 用户收货地址信息 + * @param user 用户数据 + * @param commoditySpecs 商品规格数据 + * @param orderDto 用户请求参数 + * @param nowDate 操作时间 + * @param commodityActivity 拼团活动数据 + * @return 初始化订单数据 + */ + public static ComBatteryCommodityOrder getCreateOrder(ComBatteryCommodity commodity, ComBatteryUserAddress userAddress + , SysUser user, ComBatteryCommoditySpecs commoditySpecs, StartBargainOrderDto orderDto, Date nowDate + ,ComBatteryCommodityActivity commodityActivity){ + ComBatteryCommodityOrder commodityOrder = new ComBatteryCommodityOrder(); + commodityOrder.setUserId(user.getUserId()); + commodityOrder.setOpenId(user.getOpenid()); + commodityOrder.setStoreId(commodity.getStoreId()); + commodityOrder.setActivityId(commodityActivity.getId()); + commodityOrder.setCommodityId(commodity.getId()); + commodityOrder.setSpecsId(commoditySpecs.getId()); + commodityOrder.setOrderNo("KJ" + Snowflake.getId()); + commodityOrder.setActivityType(commodityActivity.getType()); + commodityOrder.setStatus(ComBatteryCommodityOrder.Status.DFK); + commodityOrder.setPayStatus(ComBatteryCommodityOrder.PayStatus.WZF); + commodityOrder.setIsDel(ComBatteryCommodityOrder.IsDel.NO); + commodityOrder.setPayType(ComBatteryCommodityOrder.PayType.WX); + commodityOrder.setCount(orderDto.getCount()); + commodityOrder.setPrice(commodityActivity.getPrice()); + commodityOrder.setAmount(commodityActivity.getPrice().multiply(BigDecimal.valueOf(orderDto.getCount()))); + commodityOrder.setFreight(commodity.getPostage()); + commodityOrder.setFinalAmount(commodityOrder.getAmount().add(commodityOrder.getFreight())); + commodityOrder.setCreateAt(nowDate); + commodityOrder.setCreateBy(user.getUserId()); + commodityOrder.setRemark(orderDto.getRemark()); + //收货地址 + commodityOrder.setAddressId(userAddress.getId()); + commodityOrder.setReceivingName(userAddress.getName()); + commodityOrder.setReceivingPhone(userAddress.getPhone()); + commodityOrder.setReceivingRegionCode(userAddress.getProvinceAdcode() + "-" + userAddress.getCityAdcode() + "-" + userAddress.getDistrictAdcode()); + commodityOrder.setReceivingRegion(userAddress.getProvinceName() + userAddress.getCityName() + userAddress.getDistrictName()); + commodityOrder.setReceivingAddress(userAddress.getAddress()); + return commodityOrder; + } + + /** + * 小程序唤起微信支付 + * + * @param money + * 需要支付的金额 + * @param openId + * 用户唤起微信支付的openid + * @param orderNo + * 业务订单号 + * @param remark + * 交易备注 + * @return 小程序支付参数 + */ + private String getWxPayResult(BigDecimal money, String openId, String orderNo, String remark,String type) { + String result = ""; + // 将剩余金额调起微信支付 + if (isTest) { + money = BigDecimal.valueOf(0.01); + } + // 调用wx支付 +// result = WxPayUtils.getUnifiedorder(appid, mchId, payKey, currencyNotifyUrl + PayCpmstant.BATTERY_STORE_ACTIVITY_PAY_NOTIFY_URL +// , remark, openId, orderNo, money,type); + log.info("用户购买商品微信支付返回参数:" + result); + return result; + } + + /** + * 帮好友砍价 + * @param orderDto 请求参数 + * @return 创建订单结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public synchronized R startUserBargain(StartUserBargainOrderDto orderDto) { + //查询砍价记录 + ComBatteryCommodityOrderBargain orderBargain = this.baseMapper.selectById(orderDto.getBargainId()); + if(orderBargain == null){ + return R.fail("未查询到用户砍价记录"); + } + if(orderBargain.getUserId().equals(orderDto.getUserId())){ + return R.fail("您不可砍自己的订单"); + } + //查询砍价订单 + ComBatteryCommodityOrder commodityOrder = commodityOrderMapper.selectById(orderBargain.getOrderId()); + if(commodityOrder == null){ + return R.fail("未查询到砍价订单"); + } + Date nowDate = new Date(); + //判断当前砍价订单的截止时间是否已结束 + Date deadline = DateUtils.addDay(commodityOrder.getCreateAt(),1); + if(DateUtils.dateCompare(deadline,nowDate) == -1){ + return R.fail("该订单已超过砍价截止时间"); + } + //查询砍价活动 + ComBatteryCommodityActivity commodityActivity = commodityActivityMapper.selectById(commodityOrder.getActivityId()); + if(commodityActivity != null){ + if(DateUtils.dateCompare(commodityActivity.getEndTime(),nowDate) == -1){ + return R.fail("该砍价活动已结束"); + } + } + Integer count = orderBargainRecordMapper.selectCount(new QueryWrapper<ComBatteryCommodityOrderBargainRecord>().lambda() + .eq(ComBatteryCommodityOrderBargainRecord::getBargainId,orderDto.getBargainId()) + .eq(ComBatteryCommodityOrderBargainRecord::getUserId,orderDto.getUserId())); + if(count > 0){ + return R.fail("您已经参加此砍价,不可重复参加"); + } + //商品原价 + BigDecimal originalPrice = orderBargain.getOriginalPrice(); + //商品目标价格 + BigDecimal targetPrice = orderBargain.getTargetPrice(); + //商品当前价格 + BigDecimal currentPrice = orderBargain.getCurrentPrice(); + //商品当前剩余砍价金额 + BigDecimal surplusPrice = currentPrice.subtract(targetPrice); + + //获取砍价随机金额 + BigDecimal maxPrice = originalPrice.subtract(targetPrice).multiply(BigDecimal.valueOf(0.1)); + BigDecimal minPrice = originalPrice.subtract(targetPrice).multiply(BigDecimal.valueOf(0.05)); + BigDecimal randomNumber = MathUtils.getRandomNumber(maxPrice,minPrice); + if(randomNumber.compareTo(surplusPrice) > 0){ + randomNumber = surplusPrice; + } + //初始化用户帮砍价记录 + ComBatteryCommodityOrderBargainRecord orderBargainRecord = getOrderBargainRecord(orderBargain.getId() + ,orderDto.getUserId(),randomNumber,commodityOrder.getUserId(),nowDate); + orderBargainRecordMapper.insert(orderBargainRecord); + + //更新砍价记录 + orderBargain.setCurrentPrice(orderBargain.getCurrentPrice().subtract(randomNumber)); + orderBargain.setCount(orderBargain.getCount() + 1); + this.baseMapper.updateById(orderBargain); + + //判断当前砍价订单是否已完成 + if(orderBargain.getCurrentPrice().compareTo(orderBargain.getTargetPrice()) == 0){ + //砍价完成,更新订单为已完成 + commodityOrder.setStatus(ComBatteryCommodityOrder.Status.DFH); + commodityOrder.setBargainStatus(ComBatteryCommodityOrder.BargainStatus.KJCG); + commodityOrder.setUpdateAt(nowDate); + commodityOrder.setUpdateBy(orderDto.getUserId()); + commodityOrderMapper.updateById(commodityOrder); + } + return R.ok(randomNumber); + } + + /** + * 初始化用户帮砍价记录 + * @param bargainId 砍价记录id + * @param userId 帮砍价用户id + * @param amount 砍价金额 + * @param oldUserId 原发布砍价订单用户id + * @param nowDate 操作时间 + * @return 用户帮砍价记录 + */ + private ComBatteryCommodityOrderBargainRecord getOrderBargainRecord(Long bargainId,Long userId + ,BigDecimal amount,Long oldUserId,Date nowDate){ + ComBatteryCommodityOrderBargainRecord orderBargainRecord = new ComBatteryCommodityOrderBargainRecord(); + orderBargainRecord.setBargainId(bargainId); + orderBargainRecord.setUserId(userId); + orderBargainRecord.setAmount(amount); + orderBargainRecord.setOldUserId(oldUserId); + orderBargainRecord.setCreateAt(nowDate); + orderBargainRecord.setCreateBy(userId); + return orderBargainRecord; + } + + /** + * 查询砍价记录详情 + * @param id 砍价记录id + * @return 创建订单结果 + */ + @Override + public R getUserBargain(Long id) { + //查询砍价记录 + ComBatteryCommodityOrderBargainVo orderBargainVo = this.baseMapper.queryById(id); + if(orderBargainVo != null){ + //查询帮砍价记录 + List<ComBatteryCommodityOrderBargainRecordVo> orderBargainRecordList = orderBargainRecordMapper.queryAllByBargainId(id); + orderBargainVo.setOrderBargainRecordList(orderBargainRecordList); + } + return R.ok(orderBargainVo); + } } -- Gitblit v1.7.1