Kaynağa Gözat

发行接口

master
qiubh 3 ay önce
ebeveyn
işleme
3687741e1c

+ 5
- 3
gly-base-core/src/main/java/cn/com/taiji/core/entity/issue/IssueOrderVerification.java Dosyayı Görüntüle

@@ -1,12 +1,11 @@
package cn.com.taiji.core.entity.issue;

import cn.com.taiji.core.entity.AbstractStringPropertyUUIDEntity;
import cn.com.taiji.core.entity.dict.issue.OrderType;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.*;
import java.time.LocalDateTime;


@@ -19,6 +18,9 @@ import java.time.LocalDateTime;
@Table(name = "ISSUE_ORDER_VERIFICATION")
public class IssueOrderVerification extends AbstractStringPropertyUUIDEntity {

@Column(name = "TYPE")
@Enumerated(EnumType.STRING)
private OrderType type;// 类型 1-发行 2-售后
@Column(name = "ORDER_NO")
private String orderNo;//订单编号
@Column(name = "VERIFY_TIME")

zhywpt-service-ias/src/main/java/cn/com/taiji/ias/tools/MyTimeTools.java → gly-base-core/src/main/java/cn/com/taiji/core/manager/tools/MyTimeTools.java Dosyayı Görüntüle

@@ -1,4 +1,4 @@
package cn.com.taiji.ias.tools;
package cn.com.taiji.core.manager.tools;

import cn.com.taiji.common.pub.TimeTools;


+ 107
- 0
gly-base-core/src/main/java/cn/com/taiji/core/manager/tools/issue/IssueTools.java Dosyayı Görüntüle

@@ -0,0 +1,107 @@
package cn.com.taiji.core.manager.tools.issue;

import cn.com.taiji.common.manager.AbstractManager;
import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.core.entity.dict.basic.VehicleType;

public class IssueTools extends AbstractManager {

/**
* 计算收费车型
*
* @param vanType 车型 1客2货3专项作业
* @param vehicleDimensions 车辆外廓尺寸
* @param approvedCount 核定载人数
* @param axleCount 轴数
* @param totalMass 总质量
* @return 收费车型
*/
public static Integer getVehicleClass(Integer vanType, String vehicleDimensions, Integer approvedCount,
Integer axleCount, Integer totalMass) throws ManagerException {
switch (vanType) {
case 1:
return mathCar(vehicleDimensions, approvedCount);
case 2:
return mathTruck(vehicleDimensions, axleCount, totalMass);
case 3:
return mathWorkVehicle(vehicleDimensions, axleCount, totalMass);
default:
throw new ManagerException(String.format("未知的车辆类型[%s]", vanType));
}

}

private static int mathCar(String vehicleDimensions, Integer approvedCount) throws ManagerException {
// 车辆外廓尺寸
int l = Integer.parseInt(vehicleDimensions.split("[Xx×*]")[0]);
// 车长小于 6 000mm 且核定载人数不大于 9 人的载客汽车
if (l < 6000 && approvedCount <= 9) {
return VehicleType.CAR_TYPE_1.getTypeCode();
} else if (l < 6000 && approvedCount <= 19) {
// 车长小于 6 000mm 且核定载人数为(10 ~ 19)人的载客汽车
return VehicleType.CAR_TYPE_2.getTypeCode();
} else if (l >= 6000 && approvedCount <= 39) {
// 车长不小于 6 000mm 且核定载人数不大 于 39 人的载客汽车
return VehicleType.CAR_TYPE_3.getTypeCode();
} else if (l >= 6000) {
// 车长不小于 6 000mm 且核定载人数不小 于 40 人的载客汽车
return VehicleType.CAR_TYPE_4.getTypeCode();
} else {
// 数据不合规
throw new ManagerException("车辆基础参数不合规,无法计算收费车型");
}
}

private static int mathTruck(String vehicleDimensions, Integer axleCount, Integer totalMass) throws ManagerException {
// 车辆外廓尺寸
int l = Integer.parseInt(vehicleDimensions.split("[Xx×*]")[0]);
if (axleCount == 2 && l < 6000 && totalMass < 4500) {
// 总轴数=2 车长小于 6 000mm 且最大允许总质量小于 4 500kg
return VehicleType.TRUCK_TYPE_1.getTypeCode();
} else if (axleCount == 2) {
// 总轴数=2 车长不小于 6 000mm 或最大允许总质量不小于 4500kg
return VehicleType.TRUCK_TYPE_2.getTypeCode();
} else if (axleCount == 3) {
// 总轴数=3
return VehicleType.TRUCK_TYPE_3.getTypeCode();
} else if (axleCount == 4) {
// 总轴数=4
return VehicleType.TRUCK_TYPE_4.getTypeCode();
} else if (axleCount == 5) {
// 总轴数=5
return VehicleType.TRUCK_TYPE_5.getTypeCode();
} else if (axleCount == 6) {
// 总轴数=6
return VehicleType.TRUCK_TYPE_6.getTypeCode();
} else {
// 数据不合规
throw new ManagerException("车辆基础参数不合规,无法计算收费车型");
}
}

private static int mathWorkVehicle(String vehicleDimensions, Integer axleCount, Integer totalMass) throws ManagerException {
// 车辆外廓尺寸
int l = Integer.parseInt(vehicleDimensions.split("[Xx×*]")[0]);
if (axleCount == 2) {
// 总轴数=2 车长小于 6 000mm 且最大允许总质量小于 4 500kg
if (l < 6000 && totalMass < 4500) {
return VehicleType.ZXZYC_1.getTypeCode();
} else {
// 总轴数=2 车长不小于 6 000mm 或最大允许总质量不小于 4 500kg
return VehicleType.ZXZYC_2.getTypeCode();
}
// 根据车轴数决定几项专项作业车
} else if (axleCount == 3) {
return VehicleType.ZXZYC_3.getTypeCode();
} else if (axleCount == 4) {
return VehicleType.ZXZYC_4.getTypeCode();
} else if (axleCount == 5) {
return VehicleType.ZXZYC_5.getTypeCode();
} else if (axleCount == 6) {
return VehicleType.ZXZYC_6.getTypeCode();
} else {
throw new ManagerException("车辆基础参数不合规,无法计算收费车型");
}
}

}

+ 0
- 10
gly-base-core/src/main/java/cn/com/taiji/core/manager/tools/ocr/BaiduOcrManager.java Dosyayı Görüntüle

@@ -1,10 +0,0 @@
package cn.com.taiji.core.manager.tools.ocr;

import cn.com.taiji.common.model.BaseModel;
import cn.com.taiji.core.entity.dict.OcrType;

public interface BaiduOcrManager {

public BaseModel doOcr(OcrType type, String imagePath) throws Exception;

}

+ 0
- 43
gly-base-core/src/main/java/cn/com/taiji/core/manager/tools/ocr/BaiduOcrManagerImpl.java Dosyayı Görüntüle

@@ -1,43 +0,0 @@
/**
* @Title YgzUploadUtil.java
* @Package
* @Description TODO
* @author
* @date
* @version V1.0
*/
package cn.com.taiji.core.manager.tools.ocr;

import cn.com.taiji.common.manager.AbstractManager;
import cn.com.taiji.common.model.BaseModel;
import cn.com.taiji.core.entity.dict.OcrType;
import cn.com.taiji.core.model.comm.protocol.ats.ocr.IdCardOcrRequest;
import cn.com.taiji.core.repo.jpa.comm.OcrResultRepo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* @author : qiubh
* @date : 2025-05-29
*/
@Service
public class BaiduOcrManagerImpl extends AbstractManager implements BaiduOcrManager {

@Autowired
private OcrResultRepo repo;

@Override
public BaseModel doOcr(OcrType type, String imagePath) throws Exception {
switch (type) {
case id_front:
IdCardOcrRequest req = new IdCardOcrRequest();
req.setImageType("1");
req.setUrl(imagePath);
// IdCardOcrResponse res = jsonPost

}
return null;

}

}

+ 1
- 1
gly-base-core/src/main/java/cn/com/taiji/core/model/comm/protocol/ias/order/VehicleUploadRequest.java Dosyayı Görüntüle

@@ -118,7 +118,7 @@ public class VehicleUploadRequest extends AbstractOrderRequest<VehicleUploadResp
}
// 牵引车必填字段
if (tractorSign == 1) {
validator.validFieldNotNull("roadTransportPermitPicUrl", roadTransportPermitPicUrl);
validator.validFieldNotBlank("roadTransportPermitPicUrl", roadTransportPermitPicUrl);
}

}

