jiangping
2023-10-07 c6085dd1e5fbbe13eae825dda02819c52227596a
微信对账
已添加1个文件
已修改5个文件
241 ■■■■ 文件已修改
server/services/src/main/java/com/doumee/core/utils/DateUtil.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/WxBillDetailMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/WxBill.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/mappers/WxBillDetailMapper.xml 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -2298,6 +2298,16 @@
            return new Timestamp(System.currentTimeMillis());
        }
    }
    public static Date getDateFromString2(String strDate) {
        if (StringUtils.isEmpty(strDate)) {
            return new Date(System.currentTimeMillis());
        }
        try {
            return sdfLongTimePlus.parse(strDate);
        } catch (Exception ex) {
           return  null;
        }
    }
    // -----------------------------------------------------------------------
    public static Date parseFromFormats(String aValue) {
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
@@ -1,28 +1,19 @@
package com.doumee.core.wx;
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.utils.ID;
import com.doumee.dao.business.ActionLogMapper;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayDownloadBillRequest;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
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.yaml.snakeyaml.scanner.Constant;
import java.math.BigDecimal;
import java.security.KeyFactory;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
/**
 * å¾®ä¿¡å°ç¨‹åº-公共方法
@@ -49,14 +40,12 @@
            WxPayRefundRequest request = new WxPayRefundRequest();
            request.setOutTradeNo(orderNo);
            request.setOutRefundNo(refNum);
           // request.setTotalFee(2);
          //  request.setRefundFee(1);
            request.setTotalFee(BaseWxPayRequest.yuanToFen(totalPrice.toString()));
            request.setRefundFee(BaseWxPayRequest.yuanToFen(refundPrice.toString()));
            WxPayRefundResult response = WxMiniConfig.wxPayService.refund(request);
            if ("SUCCESS".equals(response.getReturnCode()) && "SUCCESS".equals(response.getResultCode())) {
                return refNum;
            } else {
            } else{
                throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),response.getErrCode() + response.getErrCodeDes());
            }
        } catch (WxPayException e) {
server/services/src/main/java/com/doumee/dao/business/WxBillDetailMapper.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.WxBillDetail;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/09/27 18:08
 */
public interface WxBillDetailMapper extends BaseMapper<WxBillDetail> {
    void insertBatch(List<WxBillDetail> detailList);
}
server/services/src/main/java/com/doumee/dao/business/model/WxBill.java
@@ -20,7 +20,7 @@
public class WxBill {
    @ApiModelProperty(value = "")
    @ExcelColumn(name="")
    @ExcelColumn(name="主键,按照日期yyyyMMDD格式存储,防止重复")
    private String id;
    @ApiModelProperty(value = "总交易单数", example = "1")
server/services/src/main/java/com/doumee/service/business/impl/WxBillServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
@@ -7,8 +8,10 @@
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.WxBillDetailMapper;
import com.doumee.dao.business.WxBillMapper;
import com.doumee.dao.business.model.WxBill;
import com.doumee.dao.business.model.WxBillDetail;
import com.doumee.service.business.WxBillService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -18,12 +21,14 @@
import com.github.binarywang.wxpay.bean.result.WxPayBillInfo;
import com.github.binarywang.wxpay.bean.result.WxPayBillResult;
import com.github.binarywang.wxpay.exception.WxPayException;
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.util.Date;
import java.util.List;
import java.math.BigDecimal;
import java.util.*;
/**
 * Service实现
@@ -35,6 +40,8 @@
    @Autowired
    private WxBillMapper wxBillMapper;
    @Autowired
    private WxBillDetailMapper wxBillDetailMapper;
    @Override
    public String create(WxBill wxBill) {
        wxBillMapper.insert(wxBill);
@@ -149,22 +156,122 @@
        return wxBillMapper.selectCount(wrapper);
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void getWxBill() {
        // èŽ·å–äº¤æ˜“è´¦å•æ•°æ®
        WxPayDownloadBillRequest request = new WxPayDownloadBillRequest();
        String billDate =  DateUtil.beforeDateToStr(1);
        request.setBillDate(billDate);
        request.setBillType("SUCCESS");
        WxPayBillResult response = null;
        try {
            // èŽ·å–äº¤æ˜“è´¦å•æ•°æ®
            WxPayDownloadBillRequest request = new WxPayDownloadBillRequest();
            String billDate =  DateUtil.beforeDateToStr(1);
            request.setBillDate(billDate);
            request.setBillType("ALL");
            WxPayBillResult response = WxMiniConfig.wxPayService.downloadBill(request);
            if(response !=null){
                List<WxPayBillInfo> detailList = response.getBillInfoList();
            }else{
                throw  new BusinessException(ResponseStatus.SERVER_ERROR);
            }
            response = WxMiniConfig.wxPayService.downloadBill(request);
        }catch (WxPayException e){
        } catch (WxPayException e) {
            e.printStackTrace();
        }
        request.setBillType("REFUND");
        //请求退款单交易记录汇总数据
        WxPayBillResult responseRefund = null;
        try {
            responseRefund = WxMiniConfig.wxPayService.downloadBill(request);
        }catch (WxPayException e){
        }
        WxBill bill = new WxBill();
        //日期作为主键
        bill.setId(billDate);
        bill.setSumBill(0);
        bill.setSumTotalFee(new BigDecimal(0.00));
        bill.setSumSuccessFee(new BigDecimal(0.00));
        bill.setSumRefundFee(new BigDecimal(0.00));
        bill.setSumCouponRefundFee(new BigDecimal(0.00));
        bill.setSumApplyRefundFee(new BigDecimal(0.00));
        bill.setSumCmmsAmt(new BigDecimal(0.00));
        bill.setSumRefundBill(0);
        bill.setSumRefundCmmsAmt(new BigDecimal(0.00));
        List<WxBillDetail> detailList = new ArrayList<>();
        if(response !=null){
//                List<WxPayBillInfo> detailList = response.getBillInfoList();
            int totalRefund = 0;
            BigDecimal totalRefundAmt = new BigDecimal(0.00);
            bill.setSumBill(Integer.parseInt(response.getTotalRecord()));
            //订单总金额
            bill.setSumTotalFee(formatStringToDecimal(response.getTotalAmount()));
            //应结订单总金额
            bill.setSumSuccessFee(formatStringToDecimal(response.getTotalFee()));
            //退款总金额
            bill.setSumRefundFee(formatStringToDecimal(response.getTotalFee()));
            //退款总金额
            bill.setSumApplyRefundFee(formatStringToDecimal(response.getTotalAppliedRefundFee()));
            //交易总手续费金额
            bill.setSumCmmsAmt(formatStringToDecimal(response.getTotalPoundageFee()));
            detailList.addAll(getDetialModelByInfo(bill,response.getBillInfoList()));
        }
        if(responseRefund != null){
            //退款单总数累计进入
//                bill.setSumBill(bill.getSumBill()+(Integer.parseInt(response.getTotalRecord()));
            bill.setSumRefundBill(Integer.parseInt(responseRefund.getTotalRecord()));//退款的订单数
            bill.setSumRefundCmmsAmt(formatStringToDecimal(responseRefund.getTotalPoundageFee()));//退款总手续费
            bill.setSumCouponRefundFee(formatStringToDecimal(responseRefund.getTotalCouponFee()));//退款总手续费
            detailList.addAll(getDetialModelByInfo(bill,responseRefund.getBillInfoList()));
        }
        wxBillMapper.delete(new UpdateWrapper<WxBill>().lambda().eq( WxBill::getId, bill.getId()));
        wxBillDetailMapper.delete(new UpdateWrapper<WxBillDetail>().lambda().eq( WxBillDetail::getPid, bill.getId()));
        wxBillMapper.insert(bill);
        if(detailList.size()>0){
            wxBillDetailMapper.insertBatch(detailList);
        }
    }
    private  List<WxBillDetail> getDetialModelByInfo(WxBill bill, List<WxPayBillInfo> billInfoList) {
        List<WxBillDetail> detailList = new ArrayList<>();
        if(billInfoList!=null){
            for (int i = 0; i <billInfoList.size(); i++) {
                WxPayBillInfo info =billInfoList.get(i);
                WxBillDetail detail = new WxBillDetail();
                detail.setId(UUID.randomUUID().toString());
                detail.setPid(bill.getId());
                detail.setBillDate(DateUtil.getDateFromString2(info.getTradeTime()));//交易时间
                detail.setAppid(info.getAppId());//公众账号ID
                detail.setMchId(info.getMchId());//商户号
                detail.setSubMchid(info.getSubMchId());//特约商户号
                detail.setDeviceInfo(info.getDeviceInfo());//设备
                detail.setTransactionId(info.getTransactionId());//微信订单号
                detail.setOutTradeNo(info.getOutTradeNo());//商户订单号
                detail.setOpenid(info.getOpenId());//用户标识
                detail.setBillType(info.getTradeType());//交易类型
                detail.setBillStatus(info.getTradeState());//交易状态
                detail.setBankType(info.getBankType());//付款银行
                detail.setFeeType(info.getFeeType());//货币种类
                detail.setSettlementTotalFee(formatStringToDecimal(info.getTotalFee()));//应结订单金额
                detail.setCouponFee(formatStringToDecimal(info.getCouponFee()));//代金券金额
                detail.setRefundId(info.getRefundId());//微信退款单号
                detail.setOutRefundNo(info.getOutRefundNo());//商户退款单号
                detail.setRefundFee(formatStringToDecimal(info.getSettlementRefundFee()));//退款金额
                detail.setCouponRefundFee(formatStringToDecimal(info.getCouponRefundFee()));//充值券退款金额
                detail.setRefundType(info.getRefundChannel());//退款类型
                detail.setRefundSuccessStatus(info.getRefundState());//退款状态
                detail.setBody(info.getBody());//商品名称
                detail.setAttach(info.getAttach());//商户数据包
                detail.setCmmsAmt(formatStringToDecimal(info.getPoundage()));//手续费
                detail.setRate(formatStringToDecimal(info.getPoundageRate().replace("%", "")));//费率
                detail.setTotalFee(formatStringToDecimal(info.getTotalAmount()));//订单金额
                detail.setApplyRefundFee(formatStringToDecimal(info.getAppliedRefundAmount()));//申请退款金额
                detail.setRateRemark(info.getFeeRemark());//费率备注
                detail.setRefundSuccessDate(DateUtil.getDateFromString2(info.getRefundSuccessTime()));//成功退款时间
                detail.setRefundApplyDate(DateUtil.getDateFromString2(info.getRefundTime())); //申请退款时间
                detailList.add(detail);
            }
        }
        return detailList;
    }
    public static BigDecimal formatStringToDecimal(String str){
        if(str == null){
            return  new BigDecimal(0.00);
        }
        return new BigDecimal(Double.parseDouble(str));
    }
}
server/services/src/main/resources/mappers/WxBillDetailMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.doumee.dao.business.WxBillDetailMapper">
  <insert id="insertBatch">
      insert into wx_bill_detail
    ( "id" ,
    "pid",
    "bill_date",
    "appid" ,
    "mch_id" ,
    "sub_mchid" ,
    "device_info",
    "transaction_id",
    "out_trade_no",
    "openid",
    "bill_type",
    "bill_status",
    "bank_type",
    "fee_type" ,
    "settlement_total_fee",
    "coupon_fee",
    "refund_id" ,
    "out_refund_no" ,
    "refund_fee",
    "coupon_refund_fee" ,
    "refund_type",
    "refund_apply_date" ,
    "refund_success_date" ,
    "refund_success_status" ,
    "body",
    "attach" ,
    "cmms_amt",
    "rate",
    "total_fee",
    "apply_refund_fee" ,
    "rate_remark"
    )
    values
    <foreach collection="list" item="item" separator=",">
      (#{item.id},
      #{item.billDate},
      #{item.pid},
      #{item.appid},
      #{item.mchId},
      #{item.subMchid},
      #{item.deviceInfo},
      #{item.transactionId},
      #{item.outTradeNo},
      #{item.openid},
      #{item.billType},
      #{item.billStatus},
      #{item.bankType},
      #{item.feeType},
      #{item.settlementTotalFee},
      #{item.couponFee},
      #{item.refundId},
      #{item.outRefundNo},
      #{item.refundFee},
      #{item.couponRefundFee},
      #{item.refundType},
      #{item.refundApplyDate},
      #{item.refundSuccessDate},
      #{item.refundSuccessStatus},
      #{item.body},
      #{item.attach},
      #{item.cmmsAmt},
      #{item.rate},
      #{item.totalFee},
      #{item.applyRefundFee},
      #{item.rateRemark}
      )
    </foreach>
  </insert>
</mapper>