| | |
| | | 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: 电动车商城-砍价订单记录表表服务实现类 |
| | |
| | | * @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.isRefundTest}") |
| | | private Boolean isRefundTest; |
| | | @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 分页查询 |
| | |
| | | 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); |
| | | } |
| | | } |