package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.stylefeng.guns.core.util.ToolUtil;
|
import com.stylefeng.guns.modular.system.dao.SettlementRecordMapper;
|
import com.stylefeng.guns.modular.system.model.*;
|
import com.stylefeng.guns.modular.system.service.*;
|
import com.stylefeng.guns.modular.system.util.DateUtil;
|
import com.stylefeng.guns.modular.system.util.ResultUtil;
|
import com.stylefeng.guns.modular.system.util.Tingg.TinggPayUtil;
|
import com.stylefeng.guns.modular.system.util.Tingg.model.CheckoutRequest;
|
import com.stylefeng.guns.modular.system.warpper.QueryHistoricalSettlement;
|
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmount;
|
import com.stylefeng.guns.modular.system.warpper.QuerySettlementAmountDetails;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* @author zhibing.pu
|
* @Date 2023/8/17 9:36
|
*/
|
@Service
|
public class SettlementRecordServiceImpl extends ServiceImpl<SettlementRecordMapper, SettlementRecord> implements ISettlementRecordService {
|
|
@Autowired
|
private ISettlementDetailService settlementDetailService;
|
|
@Autowired
|
private IDriverService driverService;
|
|
@Autowired
|
private IBankCardService bankCardService;
|
|
@Autowired
|
private ITransactionDetailsService transactionDetailsService;
|
|
@Autowired
|
private ISettlementAllocationService settlementAllocationService;
|
|
@Value("${callbackPath}")
|
private String callbackPath;//支付回调网关地址
|
|
@Resource
|
private IBalanceUsageRecordService balanceUsageRecordService;
|
|
|
|
/**
|
* 获取待结算金额和明细
|
* @param driverId
|
* @return
|
*/
|
@Override
|
public QuerySettlementAmount querySettlementAmount(Integer language, Integer driverId) {
|
QuerySettlementAmount querySettlementAmount = new QuerySettlementAmount();
|
SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
|
if(null != settlementRecord){
|
querySettlementAmount.setType(settlementRecord.getType());
|
querySettlementAmount.setAmount(settlementRecord.getPayMoney());
|
List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("settlementRecordId", settlementRecord.getId()).orderBy("createTime desc"));
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
List<QuerySettlementAmountDetails> list = new ArrayList<>();
|
settlementDetailList.forEach(s -> {
|
QuerySettlementAmountDetails querySettlementAmountDetails = new QuerySettlementAmountDetails();
|
querySettlementAmountDetails.setOrderMoney(s.getOrderMoney());
|
querySettlementAmountDetails.setPayMoney(s.getPrice());
|
querySettlementAmountDetails.setOrderTime(DateUtil.conversionFormat(language, sdf.format(s.getCreateTime())));
|
list.add(querySettlementAmountDetails);
|
});
|
querySettlementAmount.setList(list);
|
}else{
|
querySettlementAmount.setType(2);
|
querySettlementAmount.setAmount(0D);
|
querySettlementAmount.setList(new ArrayList<>());
|
}
|
return querySettlementAmount;
|
}
|
|
|
/**
|
* 支付待结算
|
* @param driverId
|
* @param payType
|
* @return
|
*/
|
@Override
|
public ResultUtil paymentSettlementAmount(Integer driverId, Integer payType, Integer bankCardId, Integer language) throws Exception {
|
Driver driver1 = driverService.selectById(driverId);
|
SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
|
if(null == settlementRecord){
|
return ResultUtil.error(language == 1 ? "暂无需支付" : language == 2 ? "No need to make payments for the time being" : "Pas besoin d’effectuer de paiements pour le moment");
|
}
|
Double payMoney = settlementRecord.getPayMoney();
|
ResultUtil resultUtil = ResultUtil.success("");
|
if(payType == 1){//手机支付
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
String merchantTransactionId = sdf.format(new Date()) + language + settlementRecord.getId();
|
CheckoutRequest checkoutRequest = new CheckoutRequest();
|
checkoutRequest.setMsisdn(Long.valueOf(driver1.getPhone()));
|
checkoutRequest.setCustomerEmail(driver1.getEmail());
|
checkoutRequest.setAccountNumber(driver1.getPhone());
|
checkoutRequest.setCustomerFirstName(driver1.getFirstName());
|
checkoutRequest.setCustomerLastName(driver1.getLastName());
|
checkoutRequest.setRequestAmount(payMoney);
|
checkoutRequest.setMerchantTransactionId(merchantTransactionId);
|
checkoutRequest.setRequestDescription("Settlement cost");
|
checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/querySettlementAmount");
|
checkoutRequest.setPendingRedirectUrl("");
|
checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
|
checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
|
resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
|
|
if(resultUtil.getCode()!=200){
|
resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Échec de paiement", "");
|
}
|
return resultUtil;
|
}
|
if(payType == 2){//银行卡支付
|
BankCard bankCard = bankCardService.selectById(bankCardId);
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
|
String merchantTransactionId = sdf.format(new Date()) + language + settlementRecord.getId();
|
CheckoutRequest checkoutRequest = new CheckoutRequest();
|
checkoutRequest.setMsisdn(Long.valueOf(bankCard.getCode()));
|
checkoutRequest.setCustomerEmail(driver1.getEmail());
|
checkoutRequest.setAccountNumber(bankCard.getCode());
|
checkoutRequest.setCustomerFirstName(bankCard.getFirstName());
|
checkoutRequest.setCustomerLastName(bankCard.getLastName());
|
checkoutRequest.setRequestAmount(payMoney);
|
checkoutRequest.setMerchantTransactionId(merchantTransactionId);
|
checkoutRequest.setRequestDescription("Settlement cost");
|
checkoutRequest.setCallbackUrl(callbackPath + "/base/settlementRecord/querySettlementAmount");
|
checkoutRequest.setPendingRedirectUrl("");
|
checkoutRequest.setSuccessRedirectUrl("http://182.160.16.251:81/payMoney/pages/success.html");
|
checkoutRequest.setFailRedirectUrl("http://182.160.16.251:81/payMoney/pages/fail.html");
|
resultUtil = TinggPayUtil.checkoutRequest(checkoutRequest);
|
|
if(resultUtil.getCode()!=200){
|
resultUtil = ResultUtil.error(language == 1 ? "支付失败" : language == 2 ? "Payment failure" : "Échec de paiement", "");
|
}
|
return resultUtil;
|
}
|
if(payType == 3){//余额支付
|
if(driver1.getBalance() == null || driver1.getBalance() < payMoney){
|
return ResultUtil.error(language == 1 ? "账户余额不足" : language == 2 ? "Insufficient balance" : "Solde insuffisant", "");
|
}
|
|
Double laveActivityMoney = driver1.getLaveActivityMoney();
|
Double laveBusinessMoney = driver1.getLaveBusinessMoney();
|
//活动余额小于结算金额
|
if(null != laveActivityMoney && 0 < laveActivityMoney && laveActivityMoney.compareTo(payMoney) < 0){
|
driver1.setLaveActivityMoney(0D);
|
BigDecimal m = new BigDecimal(payMoney).subtract(new BigDecimal(laveActivityMoney)).setScale(2, RoundingMode.HALF_EVEN);
|
driver1.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(m).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
settlementRecord.setPayMoney(laveActivityMoney);
|
settlementRecord.setPaymentStatus(2);
|
settlementRecord.setPayType(payType);
|
settlementRecord.setBalanceType(1);
|
settlementRecord.setPayTime(new Date());
|
this.updateById(settlementRecord);
|
balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, laveActivityMoney, settlementRecord.getType() + 2);
|
balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 2, m.doubleValue(), settlementRecord.getType() + 2);
|
|
SettlementRecord settlementRecord1 = new SettlementRecord();
|
BeanUtils.copyProperties(settlementRecord, settlementRecord1);
|
settlementRecord1.setId(null);
|
settlementRecord1.setPayMoney(m.doubleValue());
|
settlementRecord1.setBalanceType(2);
|
this.insert(settlementRecord1);
|
}
|
//活动余额大于结算金额
|
if(null != laveActivityMoney && 0 < laveActivityMoney && laveActivityMoney.compareTo(payMoney) >= 0){
|
driver1.setLaveActivityMoney(new BigDecimal(laveActivityMoney).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
settlementRecord.setPaymentStatus(2);
|
settlementRecord.setPayType(payType);
|
settlementRecord.setBalanceType(1);
|
settlementRecord.setPayTime(new Date());
|
this.updateById(settlementRecord);
|
balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 1, payMoney, settlementRecord.getType() + 2);
|
}
|
if(null == laveActivityMoney || 0 == laveActivityMoney){
|
driver1.setLaveActivityMoney(0D);
|
driver1.setLaveBusinessMoney(new BigDecimal(laveBusinessMoney).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
settlementRecord.setPaymentStatus(2);
|
settlementRecord.setPayType(payType);
|
settlementRecord.setBalanceType(1);
|
settlementRecord.setPayTime(new Date());
|
this.updateById(settlementRecord);
|
balanceUsageRecordService.saveBalanceUsageRecord(settlementRecord.getDriverId(), 2, payMoney, settlementRecord.getType() + 2);
|
}
|
|
driver1.setBalance(new BigDecimal(driver1.getBalance()).subtract(new BigDecimal(payMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
|
//添加交易明细
|
transactionDetailsService.saveData(driverId, "线下结算", payMoney, 2, 1, 2, null, null);
|
driverService.updateById(driver1);
|
return ResultUtil.success("");
|
}
|
return resultUtil;
|
}
|
|
|
/**
|
* 获取司机结算历史记录
|
* @param driverId
|
* @return
|
*/
|
@Override
|
public List<QueryHistoricalSettlement> queryHistoricalSettlement(Integer language, Integer driverId, Integer pageNum, Integer size) {
|
pageNum = (pageNum - 1) * size;
|
List<Map<String, Object>> list = this.baseMapper.queryHistoricalSettlement(driverId, pageNum, size);
|
Double aDouble = this.baseMapper.queryHistoricalSettlementTotal(driverId);
|
List<QueryHistoricalSettlement> datas = new ArrayList<>();
|
for (Map<String, Object> map : list) {
|
QueryHistoricalSettlement queryHistoricalSettlement = new QueryHistoricalSettlement();
|
if(null != map.get("createTime")){
|
queryHistoricalSettlement.setCreateTime(DateUtil.conversionFormat(language, map.get("createTime").toString()));
|
}
|
if(null != map.get("price")){
|
queryHistoricalSettlement.setPrice(Double.valueOf(map.get("price").toString()));
|
}
|
if(null != map.get("type")){
|
queryHistoricalSettlement.setType(Integer.valueOf(map.get("type").toString()));
|
}
|
if(null != map.get("payType")){
|
Integer balanceType = Integer.valueOf(map.get("balanceType").toString());
|
switch (map.get("payType").toString()){
|
case "1":
|
queryHistoricalSettlement.setPayType(language == 1 ? "手机支付" : language == 2 ? "Mobile Money" : "Paiement mobile");
|
break;
|
case "2":
|
queryHistoricalSettlement.setPayType(language == 1 ? "线上支付" : language == 2 ? "Bank Card" : "Carte bancaire");
|
break;
|
default:
|
queryHistoricalSettlement.setPayType(language == 1 ? "余额支付(" + (balanceType == 1 ? "奖励" : "收入") + ")" : language == 2 ? "Wallet (" + (balanceType == 1 ? "Reward" : "Income") + ")" : "Portefeuille (" + (balanceType == 1 ? "Récompense" : "Revenu") + ")");
|
break;
|
}
|
}
|
queryHistoricalSettlement.setTotalPrice(aDouble);
|
datas.add(queryHistoricalSettlement);
|
}
|
return datas;
|
}
|
|
|
/**
|
* 是否需要结算
|
* @param driverId
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public boolean needToSettle(Integer driverId) throws Exception {
|
SettlementRecord settlementRecord = this.selectOne(new EntityWrapper<SettlementRecord>().eq("driverId", driverId).eq("paymentStatus", 1));
|
return null == settlementRecord ? false : true;
|
}
|
|
|
/**
|
* 定时任务生成结算数据
|
*/
|
@Override
|
public void taskSettlement() {
|
SettlementAllocation settlementAllocation = settlementAllocationService.selectOne(null);
|
Calendar today = Calendar.getInstance();
|
int w = today.get(Calendar.DAY_OF_WEEK);
|
w = w == 1 ? 7 : w - 1;
|
int d = today.get(Calendar.DAY_OF_MONTH);
|
if(null != settlementAllocation){
|
JSONObject jsonObject = JSON.parseObject(settlementAllocation.getContent());
|
Integer type = jsonObject.getInteger("type");
|
Integer day = jsonObject.getInteger("day");
|
if(type == 2 && w == day){//周结算
|
List<Map<String, Object>> list = settlementDetailService.queryGroupDriver();
|
for (Map<String, Object> map : list) {
|
Integer driverId = Integer.valueOf(map.get("driverId").toString());
|
Double price = Double.valueOf(map.get("price").toString());
|
|
SettlementRecord settlementRecord = new SettlementRecord();
|
settlementRecord.setDay(new Date());
|
settlementRecord.setDriverId(driverId);
|
settlementRecord.setType(2);
|
settlementRecord.setPaymentStatus(1);
|
settlementRecord.setPayMoney(price);
|
settlementRecord.setInsertTime(new Date());
|
this.insert(settlementRecord);
|
|
List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driverId).isNull("settlementRecordId"));
|
settlementDetailList.forEach(s -> {
|
s.setSettlementRecordId(settlementRecord.getId());
|
});
|
if(settlementDetailList.size() > 0){
|
settlementDetailService.updateBatchById(settlementDetailList);
|
}
|
}
|
}
|
if(type == 3 && d == day){//月结算
|
List<Map<String, Object>> list = settlementDetailService.queryGroupDriver();
|
for (Map<String, Object> map : list) {
|
Integer driverId = Integer.valueOf(map.get("driverId").toString());
|
Double price = Double.valueOf(map.get("price").toString());
|
|
SettlementRecord settlementRecord = new SettlementRecord();
|
settlementRecord.setDay(new Date());
|
settlementRecord.setDriverId(driverId);
|
settlementRecord.setType(3);
|
settlementRecord.setPaymentStatus(1);
|
settlementRecord.setPayMoney(price);
|
settlementRecord.setInsertTime(new Date());
|
this.insert(settlementRecord);
|
|
List<SettlementDetail> settlementDetailList = settlementDetailService.selectList(new EntityWrapper<SettlementDetail>().eq("driverId", driverId).isNull("settlementRecordId"));
|
settlementDetailList.forEach(s -> {
|
s.setSettlementRecordId(settlementRecord.getId());
|
});
|
if(settlementDetailList.size() > 0){
|
settlementDetailService.updateBatchById(settlementDetailList);
|
}
|
}
|
}
|
}
|
}
|
}
|