package com.ylx.massage.service.impl; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ijpay.core.IJPayHttpResponse; import com.ijpay.core.enums.RequestMethodEnum; import com.ijpay.core.kit.PayKit; import com.ijpay.core.kit.WxPayKit; import com.ijpay.core.utils.DateTimeZoneUtil; import com.ijpay.wxpay.WxPayApi; import com.ijpay.wxpay.enums.WxDomainEnum; import com.ijpay.wxpay.enums.v3.BasePayApiEnum; import com.ijpay.wxpay.model.v3.Amount; import com.ijpay.wxpay.model.v3.Payer; import com.ijpay.wxpay.model.v3.UnifiedOrderModel; import com.ylx.common.config.WxPayConfig; import com.ylx.common.core.domain.R; import com.ylx.common.exception.ServiceException; import com.ylx.common.utils.StringUtils; import com.ylx.massage.domain.TConsumptionLog; import com.ylx.massage.domain.TRecharge; import com.ylx.massage.domain.TWxUser; import com.ylx.massage.mapper.TRechargeMapper; import com.ylx.massage.service.TConsumptionLogService; import com.ylx.massage.service.TRechargeService; import com.ylx.massage.service.TWxUserService; import com.ylx.massage.utils.OrderNumberGenerator; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Map; import static com.ylx.common.constant.HttpStatus.SUCCESS; /** * 充值记录表 服务实现类 */ @Service @Slf4j public class TRechargeServiceImpl extends ServiceImpl implements TRechargeService { @Resource private TWxUserService wxUserService; @Resource private OrderNumberGenerator generator; @Resource private TConsumptionLogService consumptionLogService; @Override @Transactional(rollbackFor = Exception.class) public TRecharge recharge(TRecharge recharge) { //增加充值记录 if (StringUtils.isBlank(recharge.getcOpenId())) { throw new ServiceException("openId不能为空"); } if (null == recharge.getdMoney() || recharge.getdMoney().compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("充值金额不能为空"); } LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TRecharge::getcOpenId, recharge.getcOpenId()).eq(TRecharge::getPayStatus, -1).eq(TRecharge::getdMoney, recharge.getdMoney()); TRecharge one = getOne(queryWrapper); if (one != null) { log.info("未支付的充值记录,{}",one.getRechargeNo()); return one; } recharge.setRechargeNo(generator.generateNextOrderNumber(OrderNumberGenerator.KEY_PREFIX_RECHAR)); recharge.setDtCreateTime(LocalDateTime.now()); save(recharge); //todo 调用微信支付成功后增加账户金额 return recharge; } @Override @Transactional(rollbackFor = Exception.class) public TRecharge increaseAmount(String rechargeNo) { //增加个人账户金额 TRecharge recharge = getByRechargeNo(rechargeNo); if(recharge == null){ log.error("未支付的充值记录不存在,单号:{}",rechargeNo); return null; } //修改充值状态 recharge.setPayStatus(1); this.updateById(recharge); //增加个人账户金额 TWxUser user = wxUserService.getByOpenId(recharge.getcOpenId()); user.setdBalance(user.getdBalance().add(recharge.getdMoney())); wxUserService.updateById(user); //增加消费记录 TConsumptionLog tConsumptionLog = new TConsumptionLog(); tConsumptionLog.setAmount(recharge.getdMoney()); tConsumptionLog.setBillNo(rechargeNo); tConsumptionLog.setOpenId(recharge.getcOpenId()); tConsumptionLog.setBillType(1); tConsumptionLog.setNote("微信充值"); consumptionLogService.save(tConsumptionLog); log.info("微信充值成功,充值单号:{},充值金额:{},充值OpenId:{}",rechargeNo,recharge.getdMoney(),user.getcOpenid()); return recharge; } private TRecharge getByRechargeNo(String rechargeNo) { return getOne(new LambdaQueryWrapper().eq(TRecharge::getRechargeNo, rechargeNo).eq(TRecharge::getPayStatus, -1)); } }