@@ -1,10 +1,7 @@ | |||
package cn.com.taiji.iaw.dto.issue; | |||
import cn.com.taiji.core.dto.AbstractBizRequestDTO; | |||
import cn.com.taiji.core.entity.dict.basic.IdType; | |||
import cn.com.taiji.core.entity.dict.basic.PlateColorType; | |||
import cn.com.taiji.core.entity.dict.basic.UseUserType; | |||
import cn.com.taiji.core.entity.dict.basic.VehicleUseCharacter; | |||
import cn.com.taiji.core.entity.dict.basic.*; | |||
import cn.com.taiji.core.model.comm.protocol.constraint.EnumInteger; | |||
import cn.com.taiji.core.model.comm.protocol.constraint.IntegerConstant; | |||
import io.swagger.annotations.ApiModel; | |||
@@ -114,9 +111,10 @@ public class UploadVehicleReqDTO extends AbstractBizRequestDTO { | |||
@IntegerConstant(values = "0,1") | |||
@ApiModelProperty(value = "应急车辆标识0-非应急车辆 1-应急车辆") | |||
private Integer emergencyFlag;// 应急车辆标识 0-非应急车辆 1-应急车辆 | |||
@NotNull | |||
@ApiModelProperty(value = "收费车型") | |||
private Integer feeVehicleType;//收费车型 | |||
// @NotNull 后端自己计算 | |||
// @ApiModelProperty(value = "收费车型") | |||
// @EnumInteger(enumClazz = VehicleType.class) | |||
// private Integer feeVehicleType;//收费车型 | |||
@ApiModelProperty(value = "车主手机号") |
@@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import java.io.IOException; | |||
import java.time.LocalDateTime; | |||
@Service | |||
public class VerificationRuleManager extends AbstractCommManager { | |||
@@ -36,12 +37,12 @@ public class VerificationRuleManager extends AbstractCommManager { | |||
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 + "】不一致;"); | |||
} | |||
// // 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);// 车 | |||
@@ -52,6 +53,7 @@ public class VerificationRuleManager extends AbstractCommManager { | |||
BeanTools.copyProperties(model, verification); | |||
verification.setFailReason(builder.toString()); | |||
verification.setVerifyResult(hasText(verification.getFailReason()) ? 0 : 1); | |||
verification.setVerifyTime(LocalDateTime.now()); | |||
verificationRepo.save(verification); | |||
return builder.toString(); | |||
} | |||
@@ -157,7 +159,7 @@ public class VerificationRuleManager extends AbstractCommManager { | |||
* @param msg 错误信息个性化前缀 | |||
*/ | |||
public void ocrVarifyIdCard(String name, String idNum, String imagUrl,StringBuilder builder, String msg){ | |||
ocrVarifyIdCard(name, idNum, imagUrl,null, builder, msg); | |||
ocrVarifyIdCard(name, idNum, imagUrl,"", builder, msg); | |||
} | |||
/** | |||
* 身份证OCR校验(正面) |
@@ -9,6 +9,7 @@ import cn.com.taiji.core.entity.basic.QtkServicehallLocation; | |||
import cn.com.taiji.core.entity.basic.QtkVehicleInfo; | |||
import cn.com.taiji.core.entity.comm.CommonPayConfig; | |||
import cn.com.taiji.core.entity.dict.issue.OrderPayStatus; | |||
import cn.com.taiji.core.entity.dict.issue.OrderPayType; | |||
import cn.com.taiji.core.entity.dict.issue.OrderType; | |||
import cn.com.taiji.core.entity.dict.issue.TransactionBizType; | |||
import cn.com.taiji.core.entity.dict.pay.PayChannelType; | |||
@@ -47,6 +48,7 @@ import org.springframework.transaction.annotation.Transactional; | |||
import java.awt.geom.Point2D; | |||
import java.time.LocalDateTime; | |||
import java.util.List; | |||
import java.util.Random; | |||
import java.util.concurrent.TimeUnit; | |||
public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>> | |||
@@ -249,9 +251,7 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>> | |||
* 完成支付查询,并更新支付状态 | |||
*/ | |||
private void paymentDetection(IssueOrderPay pay) throws ServiceHandleException { | |||
if (!hasText(pay.getExternalOrderNo())) { | |||
return; | |||
} | |||
CommonPayConfig payConfig = payConfigRepo.findById(pay.getPayConfigId()).orElse(null); | |||
if (payConfig == null) | |||
throw newBusinessException("支付配置信息不存在" + pay.getPayConfigId()); | |||
@@ -274,7 +274,7 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>> | |||
private void queryV3(IssueOrderPay pay, CommonPayConfig payConfig) throws ServiceHandleException { | |||
AtsQueryPayResultV3Request v3Request = new AtsQueryPayResultV3Request(); | |||
v3Request.setCreateType(payConfig.getWxServiceType()); | |||
v3Request.setExternalOrderNo(pay.getExternalOrderNo()); | |||
v3Request.setOutTradeNo(pay.getPayOrderNo()); | |||
v3Request.setTradeType(TradeType.valueOf(payConfig.getPayProductType())); | |||
v3Request.setMchid(payConfig.getWxMchId()); | |||
v3Request.setApiV3Key(payConfig.getWxApiv3key()); | |||
@@ -297,7 +297,7 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>> | |||
private void queryV2(IssueOrderPay pay, CommonPayConfig payConfig) throws ServiceHandleException { | |||
AtsQueryPayResultV2Request v2Request = new AtsQueryPayResultV2Request(); | |||
v2Request.setCreateType(payConfig.getWxServiceType()); | |||
v2Request.setOutTradeNo(pay.getExternalOrderNo()); | |||
v2Request.setOutTradeNo(pay.getPayOrderNo()); | |||
v2Request.setAppId(payConfig.getWxAppId()); | |||
v2Request.setMchId(payConfig.getWxMchId()); | |||
// v2Request.setSubAppId(payConfig.gets); | |||
@@ -312,4 +312,21 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>> | |||
} | |||
} | |||
/** | |||
* 支付订单号需要满足固定规则 | |||
*/ | |||
public String getPayOrderId(OrderPayType payType, String accountId ) { | |||
// 统一传给微信及支付宝的商户订单号out_trade_no参数的传值格式,参数长度为32位,由11位渠道编码+2位业务类型编码+14位日期(yyyyMMddHHmmss)+2位系统编码+3位随机码组成,示例:52010102006001202402191336260778 | |||
// 11位渠道编码 | |||
// 2位业务类型编码 | |||
String busCode = payType.getBusCode(); | |||
// 14位日期(yyyyMMddHHmmss) | |||
String yyyyMMddHHmmss = LocalDateTime.now().format(TimeTools.yyyyMMddHHmmss); | |||
// 2位系统编码/综合业务支撑平台固定06 | |||
String systemCode = "06"; | |||
// 3位随机码组成 | |||
String i = String.format("%03d", new Random().nextInt(999)); | |||
return accountId + busCode + yyyyMMddHHmmss + systemCode + i; | |||
} | |||
} |
@@ -1,6 +1,7 @@ | |||
package cn.com.taiji.ias.manager.order; | |||
import cn.com.taiji.common.manager.net.http.ServiceHandleException; | |||
import cn.com.taiji.common.pub.CollectionTools; | |||
import cn.com.taiji.common.pub.TimeTools; | |||
import cn.com.taiji.core.entity.basic.QtkAgency; | |||
import cn.com.taiji.core.entity.basic.QtkCardInfo; | |||
@@ -34,6 +35,7 @@ import org.redisson.api.RLock; | |||
import org.redisson.api.RedissonClient; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import org.springframework.stereotype.Service; | |||
import org.springframework.util.CollectionUtils; | |||
import javax.validation.Valid; | |||
import java.time.LocalDateTime; | |||
@@ -289,6 +291,8 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> { | |||
IssueOrderPay orderPay = new IssueOrderPay(); | |||
orderPay.setOrderNo(order.getOrderNo()); | |||
orderPay.setPayType(OrderPayType.valueOf(productPay.getFeeType())); | |||
orderPay.setPayOrderNo(getPayOrderId(orderPay.getPayType(), order.getAccountId())); | |||
orderPay.setPayStatus(OrderPayStatus.UNPAY); | |||
switch (orderPay.getPayType()) { | |||
case HANDLE: | |||
orderPay.setFee(product.getHandleFee()); | |||
@@ -306,7 +310,7 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> { | |||
if (orderPay.getFee() > 0) | |||
orderPays.add(orderPay); | |||
} | |||
if (isEmpty(orderPays)) | |||
if (!CollectionUtils.isEmpty(orderPays)) | |||
orderPayRepo.persistAll(orderPays); | |||
} | |||
@@ -88,12 +88,7 @@ public class OrderPayApplyManager extends AbstractOrderManager<OrderPayApplyRequ | |||
@Override | |||
protected void persistInternal(OrderPayApplyRequest request, ServiceLogEvent event, | |||
Map<String, Object> dataStream) throws ServiceHandleException { | |||
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER); | |||
IssueOrderPay orderPay = (IssueOrderPay)dataStream.get(ORDER_PAY); | |||
// 补充参数 | |||
if (orderPay.getPayOrderNo() == null) { | |||
orderPay.setPayOrderNo(getPayOrderId(orderPay, order.getAccountId())); | |||
} | |||
// 获取支付参数,连调3次接口报错时整个事务回滚 | |||
// 会发生的极端情况:1、接口实际成功的,但响应报错 2、接口成功,但本方法回滚。 | |||
OrderPayApplyResponse res = new OrderPayApplyResponse(); | |||
@@ -186,21 +181,5 @@ public class OrderPayApplyManager extends AbstractOrderManager<OrderPayApplyRequ | |||
return res; | |||
} | |||
/** | |||
* 支付订单号需要满足固定规则 | |||
*/ | |||
private String getPayOrderId(IssueOrderPay orderPay, String accountId ) { | |||
// 统一传给微信及支付宝的商户订单号out_trade_no参数的传值格式,参数长度为32位,由11位渠道编码+2位业务类型编码+14位日期(yyyyMMddHHmmss)+2位系统编码+3位随机码组成,示例:52010102006001202402191336260778 | |||
// 11位渠道编码 | |||
// 2位业务类型编码 | |||
OrderPayType payType = orderPay.getPayType(); | |||
String busCode = payType.getBusCode(); | |||
// 14位日期(yyyyMMddHHmmss) | |||
String yyyyMMddHHmmss = LocalDateTime.now().format(TimeTools.yyyyMMddHHmmss); | |||
// 2位系统编码/综合业务支撑平台固定06 | |||
String systemCode = "06"; | |||
// 3位随机码组成 | |||
String i = String.format("%03d", new Random().nextInt(999)); | |||
return accountId + busCode + yyyyMMddHHmmss + systemCode + i; | |||
} | |||
} |
@@ -134,6 +134,7 @@ public class UserUploadManager extends AbstractOrderManager<UserUploadRequest> { | |||
dataStream.put(CUSTOMER_INFO, customerInfo); | |||
} | |||
////同步老库及YGZ上传,后面优化移到激活后 | |||
@Override | |||
protected void onSuccessInternal(UserUploadRequest req, ServiceLogEvent event, Map<String, Object> dataStream) { | |||
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER); |
@@ -12,6 +12,7 @@ import cn.com.taiji.core.entity.issue.IssueOrderinfo; | |||
import cn.com.taiji.core.entity.issue.IssueOrderinfoExt; | |||
import cn.com.taiji.core.entity.issue.IssueProduct; | |||
import cn.com.taiji.core.entity.issue.TransactionStatus; | |||
import cn.com.taiji.core.manager.tools.issue.IssueTools; | |||
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse; | |||
import cn.com.taiji.core.model.comm.protocol.ias.order.VehicleUploadRequest; | |||
import cn.com.taiji.core.model.comm.protocol.ias.order.VehicleUploadResponse; | |||
@@ -37,6 +38,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
public static final String VEHICLE_INFO = "vehicleInfo"; | |||
public static final String ORDER_EXT = "orderExt"; | |||
public static final String VEHICLE_CLASS= "vehicleClass"; | |||
@Autowired | |||
private VerificationRuleManager verificationRuleManager; | |||
@@ -78,13 +80,17 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
if (!order.getVehicleId().equals(request.getVehiclePlate()+"_"+request.getVehiclePlateColor())) { | |||
throw newBusinessException("当前车牌与订单车牌不一致"); | |||
} | |||
// 校验产品是否支持当前车型 | |||
// Integer vehicleClass = getVehicleClass(request); | |||
// 校验车型 | |||
// throwBisExceptionOn(vehicleClass.intValue() != request.getFeeVehicleType().intValue(),"车型与行驶证不符"); | |||
//计算收费车型 | |||
Integer vehicleClass = null; | |||
try { | |||
vehicleClass = IssueTools.getVehicleClass(request.getVanType(), request.getVehicleDimensions(), | |||
request.getApprovedCount(), request.getAxleCount(), request.getTotalMass()); | |||
} catch (ManagerException e) { | |||
throw newBusinessException(e.getMessage()); | |||
} | |||
IssueProduct product = issueProductRepo.findByReleaseId(order.getProductId()); | |||
if (!product.getVehicleType().contains(request.getFeeVehicleType() + "")) { | |||
throw newBusinessException(String.format("当前产品不支持%s发行", VehicleType.fromCode(request.getFeeVehicleType()).getValue())); | |||
if (!product.getVehicleType().contains(vehicleClass + "")) { | |||
throw newBusinessException(String.format("当前产品不支持%s发行", VehicleType.fromCode(vehicleClass).getValue())); | |||
} | |||
// 车辆所有人不是持卡人 | |||
if (!order.getCustomerName().equals(request.getOwnerName())) { | |||
@@ -96,6 +102,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
// 车辆数量校验 | |||
validCount(order.getCustomerId(), order.getUserType().getCode()); | |||
dataStream.put(ORDER, order); | |||
dataStream.put(VEHICLE_CLASS, vehicleClass); | |||
} | |||
@Override | |||
@@ -103,7 +110,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
Map<String, Object> dataStream) throws ServiceHandleException { | |||
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER); | |||
// 保存车辆 | |||
QtkVehicleInfo vehicleInfo = saveVehicle(order, request); | |||
QtkVehicleInfo vehicleInfo = saveVehicle(order, request,dataStream); | |||
// 保存订单 | |||
IssueOrderinfoExt ext = saveOrder(order, vehicleInfo, request); | |||
// 自动审核 货车类型走 人工审核 | |||
@@ -132,6 +139,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
return res; | |||
} | |||
//同步老库及YGZ上传,后面优化移到激活后 | |||
@Override | |||
protected void onSuccessInternal(VehicleUploadRequest req, ServiceLogEvent event, | |||
Map<String, Object> dataStream) { | |||
@@ -210,7 +218,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
return ext; | |||
} | |||
private QtkVehicleInfo saveVehicle(IssueOrderinfo order, VehicleUploadRequest request) throws ServiceHandleException { | |||
private QtkVehicleInfo saveVehicle(IssueOrderinfo order, VehicleUploadRequest request,Map<String, Object> dataStream) throws ServiceHandleException { | |||
QtkVehicleInfo vehicle = getVehicle(request); | |||
QtkCustomerInfo customer = customerInfoRepo.findByCustomerId(order.getCustomerId()); | |||
boolean hasOldVehicle = vehicle != null; | |||
@@ -226,7 +234,7 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ | |||
vehicle.setCustomerId(order.getCustomerId()); | |||
// vehicle.setCustomerInfo(customer); | |||
vehicle.setVehicleType(request.getVehicleType()); | |||
vehicle.setType(request.getFeeVehicleType()); | |||
vehicle.setType((Integer) dataStream.get(VEHICLE_CLASS)); | |||
// 办理人不是车主 | |||
if (!order.getCustomerName().equals(request.getOwnerName())) { | |||
vehicle.setOwnerName(request.getOwnerName()); |