package com.panzhihua.service_community.service.impl; 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: 电动车商城-砍价订单记录表表服务实现类 *

* projectName 成都呐喊信息技术有限公司-智慧社区项目 *

* description: 电动车商城-砍价订单记录表表服务实现类 * * @author lyq * @date 2022-03-29 16:06:35 */ @Slf4j @Service("comBatteryCommodityOrderBargainService") public class ComBatteryCommodityOrderBargainServiceImpl extends ServiceImpl 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 分页查询 * * @param comBatteryCommodityOrderBargain 请求参数 * @return 分页查询列表数据 * @author lyq * @date 2022-03-29 16:06:35 */ @Override public R queryByPage(PageComBatteryCommodityOrderBargainDto comBatteryCommodityOrderBargain) { return R.ok(this.baseMapper.queryAllByLimit(comBatteryCommodityOrderBargain, new Page(comBatteryCommodityOrderBargain.getPageNum(), comBatteryCommodityOrderBargain.getPageSize()))); } /** * description insert 新增数据 * * @param comBatteryCommodityOrderBargain 请求参数 * @return 新增结果 * @author lyq * @date 2022-03-29 16:06:35 */ @Override public R insert(AddComBatteryCommodityOrderBargainDto comBatteryCommodityOrderBargain) { ComBatteryCommodityOrderBargain entity = new ComBatteryCommodityOrderBargain(); BeanUtils.copyProperties(comBatteryCommodityOrderBargain, entity); if (this.baseMapper.insert(entity) > 0) { return R.ok(); } return R.fail("添加失败"); } /** * description update 修改数据 * * @param editDto 请求参数 * @return 修改结果 * @author lyq * @date 2022-03-29 16:06:35 */ @Override public R update(EditComBatteryCommodityOrderBargainDto editDto) { ComBatteryCommodityOrderBargain entity = this.baseMapper.selectById(editDto.getId()); if (entity == null) { return R.fail("未查询到该记录"); } BeanUtils.copyProperties(editDto, entity); if (this.baseMapper.updateById(entity) > 0) { return R.ok(); } return R.fail("修改失败"); } /** * description deleteById 通过主键删除数据 * * @param id 主键id * @return 删除结果 * @author lyq * @date 2022-03-29 16:06:35 */ @Override public R deleteById(Long id) { if (this.baseMapper.deleteById(id) > 0) { return R.ok(); } return R.fail("删除失败"); } /** * description detailById 查询详情 * * @param id 主键id * @return 详情数据 * @author lyq * @date 2022-03-29 16:06:35 */ @Override public R detailById(Long id) { return R.ok(this.baseMapper.queryById(id)); } /** * description queryByPage 查询列表 * * @param comBatteryCommodityOrderBargain 请求参数 * @return 列表数据 * @author lyq * @date 2022-03-29 16:06:35 */ @Override 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().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() .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 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().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 orderBargainRecordList = orderBargainRecordMapper.queryAllByBargainId(id); orderBargainVo.setOrderBargainRecordList(orderBargainRecordList); } return R.ok(orderBargainVo); } }