+ 5
- 0
gly-base-core/src/main/java/cn/com/taiji/core/repo/jpa/comm/OcrResultRepo.java Dosyayı Görüntüle

@@ -2,7 +2,12 @@ package cn.com.taiji.core.repo.jpa.comm;

import cn.com.taiji.common.repo.jpa.AbstractJpaRepo;
import cn.com.taiji.core.entity.comm.OcrResult;
import cn.com.taiji.core.entity.dict.OcrType;
import org.springframework.data.jpa.repository.Query;

public interface OcrResultRepo extends AbstractJpaRepo<OcrResult, String>{

@Query(" from OcrResult where url = ?1 and ocrType = ?2")
OcrResult findByUrlAndType(String url, OcrType ocrType);

}

+ 18
- 4
zhywpt-app-userw/src/main/java/cn/com/taiji/userw/manager/AbstractUserwManager.java Dosyayı Görüntüle

@@ -2,6 +2,7 @@ package cn.com.taiji.userw.manager;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.common.manager.net.http.ServiceHandleException;
import cn.com.taiji.common.pub.json.JsonTools;
import cn.com.taiji.core.entity.comm.OcrResult;
import cn.com.taiji.core.entity.dict.OcrType;
import cn.com.taiji.core.model.comm.protocol.ats.AbstractAtsResponse;
@@ -9,6 +10,7 @@ import cn.com.taiji.core.model.comm.protocol.ats.ocr.*;
import cn.com.taiji.core.repo.jpa.comm.OcrResultRepo;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.IOException;
import java.time.LocalDateTime;

