package com.doumee.service.business.impl; import com.allinpay.syb.lib.DoumeeTLUtil; import com.allinpay.syb.lib.SybUtil; import com.allinpay.syb.model.PayOrderNotifyParam; import com.allinpay.syb.model.PayOrderRefundResponse; import com.allinpay.syb.model.PayPublicModel; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.DateUtil; import com.doumee.dao.business.OrdersMapper; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.model.Refund; import com.doumee.core.utils.Utils; import com.doumee.dao.business.RefundMapper; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.RefundService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.sql.Ref; import java.util.Date; import java.util.List; import java.util.TreeMap; /** * 订单退款信息表Service实现 * @author doumee * @date 2026-02-06 11:35:16 */ @Service public class RefundServiceImpl implements RefundService { @Autowired private RefundMapper refundMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private OrdersMapper ordersMapper; @Override @Transactional public Integer create(Refund model) { if(model.getOrderId()==null ||model.getMoney()==null ||model.getMoney().compareTo(new BigDecimal("0.01")) < 0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"请按照要求填写信息!"); } model.setMoney(model.getMoney().multiply(new BigDecimal(100)));//单位分 Orders order = ordersMapper.selectById(model.getOrderId()); if(order==null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"订单信息不存在!"); } if(!Constants.equalsInteger(order.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"订单未交易成功,不支持退款操作!"); } if( Constants.formatBigDecimal(model.getMoney()).compareTo(Constants.formatBigDecimal(order.getMoney())) >=0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"退款金额不能超过订单金额!"); } Refund sum = refundMapper.selectOne(new QueryWrapper().select("sum(money) as money").lambda() .eq(Refund::getDeleted,Constants.ZERO) .eq(Refund::getOrderId,model.getOrderId()) .in(Refund::getStatus,Constants.ZERO,Constants.ONE) ); if(sum!=null && Constants.formatBigDecimal(sum.getMoney()).compareTo(Constants.formatBigDecimal(order.getMoney())) >=0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"该订单退款总额已达上限!"); } Date date = new Date(); model.setCreateTime(date); model.setStatus(Constants.ZERO); model.setDeleted(Constants.ZERO); model.setBanlance(Constants.formatBigDecimal(order.getMoney()).subtract(Constants.formatBigDecimal( model.getMoney()))); if(sum!=null){ model.setBanlance(Constants.formatBigDecimal(model.getBanlance()).subtract(Constants.formatBigDecimal( sum.getMoney())));//当前还可提现余额 } refundMapper.insert(model); DoumeeTLUtil doumeeTLUtil = new DoumeeTLUtil(systemDictDataBiz.initPayPublicModel()); PayOrderRefundResponse map = doumeeTLUtil.sendRefundOrder(model.getId()+"",model.getOrderId()+"", model.getMoney().intValue()+"",model.getRemark()); if(map ==null || !StringUtils.equals(map.getRetcode(),DoumeeTLUtil.SUCCESS_CODE) || !StringUtils.equals(map.getTrxstatus(),"0000")){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"对不起,发起退款失败,"+(map!=null?map.getErrmsg():"")); } return model.getId(); } @Override public void deleteById(Integer id) { refundMapper.deleteById(id); } @Override public void delete(Refund refund) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(refund); refundMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } refundMapper.deleteBatchIds(ids); } @Override public void updateById(Refund refund) { refundMapper.updateById(refund); } @Override public void updateByIdInBatch(List refunds) { if (CollectionUtils.isEmpty(refunds)) { return; } for (Refund refund: refunds) { this.updateById(refund); } } @Override public Refund findById(Integer id) { return refundMapper.selectById(id); } @Override public Refund findOne(Refund refund) { QueryWrapper wrapper = new QueryWrapper<>(refund).last("limit 1"); return refundMapper.selectOne(wrapper); } @Override public List findList(Refund refund) { QueryWrapper wrapper = new QueryWrapper<>(refund); return refundMapper.selectList(wrapper); } @Override public void updateByPayStatus(Refund param) { int time = 30; try { time = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PAY_VALID_TIME).getCode()); }catch (Exception e){ } Refund model = refundMapper.selectById(param.getId()); if(model !=null ){ PayPublicModel publicModel =systemDictDataBiz.initPayPublicModel(); Date date = new Date(); queryPayOrderDetailBiz(model,publicModel,date,time); } } private void queryPayOrderDetailBiz(Refund model, PayPublicModel publicModel, Date date,int time) { DoumeeTLUtil doumeeTLUtil = new DoumeeTLUtil(publicModel); PayOrderNotifyParam map = doumeeTLUtil.sendQueryOrder(DoumeeTLUtil.REFUND_SN_PREFIX+model.getId()+""); int status = Constants.TWO; if(map!=null){ String info = SybUtil.getPayInfoByStatus(map); if(StringUtils.equals(map.getTrxcode(),"VSP503") ||StringUtils.equals(map.getTrxcode(),"VSP513") ||StringUtils.equals(map.getTrxcode(),"VSP553")){ // //交易类型是 微信t退款 、支付宝支付退款或者银联扫码退货,记录支付状态 if(StringUtils.equals(map.getTrxstatus(),"0000")){ //交易成功 status = Constants.ONE; } else if (StringUtils.equals(map.getTrxstatus(),"2000") || StringUtils.equals(map.getTrxstatus(),"2008")) { //如果交易未支付,并且未超过半小时,不处理 if(date.getTime() - model.getCreateTime().getTime() < time*60*1000){ return; } } } model.setPayFee(map.getFee()); model.setStatus(status); model.setPayDate(DateUtil.fromStringToDate("yyyyMMddHHmmss",map.getPaytime())); model.setPayOrderId(map.getSrctrxid());//通联订单号 model.setPayThirdOrderId(map.getChnltrxid());//支付宝微信订单号 model.setPayThirdOrderData(map.getChnldata());//三方交易渠道数据 model.setPayInfo(info); model.setPayCode(map.getTrxcode()); }else{ model.setPayInfo("超时无结果,自动取消"); model.setStatus(Constants.TWO); } model.setUpdateTime(date); refundMapper.updateById(model) ; } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Refund.class) .selectAs(SystemUser::getRealname,Refund::getUserRealname) .selectAs(SystemUser::getUsername,Refund::getUsername) .selectAs(Orders::getName,Refund::getMemberName) .selectAs(Orders::getPhone,Refund::getMemberPhone) .leftJoin(Orders.class,Orders::getId,Refund::getOrderId) .leftJoin(SystemUser.class,SystemUser::getId,Refund::getCreateUser); Utils.MP.blankToNull(pageWrap.getModel()); pageWrap.getModel().setDeleted(Constants.ZERO); queryWrapper.eq(pageWrap.getModel().getId() != null,Refund::getId, pageWrap.getModel().getId()); queryWrapper.eq(pageWrap.getModel().getDeleted() != null,Refund::getDeleted, pageWrap.getModel().getDeleted()); queryWrapper.eq(pageWrap.getModel().getCreateUser() != null,Refund::getCreateUser, pageWrap.getModel().getCreateUser()); queryWrapper.eq(pageWrap.getModel().getUpdateUser() != null,Refund::getUpdateUser, pageWrap.getModel().getUpdateUser()); queryWrapper.eq(pageWrap.getModel().getRemark() != null,Refund::getRemark, pageWrap.getModel().getRemark()); queryWrapper.eq(pageWrap.getModel().getStatus() != null,Refund::getStatus, pageWrap.getModel().getStatus()); queryWrapper.eq(pageWrap.getModel().getDetail() != null,Refund::getDetail, pageWrap.getModel().getDetail()); queryWrapper.eq(pageWrap.getModel().getImgurl() != null,Refund::getImgurl, pageWrap.getModel().getImgurl()); queryWrapper.eq(pageWrap.getModel().getSortnum() != null,Refund::getSortnum, pageWrap.getModel().getSortnum()); queryWrapper.eq(pageWrap.getModel().getMoney() != null,Refund::getMoney, pageWrap.getModel().getMoney()); queryWrapper.eq(pageWrap.getModel().getBanlance() != null,Refund::getBanlance, pageWrap.getModel().getBanlance()); queryWrapper.eq(pageWrap.getModel().getPayOrderId() != null,Refund::getPayOrderId, pageWrap.getModel().getPayOrderId()); queryWrapper.eq(pageWrap.getModel().getPayThirdOrderId() != null,Refund::getPayThirdOrderId, pageWrap.getModel().getPayThirdOrderId()); queryWrapper.eq(pageWrap.getModel().getPayInfo() != null,Refund::getPayInfo, pageWrap.getModel().getPayInfo()); queryWrapper.eq(pageWrap.getModel().getPayThirdOrderData() != null,Refund::getPayThirdOrderData, pageWrap.getModel().getPayThirdOrderData()); queryWrapper.eq(pageWrap.getModel().getPayFee() != null,Refund::getPayFee, pageWrap.getModel().getPayFee()); queryWrapper.eq(pageWrap.getModel().getPayCode() != null,Refund::getPayCode, pageWrap.getModel().getPayCode()); queryWrapper.eq(pageWrap.getModel().getOrderType() != null,Orders::getType, pageWrap.getModel().getOrderType()); queryWrapper.eq(pageWrap.getModel().getOrderId() != null,Refund::getOrderId, pageWrap.getModel().getOrderId()); queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getMemberPhone() ) ,Orders::getName, pageWrap.getModel().getMemberPhone()); queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getMemberName() ) ,Orders::getName, pageWrap.getModel().getMemberName()); queryWrapper.ge(pageWrap.getModel().getStarttime()!=null,Refund::getCreateTime , pageWrap.getModel().getStarttime()); queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Refund::getCreateTime , pageWrap.getModel().getEndtime()); queryWrapper.orderByDesc(Refund::getId); return PageData.from(refundMapper.selectJoinPage(page,Refund.class, queryWrapper)); } @Override public long count(Refund refund) { QueryWrapper wrapper = new QueryWrapper<>(refund); return refundMapper.selectCount(wrapper); } }