diff --git a/src/main/java/com/sczx/order/service/OrderDistribService.java b/src/main/java/com/sczx/order/service/OrderDistribService.java index d1d82dc..08927f0 100644 --- a/src/main/java/com/sczx/order/service/OrderDistribService.java +++ b/src/main/java/com/sczx/order/service/OrderDistribService.java @@ -14,4 +14,10 @@ public interface OrderDistribService { * @return */ IPage pageQueryOrderDistrib(Integer pageNo, Integer pageSize, OrderDistribQueryReq orderDistribQueryReq); + + /** + * 保存订单分润记录 + * @param orderNo + */ + void saveOrderDistrib(String orderNo); } diff --git a/src/main/java/com/sczx/order/service/impl/OrderDistribServiceImpl.java b/src/main/java/com/sczx/order/service/impl/OrderDistribServiceImpl.java index 097b331..5712601 100644 --- a/src/main/java/com/sczx/order/service/impl/OrderDistribServiceImpl.java +++ b/src/main/java/com/sczx/order/service/impl/OrderDistribServiceImpl.java @@ -20,4 +20,9 @@ public class OrderDistribServiceImpl implements OrderDistribService { public IPage pageQueryOrderDistrib(Integer pageNo, Integer pageSize, OrderDistribQueryReq orderDistribQueryReq) { return orderDistribRepo.pageQueryOrderDistrib(pageNo, pageSize, orderDistribQueryReq); } + + @Override + public void saveOrderDistrib(String orderNo) { + //TODO 获取订单分润信息 + } } diff --git a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java index 7896d15..d5e05f7 100644 --- a/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/sczx/order/service/impl/OrderServiceImpl.java @@ -21,6 +21,7 @@ import com.sczx.order.service.OrderService; import com.sczx.order.thirdpart.dto.*; import com.sczx.order.thirdpart.dto.req.CarQueryConditionReq; import com.sczx.order.thirdpart.integration.CarInteg; +import com.sczx.order.thirdpart.integration.PayInteg; import com.sczx.order.thirdpart.integration.StoreInteg; import com.sczx.order.utils.JwtUtil; import com.sczx.order.utils.OrderUtil; @@ -62,6 +63,9 @@ public class OrderServiceImpl implements OrderService { @Autowired private OrderCarImgRepo orderCarImgRepo; + @Autowired + private PayInteg payInteg; + @Transactional(rollbackFor = Exception.class) @Override public RentCarOrderResultDTO submitRentCarOrder(RentCarOrderReq rentCarOrderReq) { diff --git a/src/main/java/com/sczx/order/thirdpart/dto/PaymentResponse.java b/src/main/java/com/sczx/order/thirdpart/dto/PaymentResponse.java new file mode 100644 index 0000000..67b6aaa --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/PaymentResponse.java @@ -0,0 +1,38 @@ +package com.sczx.order.thirdpart.dto; + +import java.util.Map; + +/** + * 支付响应数据传输对象 + */ +public class PaymentResponse { + private String code; + private String message; + private Map payData; + + public PaymentResponse() {} + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Map getPayData() { + return payData; + } + + public void setPayData(Map payData) { + this.payData = payData; + } +} diff --git a/src/main/java/com/sczx/order/thirdpart/dto/req/PaymentRequest.java b/src/main/java/com/sczx/order/thirdpart/dto/req/PaymentRequest.java new file mode 100644 index 0000000..943f4db --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/req/PaymentRequest.java @@ -0,0 +1,74 @@ +package com.sczx.order.thirdpart.dto.req; + +/** + * 支付请求数据传输对象 + */ +public class PaymentRequest { + private Long companyId; // 公司ID + private String body; // 商品描述 + private String outTradeNo; // 商户订单号 + private Integer totalFee; // 总金额,单位为分 + private String spbillCreateIp; // 终端IP + private String openId; // 用户标识 + private String attach; // 附加数据 + + // 构造函数 + public PaymentRequest() {} + + // getter和setter方法 + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public Integer getTotalFee() { + return totalFee; + } + + public void setTotalFee(Integer totalFee) { + this.totalFee = totalFee; + } + + public String getSpbillCreateIp() { + return spbillCreateIp; + } + + public void setSpbillCreateIp(String spbillCreateIp) { + this.spbillCreateIp = spbillCreateIp; + } + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getAttach() { + return attach; + } + + public void setAttach(String attach) { + this.attach = attach; + } +} diff --git a/src/main/java/com/sczx/order/thirdpart/dto/req/RefundRequest.java b/src/main/java/com/sczx/order/thirdpart/dto/req/RefundRequest.java new file mode 100644 index 0000000..c936872 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/dto/req/RefundRequest.java @@ -0,0 +1,65 @@ +package com.sczx.order.thirdpart.dto.req; + +/** + * 退款请求数据传输对象 + */ +public class RefundRequest { + private Long companyId; // 公司ID + private String outTradeNo; // 商户订单号 + private String outRefundNo; // 商户退款单号 + private Integer totalFee; // 订单金额(分) + private Integer refundFee; // 退款金额(分) + private String refundDesc; // 退款原因 + + // 构造函数 + public RefundRequest() {} + + // getter和setter方法 + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public String getOutRefundNo() { + return outRefundNo; + } + + public void setOutRefundNo(String outRefundNo) { + this.outRefundNo = outRefundNo; + } + + public Integer getTotalFee() { + return totalFee; + } + + public void setTotalFee(Integer totalFee) { + this.totalFee = totalFee; + } + + public Integer getRefundFee() { + return refundFee; + } + + public void setRefundFee(Integer refundFee) { + this.refundFee = refundFee; + } + + public String getRefundDesc() { + return refundDesc; + } + + public void setRefundDesc(String refundDesc) { + this.refundDesc = refundDesc; + } +} diff --git a/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java b/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java new file mode 100644 index 0000000..d6a9a69 --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/facade/PayFacade.java @@ -0,0 +1,47 @@ +package com.sczx.order.thirdpart.facade; + +import com.sczx.order.thirdpart.dto.PaymentResponse; +import com.sczx.order.thirdpart.dto.req.PaymentRequest; +import com.sczx.order.thirdpart.dto.req.RefundRequest; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; + +@FeignClient(name = "sczx-singlepay", url = "${sczx-singlepay.ribbon.listOfServers:}") +public interface PayFacade { + + /** + * 统一下单 + * @param request + * @return + */ + @PostMapping("/api/payment/unifiedOrder") + PaymentResponse unifiedOrder(@RequestBody PaymentRequest request); + + /** + * 查询订单 + * @param companyId + * @param outTradeNo + * @return + */ + @GetMapping("/api/payment/query/{companyId}/{outTradeNo}") + Map orderQuery(@PathVariable Long companyId, @PathVariable String outTradeNo); + + /** + * 退款 + * @param request + * @return + */ + @PostMapping("/api/payment/refund") + Map refund(@RequestBody RefundRequest request); + + /** + * 退款查询 + * @param companyId + * @param outTradeNo + * @return + */ + @GetMapping("/api/payment/refundQuery/{companyId}") + Map refundQuery(@PathVariable Long companyId, @RequestParam String outTradeNo); +} diff --git a/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java b/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java new file mode 100644 index 0000000..f24434a --- /dev/null +++ b/src/main/java/com/sczx/order/thirdpart/integration/PayInteg.java @@ -0,0 +1,109 @@ +package com.sczx.order.thirdpart.integration; + +import com.sczx.order.common.enums.PaymentTypeEnum; +import com.sczx.order.exception.InnerException; +import com.sczx.order.thirdpart.dto.PaymentResponse; +import com.sczx.order.thirdpart.dto.UnifiedPaymentInfoDTO; +import com.sczx.order.thirdpart.dto.req.PaymentRequest; +import com.sczx.order.thirdpart.dto.req.RefundRequest; +import com.sczx.order.thirdpart.facade.PayFacade; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@Slf4j +@Component +public class PayInteg { + + + @Autowired + private PayFacade payFacade; + + public UnifiedPaymentInfoDTO unifiedOrder(PaymentRequest request){ + try{ + PaymentResponse result = payFacade.unifiedOrder(request); + if(StringUtils.isNotBlank(result.getCode()) && "SUCCESS".equals(result.getCode())){ + UnifiedPaymentInfoDTO unifiedPaymentInfo = new UnifiedPaymentInfoDTO(); + unifiedPaymentInfo.setAppId(result.getPayData().get("appid")); + unifiedPaymentInfo.setTimeStamp(result.getPayData().get("timeStamp")); + unifiedPaymentInfo.setNonceStr(result.getPayData().get("nonceStr")); + unifiedPaymentInfo.setPackageValue(result.getPayData().get("package")); + unifiedPaymentInfo.setSignType(result.getPayData().get("signType")); + unifiedPaymentInfo.setPaySign(result.getPayData().get("paySign")); + unifiedPaymentInfo.setOutTradeNo(result.getPayData().get("out_trade_no")); + unifiedPaymentInfo.setPaymentType(PaymentTypeEnum.WX_PAY.getCode()); + return unifiedPaymentInfo; + }else { + throw new InnerException(result.getMessage()); + } + } catch (Exception e){ + log.error("支付下单失败",e); + throw new InnerException("支付下单失败"); + } + } + + /** + * 查询订单 + * @param companyId + * @param outTradeNo + * @return + */ + public Map orderQuery(Long companyId, String outTradeNo){ + try { + Map result = payFacade.orderQuery(companyId, outTradeNo); + String returnCode = result.get("return_code"); + if(StringUtils.equalsIgnoreCase(returnCode, "FAIL")){ + throw new InnerException("查询订单失败"); + }else { + return result; + } + } catch (Exception e){ + log.error("查询订单失败",e); + throw new InnerException("查询订单失败"); + } + } + + /** + * 退款 + * @param request + * @return + */ + public Map refund(RefundRequest request){ + try { + Map result = payFacade.refund(request); + String returnCode = result.get("return_code"); + if(StringUtils.equalsIgnoreCase(returnCode, "FAIL")){ + throw new InnerException("退款失败"); + }else { + return result; + } + } catch (Exception e){ + log.error("退款失败",e); + throw new InnerException("退款失败"); + } + } + + /** + * 退款查询 + * @param companyId + * @param outTradeNo + * @return + */ + public Map refundQuery(Long companyId, String outTradeNo){ + try { + Map result = payFacade.refundQuery(companyId, outTradeNo); + String returnCode = result.get("return_code"); + if(StringUtils.equalsIgnoreCase(returnCode, "FAIL")){ + throw new InnerException("查询退款失败"); + }else { + return result; + } + } catch (Exception e){ + log.error("查询退款失败",e); + throw new InnerException("查询退款失败"); + } + } +} diff --git a/src/main/java/com/sczx/order/utils/ThreadPoolUtils.java b/src/main/java/com/sczx/order/utils/ThreadPoolUtils.java new file mode 100644 index 0000000..164aaa6 --- /dev/null +++ b/src/main/java/com/sczx/order/utils/ThreadPoolUtils.java @@ -0,0 +1,57 @@ +package com.sczx.order.utils; + +import org.springframework.stereotype.Service; + +import java.util.concurrent.*; + +/** + * 线程池工具类,用于执行异步任务 + * Created by zengji on 2019/5/13. + * + */ +@Service +public class ThreadPoolUtils { + + public static ThreadPoolExecutor threadPool; + //核心线程大小 + private static int corePoolSize=120; + //最大线程个数 + private static int maximumPoolSize=180; + //空闲线程存活时间 + private static long keepAliveTime=300; + //队列容量 + private static int capacity=200; + + /** + * 无返回值 + */ + public static void execute(Runnable runnable){ + getThreadPool().execute(runnable); + } + + /** + * 有返回值 + */ + public static Future submit(Callable callable){ + return getThreadPool().submit(callable); + } + + + /** + * dcs获取线程池 + * @return 线程池对象 + */ + public static ThreadPoolExecutor getThreadPool() { + if (threadPool != null) { + return threadPool; + } else { + synchronized (ThreadPoolUtils.class) { + if (threadPool == null) { + threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(capacity), new ThreadPoolExecutor.CallerRunsPolicy()); + } + return threadPool; + } + } + } +} diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index f415879..f0e66d0 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -4,4 +4,8 @@ sczx-store: sczx-car: ribbon: - listOfServers: http://115.190.8.52:8083 \ No newline at end of file + listOfServers: http://115.190.8.52:8083 + +sczx-singlepay: + ribbon: + listOfServers: http://115.190.8.52:8019 \ No newline at end of file