public abstract class AbstractUserwManager extends AbstractCommManager {
@@ -20,21 +22,33 @@ public abstract class AbstractUserwManager extends AbstractCommManager {
* type:1-身份证-人像面 2-身份证-国徽面 3-行驶证前页 4-行驶证背页 5-营业执照
* imagePath:图片地址
*/
protected AbstractAtsResponse getOcrResult(Integer type, String imagePath) throws ManagerException {
protected AbstractAtsResponse getOcrResult(Integer type, String imagePath) throws ManagerException, IOException {
OcrResult ocrResult = new OcrResult();
ocrResult.setCreateTime(LocalDateTime.now());
ocrResult.setUrl(imagePath);
ocrResult.setOcrType(OcrType.findByCode(type));
// 相同的图片,直接取已有的结果
OcrResult exist = ocrResultRepo.findByUrlAndType(ocrResult.getUrl(), ocrResult.getOcrType());
switch (ocrResult.getOcrType()) {
case id_front:
if (exist != null)
return JsonTools.json2Object(exist.getResult(), IdCardOcrResponse.class);
return doIdCardOcr(1, imagePath, ocrResult);
case id_back:
if (exist != null)
return JsonTools.json2Object(exist.getResult(), IdCardOcrResponse.class);
return doIdCardOcr(2, imagePath, ocrResult);
case vehicle_license_front:
if (exist != null)
return JsonTools.json2Object(exist.getResult(), VehicleLicenseOcrResponse.class);
return doVehicleLicenseOcr(1, imagePath, ocrResult);
case vehicle_license_back:
if (exist != null)
return JsonTools.json2Object(exist.getResult(), VehicleLicenseOcrResponse.class);
return doVehicleLicenseOcr(2, imagePath, ocrResult);
case business_license:
if (exist != null)
return JsonTools.json2Object(exist.getResult(), BusinessLicenseOcrResponse.class);
return doBusinessLicenseOcr(imagePath, ocrResult);
default:
throw new ManagerException("OCR类型异常");
@@ -42,10 +56,10 @@ public abstract class AbstractUserwManager extends AbstractCommManager {
}

private IdCardOcrResponse doIdCardOcr(int type, String imagePath, OcrResult ocrResult) throws ManagerException {
IdCardOcrRequest req = new IdCardOcrRequest();
req.setImageType(type+"");
req.setUrl(imagePath);
try {
IdCardOcrRequest req = new IdCardOcrRequest();
req.setImageType(type+"");
req.setUrl(imagePath);
IdCardOcrResponse res = jsonPostRepeat(req);
ocrResult.setResult(res.getBizContent());
ocrResult.setCode(res.getRespCode());

+ 1
- 0
zhywpt-service-ias/build.gradle Dosyayı Görüntüle

@@ -16,6 +16,7 @@ dependencies {
implementation "${groupname}:sample-protocol:1.0.0-SNAPSHOT"
implementation "${groupname}:ias-protocol:1.0.0-SNAPSHOT"
implementation "${groupname}:ods-protocol:1.0.0-SNAPSHOT"
implementation "${groupname}:ats-protocol:1.0.0-SNAPSHOT"
implementation "${groupname}:smp-protocol:1.0.0-SNAPSHOT"
implementation "com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery"
implementation "com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config"

+ 9
- 0
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/audit/VerificationRuleManager.java Dosyayı Görüntüle

@@ -0,0 +1,9 @@
package cn.com.taiji.ias.manager.audit;


import cn.com.taiji.ias.model.issue.OrderVerificationModel;

public interface VerificationRuleManager {
public String autoVerify(OrderVerificationModel model) throws Exception;

}

+ 150
- 0
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/audit/VerificationRuleManagerImpl.java Dosyayı Görüntüle

@@ -0,0 +1,150 @@
package cn.com.taiji.ias.manager.audit;

import cn.com.taiji.common.manager.ManagerException;
import cn.com.taiji.common.pub.BeanTools;
import cn.com.taiji.common.pub.json.JsonTools;
import cn.com.taiji.core.entity.comm.OcrResult;
import cn.com.taiji.core.entity.dict.OcrType;
import cn.com.taiji.core.entity.dict.basic.IdType;
import cn.com.taiji.core.entity.issue.IssueOrderVerification;
import cn.com.taiji.core.manager.tools.issue.IssueTools;
import cn.com.taiji.core.model.comm.protocol.ats.ocr.BusinessLicenseOcrResponse;
import cn.com.taiji.core.model.comm.protocol.ats.ocr.IdCardOcrResponse;
import cn.com.taiji.core.model.comm.protocol.ats.ocr.VehicleLicenseOcrResponse;
import cn.com.taiji.core.repo.jpa.comm.OcrResultRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueOrderVerificationRepo;
import cn.com.taiji.ias.manager.AbstractCommManager;
import cn.com.taiji.ias.model.issue.OrderVerificationModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
public class VerificationRuleManagerImpl extends AbstractCommManager implements VerificationRuleManager {

@Autowired
private OcrResultRepo ocrResultRepo;
@Autowired
private IssueOrderVerificationRepo verificationRepo;

@Override
public String autoVerify(OrderVerificationModel model) throws ManagerException {
StringBuilder builder = new StringBuilder();
// 1-校验车型-接口传的和系统算的比对
Integer vehicleClass = IssueTools.getVehicleClass(model.getVanType(), model.getVehicleDimensions(),
model.getApprovedCount(), model.getAxleCount(), model.getTotalMass());
if (vehicleClass.intValue() != model.getFeeVehicleType().intValue()) {
builder.append("收费车型【" + model.getFeeVehicleType() + "】与系统计算结果【" + vehicleClass + "】不一致;");
}
// 2-OCR结果比对
varifyCustomer(model, builder);// 人
varifyVehicle(model, builder);// 车
// 3-车辆vin-结合公告表

//保存审核记录
IssueOrderVerification verification = new IssueOrderVerification();
BeanTools.copyProperties(model, verification);
verification.setFailReason(builder.toString());
verification.setVerifyResult(hasText(verification.getFailReason())?0:1);
verificationRepo.save(verification);
return builder.toString();
}

private void varifyVehicle(OrderVerificationModel model, StringBuilder builder) {
OcrResult pos = ocrResultRepo.findByUrlAndType(model.getVehPosImgUrl(), OcrType.vehicle_license_front);
if (pos == null) {
builder.append("行驶证主页照片未找到识别结果;");
} else {
try {
VehicleLicenseOcrResponse res = JsonTools.json2Object(pos.getResult(), VehicleLicenseOcrResponse.class);
if (!model.getVehiclePlate().equals(res.getPlate_a())) {
builder.append("车牌号【" + model.getVehiclePlate() + "】与主页识别结果【" + res.getPlate_a() + "】不一致;");
}
if (!model.getOwnerName().equals(res.getMan())) {
builder.append("车主姓名【" + model.getOwnerName() + "】与系统识别结果【" + res.getMan() + "】不一致;");
}
if (!model.getVin().equals(res.getVin())) {
builder.append("VIN【" + model.getVin() + "】与系统识别结果【" + res.getVin() + "】不一致;");
}
if (!model.getVin().equals(res.getVin())) {
builder.append("VIN【" + model.getVin() + "】与系统识别结果【" + res.getVin() + "】不一致;");
}
} catch (IOException e) {
builder.append("行驶证主页照片识别结果异常;");
}
}
OcrResult neg = ocrResultRepo.findByUrlAndType(model.getVehPosImgUrl(), OcrType.vehicle_license_back);
if (neg == null) {
builder.append("行驶证副页照片未找到识别结果;");
} else {
try {
VehicleLicenseOcrResponse res = JsonTools.json2Object(neg.getResult(), VehicleLicenseOcrResponse.class);
if (!model.getVehiclePlate().equals(res.getPlate_b())) {
builder.append("车牌号【" + model.getVehiclePlate() + "】与副页识别结果【" + res.getPlate_b() + "】不一致;");
}
if (!model.getVin().equals(res.getVin())) {
builder.append("VIN【" + model.getVin() + "】与系统识别结果【" + res.getVin() + "】不一致;");
}
String vehicleDimensions = model.getVehicleDimensions().replace("mm","").replace("×","").toUpperCase();
String overall = res.getOverall().replace("mm","").replace("×","").toUpperCase();
if (!vehicleDimensions.equals(overall)) {
builder.append("外廓尺寸【" + model.getVehicleDimensions() + "】与系统识别结果【" + res.getOverall() + "】不一致;");
}
if (model.getVanType().intValue() == 1) {
if ((model.getVehicleApprovedCount()+"人").equals(res.getApc())) {
builder.append("核定载人数【" + model.getVehicleApprovedCount()+"人" + "】与系统识别结果【" + res.getApc() + "】不一致;");
}
} else {
if ((model.getTotalMass()+"KG").equals(res.getGross().toUpperCase())) {
builder.append("总质量【" + model.getVehicleApprovedCount() + "】与系统识别结果【" + res.getApc() + "】不一致;");
}
}
} catch (IOException e) {
builder.append("行驶证副页照片识别结果异常;");
}
}
}

private void varifyCustomer(OrderVerificationModel model, StringBuilder builder) {
// 根据图片查询OCR结果
if (IdType.SFZ.equals(model.getCustomerIdType())) {
OcrResult exist = ocrResultRepo.findByUrlAndType(model.getCusPosImageUrl(), OcrType.id_front);
if (exist == null) {
builder.append("用户证件正面照未找到识别结果;");
} else {
try {
IdCardOcrResponse res = JsonTools.json2Object(exist.getResult(), IdCardOcrResponse.class);
if (!model.getCustomerName().equals(res.getName())) {
builder.append("用户名称【" + model.getCustomerName() + "】与系统识别结果【" + res.getName() + "】不一致;");
}
if (!model.getCustomerIdNum().equals(res.getIdno())) {
builder.append("用户证件号码【" + model.getCustomerIdNum() + "】与系统识别结果【" + res.getIdno() + "】不一致;");
}
} catch (IOException e) {
builder.append("用户证件正面照识别结果异常;");
}
}
} else if (IdType.TYSHXYDMZS.equals(model.getCustomerIdType())) {
OcrResult exist = ocrResultRepo.findByUrlAndType(model.getCusPosImageUrl(), OcrType.business_license);
if (exist == null) {
builder.append("用户证件正面照未找到识别结果;");
} else {
try {
BusinessLicenseOcrResponse res = JsonTools.json2Object(exist.getResult(), BusinessLicenseOcrResponse.class);
if (!model.getCustomerName().equals(res.getUnitName())) {
builder.append("用户名称【" + model.getCustomerName() + "】与系统识别结果【" + res.getUnitName() + "】不一致;");
}
if (!model.getCustomerIdNum().equals(res.getSCreditCode())) {
builder.append("用户证件号码【" + model.getCustomerIdNum() + "】与系统识别结果【" + res.getSCreditCode() + "】不一致;");
}
} catch (IOException e) {
builder.append("用户证件正面照识别结果异常;");
}
}
} else {
builder.append("特殊证件类型;");
}
}

}

+ 0
- 1
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/OrderInitManager.java Dosyayı Görüntüle

@@ -22,7 +22,6 @@ import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder;
import cn.com.taiji.core.repo.jpa.issue.IssueOrderPayRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueProductPayRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueProductPromotionRepo;
import cn.com.taiji.core.repo.jpa.issue.IssueProductRepo;
import cn.com.taiji.ias.dict.DataType;
import cn.com.taiji.ias.model.MyFinals;
import cn.com.taiji.ias.model.ServiceLogEvent;

+ 1
- 1
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/UserUploadManager.java Dosyayı Görüntüle

@@ -10,6 +10,7 @@ import cn.com.taiji.core.entity.issue.IssueOrderinfo;
import cn.com.taiji.core.entity.issue.IssueOrderinfoExt;
import cn.com.taiji.core.entity.issue.TransactionStatus;
import cn.com.taiji.core.entity.user.AccountInfo;
import cn.com.taiji.core.manager.tools.MyTimeTools;
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse;
import cn.com.taiji.core.model.comm.protocol.ias.order.GetCustomerIdRequest;
import cn.com.taiji.core.model.comm.protocol.ias.order.GetCustomerIdResponse;
@@ -23,7 +24,6 @@ import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder;
import cn.com.taiji.ias.dict.DataType;
import cn.com.taiji.ias.model.MyFinals;
import cn.com.taiji.ias.model.ServiceLogEvent;
import cn.com.taiji.ias.tools.MyTimeTools;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.stereotype.Service;


+ 19
- 6
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/model/issue/OrderVerificationModel.java Dosyayı Görüntüle

@@ -1,21 +1,34 @@
package cn.com.taiji.ias.model.issue;

import cn.com.taiji.common.entity.BaseEntity;
import cn.com.taiji.core.entity.dict.basic.IdType;
import lombok.Getter;
import lombok.Setter;
import org.apache.poi.ss.formula.functions.T;

import java.util.List;

@Getter
@Setter
public class OrderVerificationModel extends BaseEntity {

private Integer type;// 类型 1-发行 2-售后
private String orderNo;// 订单号
private IdType customerIdType;// 用户证据类型
private String customerName;// 用户姓名
private String idNum;// 身份证号
private String customerIdNum;// 身份证号
private String cusPosImageUrl;// 正面照地址

private String msg;
private String vehiclePlate;// 车牌号
private String vehPosImgUrl;// 行驶证正面照
private String vehNegImgUrl;// 行驶证反面照
private String vehicleDimensions;// 外廓尺寸
private String vehicleApprovedCount;// 核定载人数
private String ownerName;// 车主姓名
private IdType ownerIdType;// 车主证件类型
private Integer feeVehicleType;//收费车型
private Integer vanType;// 车型
private Integer approvedCount;// 核定载人数
private Integer axleCount;// 轴数
private Integer totalMass;// 总质量
private String vin;// VIN
private String vehicleModel;// 行驶证车辆品牌

private List<T> list;
}

Loading…
İptal
Kaydet