Commit 6bde929f by 程裕兵

Merge branch 'feature/mini-pay' into 'master'

Feature/mini pay

See merge request !2
parents 95e75898 8d2272ed
......@@ -4,18 +4,22 @@ import com.jiejing.common.model.JsonResult;
import com.jiejing.common.model.PageVO;
import com.jiejing.fitness.finance.api.merchant.request.ApplyStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.AuthStudioSubChannelRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioMerchantXcxAppIdRequest;
import com.jiejing.fitness.finance.api.merchant.request.CheckUnbindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetAuthStudioSubChannelRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetOpenIdRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioLatestMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.PageStudioMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.StudioMerchantPayRequest;
import com.jiejing.fitness.finance.api.merchant.request.StudioMerchantRefundRequest;
import com.jiejing.fitness.finance.api.merchant.request.SyncStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.UnbindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.vo.StudioEmbeddedXcxVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO;
......@@ -106,4 +110,16 @@ public interface StudioMerchantApi {
@PostMapping(value = "/private/studioMerchant/refund")
JsonResult<StudioMerchantRefundVO> refund(StudioMerchantRefundRequest request);
@ApiOperation(value = "获取半屏小程序", tags = {TAG})
@PostMapping(value = "/private/studio/getEmbeddedXcx")
JsonResult<StudioEmbeddedXcxVO> getEmbeddedXcx(GetStudioEmbeddedXcxRequest request);
@ApiOperation(value = "绑定半屏小程序", tags = {TAG})
@PostMapping(value = "/private/studio/bindEmbeddedXcx")
JsonResult<Void> bindEmbeddedXcx(BindStudioEmbeddedXcxRequest request);
@ApiOperation(value = "同步半屏小程序状态", tags = {TAG})
@PostMapping(value = "/private/studio/syncEmbeddedXcx")
JsonResult<Void> syncEmbeddedXcx(SyncStudioEmbeddedXcxRequest request);
}
\ No newline at end of file
......@@ -4,18 +4,22 @@ import com.jiejing.common.model.JsonResult;
import com.jiejing.common.model.PageVO;
import com.jiejing.fitness.finance.api.merchant.request.ApplyStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.AuthStudioSubChannelRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioMerchantXcxAppIdRequest;
import com.jiejing.fitness.finance.api.merchant.request.CheckUnbindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetAuthStudioSubChannelRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetOpenIdRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioLatestMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.PageStudioMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.StudioMerchantPayRequest;
import com.jiejing.fitness.finance.api.merchant.request.StudioMerchantRefundRequest;
import com.jiejing.fitness.finance.api.merchant.request.SyncStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.UnbindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.vo.StudioEmbeddedXcxVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO;
......@@ -126,6 +130,21 @@ public class StudioMerchantApiFallback implements FallbackFactory<StudioMerchant
public JsonResult<StudioMerchantRefundVO> refund(StudioMerchantRefundRequest request) {
return JsonResult.rpcError();
}
@Override
public JsonResult<StudioEmbeddedXcxVO> getEmbeddedXcx(GetStudioEmbeddedXcxRequest request) {
return JsonResult.rpcError();
}
@Override
public JsonResult<Void> bindEmbeddedXcx(BindStudioEmbeddedXcxRequest request) {
return JsonResult.rpcError();
}
@Override
public JsonResult<Void> syncEmbeddedXcx(SyncStudioEmbeddedXcxRequest request) {
return JsonResult.rpcError();
}
};
}
}
package com.jiejing.fitness.finance.api.merchant.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author chengyubing
* @since 2024/8/13 15:28
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "绑定半屏小程序")
public class BindStudioEmbeddedXcxRequest {
@ApiModelProperty(value = "场馆ID", required = true)
@NotNull(message = "场馆ID不能为空")
private Long studioId;
@ApiModelProperty(value = "小程序appId", required = true)
@NotBlank(message = "小程序appId不能为空")
private String appId;
}
package com.jiejing.fitness.finance.api.merchant.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author chengyubing
* @since 2024/8/13 15:28
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "获取半屏小程序")
public class GetStudioEmbeddedXcxRequest {
@ApiModelProperty(value = "场馆ID", required = true)
@NotNull(message = "场馆ID不能为空")
private Long studioId;
@ApiModelProperty(value = "小程序appId", required = true)
@NotBlank(message = "小程序appId不能为空")
private String appId;
}
package com.jiejing.fitness.finance.api.merchant.request;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author chengyubing
* @since 2024/8/13 15:28
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "同步半屏小程序状态")
public class SyncStudioEmbeddedXcxRequest {
@ApiModelProperty(value = "场馆ID")
private Long studioId;
}
package com.jiejing.fitness.finance.api.merchant.vo;
import com.jiejing.common.swagger.EnumMapping;
import com.jiejing.fitness.enums.finance.EmbededXcxEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* <p>
* 场馆半屏小程序申请记录
* </p>
*
* @author chengyubing, created on 2024-08-13
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "半屏小程序VO")
public class StudioEmbeddedXcxVO {
@ApiModelProperty("ID")
private Long id;
@ApiModelProperty("品牌ID")
private Long brandId;
@ApiModelProperty("场馆ID")
private Long studioId;
@ApiModelProperty("小程序appId")
private String appId;
@ApiModelProperty("授权方appId")
private String authorizerAppId;
@EnumMapping(enumClass = EmbededXcxEnum.class)
@ApiModelProperty("状态")
private String state;
@ApiModelProperty("失败原因")
private String message;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("更新时间")
private Date updateTime;
}
......@@ -40,6 +40,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
"com.jiejing.fitness.rpc.api",
"com.jiejing.permcenter.api",
"com.jiejing.configcenter.api",
"com.jiejing.workflow.api",
})
@SpringBootApplication(scanBasePackages = "com.jiejing", exclude = {
DruidDataSourceAutoConfigure.class
......
package com.jiejing.fitness.finance.app.controller.merchant;
import com.google.common.collect.Lists;
import com.jiejing.common.model.JsonResult;
import com.jiejing.common.model.PageVO;
import com.jiejing.common.utils.convert.BeanUtil;
import com.jiejing.fitness.finance.api.merchant.StudioMerchantApi;
import com.jiejing.fitness.finance.api.merchant.request.ApplyStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.AuthStudioSubChannelRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.BindStudioMerchantXcxAppIdRequest;
import com.jiejing.fitness.finance.api.merchant.request.CheckUnbindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetAuthStudioSubChannelRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetOpenIdRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioLatestMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.GetStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.request.PageStudioMerchantApplyRequest;
import com.jiejing.fitness.finance.api.merchant.request.StudioMerchantPayRequest;
import com.jiejing.fitness.finance.api.merchant.request.StudioMerchantRefundRequest;
import com.jiejing.fitness.finance.api.merchant.request.SyncStudioEmbeddedXcxRequest;
import com.jiejing.fitness.finance.api.merchant.request.UnbindStudioMerchantRequest;
import com.jiejing.fitness.finance.api.merchant.vo.StudioEmbeddedXcxVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO;
......@@ -197,4 +202,29 @@ public class StudioMerchantController implements StudioMerchantApi {
return JsonResult.success(refundService.merchantRefund(params));
}
@ApiOperation(value = "获取半屏小程序", tags = {TAG})
@PostMapping(value = "/private/studio/getEmbeddedXcx")
@Override
public JsonResult<StudioEmbeddedXcxVO> getEmbeddedXcx(
@RequestBody @Valid GetStudioEmbeddedXcxRequest request) {
return JsonResult.success(
studioMerchantService.getEmbeddedXcx(request.getStudioId(), request.getAppId()));
}
@ApiOperation(value = "绑定半屏小程序", tags = {TAG})
@PostMapping(value = "/private/studio/bindEmbeddedXcx")
@Override
public JsonResult<Void> bindEmbeddedXcx(@RequestBody @Valid BindStudioEmbeddedXcxRequest request) {
studioMerchantService.bindEmbeddedXcx(request.getStudioId(), Lists.newArrayList(request.getAppId()));
return JsonResult.success();
}
@ApiOperation(value = "同步半屏小程序状态", tags = {TAG})
@PostMapping(value = "/private/studio/syncEmbeddedXcx")
@Override
public JsonResult<Void> syncEmbeddedXcx(@RequestBody @Valid SyncStudioEmbeddedXcxRequest request) {
studioMerchantService.syncEmbeddedXcx();
return JsonResult.success();
}
}
......@@ -22,4 +22,10 @@ finance:
ali_app: "002"
wx_app: "003"
url:
transDetail: /pay/transaction-record/detail?id=
\ No newline at end of file
transDetail: /pay/transaction-record/detail?id=
wx:
component:
appId: wxe6c4979bafd48126
embedded:
appId: wx06a084dcba4f0a05
\ No newline at end of file
......@@ -22,4 +22,10 @@ finance:
ali_app: "002"
wx_app: "003"
url:
transDetail: /pay/transaction-record/detail?id=
\ No newline at end of file
transDetail: /pay/transaction-record/detail?id=
wx:
component:
appId: wxda913f3b6f1439b4
embedded:
appId: wxf187be22c2234300
\ No newline at end of file
......@@ -27,4 +27,10 @@ finance:
ali_app: "002"
wx_app: "003"
url:
transDetail: /pay/transaction-record/detail?id=
\ No newline at end of file
transDetail: /pay/transaction-record/detail?id=
wx:
component:
appId: wxda913f3b6f1439b4
embedded:
appId: wxf187be22c2234300
......@@ -22,4 +22,10 @@ finance:
ali_app: "002"
wx_app: "003"
url:
transDetail: /pay/transaction-record/detail?id=
\ No newline at end of file
transDetail: /pay/transaction-record/detail?id=
wx:
component:
appId: wxe6c4979bafd48126
embedded:
appId: wx06a084dcba4f0a05
\ No newline at end of file
......@@ -22,4 +22,10 @@ finance:
ali_app: "002"
wx_app: "003"
url:
transDetail: /pay/transaction-record/detail?id=
\ No newline at end of file
transDetail: /pay/transaction-record/detail?id=
wx:
component:
appId: wxeca14e61b1e1370b
embedded:
appId: wxf187be22c2234300
\ No newline at end of file
......@@ -96,6 +96,11 @@
<artifactId>configcenter-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.jiejing.base</groupId>
<artifactId>workflow-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- ======================= jiejing api end ======================= -->
......
/*
* Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
*
* The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
* Official website: www.xiaomai5.com
*
*
*
* Copyright © 2024 杭州杰竞科技有限公司 版权所有.
*
* 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
* 官网: www.xiaomai5.com
*/
package com.jiejing.fitness.finance.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* <p>
* 场馆半屏小程序申请记录
* </p>
*
* @author chengyubing, created on 2024-08-13
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Builder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
public class StudioEmbeddedXcxApply implements Serializable {
private static final long serialVersionUID = -4415580599984265484L;
/**
* 备注: 主键 是否允许为null: NO
*/
@TableId(value = "id", type = IdType.ID_WORKER)
private Long id;
/**
* 备注: 场馆ID 是否允许为null: YES
*/
private Long studioId;
/**
* 备注: 第三方平台appId 是否允许为null: YES
*/
private String componentAppId;
/**
* 备注: 授权方appId(申请小程序appId) 是否允许为null: YES
*/
private String authorizerAppId;
/**
* 备注: 半屏小程序appId 是否允许为null: YES
*/
private String embeddedAppId;
/**
* 备注: 状态 是否允许为null: YES
*/
private String state;
/**
* 备注: 失败原因 是否允许为null: YES
*/
private String message;
/**
* 备注: 创建时间 是否允许为null: YES
*/
private Date createTime;
/**
* 备注: 更新时间 是否允许为null: YES
*/
private Date updateTime;
public static final String ID = "id";
public static final String STUDIO_ID = "studio_id";
public static final String COMPONENT_APP_ID = "component_app_id";
public static final String AUTHORIZER_APP_ID = "authorizer_app_id";
public static final String EMBEDDED_APP_ID = "embedded_app_id";
public static final String STATE = "state";
public static final String MESSAGE = "message";
public static final String CREATE_TIME = "create_time";
public static final String UPDATE_TIME = "update_time";
}
/*
* Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
*
* The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
* Official website: www.xiaomai5.com
*
*
*
* Copyright © 2024 杭州杰竞科技有限公司 版权所有.
*
* 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
* 官网: www.xiaomai5.com
*/
package com.jiejing.fitness.finance.repository.mapper;
import com.jiejing.fitness.finance.repository.entity.StudioEmbeddedXcxApply;
import com.jiejing.mbp.inject.XBaseMapper;
/**
* <p>
* 场馆半屏小程序申请记录 Mapper 接口
* </p>
*
* @author chengyubing, created on 2024-08-13
*/
public interface StudioEmbeddedXcxApplyMapper extends XBaseMapper<StudioEmbeddedXcxApply> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
~
~ The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
~ Official website: www.xiaomai5.com
~
~
~
~ Copyright © 2024 杭州杰竞科技有限公司 版权所有.
~
~ 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
~ 官网: www.xiaomai5.com
-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jiejing.fitness.finance.repository.mapper.StudioEmbeddedXcxApplyMapper">
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, studio_id, component_app_id, embedded_app_id, authorizer_app_id, state, message, create_time, update_time
</sql>
</mapper>
/*
* Copyright © 2024 Hangzhou Jiejing Technology Co., Ltd. All rights reserved.
*
* The copyright of the company's program code belongs to Hangzhou Jiejing Technology Co., Ltd. No one can illegally copy it without the explicit permission of this website.
* Official website: www.xiaomai5.com
*
*
*
* Copyright © 2024 杭州杰竞科技有限公司 版权所有.
*
* 本公司程序代码的版权归杭州杰竞科技有限公司所有,未经本网站的明确许可,任何人不得非法复制。
* 官网: www.xiaomai5.com
*/
package com.jiejing.fitness.finance.repository.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jiejing.fitness.enums.finance.EmbededXcxEnum;
import com.jiejing.fitness.finance.repository.entity.StudioEmbeddedXcxApply;
import com.jiejing.fitness.finance.repository.mapper.StudioEmbeddedXcxApplyMapper;
import com.jiejing.mbp.MapperRepoService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
/**
* <p>
* 场馆半屏小程序申请记录 服务实现类
* </p>
*
* @author chengyubing, created on 2024-08-13
*/
@Service
public class StudioEmbeddedXcxApplyRpService extends
MapperRepoService<Long, StudioEmbeddedXcxApply, StudioEmbeddedXcxApplyMapper> {
public Map<String, StudioEmbeddedXcxApply> mapByAppId(String componentAppId, String embeddedAppId,
List<String> appIds) {
return this.listByAppId(componentAppId, embeddedAppId, appIds)
.stream().collect(Collectors.toMap(StudioEmbeddedXcxApply::getAuthorizerAppId, e -> e));
}
public List<StudioEmbeddedXcxApply> listByAppId(String componentAppId, String embeddedAppId,
List<String> appIds) {
QueryWrapper<StudioEmbeddedXcxApply> wrapper = new QueryWrapper<>();
wrapper.eq(StudioEmbeddedXcxApply.COMPONENT_APP_ID, componentAppId);
wrapper.eq(StudioEmbeddedXcxApply.EMBEDDED_APP_ID, embeddedAppId);
wrapper.in(StudioEmbeddedXcxApply.AUTHORIZER_APP_ID, appIds);
return Optional.ofNullable(this.baseMapper.selectList(wrapper)).orElse(new ArrayList<>(1));
}
public StudioEmbeddedXcxApply getByAppId(String componentAppId, String embeddedAppId, String appId) {
QueryWrapper<StudioEmbeddedXcxApply> wrapper = new QueryWrapper<>();
wrapper.eq(StudioEmbeddedXcxApply.COMPONENT_APP_ID, componentAppId);
wrapper.eq(StudioEmbeddedXcxApply.EMBEDDED_APP_ID, embeddedAppId);
wrapper.eq(StudioEmbeddedXcxApply.AUTHORIZER_APP_ID, appId);
return Optional.ofNullable(this.baseMapper.selectList(wrapper))
.orElse(new ArrayList<>(1))
.stream().findFirst().orElse(null);
}
public List<StudioEmbeddedXcxApply> listByAppIds(String componentAppId, String embeddedAppId,
List<String> appIds) {
QueryWrapper<StudioEmbeddedXcxApply> wrapper = new QueryWrapper<>();
wrapper.eq(StudioEmbeddedXcxApply.COMPONENT_APP_ID, componentAppId);
wrapper.eq(StudioEmbeddedXcxApply.EMBEDDED_APP_ID, embeddedAppId);
wrapper.in(StudioEmbeddedXcxApply.AUTHORIZER_APP_ID, appIds);
return Optional.ofNullable(this.baseMapper.selectList(wrapper)).orElse(new ArrayList<>(1));
}
public List<StudioEmbeddedXcxApply> listAllInit(String componentAppId, String embeddedAppId) {
QueryWrapper<StudioEmbeddedXcxApply> wrapper = new QueryWrapper<>();
wrapper.eq(StudioEmbeddedXcxApply.COMPONENT_APP_ID, componentAppId);
wrapper.eq(StudioEmbeddedXcxApply.EMBEDDED_APP_ID, embeddedAppId);
wrapper.eq(StudioEmbeddedXcxApply.STATE, EmbededXcxEnum.INIT.getCode());
return Optional.ofNullable(this.baseMapper.selectList(wrapper)).orElse(new ArrayList<>(1));
}
}
......@@ -59,7 +59,8 @@ public class GeneratorServiceEntity {
// "branch_bank",
// "studio_settle_record",
// "studio_check_settle_record",
"merchant_settle_record"
// "merchant_settle_record"
"studio_embedded_xcx_apply"
};
/**
......
......@@ -44,6 +44,10 @@
<artifactId>configcenter-api</artifactId>
</dependency>
<dependency>
<groupId>com.jiejing.base</groupId>
<artifactId>workflow-api</artifactId>
</dependency>
<dependency>
<groupId>com.jiejing.event</groupId>
<artifactId>scs-event</artifactId>
</dependency>
......
......@@ -7,6 +7,7 @@ import com.jiejing.common.exception.BizException;
import com.jiejing.common.model.PageVO;
import com.jiejing.common.utils.collection.CollectionUtil;
import com.jiejing.common.utils.convert.BeanUtil;
import com.jiejing.common.utils.http.HttpAgent;
import com.jiejing.common.utils.text.StringUtil;
import com.jiejing.fitness.enums.finance.BrandCashierTransTypeEnum;
import com.jiejing.fitness.finance.api.cashier.vo.StudioCashierRecordVO;
......@@ -181,4 +182,12 @@ public class StudioCashierServiceImpl implements StudioCashierService {
return CashierConvert.convertList(records);
}
public static void main(String[] args) {
String token = "83_5IJi4qSVAhY4leEebVWVzDuNZT5RAbwl9cEWi_iw6N5DWqWZ0jS2A1FvOn7lrxJaFqzwqXRAnowcDkoQW8vRmEr6H9lKUe-4khE8GCgXML7MSqxWmm8ZwDBWIPFEriqiAYYTfpybdKrK0FXxGSGgAEDWIW";
String url = "https://api.weixin.qq.com/wxaapi/wxaembedded/add_embedded?access_token=%s";
JSONObject json = HttpAgent.postAsJson(String.format(url, token),
new JSONObject().fluentPut("appid", "wx2e1e65f65f6e257d")).asJSONObject();
System.out.println(json);
}
}
......@@ -8,8 +8,10 @@ import com.jiejing.fitness.finance.service.merchant.StudioMerchantService;
import com.jiejing.fitness.finance.service.pay.PayService;
import com.jiejing.fitness.finance.service.pay.RefundService;
import com.jiejing.paycenter.common.event.MerchantEvent;
import com.jiejing.paycenter.common.event.MerchantSubChannelEvent;
import com.jiejing.paycenter.common.event.PayEvent;
import com.jiejing.paycenter.common.event.RefundEvent;
import com.jiejing.workflow.event.DelayTaskEvent;
import com.xiaomai.event.annotation.EventHandler;
import java.util.ArrayList;
import java.util.Optional;
......@@ -78,4 +80,25 @@ public class ListenerService {
}
}
@EventHandler(value = MerchantSubChannelEvent.class, binder = "biz-kafka", maxAttempts = MAX_RETRY)
public void merchantSubChannelEventCallback(MerchantSubChannelEvent event,
@Header(DELIVERY_ATTEMPT) int retryNum) {
try {
log.info("start process merchantSubChannelEventCallback event {}", JSON.toJSONString(event));
studioMerchantService.merchantSubChannelEventCallback(event);
} catch (Exception e) {
log.info("process merchantSubChannelEventCallback event fail {}", event.getId(), e);
}
}
@EventHandler(value = DelayTaskEvent.class, binder = "biz-kafka", maxAttempts = MAX_RETRY)
public void delayTaskEventCallback(DelayTaskEvent event, @Header(DELIVERY_ATTEMPT) int retryNum) {
try {
log.info("start process delayTaskEventCallback {}", JSON.toJSONString(event));
studioMerchantService.syncEmbeddedXcx(event.getId());
} catch (Exception e) {
log.info("process delayTaskEventCallback fail {}", event, e);
}
}
}
package com.jiejing.fitness.finance.service.merchant;
import com.jiejing.common.model.PageVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioEmbeddedXcxVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantAuthSubChannelVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantBindXcxAppIdVO;
......@@ -11,6 +12,7 @@ import com.jiejing.fitness.finance.service.merchant.params.PageStudioMerchantApp
import com.jiejing.paycenter.common.enums.merchant.SubChannelAuthTypeEnums;
import com.jiejing.paycenter.common.enums.merchant.SubChannelEnums;
import com.jiejing.paycenter.common.event.MerchantEvent;
import com.jiejing.paycenter.common.event.MerchantSubChannelEvent;
import java.util.List;
import java.util.Set;
......@@ -66,6 +68,13 @@ public interface StudioMerchantService {
void callback(MerchantEvent event);
/**
* 商户子渠道事件处理
*
* @param event 事件
*/
void merchantSubChannelEventCallback(MerchantSubChannelEvent event);
/**
* 获取场馆当前绑定的商户信息
*
* @param studioId 场馆ID
......@@ -160,4 +169,31 @@ public interface StudioMerchantService {
*/
StudioMerchantApplyVO getLatestSuccessApply(Long studioId);
/**
* 获取半屏小程序绑定信息
*
* @param studioId 场馆ID
* @param appId 小程序appId
* @return 结果
*/
StudioEmbeddedXcxVO getEmbeddedXcx(Long studioId, String appId);
/**
* 绑定半屏小程序
*
* @param studioId 场馆ID
* @param appIds 小程序appId
*/
void bindEmbeddedXcx(Long studioId, List<String> appIds);
/**
* 同步半屏小程序状态
*/
void syncEmbeddedXcx();
/**
* 同步半屏小程序状态
*/
void syncEmbeddedXcx(Long id);
}
......@@ -14,9 +14,11 @@ import com.jiejing.fitness.finance.api.merchant.vo.BrandBankCardVO;
import com.jiejing.fitness.finance.api.merchant.vo.BrandLegalVO;
import com.jiejing.fitness.finance.api.merchant.vo.BrandLicenseVO;
import com.jiejing.fitness.finance.api.merchant.vo.BrandMerchantVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioEmbeddedXcxVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantVO;
import com.jiejing.fitness.finance.repository.entity.PartyToMerchant;
import com.jiejing.fitness.finance.repository.entity.StudioEmbeddedXcxApply;
import com.jiejing.fitness.finance.repository.entity.StudioMerchantApply;
import com.jiejing.fitness.finance.service.global.dto.SubChannelInfoDTO;
import com.jiejing.fitness.finance.service.merchant.params.ApplyStudioMerchantParams;
......
package com.jiejing.fitness.finance.service.merchant.convert;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.jiejing.common.config.idgen.adapter.IdWorker;
import com.jiejing.common.utils.time.TimeUtil;
import com.jiejing.fitness.enums.delay.DelayTaskCodeEnum;
import com.jiejing.fitness.enums.finance.EmbededXcxEnum;
import com.jiejing.fitness.finance.api.merchant.vo.StudioMerchantApplyVO;
import com.jiejing.fitness.finance.repository.entity.StudioEmbeddedXcxApply;
import com.jiejing.wechat.vo.xcx.HalfScreenXcxAuthVO.AuthXcxInfo;
import com.jiejing.workflow.api.request.BatchSaveDelayTaskRequest;
import com.jiejing.workflow.api.request.BatchSaveDelayTaskRequest.TaskInfo;
import com.jiejing.workflow.common.enums.DelayTopicEnum;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author chengyubing
* @since 2024/8/13 15:02
*/
public class StudioEmbeddedXcxConvert {
public static StudioEmbeddedXcxApply toEntity(Long studioId, String componentAppId, String embeddedAppId,
String appId) {
StudioEmbeddedXcxApply record = new StudioEmbeddedXcxApply();
record.setId(IdWorker.getId());
record.setComponentAppId(componentAppId);
record.setAuthorizerAppId(appId);
record.setEmbeddedAppId(embeddedAppId);
record.setStudioId(studioId);
record.setState(EmbededXcxEnum.INIT.getCode());
record.setCreateTime(new Date());
record.setUpdateTime(new Date());
return record;
}
public static StudioEmbeddedXcxApply toRefuse(Long id, String fail) {
return StudioEmbeddedXcxApply.builder()
.id(id)
.state(EmbededXcxEnum.REFUSE.getCode())
.message(fail)
.updateTime(new Date())
.build();
}
public static StudioEmbeddedXcxApply toSuccess(Long id) {
return StudioEmbeddedXcxApply.builder()
.id(id)
.state(EmbededXcxEnum.SUCCESS.getCode())
.updateTime(new Date())
.build();
}
public static List<Long> filterAppIds(List<StudioEmbeddedXcxApply> applies, List<String> appIds) {
return applies.stream()
.filter(e -> !EmbededXcxEnum.SUCCESS.getCode().equals(e.getState()))
.filter(e -> appIds.contains(e.getAuthorizerAppId()))
.map(StudioEmbeddedXcxApply::getId)
.collect(Collectors.toList());
}
public static List<StudioEmbeddedXcxApply> toFailList(EmbededXcxEnum status,
List<StudioEmbeddedXcxApply> applies, List<AuthXcxInfo> authXcxInfos) {
Map<String, AuthXcxInfo> map = authXcxInfos.stream()
.collect(Collectors.toMap(AuthXcxInfo::getAppId, e -> e));
return applies.stream()
.filter(e -> null != map.get(e.getAuthorizerAppId()))
.filter(e -> {
AuthXcxInfo info = map.get(e.getAuthorizerAppId());
return EmbededXcxEnum.valueOf(e.getState()) != EmbededXcxEnum.getByWxCode(
Integer.parseInt(info.getStatus()));
})
.map(e -> StudioEmbeddedXcxApply.builder()
.id(e.getId())
.state(status.getCode())
.updateTime(new Date())
.build())
.collect(Collectors.toList());
}
public static StudioEmbeddedXcxApply toInit(StudioEmbeddedXcxApply entity) {
StudioEmbeddedXcxApply toInit = new StudioEmbeddedXcxApply();
toInit.setId(entity.getId());
toInit.setState(EmbededXcxEnum.INIT.getCode());
toInit.setCreateTime(new Date());
toInit.setUpdateTime(new Date());
return toInit;
}
public static StudioEmbeddedXcxApply toFail(Long id, EmbededXcxEnum state) {
StudioEmbeddedXcxApply toInit = new StudioEmbeddedXcxApply();
toInit.setId(id);
toInit.setState(state.getCode());
toInit.setUpdateTime(new Date());
return toInit;
}
public static BatchSaveDelayTaskRequest toDelayTask(StudioEmbeddedXcxApply apply, String appId) {
// 同步两次即可,分别是申请后30秒,申请后5分钟。两次都没有最新状态,则认为本次申请发生异常可以人工介入
JSONObject body = new JSONObject().fluentPut("appId", appId);
return BatchSaveDelayTaskRequest.builder()
.topic(DelayTopicEnum.COMMON_DELAY_TASK)
.tenantId(apply.getStudioId())
.bizCode(DelayTaskCodeEnum.EMBEDDED_XCX.getCode())
.batch(Lists.newArrayList(
TaskInfo.builder().bizId(apply.getId())
.executionTime(TimeUtil.local().plus(apply.getCreateTime(), 30, ChronoUnit.SECONDS))
.taskBody(body).build(),
TaskInfo.builder().bizId(apply.getId())
.executionTime(TimeUtil.local().plus(apply.getCreateTime(), 5, ChronoUnit.MINUTES))
.taskBody(body).build()
))
.build();
}
}
package com.jiejing.fitness.finance.service.rpc;
import com.jiejing.common.model.JsonResult;
import com.jiejing.workflow.api.DelayQueueApi;
import com.jiejing.workflow.api.request.BatchSaveDelayTaskRequest;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* @author chengyubing
* @since 2024/8/15 10:02
*/
@Slf4j
@Service
public class DelayTaskRpcService {
@Resource
private DelayQueueApi delayQueueApi;
public void batchSave(BatchSaveDelayTaskRequest request) {
JsonResult<Void> result = delayQueueApi.batchSave(request);
if (!result.getSuccess()) {
log.error("batch save delay task fail {}", result);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment