|
@@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.core.util.URLUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.github.pagehelper.Page;
|
|
@@ -15,21 +16,30 @@ import com.zbkj.common.config.CrmebConfig;
|
|
|
import com.zbkj.common.constants.*;
|
|
|
import com.zbkj.common.exception.CrmebException;
|
|
|
import com.zbkj.common.model.admin.SystemAdmin;
|
|
|
+import com.zbkj.common.model.bill.Bill;
|
|
|
import com.zbkj.common.model.rider.Rider;
|
|
|
import com.zbkj.common.model.rider.RiderApply;
|
|
|
+import com.zbkj.common.model.rider.RiderBalanceRecord;
|
|
|
import com.zbkj.common.model.rider.RiderFeeConfig;
|
|
|
import com.zbkj.common.model.system.SystemNotification;
|
|
|
import com.zbkj.common.model.user.User;
|
|
|
+import com.zbkj.common.model.user.UserBalanceRecord;
|
|
|
+import com.zbkj.common.model.user.UserBrokerageRecord;
|
|
|
+import com.zbkj.common.model.user.UserClosing;
|
|
|
import com.zbkj.common.page.CommonPage;
|
|
|
+import com.zbkj.common.request.BrokerageToYueRequest;
|
|
|
import com.zbkj.common.request.PageParamRequest;
|
|
|
+import com.zbkj.common.request.UserClosingApplyRequest;
|
|
|
import com.zbkj.common.request.UserUpdateRequest;
|
|
|
import com.zbkj.common.request.rider.*;
|
|
|
import com.zbkj.common.response.*;
|
|
|
+import com.zbkj.common.response.rider.RiderAccountResponse;
|
|
|
import com.zbkj.common.response.rider.RiderPageResponse;
|
|
|
import com.zbkj.common.response.rider.RiderPlatformDetailResponse;
|
|
|
import com.zbkj.common.response.rider.RiderSettledResponse;
|
|
|
import com.zbkj.common.result.CommonResultCode;
|
|
|
import com.zbkj.common.result.MerchantResultCode;
|
|
|
+import com.zbkj.common.result.UserResultCode;
|
|
|
import com.zbkj.common.utils.*;
|
|
|
import com.zbkj.common.vo.DateLimitUtilVo;
|
|
|
import com.zbkj.common.vo.LoginUserVo;
|
|
@@ -44,9 +54,12 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.support.TransactionTemplate;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
+import static java.math.BigDecimal.ZERO;
|
|
|
+
|
|
|
/**
|
|
|
* StoreServiceImpl 接口实现
|
|
|
* +----------------------------------------------------------------------
|
|
@@ -81,6 +94,16 @@ public class RiderServiceImpl extends ServiceImpl<RiderDao, Rider> implements Ri
|
|
|
private SystemAttachmentService systemAttachmentService;
|
|
|
@Autowired
|
|
|
private SystemNotificationService systemNotificationService;
|
|
|
+ @Autowired
|
|
|
+ private SystemConfigService systemConfigService;
|
|
|
+ @Autowired
|
|
|
+ private UserClosingService userClosingService;
|
|
|
+ @Autowired
|
|
|
+ private RiderBalanceRecordService riderBalanceRecordService;
|
|
|
+ @Autowired
|
|
|
+ private BillService billService;
|
|
|
+ @Autowired
|
|
|
+ private UserBalanceRecordService userBalanceRecordService;
|
|
|
|
|
|
private final Logger logger = LoggerFactory.getLogger(RiderServiceImpl.class);
|
|
|
|
|
@@ -203,6 +226,155 @@ public class RiderServiceImpl extends ServiceImpl<RiderDao, Rider> implements Ri
|
|
|
return response;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public RiderAccountResponse getMyAccount() {
|
|
|
+ User user = userService.getInfo();
|
|
|
+ Rider rider= getByUIdException(user.getId());
|
|
|
+ // 冻结的佣金
|
|
|
+ BigDecimal freezePrice = BigDecimal.ZERO;
|
|
|
+ //累计已提取
|
|
|
+ BigDecimal settledCommissionPrice = riderBalanceRecordService.getSettledCommission(user.getId());
|
|
|
+ RiderAccountResponse response = new RiderAccountResponse();
|
|
|
+ response.setFreezePrice(freezePrice);
|
|
|
+ response.setSettledCommissionPrice(settledCommissionPrice);
|
|
|
+ response.setNowMoney(rider.getBalance());
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean userClosingApply(UserClosingApplyRequest request) {
|
|
|
+ userClosingApplyValidate(request);
|
|
|
+ Rider user = getByUIdException(userService.getUserId());
|
|
|
+ if (ObjectUtil.isNull(user)) {
|
|
|
+ throw new CrmebException(UserResultCode.USER_NOT_EXIST);
|
|
|
+ }
|
|
|
+ BigDecimal money = user.getBalance();//可提现总金额
|
|
|
+ if (money.compareTo(ZERO) < 1) {
|
|
|
+ throw new CrmebException(UserResultCode.USER_BROKERAGE_INSUFFICIENT);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (money.compareTo(request.getClosingPrice()) < 0) {
|
|
|
+ throw new CrmebException(UserResultCode.USER_BROKERAGE_INSUFFICIENT.setMessage("你当前最多可提现 " + money + "元"));
|
|
|
+ }
|
|
|
+
|
|
|
+ UserClosing userClosing = new UserClosing();
|
|
|
+ userClosing.setClosingWay(1);
|
|
|
+ userClosing.setClosingType(request.getType());
|
|
|
+ BeanUtils.copyProperties(request, userClosing);
|
|
|
+ userClosing.setUid(user.getUid());
|
|
|
+ userClosing.setBalance(money.subtract(request.getClosingPrice()));
|
|
|
+ userClosing.setClosingNo(CrmebUtil.getOrderNo(OrderConstants.CLOSING_ORDER_PREFIX_USER));
|
|
|
+ //存入银行名称
|
|
|
+ if (StrUtil.isNotBlank(userClosing.getPaymentCode())) {
|
|
|
+ userClosing.setPaymentCode(systemAttachmentService.clearPrefix(userClosing.getPaymentCode()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加佣金记录
|
|
|
+ RiderBalanceRecord brokerageRecord = new RiderBalanceRecord();
|
|
|
+ brokerageRecord.setUid(user.getUid());
|
|
|
+ brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_WITHDRAW);
|
|
|
+ brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB);
|
|
|
+ brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_WITHDRAW_APPLY);
|
|
|
+ brokerageRecord.setPrice(userClosing.getClosingPrice());
|
|
|
+ brokerageRecord.setBalance(money.subtract(userClosing.getClosingPrice()));
|
|
|
+ brokerageRecord.setMark(StrUtil.format("提现申请扣除收益{}", userClosing.getClosingPrice()));
|
|
|
+ brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_WITHDRAW);
|
|
|
+ brokerageRecord.setCreateTime(DateUtil.date());
|
|
|
+ brokerageRecord.setLinkNo(userClosing.getClosingNo());
|
|
|
+
|
|
|
+ Boolean execute = transactionTemplate.execute(e -> {
|
|
|
+ // 保存提现记录
|
|
|
+ userClosingService.save(userClosing);
|
|
|
+ // 添加佣金记录
|
|
|
+ riderBalanceRecordService.save(brokerageRecord);
|
|
|
+ return Boolean.TRUE;
|
|
|
+ });
|
|
|
+ // 此处可添加提现申请通知
|
|
|
+
|
|
|
+ return execute;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public UserClosingConfigResponse getUserClosingConfig() {
|
|
|
+ Rider rider=getByUIdException(userService.getUserId());
|
|
|
+ // 提现最低金额
|
|
|
+ String minPrice = systemConfigService.getValueByKeyException(SysConfigConstants.RETAIL_STORE_EXTRACT_MIN_PRICE);
|
|
|
+ // 冻结天数
|
|
|
+ String freezeDay = systemConfigService.getValueByKeyException(SysConfigConstants.RETAIL_STORE_BROKERAGE_FREEZING_TIME);
|
|
|
+ // 可提现佣金
|
|
|
+ BigDecimal brokerage = rider.getBalance();
|
|
|
+ // 冻结佣金
|
|
|
+ BigDecimal freezeBrokerage = riderBalanceRecordService.getFreezePrice(rider.getUid());
|
|
|
+ // 获取提现银行
|
|
|
+ String bank = systemConfigService.getValueByKeyException(SysConfigConstants.RETAIL_STORE_EXTRACT_BANK);
|
|
|
+ UserClosingConfigResponse response = new UserClosingConfigResponse();
|
|
|
+ response.setMinPrice(minPrice);
|
|
|
+ response.setBrokerage(brokerage);
|
|
|
+ response.setFreezeBrokerage(freezeBrokerage);
|
|
|
+ response.setFreezeDay(freezeDay);
|
|
|
+ if (StrUtil.isNotBlank(bank)) {
|
|
|
+ response.setBankList(StrUtil.splitTrim(bank, ","));
|
|
|
+ }
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean brokerageToYue(BrokerageToYueRequest request) {
|
|
|
+ Rider rider=getByUIdException(userService.getUserId());
|
|
|
+ User user = userService.getInfo();
|
|
|
+ if (rider.getBalance().compareTo(ZERO) <= 0) {
|
|
|
+ throw new CrmebException(UserResultCode.USER_BROKERAGE_INSUFFICIENT);
|
|
|
+ }
|
|
|
+ if (rider.getBalance().compareTo(request.getPrice()) < 0) {
|
|
|
+ throw new CrmebException(UserResultCode.USER_BROKERAGE_INSUFFICIENT);
|
|
|
+ }
|
|
|
+ BigDecimal price = request.getPrice();
|
|
|
+
|
|
|
+ RiderBalanceRecord brokerageRecord = new RiderBalanceRecord();
|
|
|
+ brokerageRecord.setUid(rider.getUid());
|
|
|
+ brokerageRecord.setLinkNo("0");
|
|
|
+ brokerageRecord.setLinkType(BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_YUE);
|
|
|
+ brokerageRecord.setType(BrokerageRecordConstants.BROKERAGE_RECORD_TYPE_SUB);
|
|
|
+ brokerageRecord.setTitle(BrokerageRecordConstants.BROKERAGE_RECORD_TITLE_BROKERAGE_YUE);
|
|
|
+ brokerageRecord.setPrice(price);
|
|
|
+ brokerageRecord.setBalance(rider.getBalance().subtract(price));
|
|
|
+ brokerageRecord.setMark(StrUtil.format("收益转余额,减少{}", price));
|
|
|
+ brokerageRecord.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_COMPLETE);
|
|
|
+ brokerageRecord.setCreateTime(DateUtil.date());
|
|
|
+
|
|
|
+ UserBalanceRecord balanceRecord = new UserBalanceRecord();
|
|
|
+ balanceRecord.setUid(rider.getUid());
|
|
|
+ balanceRecord.setLinkId("0");
|
|
|
+ balanceRecord.setLinkType(BalanceRecordConstants.BALANCE_RECORD_LINK_TYPE_BROKERAGE);
|
|
|
+ balanceRecord.setType(BalanceRecordConstants.BALANCE_RECORD_TYPE_ADD);
|
|
|
+ balanceRecord.setAmount(price);
|
|
|
+ balanceRecord.setBalance(user.getNowMoney().add(price));
|
|
|
+ balanceRecord.setRemark(StrUtil.format(BalanceRecordConstants.BALANCE_RECORD_REMARK_BROKERAGE, price));
|
|
|
+
|
|
|
+ Bill bill = new Bill();
|
|
|
+ bill.setUid(user.getId());
|
|
|
+ bill.setPm(BillConstants.BILL_PM_ADD);
|
|
|
+ bill.setAmount(price);
|
|
|
+ bill.setType(BillConstants.BILL_TYPE_SYSTEM);
|
|
|
+ bill.setMark(StrUtil.format("收益转余额,用户收益转余额{}元", price));
|
|
|
+ Boolean execute = transactionTemplate.execute(e -> {
|
|
|
+ Boolean result = userService.incomeToYue(user.getId(), brokerageRecord.getPrice());
|
|
|
+ if (!result) {
|
|
|
+ e.setRollbackOnly();
|
|
|
+ return Boolean.FALSE;
|
|
|
+ }
|
|
|
+ updateBalance(user.getId(),price,Constants.OPERATION_TYPE_SUBTRACT);
|
|
|
+ billService.save(bill);
|
|
|
+ userBalanceRecordService.save(balanceRecord);
|
|
|
+ riderBalanceRecordService.save(brokerageRecord);
|
|
|
+ return Boolean.TRUE;
|
|
|
+ });
|
|
|
+ if (!execute) {
|
|
|
+ throw new CrmebException("收益转余额失败");
|
|
|
+ }
|
|
|
+ return execute;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 修改骑手手机号
|
|
|
*
|
|
@@ -338,7 +510,28 @@ public class RiderServiceImpl extends ServiceImpl<RiderDao, Rider> implements Ri
|
|
|
}).collect(Collectors.toList());
|
|
|
return CommonPage.copyPageInfo(pageInfo, responseList);
|
|
|
}
|
|
|
-
|
|
|
+ /**
|
|
|
+ * 更新用户佣金
|
|
|
+ *
|
|
|
+ * @param uid 用户ID
|
|
|
+ * @param price 金额
|
|
|
+ * @param type 增加add、扣减sub
|
|
|
+ * @return Boolean
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateBalance(Integer uid, BigDecimal price, String type) {
|
|
|
+ UpdateWrapper<Rider> wrapper = Wrappers.update();
|
|
|
+ if (type.equals(Constants.OPERATION_TYPE_ADD)) {
|
|
|
+ wrapper.setSql(StrUtil.format("balance = balance + {}", price));
|
|
|
+ } else {
|
|
|
+ wrapper.setSql(StrUtil.format("balance = balance - {}", price));
|
|
|
+ }
|
|
|
+ wrapper.eq("uid", uid);
|
|
|
+ if (type.equals(Constants.OPERATION_TYPE_SUBTRACT)) {
|
|
|
+ wrapper.apply(StrUtil.format(" balance - {} >= 0", price));
|
|
|
+ }
|
|
|
+ return update(wrapper);
|
|
|
+ }
|
|
|
/**
|
|
|
* 检查骑手手机号是否重复
|
|
|
*
|
|
@@ -426,5 +619,41 @@ public class RiderServiceImpl extends ServiceImpl<RiderDao, Rider> implements Ri
|
|
|
}
|
|
|
return rider.getId()!=null&&rider.getId()>0?updateById(rider):save(rider);
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 用胡结算申请参数校验
|
|
|
+ */
|
|
|
+ private void userClosingApplyValidate(UserClosingApplyRequest request) {
|
|
|
+ if (request.getType().equals(ClosingConstant.CLOSING_TYPE_BANK)) {
|
|
|
+ if (StrUtil.isBlank(request.getCardholder())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请填写持卡人姓名");
|
|
|
+ }
|
|
|
+ if (StrUtil.isBlank(request.getBankName())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请选择银行");
|
|
|
+ }
|
|
|
+ if (StrUtil.isBlank(request.getBankCardNo())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请填写银行卡卡号");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (request.getType().equals(ClosingConstant.CLOSING_TYPE_ALIPAY)) {
|
|
|
+ if (StrUtil.isBlank(request.getAlipayAccount())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请填写支付宝账号");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (request.getType().equals(ClosingConstant.CLOSING_TYPE_WECHAT)) {
|
|
|
+ if (StrUtil.isBlank(request.getWechatNo())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请填写微信号");
|
|
|
+ }
|
|
|
+ if (StrUtil.isBlank(request.getPaymentCode())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请填写微信收款码");
|
|
|
+ }
|
|
|
+ if (StrUtil.isBlank(request.getRealName())) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "请填写真实姓名");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String minPrice = systemConfigService.getValueByKeyException(SysConfigConstants.RETAIL_STORE_EXTRACT_MIN_PRICE);
|
|
|
+ if (request.getClosingPrice().compareTo(new BigDecimal(minPrice)) < 0) {
|
|
|
+ throw new CrmebException(CommonResultCode.VALIDATE_FAILED, StrUtil.format("最低提现金额{}元", minPrice));
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|