This commit is contained in:
dzc committed 2026-09-10 16:38:26 +08:00
1 parent 10eec976c2
commit bea1783c7c
2 files changed
+52

No files matched your search

@@ -4,7 +4,9 @@ import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderEvidenceMetadataDto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
@@ -78,4 +80,17 @@ public class HardCreateOrderDto {
@Schema(description = "离线支付是否成功")
private Boolean offlinePaySuccess;
/**
* 当前终端应用版本,仅用于订单证据问题追溯,不参与订单计价和支付。
*/
@Schema(description = "终端应用版本")
private String appVersion;
/**
* 人脸支付成功后需要挂接的证据元数据;旧终端不传时保持订单创建协议兼容。
*/
@Schema(description = "订单识别证据元数据")
@Valid
private List<HardOrderEvidenceMetadataDto> evidenceMetadataList;
}
@@ -109,6 +109,8 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
@@ -376,6 +378,7 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
orderObj.setWalletId(wallet.getId());
}
baseMapper.insert(orderObj);
registerEvidenceAfterCommit(orderObj, dto);
// 扣减库存
getSelf().fastenerInventory(orderObj, YesNoEnum.YES);
// 钱包支付或者核销
@@ -424,6 +427,40 @@ public class HardOrderServiceImpl extends ServiceImpl<HardOrderMapper, HardOrder
return orderObj.getId();
}
/**
* 仅为人脸支付订单在主事务提交后登记证据占位,证据库异常不回滚已成功的订单和资金结果。
*
* @param order 已写入主库的人脸支付订单
* @param dto 终端订单请求及可选证据元数据
*/
private void registerEvidenceAfterCommit(HardOrderEntity order, HardCreateOrderDto dto) {
if (!Objects.equals(order.getPayType(), HardPayTypeEnum.FACE.getType())
|| dto.getEvidenceMetadataList() == null || dto.getEvidenceMetadataList().isEmpty()) {
return;
}
Runnable action = () -> {
try {
hardOrderEvidenceImageService.registerOrderEvidence(order, dto.getEvidenceMetadataList(), dto.getAppVersion());
} catch (Exception exception) {
// 终端本地队列仍会按 androidOrderCode 补交,服务端占位失败不得改变订单支付结果。
log.warn("|{}|订单证据占位登记失败|orderId:{}|error:{}|", TAG, order.getId(), exception.getMessage());
}
};
if (!TransactionSynchronizationManager.isSynchronizationActive()) {
action.run();
return;
}
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
/**
* 主订单事务提交后使用独立事务登记证据占位,避免文件或证据表异常污染资金事务。
*/
@Override
public void afterCommit() {
action.run();
}
});
}
/**
* 创建设备二维码扫一扫订单
*/