From 71561f86957517988cb1679d2211223a407068bc Mon Sep 17 00:00:00 2001 From: hokli <2629910752@qq.com> Date: Fri, 26 Sep 2025 14:17:56 +0800 Subject: [PATCH] web-api --- .../business/vo/dealer/DealerAccount.java | 9 + .../business/vo/dealer/DealerBusiStatus.java | 34 +++ .../business/vo/dealer/DealerConfigVO.java | 14 ++ .../business/vo/dealer/DealerResponse.java | 32 +++ .../vo/dealer/DealerResponsePage.java | 14 ++ .../vo/dealer/DealerSaleRequestVO.java | 10 + .../business/vo/dealer/DealerUserInfo.java | 23 ++ .../service/dealer/DealerService.java | 228 ++++++++++++++++++ .../controller/dealer/DealerController.java | 83 +++++++ 9 files changed, 447 insertions(+) create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerAccount.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerBusiStatus.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerConfigVO.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponse.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponsePage.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerSaleRequestVO.java create mode 100644 accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerUserInfo.java create mode 100644 accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dealer/DealerService.java create mode 100644 accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/dealer/DealerController.java diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerAccount.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerAccount.java new file mode 100644 index 000000000..8fe726be9 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerAccount.java @@ -0,0 +1,9 @@ +package com.accompany.business.vo.dealer; + +import lombok.Data; + +@Data +public class DealerAccount { + private Long coinBalance; + private Long saleAmount; +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerBusiStatus.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerBusiStatus.java new file mode 100644 index 000000000..dacb29205 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerBusiStatus.java @@ -0,0 +1,34 @@ +package com.accompany.business.vo.dealer; + +public enum DealerBusiStatus { + SUCCESS(200, "Success"), + IP_LIMIT(131, "IP addresses cannot be requested"), + SECRETKEY_ERROR(132, "account error"), + ACCOUNT_ERROR(133, "account error"), + DEALER_LIMIT(134, "Not a coin dealer"), + SELL_LIMIT(135, "Can't sell it to yourself"), + SELL_ERROR(136, "can not sell"), + SIGN_ERROR(137, "agent config error"), + USER_NOT_EXIST(138, "not this taala user"), + USER_NOT_REGION(139, "Not in the same district"), + AGENT_USER_NOT_EXIST(140, "agent user not exist"), + SEND_SELF_FAIL(141, "SEND_SELF_FAIL"), + PARAM_ERROR(400, "param error"), + + ; + private int code; + private String message; + + DealerBusiStatus(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerConfigVO.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerConfigVO.java new file mode 100644 index 000000000..933dd4995 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerConfigVO.java @@ -0,0 +1,14 @@ +package com.accompany.business.vo.dealer; + +import lombok.Data; + +import java.util.List; + +@Data +public class DealerConfigVO { + private String secretKey; + private List ipWhitelist; + private Long agentUid; + private Integer daySendLimit = 100; + private Integer daySendGoldLimit = 700000; +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponse.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponse.java new file mode 100644 index 000000000..7f0039bb2 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponse.java @@ -0,0 +1,32 @@ +package com.accompany.business.vo.dealer; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class DealerResponse { + @ApiModelProperty("响应状态码,成功200") + private Integer code; + + @ApiModelProperty("响应消息") + private String message; + + @ApiModelProperty("响应数据") + private T data; + + public DealerResponse(DealerBusiStatus dealerBusiStatus) { + this.code = dealerBusiStatus.getCode(); + this.message = dealerBusiStatus.getMessage(); + } + + public DealerResponse(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public DealerResponse(Integer code, String message) { + this.code = code; + this.message = message; + } +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponsePage.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponsePage.java new file mode 100644 index 000000000..377345aa7 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerResponsePage.java @@ -0,0 +1,14 @@ +package com.accompany.business.vo.dealer; + +import lombok.Data; + +import java.util.List; + +@Data +public class DealerResponsePage { + private Long total; + private Integer currentPage; + private Integer pageSize; + private Integer lastPage; + private List rows; +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerSaleRequestVO.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerSaleRequestVO.java new file mode 100644 index 000000000..d5c7d3191 --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerSaleRequestVO.java @@ -0,0 +1,10 @@ +package com.accompany.business.vo.dealer; + +import lombok.Data; + +@Data +public class DealerSaleRequestVO { + private String secretKey; + private Long toUserId; + private Long coins; +} diff --git a/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerUserInfo.java b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerUserInfo.java new file mode 100644 index 000000000..34dde4b2b --- /dev/null +++ b/accompany-business/accompany-business-sdk/src/main/java/com/accompany/business/vo/dealer/DealerUserInfo.java @@ -0,0 +1,23 @@ +package com.accompany.business.vo.dealer; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Data +public class DealerUserInfo { + private Long uid; + private String nickName; + private Long userId; + private String gender; + private String avatar; + + private Long toUserId; + private String toNickName; + private Double coins; + private Long createAt; +} diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dealer/DealerService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dealer/DealerService.java new file mode 100644 index 000000000..612600103 --- /dev/null +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/dealer/DealerService.java @@ -0,0 +1,228 @@ +package com.accompany.business.service.dealer; + +import cn.hutool.core.date.DateUtil; +import com.accompany.business.model.UserPurse; +import com.accompany.business.service.purse.DiamondGiveHistoryService; +import com.accompany.business.service.purse.UserPurseService; +import com.accompany.business.service.user.UsersService; +import com.accompany.business.vo.DiamondGiveHistoryVo; +import com.accompany.business.vo.dealer.*; +import com.accompany.common.constant.Constant; +import com.accompany.common.push.MarkdownMessage; +import com.accompany.common.status.BusiStatus; +import com.accompany.common.utils.EnvComponent; +import com.accompany.core.enumeration.PartitionEnum; +import com.accompany.core.exception.ServiceException; +import com.accompany.core.model.Users; +import com.accompany.core.service.SysConfService; +import com.accompany.core.service.message.MessageRobotPushService; +import com.accompany.payment.service.RechargeUserService; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +import static com.accompany.common.constant.Constant.SysConfId.WEB_API_AGENT_CHARGE; + +@Slf4j +@Service +public class DealerService { + + @Autowired + private UsersService usersService; + + @Autowired + private UserPurseService userPurseService; + + @Autowired + private RechargeUserService rechargeUserService; + + @Autowired + private DiamondGiveHistoryService diamondGiveHistoryService; + + @Autowired + private EnvComponent envComponent; + @Autowired + private MessageRobotPushService messageRobotPushService; + @Autowired + private SysConfService sysConfService; + + + public DealerResponse checkParam(String secretKey, String ipStr, Long userId, DealerConfigVO dealerConfigVO) { + if (StringUtils.isEmpty(secretKey) || StringUtils.isEmpty(ipStr)) { + return new DealerResponse(DealerBusiStatus.PARAM_ERROR); + } + if (dealerConfigVO == null || dealerConfigVO.getAgentUid() == null + || StringUtils.isEmpty(dealerConfigVO.getSecretKey())) { + return new DealerResponse(DealerBusiStatus.ACCOUNT_ERROR); + } + if (CollectionUtils.isNotEmpty(dealerConfigVO.getIpWhitelist()) && !dealerConfigVO.getIpWhitelist().contains(ipStr)) { + return new DealerResponse(DealerBusiStatus.IP_LIMIT); + } + if (!dealerConfigVO.getSecretKey().equals(secretKey)) { + return new DealerResponse(DealerBusiStatus.SECRETKEY_ERROR); + } + Boolean rechargeUser = rechargeUserService.isRechargeUser(dealerConfigVO.getAgentUid()); + if (!rechargeUser) { + return new DealerResponse(DealerBusiStatus.SIGN_ERROR); + } + Users user = usersService.getUsersByUid(dealerConfigVO.getAgentUid()); + if (user == null) { + return new DealerResponse(DealerBusiStatus.AGENT_USER_NOT_EXIST); + } + if (userId != null) { + Users usersByErBanNo = usersService.getUserByErbanNo(userId); + if (usersByErBanNo == null) { + return new DealerResponse(DealerBusiStatus.USER_NOT_EXIST); + } + if (user.getUid().equals(usersByErBanNo.getUid())) { + return new DealerResponse(DealerBusiStatus.SEND_SELF_FAIL); + } + if (!user.getPartitionId().equals(usersByErBanNo.getPartitionId())) { + return new DealerResponse(DealerBusiStatus.USER_NOT_REGION); + } + } + return new DealerResponse(DealerBusiStatus.SUCCESS); + } + + + public void accountInfo(DealerResponse dealerResponse, DealerConfigVO dealerConfigVO) { + DealerAccount dealerAccount = new DealerAccount(); + dealerResponse.setData(dealerAccount); + Long totalGoldNum = 0L; + UserPurse userPurse = userPurseService.queryUserPurse(dealerConfigVO.getAgentUid()); + if (userPurse != null) { + totalGoldNum += userPurse.getDiamonds().longValue(); + } + dealerAccount.setCoinBalance(totalGoldNum); + } + + public DealerResponse userInfo(Long erbanNo) { + DealerUserInfo userInfo = new DealerUserInfo(); + Users users = usersService.getUserByErbanNo(erbanNo); + userInfo.setUserId(users.getErbanNo()); + userInfo.setAvatar(users.getAvatar()); + userInfo.setGender(users.getGender() == 1 ? "MALE" : "FEMALE"); + userInfo.setNickName(users.getNick()); + userInfo.setUid(users.getUid()); + DealerResponse dealerResponse = new DealerResponse(DealerBusiStatus.SUCCESS); + dealerResponse.setData(userInfo); + return dealerResponse; + } + + public DealerResponse sale(Long toErbanNo, Long coins, DealerConfigVO dealerConfigVO) { + if (coins == null || coins <= 0) { + return new DealerResponse(DealerBusiStatus.PARAM_ERROR); + } + Users toUser = usersService.getUserByErbanNo(toErbanNo); + Long toUid = toUser.getUid(); + boolean toAgentUser = rechargeUserService.isRechargeUser(toUid); + if (toAgentUser) { + log.info("DealerService.sale:toErbanNo:{} are agent", toErbanNo); + return new DealerResponse(DealerBusiStatus.SIGN_ERROR); + } + Long agentUid = dealerConfigVO.getAgentUid(); + Users usersByUid = usersService.getUsersByUid(agentUid); + try { + diamondGiveHistoryService.webGiveDiamond(agentUid, toUid, coins); + sendRobotMsg(usersByUid.getPartitionId(), usersByUid.getErbanNo(), toUser.getErbanNo(), coins); + } catch (ServiceException e) { + BusiStatus busiStatus = e.getBusiStatus(); + log.error("DealerService.sale,error:{}", JSONObject.toJSONString(busiStatus), e); + return new DealerResponse(busiStatus.getCode(), busiStatus.getName()); + } + + return new DealerResponse(DealerBusiStatus.SUCCESS); + } + + private void sendRobotMsg(Integer partitionId, Long agentErbanNo, Long erbanNo, Long coins) { + String key; + if (envComponent.getDevOrNativeEnv()) { + key = "474c92e5-385d-4b6a-b606-b33769f59457"; + } else { + key = "37355bec-05c4-4168-8287-51c8fcfd1475"; + } + PartitionEnum partitionEnum = PartitionEnum.getByPartitionId(partitionId); + String title = " Eparty-WEB-API代理充值(" + partitionEnum.getDesc() + "区)"; + MarkdownMessage msg = new MarkdownMessage(); + msg.add(MarkdownMessage.getHeaderText(3, title)); + msg.add(MarkdownMessage.getReferenceText("充值用户ID: " + erbanNo)); + msg.add(MarkdownMessage.getReferenceText("充值使用的代理ID: " + agentErbanNo)); + msg.add(MarkdownMessage.getReferenceText("充值coins: " + coins)); + msg.add(MarkdownMessage.getReferenceText("充值时间(GMT+8): " + DateUtil.formatDateTime(new Date()))); + messageRobotPushService.pushMessageByKey(key, msg, false); + } + + public DealerResponse> list(Integer page, DealerConfigVO dealerConfigVO) { + DealerResponsePage dealerResponsePage = new DealerResponsePage(); + DealerResponse dealerResponse = new DealerResponse<>(DealerBusiStatus.SUCCESS); + List result = new ArrayList<>(); + dealerResponse.setData(dealerResponsePage); + dealerResponsePage.setRows(result); + Long agentUid = dealerConfigVO.getAgentUid(); + dealerResponsePage.setPageSize(10); + dealerResponsePage.setCurrentPage(page); + IPage giveHistoryVoIPage = diamondGiveHistoryService.listRecordVoByType(Constant.UserGiveType.webDiamond, agentUid, + dealerResponsePage.getCurrentPage(), dealerResponsePage.getPageSize()); + dealerResponsePage.setTotal(giveHistoryVoIPage.getTotal()); + int lastPage = dealerResponsePage.getTotal().intValue() / 10 + 1; + dealerResponsePage.setLastPage(lastPage); + if (dealerResponsePage.getTotal() <= 0 || page > lastPage) { + return dealerResponse; + } + List records = giveHistoryVoIPage.getRecords(); + if (CollectionUtils.isNotEmpty(records)) { + for (DiamondGiveHistoryVo giveHistoryDTO : records) { + Users usersByUid = usersService.getUsersByUid(giveHistoryDTO.getTargetUid()); + DealerUserInfo build = DealerUserInfo.builder() + .toUserId(usersByUid.getErbanNo()) + .createAt(giveHistoryDTO.getCreateTime().getTime()) + .coins(giveHistoryDTO.getRealDiamondNum()) + .toNickName(usersByUid.getNick()).build(); + result.add(build); + } + } + return dealerResponse; + } + + /** + * 获取配置 + * + * @param secretKey + * @return + */ + public DealerConfigVO getConfigVo(String secretKey) { + return this.getConfigMap().get(secretKey); + } + + private Map getConfigMap() { + Map resultMap = new HashMap<>(); + String sysConfValueById = sysConfService.getSysConfValueById(WEB_API_AGENT_CHARGE); + log.info("DealerService.getConfigMap:{}", sysConfValueById); + if (StringUtils.isEmpty(sysConfValueById)) { + return resultMap; + } + List configVOS = JSONObject.parseArray(sysConfValueById, DealerConfigVO.class); + if (CollectionUtils.isNotEmpty(configVOS)) { + configVOS.forEach(configVO -> { + resultMap.put(configVO.getSecretKey(), configVO); + }); + } + return resultMap; + } + + public static void main(String[] args) { + DealerConfigVO configVO = new DealerConfigVO(); + configVO.setSecretKey("e364f8c9a6c8402ca375594deadcbf52"); + configVO.setAgentUid(1222L); + configVO.setIpWhitelist(new ArrayList<>()); + List configVOS = new ArrayList<>(); + configVOS.add(configVO); + System.out.println(JSONObject.toJSONString(configVOS)); + } +} diff --git a/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/dealer/DealerController.java b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/dealer/DealerController.java new file mode 100644 index 000000000..27bce26e1 --- /dev/null +++ b/accompany-business/accompany-business-web/src/main/java/com/accompany/business/controller/dealer/DealerController.java @@ -0,0 +1,83 @@ +package com.accompany.business.controller.dealer; + +import com.accompany.business.service.dealer.DealerService; +import com.accompany.business.vo.dealer.*; +import com.accompany.common.status.BusiStatus; +import com.accompany.common.utils.IPUtils; +import com.google.common.util.concurrent.RateLimiter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import java.util.concurrent.TimeUnit; + +@RequestMapping("/dealer") +@RestController +public class DealerController { + + @Autowired + private DealerService dealerService; + + private final RateLimiter certificationLimit = RateLimiter.create(200); + + @GetMapping("/account") + public DealerResponse accountInfo(String secretKey, HttpServletRequest request) { + if (!certificationLimit.tryAcquire(5, TimeUnit.SECONDS)) { + return new DealerResponse(BusiStatus.SERVERBUSY.getCode(), BusiStatus.SERVERBUSY.getReasonPhrase()); + } + String ipAddress = IPUtils.getRealIpAddress(request); + DealerConfigVO dealerConfigVO = dealerService.getConfigVo(secretKey); + DealerResponse dealerResponse = dealerService.checkParam(secretKey, ipAddress, null, dealerConfigVO); + if (dealerResponse.getCode() != DealerBusiStatus.SUCCESS.getCode()) { + return dealerResponse; + } + dealerService.accountInfo(dealerResponse, dealerConfigVO); + return dealerResponse; + } + + @GetMapping("/user-info") + public DealerResponse userInfo(String secretKey, Long userId, HttpServletRequest request) { + if (!certificationLimit.tryAcquire(5, TimeUnit.SECONDS)) { + return new DealerResponse(BusiStatus.SERVERBUSY.getCode(), BusiStatus.SERVERBUSY.getReasonPhrase()); + } + String ipAddress = IPUtils.getRealIpAddress(request); + DealerConfigVO dealerConfigVO = dealerService.getConfigVo(secretKey); + DealerResponse dealerResponse = dealerService.checkParam(secretKey, ipAddress, userId, dealerConfigVO); + if (dealerResponse.getCode() != DealerBusiStatus.SUCCESS.getCode()) { + return dealerResponse; + } + return dealerService.userInfo(userId); + } + + @PostMapping("/sale") + public DealerResponse buy(DealerSaleRequestVO dealerSaleRequestVO, HttpServletRequest request) { + if (!certificationLimit.tryAcquire(5, TimeUnit.SECONDS)) { + return new DealerResponse(BusiStatus.SERVERBUSY.getCode(), BusiStatus.SERVERBUSY.getReasonPhrase()); + } + String ipAddress = IPUtils.getRealIpAddress(request); + DealerConfigVO dealerConfigVO = dealerService.getConfigVo(dealerSaleRequestVO.getSecretKey()); + DealerResponse dealerResponse = dealerService.checkParam(dealerSaleRequestVO.getSecretKey(), ipAddress, dealerSaleRequestVO.getToUserId(), dealerConfigVO); + if (dealerResponse.getCode() != DealerBusiStatus.SUCCESS.getCode()) { + return dealerResponse; + } + return dealerService.sale(dealerSaleRequestVO.getToUserId(), dealerSaleRequestVO.getCoins(), dealerConfigVO); + } + + @GetMapping("/list") + public DealerResponse> list(String secretKey, Integer page, HttpServletRequest request) { + if (!certificationLimit.tryAcquire(5, TimeUnit.SECONDS)) { + return new DealerResponse(BusiStatus.SERVERBUSY.getCode(), BusiStatus.SERVERBUSY.getReasonPhrase()); + } + String ipAddress = IPUtils.getRealIpAddress(request); + DealerConfigVO dealerConfigVO = dealerService.getConfigVo(secretKey); + DealerResponse dealerResponse = dealerService.checkParam(secretKey, ipAddress, null, dealerConfigVO); + if (dealerResponse.getCode() != DealerBusiStatus.SUCCESS.getCode()) { + return dealerResponse; + } + return dealerService.list(page, dealerConfigVO); + } + +}