mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-21 11:35:12 +08:00
852 lines
33 KiB
Java
852 lines
33 KiB
Java
package com.jsowell.service;
|
||
|
||
import cn.hutool.core.util.PageUtil;
|
||
import com.alibaba.fastjson2.JSON;
|
||
import com.alibaba.fastjson2.JSONObject;
|
||
import com.alibaba.fastjson2.TypeReference;
|
||
import com.alipay.api.AlipayApiException;
|
||
import com.alipay.api.AlipayClient;
|
||
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
|
||
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
|
||
import com.alipay.easysdk.factory.Factory;
|
||
import com.github.pagehelper.PageHelper;
|
||
import com.github.pagehelper.PageInfo;
|
||
import com.google.common.collect.ImmutableMap;
|
||
import com.google.common.collect.Maps;
|
||
import com.huifu.adapay.core.exception.BaseAdaPayException;
|
||
import com.huifu.adapay.model.Payment;
|
||
import com.jsowell.adapay.common.CreateAdaPaymentParam;
|
||
import com.jsowell.adapay.config.AbstractAdapayConfig;
|
||
import com.jsowell.adapay.factory.AdapayConfigFactory;
|
||
import com.jsowell.alipay.factory.AlipayClientFactory;
|
||
import com.jsowell.alipay.service.AliAppletRemoteService;
|
||
import com.jsowell.common.constant.CacheConstants;
|
||
import com.jsowell.common.constant.Constants;
|
||
import com.jsowell.common.constant.UserConstants;
|
||
import com.jsowell.common.core.page.PageResponse;
|
||
import com.jsowell.common.core.redis.RedisCache;
|
||
import com.jsowell.common.enums.TitleTypeEnum;
|
||
import com.jsowell.common.enums.adapay.AdapayPayChannelEnum;
|
||
import com.jsowell.common.enums.adapay.MerchantDelayModeEnum;
|
||
import com.jsowell.common.enums.uniapp.BalanceChangesEnum;
|
||
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
|
||
import com.jsowell.common.enums.ykc.ScenarioEnum;
|
||
import com.jsowell.common.exception.BusinessException;
|
||
import com.jsowell.common.util.AdapayUtil;
|
||
import com.jsowell.common.util.DateUtils;
|
||
import com.jsowell.common.util.JWTUtils;
|
||
import com.jsowell.common.util.StringUtils;
|
||
import com.jsowell.common.util.id.IdUtils;
|
||
import com.jsowell.common.util.id.SnowflakeIdWorker;
|
||
import com.jsowell.pile.domain.*;
|
||
import com.jsowell.pile.dto.*;
|
||
import com.jsowell.pile.service.*;
|
||
import com.jsowell.pile.transaction.dto.MemberTransactionDTO;
|
||
import com.jsowell.pile.transaction.service.TransactionService;
|
||
import com.jsowell.pile.util.MerchantUtils;
|
||
import com.jsowell.pile.vo.base.MemberWalletVO;
|
||
import com.jsowell.pile.vo.uniapp.customer.InvoiceTitleVO;
|
||
import com.jsowell.pile.vo.uniapp.customer.MemberVO;
|
||
import com.jsowell.pile.vo.uniapp.customer.MemberWalletInfoVO;
|
||
import com.jsowell.pile.vo.uniapp.customer.MemberWalletLogVO;
|
||
import com.jsowell.wxpay.service.WxAppletRemoteService;
|
||
import org.apache.commons.collections4.CollectionUtils;
|
||
import org.apache.commons.compress.utils.Lists;
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
import org.springframework.beans.BeanUtils;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.beans.factory.annotation.Value;
|
||
import org.springframework.cglib.beans.BeanMap;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.text.ParseException;
|
||
import java.util.*;
|
||
import java.util.stream.Collectors;
|
||
|
||
@Service
|
||
public class MemberService {
|
||
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||
|
||
@Autowired
|
||
private RedisCache redisCache;
|
||
|
||
@Autowired
|
||
private TransactionService transactionService;
|
||
|
||
@Autowired
|
||
private MemberBasicInfoService memberBasicInfoService;
|
||
|
||
@Autowired
|
||
private PileMerchantInfoService pileMerchantInfoService;
|
||
|
||
@Autowired
|
||
private WxAppletRemoteService wxAppletRemoteService;
|
||
|
||
@Autowired
|
||
private AliAppletRemoteService aliAppletRemoteService;
|
||
|
||
@Autowired
|
||
private MemberPlateNumberRelationService memberPlateNumberRelationService;
|
||
|
||
@Autowired
|
||
private PileAuthCardService pileAuthCardService;
|
||
|
||
@Autowired
|
||
private MemberInvoiceTitleService memberInvoiceTitleService;
|
||
|
||
@Autowired
|
||
private MemberWalletInfoService memberWalletInfoService;
|
||
|
||
@Autowired
|
||
private PileRemoteService pileRemoteService;
|
||
|
||
@Autowired
|
||
private OrderBasicInfoService orderBasicInfoService;
|
||
|
||
@Autowired
|
||
private OrderService orderService;
|
||
|
||
@Value("${adapay.jsowell.appId}")
|
||
private String ADAPAY_APP_ID;
|
||
|
||
@Value("${adapay.callback}")
|
||
private String ADAPAY_CALLBACK_URL;
|
||
|
||
@Value("${weixin.login.appid}")
|
||
private String APP_ID;
|
||
|
||
private final AlipayClient alipayClient;
|
||
|
||
@Autowired
|
||
public MemberService(AlipayClientFactory alipayClientFactory) {
|
||
this.alipayClient = alipayClientFactory.getAlipayClient();
|
||
}
|
||
|
||
/**
|
||
* 校验短信验证码
|
||
* @param dto
|
||
*/
|
||
public void checkVerificationCode(MemberRegisterAndLoginDTO dto) {
|
||
// 取出缓存中的验证码进行对比,如果缓存中没有,则超时
|
||
String captchaCode = redisCache.getCacheObject(CacheConstants.SMS_VERIFICATION_CODE_KEY + dto.getMobileNumber());
|
||
if (StringUtils.isEmpty(captchaCode)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_VERIFICATION_CODE_TIMEOUT_ERROR);
|
||
}
|
||
// 如果缓存中有,但与实际不一致,则为验证码错误
|
||
if (!StringUtils.equals(captchaCode, dto.getVerificationCode())) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_VERIFICATION_CODE_ERROR);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 短信验证码登录注册
|
||
* @param dto
|
||
* @return
|
||
*/
|
||
public String memberRegisterAndLoginBySMS(MemberRegisterAndLoginDTO dto) {
|
||
// 校验短信验证码 两种情况不能通过校验,1-验证码错误;2-超时 验证码10分钟有效
|
||
checkVerificationCode(dto);
|
||
return memberRegisterAndLogin(dto); // 短信验证码登录
|
||
}
|
||
|
||
/**
|
||
* 公共登录注册方法
|
||
* @return token返给前端
|
||
*/
|
||
protected String memberRegisterAndLogin(MemberRegisterAndLoginDTO dto) {
|
||
String phoneNumber = dto.getMobileNumber();
|
||
String firstLevelMerchantId = dto.getFirstLevelMerchantId();
|
||
String openId = dto.getOpenId();
|
||
String buyerId = dto.getBuyerId();
|
||
|
||
log.info("公共登录注册方法, phoneNumber:{}, firstLevelMerchantId:{}, openId:{}", phoneNumber, firstLevelMerchantId, openId);
|
||
if (StringUtils.isBlank(phoneNumber)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR);
|
||
}
|
||
if (StringUtils.isBlank(firstLevelMerchantId)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_GET_MERCHANT_ID_BY_APP_ID_ERROR);
|
||
}
|
||
|
||
// 2024年6月11日15点37分 支付宝没有openid,改为不校验openid
|
||
// 2024年6月14日17点03分,请求来源为微信,校验openId
|
||
if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isBlank(openId)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_OPEN_ID_IS_NULL_ERROR);
|
||
}
|
||
|
||
// 查询手机号码是否注册过
|
||
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(phoneNumber, firstLevelMerchantId);
|
||
if (Objects.isNull(memberBasicInfo)) {
|
||
// 不存在则新增数据
|
||
String memberId = generateNewMemberId();
|
||
memberBasicInfo = new MemberBasicInfo();
|
||
memberBasicInfo.setStatus(Constants.ONE);
|
||
memberBasicInfo.setMemberId(memberId);
|
||
memberBasicInfo.setNickName("会员" + memberId);
|
||
memberBasicInfo.setMobileNumber(phoneNumber);
|
||
memberBasicInfo.setMerchantId(Long.valueOf(firstLevelMerchantId));
|
||
if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isNotBlank(openId)) {
|
||
memberBasicInfo.setOpenId(openId);
|
||
}
|
||
if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && StringUtils.isNotBlank(buyerId)) {
|
||
memberBasicInfo.setBuyerId(buyerId);
|
||
}
|
||
|
||
MemberTransactionDTO memberTransactionDTO = new MemberTransactionDTO();
|
||
memberTransactionDTO.setMemberBasicInfo(memberBasicInfo);
|
||
// 首次新建会员,同时新建会员钱包
|
||
if (MerchantUtils.isXiXiaoMerchant(firstLevelMerchantId)) {
|
||
MemberWalletInfo memberWalletInfo = MemberWalletInfo.builder()
|
||
.memberId(memberId)
|
||
.merchantId(MerchantUtils.XIXIAO_MERCHANT_ID)
|
||
.walletCode(memberBasicInfoService.generateWalletCode())
|
||
.build();
|
||
memberTransactionDTO.setMemberWalletInfo(memberWalletInfo);
|
||
}
|
||
transactionService.createMember(memberTransactionDTO);
|
||
} else {
|
||
boolean updateFlag = false;
|
||
if (AdapayPayChannelEnum.WX_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getOpenId(), openId)) {
|
||
// openId变化就更新
|
||
memberBasicInfo.setOpenId(openId);
|
||
updateFlag = true;
|
||
}
|
||
if (AdapayPayChannelEnum.ALIPAY_LITE.getValue().equals(dto.getRequestSource()) && !StringUtils.equals(memberBasicInfo.getBuyerId(), buyerId)) {
|
||
memberBasicInfo.setBuyerId(buyerId);
|
||
updateFlag = true;
|
||
}
|
||
if (updateFlag) {
|
||
memberBasicInfoService.updateMemberBasicInfo(memberBasicInfo);
|
||
}
|
||
}
|
||
// 服务器生成token返给前端
|
||
String memberToken = JWTUtils.createMemberToken(memberBasicInfo.getMemberId(), memberBasicInfo.getNickName());
|
||
// log.info("memToken:{}", memberToken);
|
||
return memberToken;
|
||
}
|
||
|
||
private String generateNewMemberId() {
|
||
while (true) {
|
||
String memberId = IdUtils.getMemberId();
|
||
// 通过memberId查询是否已经存在
|
||
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(memberId);
|
||
if (memberVO == null) {
|
||
return memberId;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 微信一键登录
|
||
* @param dto
|
||
*/
|
||
public String wechatLogin(WechatLoginDTO dto) {
|
||
// 通过微信传的code获取手机号码
|
||
String mobileNumber = wxAppletRemoteService.getMobileNumberByCode(dto.getCode());
|
||
if (StringUtils.isBlank(mobileNumber)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR);
|
||
}
|
||
// 通过code获取openId
|
||
String openId = "";
|
||
try {
|
||
openId = wxAppletRemoteService.getOpenIdByCode(dto.getOpenIdCode());
|
||
} catch (Exception e) {
|
||
log.error("getOpenIdByCode发生异常", e);
|
||
}
|
||
// 根据appid查询merchantId
|
||
String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByWxAppId(dto.getAppId());
|
||
// 通过手机号获取openid
|
||
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(mobileNumber, firstLevelMerchantId);
|
||
if (memberBasicInfo != null && StringUtils.isBlank(openId)) {
|
||
openId = memberBasicInfo.getOpenId();
|
||
}
|
||
// 查询手机号码是否注册过
|
||
MemberRegisterAndLoginDTO loginDTO = MemberRegisterAndLoginDTO.builder()
|
||
.openId(openId)
|
||
.firstLevelMerchantId(firstLevelMerchantId)
|
||
.mobileNumber(mobileNumber)
|
||
.requestSource(dto.getRequestSource())
|
||
.build();
|
||
return memberRegisterAndLogin(loginDTO); // 微信小程序一键登录
|
||
}
|
||
|
||
/**
|
||
* 支付宝 通过密文解密 获取手机号码
|
||
*/
|
||
// private String decryptMobileNumberCiphertext(String mobileNumberCiphertext) throws Exception {
|
||
// String decrypt = Factory.Util.AES().decrypt(mobileNumberCiphertext);
|
||
// String mobileNumber = JSON.parseObject(decrypt).getString("mobile");
|
||
// return mobileNumber;
|
||
// }
|
||
|
||
/**
|
||
* 支付宝 通过密文解密 获取手机号码
|
||
*/
|
||
private void decryptMobileNumberCiphertext(AlipayLoginDTO dto) throws Exception {
|
||
String decrypt = Factory.Util.AES().decrypt(dto.getMobileNumberCiphertext());
|
||
String mobileNumber = JSON.parseObject(decrypt).getString("mobile");
|
||
dto.setMobileNumber(mobileNumber);
|
||
}
|
||
|
||
public String alipayLogin(AlipayLoginDTO dto) throws Exception {
|
||
// 获取AccessToken
|
||
getAccessToken(dto);
|
||
|
||
// 解密手机号
|
||
decryptMobileNumberCiphertext(dto);
|
||
|
||
// 获取buyer_id
|
||
// AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
|
||
// AlipayUserInfoShareResponse response = alipayClient.execute(request, dto.getAccessToken());
|
||
// if(response.isSuccess()){
|
||
// log.info("调用成功:" + JSON.toJSONString(response));
|
||
// } else {
|
||
// log.info("调用失败:" + JSON.toJSONString(response));
|
||
// }
|
||
// String userId = response.getOpenId();
|
||
// String mobile = response.getMobile();
|
||
|
||
// 根据appid查询merchantId
|
||
String firstLevelMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByAliAppId(dto.getAppId());
|
||
|
||
log.info("支付宝登录,手机号:{}, openId:{}", dto.getMobileNumber(), dto.getOpenId());
|
||
// 查询手机号码是否注册过
|
||
MemberRegisterAndLoginDTO loginDTO = MemberRegisterAndLoginDTO.builder()
|
||
.requestSource(dto.getRequestSource())
|
||
.firstLevelMerchantId(firstLevelMerchantId)
|
||
.mobileNumber(dto.getMobileNumber())
|
||
.buyerId(dto.getUserId())
|
||
.build();
|
||
return memberRegisterAndLogin(loginDTO); // 支付宝小程序一键登录
|
||
}
|
||
|
||
/**
|
||
* 获取 auth_code(用户授权码)后应尽快调用 alipay.system.oauth.token(换取授权访问令牌接口)换取 access_token(访问令牌)
|
||
*/
|
||
private void getAccessToken(AlipayLoginDTO dto) throws AlipayApiException {
|
||
if (StringUtils.isBlank(dto.getAuthCode())) {
|
||
log.info("换取授权访问令牌接口, authCode为空");
|
||
}
|
||
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
|
||
// 设置授权码
|
||
request.setCode(dto.getAuthCode());
|
||
// 设置授权方式
|
||
request.setGrantType("authorization_code");
|
||
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);
|
||
if (!response.isSuccess()) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_ALIPAY_ACCESS_TOKEN_ERROR);
|
||
}
|
||
log.info("支付宝getAccessToken:{}", JSON.toJSONString(response));
|
||
dto.setAccessToken(response.getAccessToken());
|
||
dto.setOpenId(response.getOpenId());
|
||
dto.setUserId(response.getUserId());
|
||
}
|
||
|
||
/**
|
||
* 获取openId
|
||
* @param code
|
||
* @return
|
||
*/
|
||
// public String getOpenIdByCode(String code) {
|
||
// return wxAppletRemoteService.getOpenIdByCode(code);
|
||
// }
|
||
|
||
/**
|
||
* 处理用户信息
|
||
*
|
||
* @param memberId
|
||
* @param dto 用户个人信息
|
||
*/
|
||
public void handleUserInfo(String memberId, MemberRegisterDTO dto) {
|
||
// 通过用户手机号查询数据库,如果数据库中存在,则更新
|
||
// MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getMobileNumber());
|
||
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMemberId(memberId);
|
||
if (Objects.nonNull(memberBasicInfo)) {
|
||
if (StringUtils.isNotBlank(dto.getAvatarUrl())) {
|
||
memberBasicInfo.setAvatarUrl(dto.getAvatarUrl());
|
||
}
|
||
if (StringUtils.isNotBlank(dto.getMobileNumber())) {
|
||
memberBasicInfo.setMobileNumber(dto.getMobileNumber());
|
||
}
|
||
if (StringUtils.isNotBlank(dto.getNickName())) {
|
||
memberBasicInfo.setNickName(dto.getNickName());
|
||
}
|
||
memberBasicInfoService.updateMemberBasicInfo(memberBasicInfo);
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 通过memberToken获取用户账户信息
|
||
*
|
||
* @param memberId
|
||
* @return
|
||
*/
|
||
public MemberVO getMemberInfoByMemberId(String memberId) {
|
||
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(memberId);
|
||
return memberVO;
|
||
}
|
||
|
||
public MemberVO getMemberInfoByMemberId(String memberId, String merchantId) {
|
||
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(memberId, merchantId);
|
||
return memberVO;
|
||
}
|
||
|
||
/**
|
||
* 查询用户账户余额变动信息
|
||
*
|
||
* @param dto
|
||
*/
|
||
public PageResponse getMemberBalanceChanges(UniAppQueryMemberBalanceDTO dto) {
|
||
|
||
// 获取分页信息以及memberId
|
||
int pageNum = dto.getPageNum() == 0 ? 1 : dto.getPageNum();
|
||
int pageSize = dto.getPageSize() == 0 ? 10 : dto.getPageSize();
|
||
String memberId = dto.getMemberId();
|
||
String type = dto.getType();
|
||
|
||
if (!StringUtils.equals("1", type) && !StringUtils.equals("2", type)) {
|
||
type = "";
|
||
}
|
||
// 分页
|
||
PageHelper.startPage(pageNum, pageSize);
|
||
List<MemberWalletLogVO> list = memberBasicInfoService.getMemberBalanceChanges(memberId, type);
|
||
PageInfo<MemberWalletLogVO> pageInfo = new PageInfo<>(list);
|
||
|
||
for (MemberWalletLogVO walletLogVO : pageInfo.getList()) {
|
||
String subType = walletLogVO.getSubType();
|
||
String subTypeValue = BalanceChangesEnum.getValueByCode(subType);
|
||
if (StringUtils.isNotBlank(subTypeValue)) {
|
||
walletLogVO.setSubType(subTypeValue);
|
||
}
|
||
// walletLogVO.setTotalAccountAmount(walletLogVO.getPrincipalBalance().add(walletLogVO.getGiftBalance()));
|
||
}
|
||
PageResponse pageResponse = PageResponse.builder()
|
||
.pageSize(pageSize)
|
||
.pageNum(pageNum)
|
||
.list(pageInfo.getList())
|
||
.pages(pageInfo.getPages())
|
||
.total(pageInfo.getTotal())
|
||
.build();
|
||
return pageResponse;
|
||
}
|
||
|
||
public MemberWalletInfoVO getMemberWalletInfo(UniAppQueryMemberBalanceDTO dto) throws ParseException {
|
||
log.info("查询用户余额信息 service方法 start");
|
||
MemberWalletInfoVO vo = new MemberWalletInfoVO();
|
||
vo.setMemberId(dto.getMemberId());
|
||
|
||
// 查询会员钱包信息表,获取 本金余额
|
||
MemberWalletVO memberWalletVO = memberWalletInfoService.selectMemberWalletInfo(dto.getWalletCode());
|
||
if (memberWalletVO == null) {
|
||
// 用户未注册小程序
|
||
throw new BusinessException(ReturnCodeEnum.CODE_AUTHENTICATION_ERROR);
|
||
}
|
||
// 本金 sql处理为空返回0
|
||
vo.setPrincipalBalance(memberWalletVO.getPrincipalBalance());
|
||
|
||
// 赠金 sql处理为空返回0
|
||
vo.setGiftBalance(memberWalletVO.getGiftBalance());
|
||
|
||
// 当前余额
|
||
vo.setCurrentBalance(vo.getPrincipalBalance().add(vo.getGiftBalance()));
|
||
|
||
// 累计充值本金
|
||
vo.setAccumulatedRechargePrincipal(memberWalletVO.getAccumulatedRechargePrincipal());
|
||
|
||
// 累计赠送金额
|
||
vo.setAccumulatedRechargeGift(memberWalletVO.getAccumulatedRechargeGift());
|
||
|
||
// 累计充值金额
|
||
vo.setAccumulatedRechargeAmount(memberWalletVO.getTotalRechargeAmount());
|
||
|
||
// 累计消费金额
|
||
vo.setAccumulatedConsumptionAmount(memberWalletVO.getAccumulatedConsumptionAmount());
|
||
|
||
// 根据日期查询会员钱包变动明细 分页
|
||
// 获取分页信息
|
||
long pageNum = dto.getPageNum() == 0 ? 1L : dto.getPageNum();
|
||
long pageSize = dto.getPageSize() == 0 ? 10L : dto.getPageSize();
|
||
String tradeDate = dto.getTradeDate();
|
||
// 获取年、月
|
||
String[] split = StringUtils.split(tradeDate, "-");
|
||
int year = Integer.parseInt(split[0]);
|
||
int month = Integer.parseInt(split[1]);
|
||
// 根据年月获取当月第一天和最后一天
|
||
tradeDate = DateUtils.getFirstDay(year, month, DateUtils.YYYY_MM_DD);
|
||
String lastDay = DateUtils.getLastDay(year, month, DateUtils.YYYY_MM_DD);
|
||
// sql语句查询日期需要多加一天
|
||
Date date = DateUtils.addDays(DateUtils.parseDate(lastDay, DateUtils.YYYY_MM_DD), 1);
|
||
lastDay = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date);
|
||
dto.setTradeDate(tradeDate);
|
||
dto.setEndDate(lastDay);
|
||
// PageHelper.startPage(pageNum, pageSize);
|
||
// List<MemberWalletLogVO> list = memberBasicInfoService.getMemberWalletDetail(dto);
|
||
List<MemberWalletLogVO> list = memberBasicInfoService.getMemberWalletDetailV2(dto);
|
||
|
||
// 总支出
|
||
BigDecimal totalConsumption = list.stream()
|
||
.map(MemberWalletLogVO::getOrderAmount)
|
||
.filter(Objects::nonNull)
|
||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||
vo.setTotalConsumption(totalConsumption);
|
||
|
||
// 总充值
|
||
BigDecimal totalRechargeAmount = list.stream()
|
||
.filter(x -> StringUtils.equals(x.getType(), "1"))
|
||
.filter(x -> StringUtils.equals(x.getSubType(), "10") || StringUtils.equals(x.getSubType(), "11"))
|
||
.map(MemberWalletLogVO::getAmount)
|
||
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||
vo.setTotalRechargeAmount(totalRechargeAmount);
|
||
|
||
// PageInfo<MemberWalletLogVO> pageInfo = new PageInfo<>(list);
|
||
// 获取 type 和 subType 的对应信息
|
||
for (MemberWalletLogVO walletLogVO : list) {
|
||
// 将负数转为正数
|
||
walletLogVO.setAmount(BigDecimal.valueOf(Math.abs(walletLogVO.getAmount().doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP));
|
||
String subType = walletLogVO.getSubType();
|
||
String subTypeValue = BalanceChangesEnum.getValueByCode(subType);
|
||
if (StringUtils.isNotBlank(subTypeValue)) {
|
||
walletLogVO.setSubType(subTypeValue);
|
||
}
|
||
// walletLogVO.setTotalAccountAmount(walletLogVO.getPrincipalBalance().add(walletLogVO.getGiftBalance()));
|
||
}
|
||
// log.info("查询用户余额信息 service方法 开始处理分页----");
|
||
List<MemberWalletLogVO> collect = list.stream()
|
||
.skip((pageNum - 1) * pageSize)
|
||
.limit(pageSize)
|
||
.collect(Collectors.toList());
|
||
|
||
int total = list.size();
|
||
int pages = PageUtil.totalPage(total, dto.getPageSize());
|
||
// 返回结果集
|
||
PageResponse pageResponse = PageResponse.builder()
|
||
.pageNum(Integer.parseInt(String.valueOf(pageNum)))
|
||
.pageSize(Integer.parseInt(String.valueOf(pageSize)))
|
||
.list(collect)
|
||
.pages(pages)
|
||
.total(total)
|
||
.build();
|
||
vo.setPageResponse(pageResponse);
|
||
// log.info("查询用户余额信息 service方法 end");
|
||
return vo;
|
||
}
|
||
|
||
/**
|
||
* 获取会员钱包明细
|
||
* @return
|
||
*/
|
||
// public PageResponse getMemberWalletLog (UniAppQueryMemberBalanceDTO dto) throws ParseException {
|
||
// // 获取分页信息以及memberId
|
||
// int pageNum = dto.getPageNum() == 0 ? 1 : dto.getPageNum();
|
||
// int pageSize = dto.getPageSize() == 0 ? 10 : dto.getPageSize();
|
||
// String tradeDate = dto.getTradeDate();
|
||
// // 获取年、月
|
||
// String[] split = StringUtils.split(tradeDate, "-");
|
||
// int year = Integer.parseInt(split[0]);
|
||
// int month = Integer.parseInt(split[1]);
|
||
// // 根据年月获取当月第一天和最后一天
|
||
// tradeDate = DateUtils.getFirstDay(year, month, DateUtils.YYYY_MM_DD);
|
||
// String lastDay = DateUtils.getLastDay(year, month, DateUtils.YYYY_MM_DD);
|
||
// // sql语句查询日期需要多加一天
|
||
// Date date = DateUtils.addDays(DateUtils.parseDate(lastDay, DateUtils.YYYY_MM_DD), 1);
|
||
// lastDay = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, date);
|
||
// dto.setTradeDate(tradeDate);
|
||
// dto.setEndDate(lastDay);
|
||
// // 根据日期查询会员钱包变动明细
|
||
// // 分页
|
||
// PageHelper.startPage(pageNum, pageSize);
|
||
// List<MemberWalletLogVO> list = memberBasicInfoService.getMemberWalletDetail(dto);
|
||
// PageInfo<MemberWalletLogVO> pageInfo = new PageInfo<>(list);
|
||
// // 获取 type 和 subType 的对应信息
|
||
// for (MemberWalletLogVO walletLogVO : pageInfo.getList()) {
|
||
// // 将负数转为正数
|
||
// walletLogVO.setAmount(BigDecimal.valueOf(Math.abs(walletLogVO.getAmount().doubleValue())).setScale(2, BigDecimal.ROUND_HALF_UP));
|
||
// String subType = walletLogVO.getSubType();
|
||
// String subTypeValue = BalanceChangesEnum.getValueByCode(subType);
|
||
// if (StringUtils.isNotBlank(subTypeValue)) {
|
||
// walletLogVO.setSubType(subTypeValue);
|
||
// }
|
||
// // walletLogVO.setTotalAccountAmount(walletLogVO.getPrincipalBalance().add(walletLogVO.getGiftBalance()));
|
||
// }
|
||
//
|
||
// PageResponse pageResponse = PageResponse.builder()
|
||
// .pageSize(pageSize)
|
||
// .pageNum(pageNum)
|
||
// .list(pageInfo.getList())
|
||
// .pages(pageInfo.getPages())
|
||
// .total(pageInfo.getTotal())
|
||
// .build();
|
||
// return pageResponse;
|
||
// }
|
||
|
||
/**
|
||
* 用户绑定车牌号
|
||
* @param dto
|
||
*/
|
||
public void memberBindingCarNo(BindingCarNoDTO dto){
|
||
// 校验短信验证码(2023.8.24 不做校验)
|
||
// MemberRegisterAndLoginDTO registerAndLoginDTO = MemberRegisterAndLoginDTO.builder()
|
||
// .mobileNumber(dto.getPhoneNumber())
|
||
// .verificationCode(dto.getVerificationCode())
|
||
// .build();
|
||
// checkVerificationCode(registerAndLoginDTO);
|
||
|
||
// 判断当前车牌号是否已经绑定 (2023.8.24 不做校验)
|
||
MemberPlateNumberRelation relation = new MemberPlateNumberRelation();
|
||
relation.setMemberId(dto.getMemberId());
|
||
relation.setLicensePlateNumber(dto.getCarNo());
|
||
// 判断当前车牌号是否被绑定
|
||
// if (UserConstants.NOT_UNIQUE.equals(memberPlateNumberRelationService.checkPlateNumberUnique(dto.getCarNo()))) {
|
||
// // 不为空说明该用户绑定过此车牌号
|
||
// throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARNO_HAS_BEEN_BINDING);
|
||
// }
|
||
|
||
// 校验该车牌号是否为新能源车牌
|
||
|
||
relation.setPhoneNumber(dto.getPhoneNumber());
|
||
if (StringUtils.isNotBlank(dto.getVinCode())) {
|
||
// 判断当前vin是否被绑定
|
||
if (UserConstants.NOT_UNIQUE.equals(memberPlateNumberRelationService.checkVinCodeUnique(dto.getVinCode()))) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_VIN_HAS_BEEN_BINDING);
|
||
}
|
||
relation.setVinCode(dto.getVinCode().toUpperCase(Locale.ROOT).trim());
|
||
relation.setVinStatus(Constants.ONE); // 1-正常使用
|
||
}
|
||
memberPlateNumberRelationService.insertMemberPlateNumberRelation(relation);
|
||
}
|
||
|
||
/**
|
||
* 用户绑定鉴权卡
|
||
* @param dto
|
||
*/
|
||
public int memberBindCard(BindingCardDTO dto) {
|
||
// 校验短信验证码
|
||
MemberRegisterAndLoginDTO registerAndLoginDTO = MemberRegisterAndLoginDTO.builder()
|
||
.mobileNumber(dto.getPhoneNumber())
|
||
.verificationCode(dto.getVerificationCode())
|
||
.build();
|
||
checkVerificationCode(registerAndLoginDTO);
|
||
// 判断当前鉴权卡是否被绑定过
|
||
PileAuthCard pileAuthCardInfo = pileAuthCardService.selectCardInfoByLogicCard(dto.getLogicCard());
|
||
if (pileAuthCardInfo == null){
|
||
// 为空说明没查到此卡信息
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO);
|
||
}
|
||
if (StringUtils.isNotBlank(pileAuthCardInfo.getMemberId())) {
|
||
// memberId 不为空,说明此卡已被绑定
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_BEEN_BINDING);
|
||
}
|
||
if (!StringUtils.equals(pileAuthCardInfo.getSecretKey(), dto.getSecretKey().toUpperCase(Locale.ROOT))) {
|
||
// 密钥不一致,不能绑定
|
||
throw new BusinessException(ReturnCodeEnum.CODE_SECRET_KEY_NOT_SAME);
|
||
}
|
||
PileAuthCard authCard = PileAuthCard.builder()
|
||
.memberId(dto.getMemberId())
|
||
.status("1") // 1-正常使用
|
||
.createBy(dto.getMemberId())
|
||
.id(pileAuthCardInfo.getId())
|
||
.build();
|
||
return pileAuthCardService.updatePileAuthCard(authCard);
|
||
}
|
||
|
||
/**
|
||
* 用户解绑鉴权卡
|
||
* @param dto
|
||
* @return
|
||
*/
|
||
public int memberUnbindCard(BindingCardDTO dto) {
|
||
// 校验短信验证码
|
||
// MemberRegisterAndLoginDTO registerAndLoginDTO = MemberRegisterAndLoginDTO.builder()
|
||
// .mobileNumber(dto.getPhoneNumber())
|
||
// .verificationCode(dto.getVerificationCode())
|
||
// .build();
|
||
// checkVerificationCode(registerAndLoginDTO);
|
||
|
||
// 校验身份信息
|
||
PileAuthCard authCard = PileAuthCard.builder()
|
||
.logicCard(dto.getLogicCard())
|
||
.memberId(dto.getMemberId())
|
||
.build();
|
||
PileAuthCard pileAuthCardInfo = pileAuthCardService.selectPileAuthCardInfo(authCard);
|
||
if (pileAuthCardInfo == null){
|
||
// 为空说明没查到此卡信息
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO);
|
||
}
|
||
// 解绑鉴权卡
|
||
return pileAuthCardService.unBindingCard(authCard);
|
||
}
|
||
|
||
public List<InvoiceTitleVO> queryMemberInvoiceTitles(String memberId) {
|
||
List<InvoiceTitleVO> resultList = Lists.newArrayList();
|
||
List<MemberInvoiceTitle> memberInvoiceTitles = memberInvoiceTitleService.selectMemberInvoiceTitleList(memberId);
|
||
if (CollectionUtils.isEmpty(memberInvoiceTitles)) {
|
||
return resultList;
|
||
}
|
||
for (MemberInvoiceTitle memberInvoiceTitle : memberInvoiceTitles) {
|
||
String reception = StringUtils.isNotEmpty(memberInvoiceTitle.getEmail())
|
||
? memberInvoiceTitle.getEmail()
|
||
: memberInvoiceTitle.getPhoneNumber();
|
||
resultList.add(
|
||
InvoiceTitleVO.builder()
|
||
.titleId(memberInvoiceTitle.getId() + "")
|
||
.titleName(memberInvoiceTitle.getName())
|
||
.titleType(TitleTypeEnum.getLabel(memberInvoiceTitle.getTitleType()))
|
||
.taxId(memberInvoiceTitle.getTaxId())
|
||
.unitAddress(memberInvoiceTitle.getUnitAddress())
|
||
.phoneNumber(memberInvoiceTitle.getPhoneNumber())
|
||
.email(memberInvoiceTitle.getEmail())
|
||
.reception(reception)
|
||
.bankName(memberInvoiceTitle.getBankName())
|
||
.bankAccountNumber(memberInvoiceTitle.getBankAccountNumber())
|
||
.defaultFlag(memberInvoiceTitle.getDefaultFlag())
|
||
.build()
|
||
);
|
||
}
|
||
return resultList;
|
||
}
|
||
|
||
public void createMemberInvoiceTitle(InvoiceTitleDTO dto) {
|
||
MemberInvoiceTitle title = new MemberInvoiceTitle();
|
||
BeanUtils.copyProperties(dto, title);
|
||
title.setName(dto.getTitleName());
|
||
if (StringUtils.isEmail(dto.getReception())) {
|
||
title.setEmail(dto.getReception());
|
||
} else {
|
||
title.setPhoneNumber(dto.getReception());
|
||
}
|
||
int i = memberInvoiceTitleService.insertMemberInvoiceTitle(title);
|
||
// log.info("新增{}条发票抬头", i);
|
||
}
|
||
|
||
public void updateMemberInvoiceTitle(InvoiceTitleDTO dto) {
|
||
MemberInvoiceTitle title = new MemberInvoiceTitle();
|
||
BeanUtils.copyProperties(dto, title);
|
||
title.setId(Long.valueOf(dto.getTitleId()));
|
||
title.setName(dto.getTitleName());
|
||
if (StringUtils.isEmail(dto.getReception())) {
|
||
title.setEmail(dto.getReception());
|
||
} else {
|
||
title.setPhoneNumber(dto.getReception());
|
||
}
|
||
int i = memberInvoiceTitleService.updateMemberInvoiceTitle(title);
|
||
}
|
||
|
||
/**
|
||
* 删除会员发票抬头
|
||
* @param dto
|
||
*/
|
||
public void deleteMemberInvoiceTitle(InvoiceTitleDTO dto) {
|
||
memberInvoiceTitleService.deleteMemberInvoiceTitleById(Long.valueOf(dto.getTitleId()));
|
||
}
|
||
|
||
// public Map<String, Object> rechargeBalance(WeixinPayDTO dto) throws Exception {
|
||
// PaymentScenarioDTO paymentScenarioDTO = new PaymentScenarioDTO();
|
||
// paymentScenarioDTO.setType(ScenarioEnum.BALANCE.getValue());
|
||
// paymentScenarioDTO.setMemberId(dto.getMemberId());
|
||
// dto.setAttach(JSON.toJSONString(paymentScenarioDTO));
|
||
// dto.setDescription("会员充值余额");
|
||
// return orderService.weixinPayV3(dto);
|
||
// }
|
||
|
||
/**
|
||
* 使用汇付支付充值余额
|
||
* @param dto
|
||
* @return
|
||
*/
|
||
public Map<String, Object> rechargeBalanceWithAdapay(WeixinPayDTO dto) {
|
||
// 获取支付配置
|
||
AbstractAdapayConfig config = AdapayConfigFactory.getConfig(dto.getWechatAppId());
|
||
if (config == null) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_CONFIG_IS_NULL_ERROR);
|
||
}
|
||
log.info("使用汇付支付充值余额 支付配置参数:{}", JSON.toJSONString(config));
|
||
|
||
// 查询延时支付模式,由一级运营商配置决定
|
||
String delayMode = pileMerchantInfoService.getDelayModeByWechatAppId(dto.getWechatAppId());
|
||
String payMode = MerchantDelayModeEnum.getAdapayPayMode(delayMode);
|
||
// 封装对象
|
||
// String payMode = Constants.ADAPAY_PAY_MODE_DELAY; // 汇付延时分账
|
||
CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam();
|
||
createAdaPaymentParam.setOrder_no(SnowflakeIdWorker.getSnowflakeId());
|
||
createAdaPaymentParam.setPay_amt(AdapayUtil.formatAmount(dto.getAmount()));
|
||
// createAdaPaymentParam.setApp_id(ADAPAY_APP_ID); // 移动到配置文件中
|
||
createAdaPaymentParam.setApp_id(config.getAdapayAppId()); // 移动到配置文件中
|
||
createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求
|
||
createAdaPaymentParam.setGoods_title("充值余额");
|
||
createAdaPaymentParam.setGoods_desc("会员充值余额");
|
||
createAdaPaymentParam.setExpend(JSON.toJSONString( ImmutableMap.of("open_id", dto.getOpenId())));
|
||
//异步通知地址,url为http/https路径,服务器POST回调,URL 上请勿附带参数
|
||
createAdaPaymentParam.setNotify_url(ADAPAY_CALLBACK_URL);
|
||
Map<String, String> map = Maps.newHashMap();
|
||
map.put("type", ScenarioEnum.BALANCE.getValue());
|
||
map.put("payMode", payMode);
|
||
map.put("memberId", dto.getMemberId());
|
||
createAdaPaymentParam.setDescription(JSON.toJSONString(map));
|
||
// 延时分账
|
||
if (StringUtils.isNotBlank(payMode)) {
|
||
createAdaPaymentParam.setPay_mode(payMode);
|
||
}
|
||
try {
|
||
log.info("创建汇付支付参数:{}", JSON.toJSONString(createAdaPaymentParam));
|
||
Map<String, Object> response = Payment.create(BeanMap.create(createAdaPaymentParam), config.getWechatAppId());
|
||
log.info("创建汇付支付参数反参:{}", JSON.toJSONString(response));
|
||
if (response != null && !response.isEmpty()) {
|
||
JSONObject jsonObject = JSONObject.parseObject(response.get("expend").toString());
|
||
JSONObject pay_info = jsonObject.getJSONObject("pay_info");
|
||
return JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {});
|
||
}
|
||
} catch (BaseAdaPayException e) {
|
||
log.error("汇付-获取支付对象发生异常", e);
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* 充值订单金额
|
||
*/
|
||
// public void rechargeOrderAmount(RechargeOrderAmountDTO dto) throws ParseException {
|
||
// // 根据memberId查询出当前用户正在充电的 vin启动订单 或 卡启动订单
|
||
// UniAppQueryOrderDTO orderDTO = new UniAppQueryOrderDTO();
|
||
// orderDTO.setOrderStatus("4"); // 4-正在充电中
|
||
// PageResponse pageResponse = orderService.getListByMemberIdAndOrderStatus(dto.getMemberId(), orderDTO);
|
||
// if (pageResponse == null) {
|
||
// return;
|
||
// }
|
||
// List<OrderVO> list = (List<OrderVO>) pageResponse.getList();
|
||
// List<OrderVO> chargingList = list.stream()
|
||
// .filter(orderVO -> orderVO.getOrderStatus().equals(OrderStatusEnum.IN_THE_CHARGING.getValue()))
|
||
// .collect(Collectors.toList());
|
||
// for (OrderVO orderVO : chargingList) {
|
||
// if (StringUtils.equals(orderVO.getStartMode(), StartModeEnum.AUTH_CARD.getValue())
|
||
// || StringUtils.equals(orderVO.getStartMode(), StartModeEnum.OFFLINE_CARD.getValue())
|
||
// || StringUtils.equals(orderVO.getStartMode(), StartModeEnum.VIN_CODE.getValue())) {
|
||
// // 将充值后的余额计算出来
|
||
// BigDecimal rechargeAmount = new BigDecimal(dto.getRechargeAmount());
|
||
// BigDecimal payAmount = orderVO.getPayAmount().add(rechargeAmount);
|
||
// orderVO.setPayAmount(payAmount);
|
||
// // 发送0x41指令更新账户余额
|
||
// RemoteAccountBalanceUpdateDTO remoteDTO = new RemoteAccountBalanceUpdateDTO();
|
||
// remoteDTO.setPileSn(orderVO.getPileSn());
|
||
// remoteDTO.setConnectorCode(orderVO.getConnectorCode());
|
||
// remoteDTO.setAccountBalance(String.valueOf(orderVO.getPayAmount()));
|
||
//
|
||
// pileRemoteService.remoteAccountBalanceUpdate(remoteDTO);
|
||
//
|
||
// // 将支付金额修改数据库
|
||
// OrderBasicInfo basicInfo = new OrderBasicInfo();
|
||
// basicInfo.setId(Integer.parseInt(orderVO.getId()));
|
||
// basicInfo.setPayAmount(payAmount);
|
||
//
|
||
// orderBasicInfoService.updateOrderBasicInfo(basicInfo);
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
public List<MemberWalletVO> queryMemberWalletList(String memberId) {
|
||
return memberWalletInfoService.selectByMemberWalletList(memberId);
|
||
}
|
||
|
||
}
|