|
@@ -10,6 +10,8 @@ import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
|
|
|
+import com.ym.mec.thirdparty.adapay2.Payment;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -19,7 +21,6 @@ import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
-import com.huifu.adapay.model.payment.Payment;
|
|
|
import com.ym.mec.biz.dal.dao.SysConfigDao;
|
|
|
import com.ym.mec.biz.dal.dao.TeacherDao;
|
|
|
import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
|
|
@@ -42,7 +43,6 @@ import com.ym.mec.common.entity.HttpResponseResult;
|
|
|
import com.ym.mec.common.exception.BizException;
|
|
|
import com.ym.mec.common.service.IdGeneratorService;
|
|
|
import com.ym.mec.common.service.impl.BaseServiceImpl;
|
|
|
-import com.ym.mec.thirdparty.adapay.Pay;
|
|
|
import com.ym.mec.thirdparty.yqpay.Msg;
|
|
|
import com.ym.mec.thirdparty.yqpay.RsqMsg;
|
|
|
import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
|
|
@@ -53,324 +53,342 @@ import com.ym.mec.util.date.DateUtil;
|
|
|
@Service
|
|
|
public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantPaymentOrder> implements TenantPaymentOrderService {
|
|
|
|
|
|
- private static final Logger logger = LoggerFactory.getLogger(TenantPaymentOrderServiceImpl.class);
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private TenantPaymentOrderDao tenantPaymentOrderDao;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private TenantEntryActivitiesDao tenantEntryActivitiesDao;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IdGeneratorService idGeneratorService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private PayService payService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private SysConfigDao sysConfigDao;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private TeacherDao teacherDao;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private SysTenantAccountService sysTenantAccountService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private YqPayFeignService yqPayFeignService;
|
|
|
-
|
|
|
- @Override
|
|
|
- public BaseDAO<Long, TenantPaymentOrder> getDAO() {
|
|
|
- return tenantPaymentOrderDao;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
- public HttpResponseResult createOrder(Integer userId, Integer activitiesId, boolean isContinuePay) {
|
|
|
-
|
|
|
- Teacher teacher = teacherDao.get(userId);
|
|
|
- if (teacher == null) {
|
|
|
- throw new BizException("用户信息不存在");
|
|
|
- }
|
|
|
-
|
|
|
- Integer organId = teacher.getTeacherOrganId();
|
|
|
-
|
|
|
- TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
|
|
|
- if (tenantEntryActivities == null) {
|
|
|
- throw new BizException("活动不存在");
|
|
|
- }
|
|
|
-
|
|
|
- Date date = new Date();
|
|
|
- // 判断活动是否有效
|
|
|
- if (tenantEntryActivities.getDelFlag() == true) {
|
|
|
- throw new BizException("活动已下架");
|
|
|
- }
|
|
|
- if (date.before(tenantEntryActivities.getStartDate())) {
|
|
|
- throw new BizException("活动未开始");
|
|
|
- }
|
|
|
- if (date.after(tenantEntryActivities.getEndDate())) {
|
|
|
- throw new BizException("活动已结束");
|
|
|
- }
|
|
|
-
|
|
|
- // 查询用户订单
|
|
|
- List<TenantPaymentOrder> orderList = tenantPaymentOrderDao.queryByUserIdAndActivitiesId(userId, activitiesId);
|
|
|
- if (orderList != null && orderList.size() > 0) {
|
|
|
- for (TenantPaymentOrder po : orderList) {
|
|
|
- // 是否满足条件
|
|
|
- if (tenantEntryActivities.getSuitableUser() == SuitableUser.NEW) {
|
|
|
- if (po.getStatus() == DealStatusEnum.SUCCESS) {
|
|
|
- throw new BizException("首充优惠活动每个用户限参与一次。");
|
|
|
- }
|
|
|
-
|
|
|
- if (po.getStatus() == DealStatusEnum.ING) {
|
|
|
- int i = 35 - DateUtil.minutesBetween(po.getCreateTime(), date);
|
|
|
- if (i <= 0) {
|
|
|
- throw new BizException("您有支付中的订单出现异常,请联系客服");
|
|
|
- }
|
|
|
- // throw new BizException("您参加的首充活动正在处理中,预计于{}分钟后处理完毕,请稍后。", i);
|
|
|
- if (isContinuePay == false) {
|
|
|
- HttpResponseResult result = new HttpResponseResult(true, HttpStatus.CONTINUE, "您存在支付中的订单,是否重新付款?", null);
|
|
|
- return result;
|
|
|
- } else {
|
|
|
- // 关闭原订单
|
|
|
- po.setStatus(DealStatusEnum.CLOSE);
|
|
|
- po.setMemo("用户主动关闭");
|
|
|
- po.setUpdateTime(date);
|
|
|
- tenantPaymentOrderDao.update(po);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- TenantPaymentOrder tenantPaymentOrder = new TenantPaymentOrder();
|
|
|
- tenantPaymentOrder.setUserId(userId);
|
|
|
- tenantPaymentOrder.setTransMinutes(tenantEntryActivities.getPurchaseMinutes());
|
|
|
- tenantPaymentOrder.setGiveMinutes(tenantEntryActivities.getGiveMinutes());
|
|
|
- tenantPaymentOrder.setOrderNo(idGeneratorService.generatorId("tenant_payment") + "");
|
|
|
- tenantPaymentOrder.setType(TenantPaymentType.RECHARGE);
|
|
|
- tenantPaymentOrder.setExpectAmount(tenantEntryActivities.getDiscountPrice());
|
|
|
- tenantPaymentOrder.setStatus(DealStatusEnum.ING);
|
|
|
- tenantPaymentOrder.setCreateTime(date);
|
|
|
- tenantPaymentOrder.setUpdateTime(date);
|
|
|
- tenantPaymentOrder.setVersion(0);
|
|
|
- tenantPaymentOrder.setOrganId(organId);
|
|
|
- tenantPaymentOrder.setActivitiesId(activitiesId);
|
|
|
- tenantPaymentOrderDao.insert(tenantPaymentOrder);
|
|
|
-
|
|
|
- String baseApiUrl = sysConfigDao.findConfigValue("teacher_base_url");
|
|
|
-
|
|
|
- // 分类费用 course,instrument,accessories,other
|
|
|
- Map<String, BigDecimal> classFee = new HashMap<>();
|
|
|
- classFee.put("course", BigDecimal.ZERO);
|
|
|
- classFee.put("instrument", BigDecimal.ZERO);
|
|
|
- classFee.put("accessories", BigDecimal.ZERO);
|
|
|
- classFee.put("other", tenantPaymentOrder.getExpectAmount());
|
|
|
-
|
|
|
- try {
|
|
|
-
|
|
|
- Map<String, Object> payMap = payService.getPayMap(tenantPaymentOrder.getExpectAmount(), tenantPaymentOrder.getOrderNo(), baseApiUrl
|
|
|
- + "/api-teacher/teacherOrder/notify", baseApiUrl + "/api-teacher/teacherOrder/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
|
|
|
- "商户入驻", "商户充值", userId, classFee, organId, "sdaya");
|
|
|
-
|
|
|
- Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
|
|
|
- tenantPaymentOrder.setComAmount(routingFee.get("COM"));
|
|
|
- tenantPaymentOrder.setPerAmount(routingFee.get("PER"));
|
|
|
- tenantPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
|
|
|
- tenantPaymentOrder.setPaymentChannel(PaymentChannelEnum.valueOf(payMap.get("type").toString()));
|
|
|
- tenantPaymentOrder.setUpdateTime(date);
|
|
|
- tenantPaymentOrderDao.update(tenantPaymentOrder);
|
|
|
-
|
|
|
- HttpResponseResult result = new HttpResponseResult(true, HttpStatus.OK, payMap, null);
|
|
|
- return result;
|
|
|
- } catch (Exception e) {
|
|
|
- throw new BizException("调用支付接口出错", e);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
- public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
|
|
|
-
|
|
|
- Integer activitiesId = tenantPaymentOrder.getActivitiesId();
|
|
|
-
|
|
|
- Date date = new Date();
|
|
|
- tenantPaymentOrder.setUpdateTime(date);
|
|
|
- tenantPaymentOrderDao.update(tenantPaymentOrder);
|
|
|
-
|
|
|
- Integer userId = tenantPaymentOrder.getUserId();
|
|
|
-
|
|
|
- if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
|
|
|
-
|
|
|
- TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
|
|
|
- if (tenantEntryActivities == null) {
|
|
|
- throw new BizException("活动找不到");
|
|
|
- }
|
|
|
-
|
|
|
- // 更新账户表信息
|
|
|
- sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(),
|
|
|
- tenantPaymentOrder.getOrderNo(), TransType.RECHARGE, "", tenantEntryActivities.getDiscountPrice(), "");
|
|
|
- } else {
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void queryOrderStatusFromRemote() {
|
|
|
- try {
|
|
|
- yqPayQuery();
|
|
|
- } catch (Exception e) {
|
|
|
- throw new BizException("查询订单状态出现异常");
|
|
|
- }
|
|
|
- try {
|
|
|
- adaPayQuery();
|
|
|
- } catch (Exception e) {
|
|
|
- throw new BizException("查询订单状态出现异常");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void yqPayQuery() throws Exception {
|
|
|
- List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
|
|
|
-
|
|
|
- if (payingOrders.size() == 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
- List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
|
|
|
- String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
|
|
|
-
|
|
|
- String notifyUrl = ""; // 回调地址
|
|
|
- Map<String, Object> resultMap = new LinkedHashMap<>();
|
|
|
- resultMap.put("merOrderNoList", merOrderNos);
|
|
|
- Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
|
|
|
-
|
|
|
- RsqMsg rsqMsg = new RsqMsg(requestMap);
|
|
|
-
|
|
|
- Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
|
|
|
- logger.info("支付状态查询结果:{}", queryRs);
|
|
|
- if (queryRs.getCode().equals("88")) {
|
|
|
- // 更新订单状态
|
|
|
- String[] statusArr = { "0", "1", "7" };
|
|
|
- String responseParameters = queryRs.getResponseParameters();
|
|
|
- List<Map<String, Object>> responseList = JSON.parseObject(responseParameters, List.class);
|
|
|
- for (Map<String, Object> response : responseList) {
|
|
|
- Map<String, Object> rpMap = response;
|
|
|
- String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
|
|
|
- rpMap.put("channelType", channelType);
|
|
|
-
|
|
|
- if (orderNoList.contains(rpMap.get("merOrderNo"))) {
|
|
|
- orderNoList.remove(rpMap.get("merOrderNo"));
|
|
|
- }
|
|
|
-
|
|
|
- if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
|
|
|
- try {
|
|
|
- DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
|
|
|
- TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo").toString());
|
|
|
- if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- if (status.equals(DealStatusEnum.SUCCESS)) {
|
|
|
- order.setPayTime(new Date());
|
|
|
- } else {
|
|
|
- Object remarks = rpMap.get("remarks");
|
|
|
- if (remarks != null) {
|
|
|
- order.setMemo(remarks.toString());
|
|
|
- }
|
|
|
- }
|
|
|
- order.setStatus(status);
|
|
|
- order.setTransNo(rpMap.get("orderNo").toString());
|
|
|
- order.setPaymentBusinessChannel(channelType);
|
|
|
- order.setActualAmount(new BigDecimal(rpMap.get("moneyPayed").toString()));
|
|
|
- paymentForCallback(order);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Date date = new Date();
|
|
|
- for (TenantPaymentOrder po : payingOrders) {
|
|
|
- if (orderNoList.contains(po.getOrderNo())) {
|
|
|
- // 超过30分钟的关闭订单
|
|
|
- if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
|
|
|
- po.setStatus(DealStatusEnum.FAILED);
|
|
|
- po.setMemo("超时未支付关闭");
|
|
|
- paymentForCallback(po);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void adaPayQuery() throws Exception {
|
|
|
- List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
|
|
|
- if (payingOrders.size() == 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- List<String> orderNoList = new ArrayList<String>();
|
|
|
-
|
|
|
- for (TenantPaymentOrder payingOrder : payingOrders) {
|
|
|
- if (payingOrder.getTransNo() == null) {
|
|
|
- orderNoList.add(payingOrder.getOrderNo());
|
|
|
- continue;
|
|
|
- }
|
|
|
- Payment payment = new Pay().queryPayment(payingOrder.getTransNo());
|
|
|
- Map<String, String> rpMap = new HashMap<>();
|
|
|
- rpMap.put("merOrderNo", payingOrder.getOrderNo());
|
|
|
- rpMap.put("remarks", payment.getReason());
|
|
|
- rpMap.put("orderNo", payment.getId());
|
|
|
- rpMap.put("channelType", payment.getPayChannel());
|
|
|
- if (payment.getStatus().equals("succeeded")) {
|
|
|
- rpMap.put("tradeState", "1");
|
|
|
- }
|
|
|
- if (payment.getStatus().equals("failed")) {
|
|
|
- rpMap.put("tradeState", "0");
|
|
|
- }
|
|
|
- if (payment.getStatus().equals("pending")) {
|
|
|
- orderNoList.add(payingOrder.getOrderNo());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- Date date = new Date();
|
|
|
- for (TenantPaymentOrder po : payingOrders) {
|
|
|
- if (orderNoList.contains(po.getOrderNo())) {
|
|
|
- // 超过30分钟的关闭订单
|
|
|
- if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
|
|
|
- po.setStatus(DealStatusEnum.FAILED);
|
|
|
- po.setMemo("超时未支付关闭");
|
|
|
- paymentForCallback(po);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public TenantPaymentOrder queryByOrderNo(String orderNo) {
|
|
|
- return tenantPaymentOrderDao.findOrderByOrderNo(orderNo);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Object queryTenanPaymentPage(TenantPaymentOrderQueryInfo queryInfo) {
|
|
|
- PageInfoOrder<TenantPaymentOrder> pageInfo = new PageInfoOrder<>(queryInfo.getPage(), queryInfo.getRows());
|
|
|
- Map<String, Object> params = new HashMap<String, Object>();
|
|
|
- MapUtil.populateMap(params, queryInfo);
|
|
|
- List<TenantPaymentOrder> dataList = new ArrayList<>();
|
|
|
- int count = this.findCount(params);
|
|
|
- if (count > 0) {
|
|
|
- TenantPaymentOrder orderMoneyAmount = tenantPaymentOrderDao.getOrderMoneyAmount(params);
|
|
|
- if (orderMoneyAmount != null) {
|
|
|
- pageInfo.setTotalExpectAmount(orderMoneyAmount.getExpectAmount() != null ? orderMoneyAmount.getExpectAmount() : BigDecimal.ZERO);
|
|
|
- pageInfo.setTotalActualAmount(orderMoneyAmount.getActualAmount() != null ? orderMoneyAmount.getActualAmount() : BigDecimal.ZERO);
|
|
|
- }
|
|
|
- pageInfo.setTotal(count);
|
|
|
- params.put("offset", pageInfo.getOffset());
|
|
|
- dataList = tenantPaymentOrderDao.queryPage(params);
|
|
|
- }
|
|
|
- pageInfo.setRows(dataList);
|
|
|
- return pageInfo;
|
|
|
- }
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(TenantPaymentOrderServiceImpl.class);
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TenantPaymentOrderDao tenantPaymentOrderDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TenantEntryActivitiesDao tenantEntryActivitiesDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IdGeneratorService idGeneratorService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PayService payService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysConfigDao sysConfigDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TeacherDao teacherDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SysTenantAccountService sysTenantAccountService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private YqPayFeignService yqPayFeignService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public BaseDAO<Long, TenantPaymentOrder> getDAO() {
|
|
|
+ return tenantPaymentOrderDao;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
+ public HttpResponseResult createOrder(Integer userId, Integer activitiesId, boolean isContinuePay) {
|
|
|
+
|
|
|
+ Teacher teacher = teacherDao.get(userId);
|
|
|
+ if (teacher == null) {
|
|
|
+ throw new BizException("用户信息不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer organId = teacher.getTeacherOrganId();
|
|
|
+
|
|
|
+ TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
|
|
|
+ if (tenantEntryActivities == null) {
|
|
|
+ throw new BizException("活动不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+ // 判断活动是否有效
|
|
|
+ if (tenantEntryActivities.getDelFlag() == true) {
|
|
|
+ throw new BizException("活动已下架");
|
|
|
+ }
|
|
|
+ if (date.before(tenantEntryActivities.getStartDate())) {
|
|
|
+ throw new BizException("活动未开始");
|
|
|
+ }
|
|
|
+ if (date.after(tenantEntryActivities.getEndDate())) {
|
|
|
+ throw new BizException("活动已结束");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询用户订单
|
|
|
+ List<TenantPaymentOrder> orderList = tenantPaymentOrderDao.queryByUserIdAndActivitiesId(userId, activitiesId);
|
|
|
+ if (orderList != null && orderList.size() > 0) {
|
|
|
+ for (TenantPaymentOrder po : orderList) {
|
|
|
+ // 是否满足条件
|
|
|
+ if (tenantEntryActivities.getSuitableUser() == SuitableUser.NEW) {
|
|
|
+ if (po.getStatus() == DealStatusEnum.SUCCESS) {
|
|
|
+ throw new BizException("首充优惠活动每个用户限参与一次。");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (po.getStatus() == DealStatusEnum.ING) {
|
|
|
+ int i = 35 - DateUtil.minutesBetween(po.getCreateTime(), date);
|
|
|
+ if (i <= 0) {
|
|
|
+ throw new BizException("您有支付中的订单出现异常,请联系客服");
|
|
|
+ }
|
|
|
+ // throw new BizException("您参加的首充活动正在处理中,预计于{}分钟后处理完毕,请稍后。", i);
|
|
|
+ if (isContinuePay == false) {
|
|
|
+ HttpResponseResult result = new HttpResponseResult(true, HttpStatus.CONTINUE, "您存在支付中的订单,是否重新付款?", null);
|
|
|
+ return result;
|
|
|
+ } else {
|
|
|
+ // 关闭原订单
|
|
|
+ po.setStatus(DealStatusEnum.CLOSE);
|
|
|
+ po.setMemo("用户主动关闭");
|
|
|
+ po.setUpdateTime(date);
|
|
|
+ tenantPaymentOrderDao.update(po);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ TenantPaymentOrder tenantPaymentOrder = new TenantPaymentOrder();
|
|
|
+ tenantPaymentOrder.setUserId(userId);
|
|
|
+ tenantPaymentOrder.setTransMinutes(tenantEntryActivities.getPurchaseMinutes());
|
|
|
+ tenantPaymentOrder.setGiveMinutes(tenantEntryActivities.getGiveMinutes());
|
|
|
+ tenantPaymentOrder.setOrderNo(idGeneratorService.generatorId("tenant_payment") + "");
|
|
|
+ tenantPaymentOrder.setType(TenantPaymentType.RECHARGE);
|
|
|
+ tenantPaymentOrder.setExpectAmount(tenantEntryActivities.getDiscountPrice());
|
|
|
+ tenantPaymentOrder.setStatus(DealStatusEnum.ING);
|
|
|
+ tenantPaymentOrder.setCreateTime(date);
|
|
|
+ tenantPaymentOrder.setUpdateTime(date);
|
|
|
+ tenantPaymentOrder.setVersion(0);
|
|
|
+ tenantPaymentOrder.setOrganId(organId);
|
|
|
+ tenantPaymentOrder.setActivitiesId(activitiesId);
|
|
|
+ tenantPaymentOrderDao.insert(tenantPaymentOrder);
|
|
|
+
|
|
|
+ String baseApiUrl = sysConfigDao.findConfigValue("teacher_base_url");
|
|
|
+
|
|
|
+ // 分类费用 course,instrument,accessories,other
|
|
|
+ Map<String, BigDecimal> classFee = new HashMap<>();
|
|
|
+ classFee.put("course", BigDecimal.ZERO);
|
|
|
+ classFee.put("instrument", BigDecimal.ZERO);
|
|
|
+ classFee.put("accessories", BigDecimal.ZERO);
|
|
|
+ classFee.put("other", tenantPaymentOrder.getExpectAmount());
|
|
|
+
|
|
|
+ try {
|
|
|
+
|
|
|
+ Map<String, Object> payMap = payService.getPayMap(tenantPaymentOrder.getExpectAmount(), tenantPaymentOrder.getOrderNo(), baseApiUrl
|
|
|
+ + "/api-teacher/teacherOrder/notify", baseApiUrl + "/api-teacher/teacherOrder/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
|
|
|
+ "商户入驻", "商户充值", userId, classFee, organId, "sdaya");
|
|
|
+
|
|
|
+ Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
|
|
|
+ tenantPaymentOrder.setComAmount(routingFee.get("COM"));
|
|
|
+ tenantPaymentOrder.setPerAmount(routingFee.get("PER"));
|
|
|
+ tenantPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
|
|
|
+ tenantPaymentOrder.setPaymentChannel(PaymentChannelEnum.valueOf(payMap.get("type").toString()));
|
|
|
+ tenantPaymentOrder.setUpdateTime(date);
|
|
|
+ tenantPaymentOrderDao.update(tenantPaymentOrder);
|
|
|
+
|
|
|
+ HttpResponseResult result = new HttpResponseResult(true, HttpStatus.OK, payMap, null);
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("调用支付接口出错", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
+ public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
|
|
|
+
|
|
|
+ Integer activitiesId = tenantPaymentOrder.getActivitiesId();
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+ tenantPaymentOrder.setUpdateTime(date);
|
|
|
+ tenantPaymentOrderDao.update(tenantPaymentOrder);
|
|
|
+
|
|
|
+ Integer userId = tenantPaymentOrder.getUserId();
|
|
|
+
|
|
|
+ if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
|
|
|
+
|
|
|
+ TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
|
|
|
+ if (tenantEntryActivities == null) {
|
|
|
+ throw new BizException("活动找不到");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新账户表信息
|
|
|
+ sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(),
|
|
|
+ tenantPaymentOrder.getOrderNo(), TransType.RECHARGE, "", tenantEntryActivities.getDiscountPrice(), "");
|
|
|
+ } else {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void queryOrderStatusFromRemote() {
|
|
|
+ try {
|
|
|
+ yqPayQuery();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("查询订单状态出现异常");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ adaPayQuery();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new BizException("查询订单状态出现异常");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void yqPayQuery() throws Exception {
|
|
|
+ List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
|
|
|
+
|
|
|
+ if (payingOrders.size() == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
|
|
|
+ String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
|
|
|
+
|
|
|
+ String notifyUrl = ""; // 回调地址
|
|
|
+ Map<String, Object> resultMap = new LinkedHashMap<>();
|
|
|
+ resultMap.put("merOrderNoList", merOrderNos);
|
|
|
+ Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
|
|
|
+
|
|
|
+ RsqMsg rsqMsg = new RsqMsg(requestMap);
|
|
|
+
|
|
|
+ Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
|
|
|
+ logger.info("支付状态查询结果:{}", queryRs);
|
|
|
+ if (queryRs.getCode().equals("88")) {
|
|
|
+ // 更新订单状态
|
|
|
+ String[] statusArr = {"0", "1", "7"};
|
|
|
+ String responseParameters = queryRs.getResponseParameters();
|
|
|
+ List<Map<String, Object>> responseList = JSON.parseObject(responseParameters, List.class);
|
|
|
+ for (Map<String, Object> response : responseList) {
|
|
|
+ Map<String, Object> rpMap = response;
|
|
|
+ String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
|
|
|
+ rpMap.put("channelType", channelType);
|
|
|
+
|
|
|
+ if (orderNoList.contains(rpMap.get("merOrderNo"))) {
|
|
|
+ orderNoList.remove(rpMap.get("merOrderNo"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
|
|
|
+ try {
|
|
|
+ DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
|
|
|
+ TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo").toString());
|
|
|
+ if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (status.equals(DealStatusEnum.SUCCESS)) {
|
|
|
+ order.setPayTime(new Date());
|
|
|
+ order.setActualAmount(new BigDecimal((String) rpMap.get("payAmount")));
|
|
|
+ } else {
|
|
|
+ Object remarks = rpMap.get("remarks");
|
|
|
+ if (remarks != null) {
|
|
|
+ order.setMemo(remarks.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ order.setStatus(status);
|
|
|
+ order.setTransNo(rpMap.get("orderNo").toString());
|
|
|
+ order.setPaymentBusinessChannel(channelType);
|
|
|
+ paymentForCallback(order);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+ for (TenantPaymentOrder po : payingOrders) {
|
|
|
+ if (orderNoList.contains(po.getOrderNo())) {
|
|
|
+ // 超过30分钟的关闭订单
|
|
|
+ if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
|
|
|
+ po.setStatus(DealStatusEnum.FAILED);
|
|
|
+ po.setMemo("超时未支付关闭");
|
|
|
+ paymentForCallback(po);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void adaPayQuery() throws Exception {
|
|
|
+ List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
|
|
|
+ if (payingOrders.size() == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> orderNoList = new ArrayList<String>();
|
|
|
+
|
|
|
+ for (TenantPaymentOrder payingOrder : payingOrders) {
|
|
|
+ if (payingOrder.getTransNo() == null) {
|
|
|
+ orderNoList.add(payingOrder.getOrderNo());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ Map<String, Object> payment = Payment.queryPayment(payingOrder.getTransNo());
|
|
|
+
|
|
|
+ String channelType = (String) payment.get("pay_channel");
|
|
|
+ String payStatus = (String) payment.get("status");
|
|
|
+ String transNo = (String) payment.get("id");
|
|
|
+ String memo = null;
|
|
|
+ if (payment.containsKey("error_msg")) {
|
|
|
+ memo = (String) payment.get("error_msg");
|
|
|
+ }
|
|
|
+ DealStatusEnum status = null;
|
|
|
+ if (payStatus.equals("succeeded")) {
|
|
|
+ status = DealStatusEnum.SUCCESS;
|
|
|
+ payingOrder.setActualAmount(new BigDecimal((String) payment.get("pay_amt")));
|
|
|
+ } else if (payStatus.equals("failed")) {
|
|
|
+ status = DealStatusEnum.FAILED;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (status != null) {
|
|
|
+ payingOrder.setStatus(status);
|
|
|
+ payingOrder.setTransNo(transNo);
|
|
|
+ payingOrder.setPaymentBusinessChannel(channelType);
|
|
|
+ payingOrder.setMemo(memo);
|
|
|
+ try {
|
|
|
+ paymentForCallback(payingOrder);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (status.equals("pending")) {
|
|
|
+ orderNoList.add(payingOrder.getOrderNo());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Date date = new Date();
|
|
|
+ for (TenantPaymentOrder po : payingOrders) {
|
|
|
+ if (orderNoList.contains(po.getOrderNo())) {
|
|
|
+ // 超过30分钟的关闭订单
|
|
|
+ if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
|
|
|
+ po.setStatus(DealStatusEnum.FAILED);
|
|
|
+ po.setMemo("超时未支付关闭");
|
|
|
+ paymentForCallback(po);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public TenantPaymentOrder queryByOrderNo(String orderNo) {
|
|
|
+ return tenantPaymentOrderDao.findOrderByOrderNo(orderNo);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object queryTenanPaymentPage(TenantPaymentOrderQueryInfo queryInfo) {
|
|
|
+ PageInfoOrder<TenantPaymentOrder> pageInfo = new PageInfoOrder<>(queryInfo.getPage(), queryInfo.getRows());
|
|
|
+ Map<String, Object> params = new HashMap<String, Object>();
|
|
|
+ MapUtil.populateMap(params, queryInfo);
|
|
|
+ List<TenantPaymentOrder> dataList = new ArrayList<>();
|
|
|
+ int count = this.findCount(params);
|
|
|
+ if (count > 0) {
|
|
|
+ TenantPaymentOrder orderMoneyAmount = tenantPaymentOrderDao.getOrderMoneyAmount(params);
|
|
|
+ if (orderMoneyAmount != null) {
|
|
|
+ pageInfo.setTotalExpectAmount(orderMoneyAmount.getExpectAmount() != null ? orderMoneyAmount.getExpectAmount() : BigDecimal.ZERO);
|
|
|
+ pageInfo.setTotalActualAmount(orderMoneyAmount.getActualAmount() != null ? orderMoneyAmount.getActualAmount() : BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ pageInfo.setTotal(count);
|
|
|
+ params.put("offset", pageInfo.getOffset());
|
|
|
+ dataList = tenantPaymentOrderDao.queryPage(params);
|
|
|
+ }
|
|
|
+ pageInfo.setRows(dataList);
|
|
|
+ return pageInfo;
|
|
|
+ }
|
|
|
}
|