# Conflicts:
#	jsowell-ui/src/views/order/order/orderDetail.vue
This commit is contained in:
admin-lmm
2023-08-31 16:14:01 +08:00
14 changed files with 140 additions and 87 deletions

View File

@@ -63,6 +63,11 @@ public class OrderController extends BaseController {
if (StringUtils.isEmpty(memberId)) {
throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR);
}
String appId = request.getHeader("appId");
if (StringUtils.isBlank(appId)) {
throw new BusinessException(ReturnCodeEnum.CODE_QUERY_WECHAT_APP_ID_IS_NULL);
}
dto.setAppId(appId);
dto.setMemberId(memberId);
// 生成订单
dto.setStartMode(Constants.ONE); // 启动方式 1-app启动

View File

@@ -247,7 +247,7 @@ public class PayController extends BaseController {
*/
@PostMapping("/rechargeBalance")
public RestApiResponse<?> rechargeBalance(HttpServletRequest request, @RequestBody WeixinPayDTO dto) {
logger.info("adapay会员充值余额 param:{}", dto.toString());
logger.info("adapay会员充值余额 param:{}", JSONObject.toJSONString(dto));
RestApiResponse<?> response;
try {
if (StringUtils.isBlank(dto.getCode()) || StringUtils.isBlank(dto.getAmount())) {

View File

@@ -20,6 +20,7 @@ import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.AcquirerEnum;
import com.jsowell.common.enums.DelFlagEnum;
import com.jsowell.common.enums.InvoiceRecordEnum;
import com.jsowell.common.enums.MemberWalletEnum;
import com.jsowell.common.enums.adapay.AdapayEventEnum;
@@ -371,6 +372,7 @@ public class OrderService {
order.setStopReasonMsg(orderBasicInfo.getReason());
order.setStartSOC(orderBasicInfo.getStartSOC());
order.setEndSOC(orderBasicInfo.getEndSOC());
order.setSettleAmount(String.valueOf(orderBasicInfo.getSettleAmount()));
order.setSettlementTime(DateUtils.formatDateTime(orderBasicInfo.getSettlementTime()));
vo.setOrderInfo(order);
@@ -401,6 +403,7 @@ public class OrderService {
realTimeInfo.setOrderAmount(realTimeMonitorData.getChargingAmount());
realTimeInfo.setChargedDegree(realTimeMonitorData.getChargingDegree());
realTimeInfo.setChargingTime(realTimeMonitorData.getSumChargingTime());
realTimeInfo.setTime(realTimeMonitorData.getDateTime());
vo.setOrderRealTimeInfo(realTimeInfo);
// 根据时间进行正序排序
@@ -753,12 +756,12 @@ public class OrderService {
.build()
);
// 余额支付
result.add(
PayModeVO.builder()
.payModeCode(OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())
.payModeName(OrderPayModeEnum.PAYMENT_OF_BALANCE.getLabel())
.build()
);
// result.add(
// PayModeVO.builder()
// .payModeCode(OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())
// .payModeName(OrderPayModeEnum.PAYMENT_OF_BALANCE.getLabel())
// .build()
// );
}
return result;
}
@@ -1053,6 +1056,7 @@ public class OrderService {
.acquirer(AcquirerEnum.ADAPAY.getValue())
.deductionRecord(json.toJSONString())
.createBy(null)
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
orderPayRecordService.batchInsert(Lists.newArrayList(orderPayRecord));

View File

@@ -296,6 +296,7 @@ public class SpringBootTestController {
.acquirer(AcquirerEnum.ADAPAY.getValue())
.deductionRecord(json.toJSONString())
.createBy(null)
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
orderPayRecordService.batchInsert(Lists.newArrayList(orderPayRecord));
@@ -441,14 +442,14 @@ public class SpringBootTestController {
@Test
public void createSettleAccountRequestTest() throws BaseAdaPayException {
SettleAccountDTO dto = new SettleAccountDTO();
dto.setCardId("10534201040009200");
dto.setCardName("苏州远慧物联智能科技有限公司");
dto.setTelNo("13915742562");
dto.setBankCode("01030000");
dto.setCardId("408060100100034609");
dto.setCardName("江苏敦顺建设工程有限公司");
dto.setTelNo("18021373333");
dto.setBankCode("03090000");
dto.setBankAcctType("1");
dto.setProvCode("0032");
dto.setAreaCode("3206");
String adapayMemberId = "ACM48720983";
dto.setAreaCode("3210");
String adapayMemberId = "ACM40991242";
String wechatAppId = "wxbb3e0d474569481d";
adapayService.createSettleAccountRequest(dto, adapayMemberId, wechatAppId);
}

View File

@@ -83,4 +83,9 @@ public class GenerateOrderDTO extends BasicPileDTO{
* 站点id
*/
private String stationId;
/**
* 微信小程序appId
*/
private String appId;
}

View File

@@ -114,4 +114,6 @@ public interface IPileMerchantInfoService {
* 通过merchantId获取一级运营商信息
*/
PileMerchantInfo getFirstLevelMerchantByMerchantId(String merchantId);
String getFirstLevelMerchantIdByMerchantId(String merchantId);
}

View File

@@ -142,12 +142,12 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService
* 更新交易记录的消费金额和退款金额
*
* @param paymentId 支付id
* @param SpendAmount 消费金额
* @param RefundAmount 退款金额
* @param spendAmount 消费金额
* @param refundAmount 退款金额
* @param freezeAmount 冻结金额
*/
@Override
public void commonUpdateAmountMethod(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount, BigDecimal freezeAmount) {
public void commonUpdateAmountMethod(String paymentId, BigDecimal spendAmount, BigDecimal refundAmount, BigDecimal freezeAmount) {
MemberAdapayRecord record = selectByPaymentId(paymentId);
if (record == null) {
log.info("更新交易记录的消费金额和退款金额paymentId:{}, 查询为空", paymentId);
@@ -159,41 +159,46 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService
BigDecimal freezeAmt = record.getFreezeAmt();
BigDecimal balanceAmt = record.getBalanceAmt();
if (freezeAmount != null) {
if (BigDecimal.ZERO.compareTo(freezeAmount) > 0) {
// 如果冻结金额传过来是负数,说明是解冻
if (freezeAmount.negate().compareTo(freezeAmt) > 0) {
throw new BusinessException("", "解冻金额大于冻结金额");
try {
if (freezeAmount != null) {
if (BigDecimal.ZERO.compareTo(freezeAmount) > 0) {
// 如果冻结金额传过来是负数,说明是解冻
if (freezeAmount.negate().compareTo(freezeAmt) > 0) {
throw new BusinessException("", "解冻金额大于冻结金额");
}
balanceAmt = balanceAmt.add(freezeAmount.negate()); // 剩余金额增加
} else {
if (freezeAmount.compareTo(balanceAmt) > 0) {
throw new BusinessException("", "冻结金额大于剩余金额");
}
}
balanceAmt = balanceAmt.add(freezeAmount.negate()); // 剩余金额增加
} else {
if (freezeAmount.compareTo(balanceAmt) > 0) {
throw new BusinessException("", "冻结金额大于剩余金额");
freezeAmt = freezeAmt.add(freezeAmount); // 冻结金额减少
// 设置冻结金额 = 历史冻结金额 + 本次冻结金额
record.setFreezeAmt(freezeAmt);
}
if (refundAmount != null) {
if (refundAmount.compareTo(balanceAmt) > 0) {
throw new BusinessException("", "退款金额大于剩余金额");
}
// 设置退款金额 = 历史退款金额 + 本次退款金额
refundAmt = refundAmt.add(refundAmount);
record.setRefundAmt(refundAmt);
}
freezeAmt = freezeAmt.add(freezeAmount); // 冻结金额减少
// 设置冻结金额 = 历史冻结金额 + 本次冻结金额
record.setFreezeAmt(freezeAmt);
}
if (RefundAmount != null) {
if (RefundAmount.compareTo(balanceAmt) > 0) {
throw new BusinessException("", "退款金额大于剩余金额");
if (spendAmount != null) {
if (spendAmount.compareTo(balanceAmt) > 0) {
throw new BusinessException("", "消费金额大于剩余金额");
}
// 设置消费金额 = 历史消费金额 + 本次消费金额
spendAmt = spendAmt.add(spendAmount);
record.setSpendAmt(spendAmt);
}
// 设置退款金额 = 历史退款金额 + 本次退款金额
refundAmt = refundAmt.add(RefundAmount);
record.setRefundAmt(refundAmt);
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 - 累计冻结金额
balanceAmt = record.getPayAmt().subtract(refundAmt).subtract(spendAmt).subtract(freezeAmt);
record.setBalanceAmt(balanceAmt);
updateByPrimaryKeySelective(record);
} catch (Exception e) {
log.error("更新MemberAdapayRecord金额paymentId:{}, spendAmount:{}, refundAmount:{}, freezeAmount:{}", paymentId, spendAmount, refundAmount, freezeAmount);
log.error("更新MemberAdapayRecord金额error", e);
}
if (SpendAmount != null) {
if (SpendAmount.compareTo(balanceAmt) > 0) {
throw new BusinessException("", "消费金额大于剩余金额");
}
// 设置消费金额 = 历史消费金额 + 本次消费金额
spendAmt = spendAmt.add(SpendAmount);
record.setSpendAmt(spendAmt);
}
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 - 累计冻结金额
balanceAmt = record.getPayAmt().subtract(refundAmt).subtract(spendAmt).subtract(freezeAmt);
record.setBalanceAmt(balanceAmt);
updateByPrimaryKeySelective(record);
}
}

View File

@@ -756,7 +756,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
delay商户, 如果存在退款金额, 支付的钱部分解冻(也就是只解冻需要退款的部分), 剩下的钱继续冻结等待第二天凌晨分账
*/
// 执行退款逻辑
delayMerchantOrderRefundLogic(orderBasicInfo, adapayMemberAccount, merchantInfo.getAppId());
} else {
/*
@@ -1187,8 +1186,8 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
List<Map<String, Object>> list = calculateUnfreezeAmount(orderAmount, payRecordList);
for (Map<String, Object> map : list) {
String paymentId = (String) map.get("paymentId");
String unfreezeAmount = (String) map.get("unfreezeAmount");
memberAdapayRecordService.unfreezeAmount(paymentId, new BigDecimal(unfreezeAmount));
BigDecimal unfreezeAmount = (BigDecimal) map.get("unfreezeAmount");
memberAdapayRecordService.unfreezeAmount(paymentId, unfreezeAmount);
}
}
@@ -2973,16 +2972,23 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// paymentId, refundAmount, wechatAppId, memberId, ScenarioEnum.ORDER.getValue(),
// orderCode);
PaymentReverseOperation operation = new PaymentReverseOperation();
operation.setPaymentId(paymentId);
operation.setReverseAmt(refundAmount);
operation.setMerchantKey(wechatAppId);
operation.setMemberId(memberId);
operation.setScenarioType(ScenarioEnum.ORDER.getValue());
operation.setOrderCode(orderCode);
PaymentReverseResponse response = adapayService.createPaymentReverseRequest(operation);
// PaymentReverseOperation operation = new PaymentReverseOperation();
// operation.setPaymentId(paymentId);
// operation.setReverseAmt(refundAmount);
// operation.setMerchantKey(wechatAppId);
// operation.setMemberId(memberId);
// operation.setScenarioType(ScenarioEnum.ORDER.getValue());
// operation.setOrderCode(orderCode);
// PaymentReverseResponse response = adapayService.createPaymentReverseRequest(operation);
logger.info("重试订单退款response:{}", JSON.toJSONString(response));
ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO();
applyRefundDTO.setOrderCode(orderCode);
applyRefundDTO.setRefundType(Constants.ONE);
applyRefundDTO.setRefundAmount(refundAmount);
applyRefundDTO.setWechatAppId(wechatAppId);
applyRefundDTO.setMemberId(memberId);
refundOrderWithAdapay(applyRefundDTO);
// logger.info("重试订单退款response:{}", JSON.toJSONString(response));
} else {
BigDecimal reversedAmt = BigDecimal.ZERO;
for (PaymentReverseResponse paymentRevers : paymentReverses) {
@@ -3168,6 +3174,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
.acquirer(AcquirerEnum.LOCAL.getValue())
.deductionRecord(json.toJSONString())
.createBy(dto.getMemberId())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build());
}
// 订单支付流水入库
@@ -3225,6 +3232,13 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
throw new BusinessException(ReturnCodeEnum.CODE_STATION_IS_NOT_OPEN);
}
// 校验启动桩使用的小程序,和充电桩所属一级运营商是否一致
String merchantIdByAppId = pileMerchantInfoService.getFirstLevelMerchantIdByAppId(dto.getAppId());
String merchantIdByMerchantId = pileMerchantInfoService.getFirstLevelMerchantIdByMerchantId(stationInfo.getMerchantId());
if (!StringUtils.equals(merchantIdByAppId, merchantIdByMerchantId)) {
throw new BusinessException("", "当前桩运营商与小程序所属运营商不一致");
}
// 如果是鉴权卡或者vin启动不判断枪口状态
if (!(StringUtils.equals(dto.getStartMode(), StartModeEnum.AUTH_CARD.getValue())
|| StringUtils.equals(dto.getStartMode(), StartModeEnum.VIN_CODE.getValue()))) {

View File

@@ -430,4 +430,13 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService {
return pileMerchantInfo;
}
@Override
public String getFirstLevelMerchantIdByMerchantId(String merchantId) {
PileMerchantInfo merchantInfo = getFirstLevelMerchantByMerchantId(merchantId);
if (merchantInfo != null) {
return String.valueOf(merchantInfo.getId());
}
return null;
}
}

View File

@@ -9,6 +9,7 @@ import com.jsowell.adapay.vo.OrderSettleResult;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.enums.AcquirerEnum;
import com.jsowell.common.enums.DelFlagEnum;
import com.jsowell.common.enums.MemberWalletEnum;
import com.jsowell.common.enums.ykc.*;
import com.jsowell.common.exception.BusinessException;
@@ -83,6 +84,7 @@ public class DelayMerchantOrderLogic extends AbstractOrderLogic {
.acquirer(AcquirerEnum.LOCAL.getValue())
.deductionRecord(json.toJSONString())
.createBy(dto.getMemberId())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build());
}
// 订单支付流水入库

View File

@@ -8,6 +8,7 @@ import com.jsowell.adapay.vo.OrderSettleResult;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.enums.AcquirerEnum;
import com.jsowell.common.enums.DelFlagEnum;
import com.jsowell.common.enums.MemberWalletEnum;
import com.jsowell.common.enums.ykc.*;
import com.jsowell.common.exception.BusinessException;
@@ -85,6 +86,7 @@ public class NotDelayMerchantOrderLogic extends AbstractOrderLogic{
.acquirer(AcquirerEnum.LOCAL.getValue())
.deductionRecord(json.toJSONString())
.createBy(dto.getMemberId())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build());
}
// 订单支付流水入库

View File

@@ -58,6 +58,7 @@ public class OrderDetailInfoVO {
private String createTime; // 订单创建时间
private String startSOC; // 开始SOC
private String endSOC; // 结束SOC
private String settleAmount;// 结算金额
private String settlementTime; // 结算时间
}
@@ -84,6 +85,7 @@ public class OrderDetailInfoVO {
@Data
public static class OrderRealTimeInfo{
private String time;
private String orderAmount; // 订单金额
private String totalElectricityAmount; // 总电费
private String totalServiceAmount; // 总服务费

View File

@@ -286,7 +286,7 @@
from clearing_bill_info t1
join pile_merchant_info t2 on t1.merchant_id = t2.id and t1.del_flag = '0'
where t1.merchant_id = #{merchantId,jdbcType=VARCHAR}
and t1.create_time between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
and t1.trade_date between #{startTime,jdbcType=VARCHAR} and #{endTime,jdbcType=VARCHAR}
order by
t1.trade_date desc
</select>

View File

@@ -194,33 +194,35 @@
<!-- 实时订单数据 -->
<el-card class="cardStyle">
<h3>实时订单数据</h3>
<el-descriptions
direction="vertical"
:column="5"
border
:contentStyle="CS"
:label-style="LS"
>
<el-descriptions-item label="时间">{{
orderRealTimeInfo.time
}}</el-descriptions-item>
<el-descriptions-item label="消费金额">{{
orderRealTimeInfo.orderAmount === "0.0000"
? "0"
: orderRealTimeInfo.orderAmount
}}</el-descriptions-item>
<el-descriptions-item label="充电度数">{{
orderRealTimeInfo.chargedDegree === "0.0000"
? "0"
: orderRealTimeInfo.chargedDegree
}}</el-descriptions-item>
<el-descriptions-item label="充电时长">{{
orderRealTimeInfo.chargingTime
}}</el-descriptions-item>
<el-descriptions-item label="当前soc">{{
orderRealTimeInfo.soc
}}</el-descriptions-item>
</el-descriptions>
<el-table style="width: 100%" :data="orderRealTimeInfo" border>
<el-table-column prop="time" label="时间" align="center" />
<el-table-column
prop="orderAmount"
label="消费金额"
align="center"
width="280"
>
<template slot-scope="scope">
<span
>{{
scope.row.orderAmount === "0.0000" ? "0" : scope.row.orderAmount
}}
</span>
</template>
</el-table-column>
<el-table-column prop="chargedDegree" label="充电度数" align="center">
<template slot-scope="scope">
<span>{{
scope.row.chargedDegree === "0.0000"
? "0"
: scope.row.chargedDegree
}}</span>
</template>
</el-table-column>
<el-table-column prop="chargingTime" label="充电时长" align="center" />
<el-table-column prop="soc" label="当前soc" align="center" />
</el-table>
<div class="marginTop"></div>
</el-card>
<!-- 支付信息 -->