Przeglądaj źródła

ias 换货信息申请,车辆信息上传,用户信息上传增加分布式锁

master
chenchaod 1 miesiąc temu
rodzic
commit
7743c77656

+ 11
- 0
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/AbstractHandleManager.java Wyświetl plik

@@ -17,6 +17,7 @@ import cn.com.taiji.ias.model.PersistException;
import cn.com.taiji.ias.model.ServiceLogEvent;
import com.google.common.collect.Maps;
import com.zgglyun.common.model.AbstractHttpRequestInfo;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataIntegrityViolationException;
@@ -36,6 +37,7 @@ public abstract class AbstractHandleManager<T extends AbstractSignTypeRequest<?>
public static LocalDateTime TIME1990 = LocalDateTime.parse("1990-01-01T00:00:00");
protected final Class<T> clazz;
protected final DataType dataType;
protected RLock lock ;
// @Autowired
// protected LogManager logManager;
@Autowired
@@ -71,6 +73,15 @@ public abstract class AbstractHandleManager<T extends AbstractSignTypeRequest<?>
} finally {
event.setAllCostTime(ChronoUnit.MILLIS.between(event.getReceiveTime(), LocalDateTime.now()));
executor.execute(() -> addServiceLog(event));
if (lock != null) {
try {
lock.unlock();
} catch (Exception e) {
logger.error("", e);
}finally {
lock = null;//清楚容器内的lock,让其GC
}
}
}
}


+ 3
- 0
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/AbstractOrderManager.java Wyświetl plik

@@ -42,6 +42,7 @@ import cn.com.taiji.core.repo.jpa.user.StaffRepo;
import cn.com.taiji.ias.dict.DataType;
import cn.com.taiji.ias.manager.AbstractHandleManager;
import cn.com.taiji.ias.manager.GlobalTransactionManager;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

@@ -89,6 +90,8 @@ public abstract class AbstractOrderManager<T extends AbstractSignTypeRequest<?>>
protected IssueOrderPayRepo orderPayRepo;
@Autowired
protected CommonPayConfigRepo payConfigRepo;
@Autowired
protected RedissonClient redissonClient;

@Autowired
protected IssueOrderChannelNoticeRepo issueOrderChannelNoticeRepo;

+ 50
- 5
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/ChangeGoodsManager.java Wyświetl plik

@@ -1,14 +1,24 @@
package cn.com.taiji.ias.manager.order;

import cn.com.taiji.common.manager.net.http.ServiceHandleException;
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse;
import cn.com.taiji.core.entity.dict.basic.SourceType;
import cn.com.taiji.core.entity.dict.issue.IssueOrderStep;
import cn.com.taiji.core.entity.dict.issue.RechangeStatus;
import cn.com.taiji.core.entity.dict.issue.RechangeType;
import cn.com.taiji.core.entity.dict.issue.ShippingStatus;
import cn.com.taiji.core.entity.issue.IssueOrderRechange;
import cn.com.taiji.core.entity.issue.IssueOrderinfo;
import cn.com.taiji.core.model.comm.protocol.ias.order.ChangeGoodsRequest;
import cn.com.taiji.core.model.comm.protocol.ias.order.ChangeGoodsResponse;
import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder;
import cn.com.taiji.core.repo.jpa.issue.IssueOrderRechangeRepo;
import cn.com.taiji.ias.dict.DataType;
import cn.com.taiji.ias.model.ServiceLogEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

/**
@@ -18,11 +28,16 @@ import java.util.Map;
* @description:
*/
@Service
public class ChangeGoodsManager extends AbstractOrderManager<ChangeGoodsRequest>{
public class ChangeGoodsManager extends AbstractOrderManager<ChangeGoodsRequest> {

@Autowired
private IssueOrderRechangeRepo issueOrderRechangeRepo;


public ChangeGoodsManager() {
super(DataType.CHANGE_GOODS);
}

@Override
protected String getDataId(ChangeGoodsRequest req) {
return "";
@@ -30,16 +45,46 @@ public class ChangeGoodsManager extends AbstractOrderManager<ChangeGoodsRequest>

@Override
protected void formatValidateInternal(ErrorMsgBuilder builder, ChangeGoodsRequest req, ServiceLogEvent event, Map<String, Object> dataStream) throws ServiceHandleException {

}

@Override
protected void businessValidateInternal(ErrorMsgBuilder builder, ChangeGoodsRequest req, ServiceLogEvent event, Map<String, Object> dataStream) throws ServiceHandleException {

if (!SourceType.WECHAT.equals(req.getSourceType()) && !SourceType.ALI.equals(req.getSourceType())) {
throw newBusinessException("仅限小程序申请换货");
}

IssueOrderinfo orderinfo = checkOrder(req.getOrderNo());

//只有待激活和已收货状态可换货
if (!IssueOrderStep.WAITING_ACTIVE.equals(orderinfo.getOrderStep()) && !ShippingStatus.RECEIVED.equals(orderinfo.getShippingStatus())) {
throw newBusinessException("订单当前状态不可换货");
}
dataStream.put(ORDER, orderinfo);
}

@Override
protected void persistInternal(ChangeGoodsRequest req, ServiceLogEvent event, Map<String, Object> dataStream) throws ServiceHandleException {
IssueOrderRechange orderRechange = copyProperties(req, new IssueOrderRechange());
orderRechange.setRechangeType(RechangeType.EXCHANGE);
orderRechange.setRechangeStatus(RechangeStatus.NEW);
orderRechange.setRechangeMode(1);//写死线上
orderRechange.setOpenId(req.getOpenId());
issueOrderRechangeRepo.persist(orderRechange);

IssueOrderinfo orderinfo = (IssueOrderinfo) dataStream.get(ORDER);
orderinfo.setOrderStep(IssueOrderStep.APPLY_CHANGE);
orderinfo.setShippingStatus(ShippingStatus.WAIT_SHIPPING);
orderinfo.setUpdateTime(LocalDateTime.now());
orderInfoRepo.merge(orderinfo);
}

@Override
protected AbstractSignTypeResponse getRes(ChangeGoodsRequest req, ServiceLogEvent event, Map<String, Object> dataStream) throws ServiceHandleException, IOException {
return null;
protected ChangeGoodsResponse getRes(ChangeGoodsRequest req, ServiceLogEvent event, Map<String, Object> dataStream) throws ServiceHandleException, IOException {
IssueOrderinfo order = (IssueOrderinfo) dataStream.get(ORDER);
ChangeGoodsResponse res = new ChangeGoodsResponse();
res.setReceiveTime(getReceiveTimeStr(event));
res.setId(order.getId());
return res;
}
}

+ 3
- 11
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/OrderInitManager.java Wyświetl plik

@@ -52,7 +52,7 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> {

public static final String OLD_ORDER = "oldOrder";
public static final String STAFF = "staff";
public static final String LOCK = "lock";
@Autowired
private QtkAgencyRepo qtkAgencyRepo;

@@ -60,8 +60,7 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> {
super(DataType.ORDER_INIT);
}

@Autowired
private RedissonClient redissonClient;

@Autowired
private IssueProductPromotionRepo promotionRepo;
@Autowired
@@ -86,7 +85,7 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> {
Map<String, Object> dataStream) throws ServiceHandleException {

String lockKey = MyFinals.VEHICLE_LOCK_KEY + request.getVehiclePlate();
RLock lock = redissonClient.getLock(lockKey);
lock = redissonClient.getLock(lockKey);
boolean tryLock = false;
try {
tryLock = lock.tryLock(2, 30, TimeUnit.SECONDS);
@@ -119,7 +118,6 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> {
validVehiclePlate(request.getVehiclePlate(), request.getVehiclePlateColor());
// 校验本地订单
checkLocalOrder(request);
dataStream.put(LOCK, lock);
dataStream.put(STAFF, staff);
}

@@ -160,12 +158,6 @@ public class OrderInitManager extends AbstractOrderManager<OrderInitRequest> {

@Override
protected void onSuccessInternal(OrderInitRequest req, ServiceLogEvent event, Map<String, Object> dataStream) {
RLock lock = (RLock)dataStream.get(LOCK);
try {
lock.unlock();
} catch (Exception e) {
logger.error("", e);
}
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER);
IssueOrderinfo oldOrder = (IssueOrderinfo)dataStream.get(OLD_ORDER);
executor.execute(() -> {

+ 78
- 28
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/UserUploadManager.java Wyświetl plik

@@ -3,22 +3,19 @@ package cn.com.taiji.ias.manager.order;
import cn.com.taiji.common.manager.net.http.ServiceHandleException;
import cn.com.taiji.common.pub.TimeTools;
import cn.com.taiji.core.entity.basic.QtkCustomerInfo;
import cn.com.taiji.core.entity.dict.basic.Gender;
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.UserType;
import cn.com.taiji.core.entity.dict.basic.*;
import cn.com.taiji.core.entity.dict.issue.IssueOrderStatus;
import cn.com.taiji.core.entity.dict.issue.IssueOrderStep;
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;
import cn.com.taiji.core.model.comm.protocol.ias.order.UserUploadRequest;
import cn.com.taiji.core.model.comm.protocol.ias.order.UserUploadResponse;
import cn.com.taiji.core.model.comm.protocol.ias.portal.AuthRequest;
import cn.com.taiji.core.model.comm.protocol.ias.portal.RegisterNoCodeRequest;
import cn.com.taiji.core.model.comm.protocol.ods.ois.issue.OisBasicDataUpdateRequest;
import cn.com.taiji.core.model.comm.protocol.ods.oqs.issue.OqsUserQueryRequest;
@@ -26,18 +23,19 @@ import cn.com.taiji.core.model.comm.protocol.ods.oqs.issue.OqsUserQueryResponse;
import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder;
import cn.com.taiji.core.model.comm.protocol.valid.GlyServiceError;
import cn.com.taiji.ias.dict.DataType;
import cn.com.taiji.ias.manager.portal.AuthManager;
import cn.com.taiji.ias.manager.portal.RegisterNoCodeManager;
import cn.com.taiji.ias.model.MyFinals;
import cn.com.taiji.ias.model.ServiceLogEvent;
import cn.hutool.core.util.ObjectUtil;
import org.redisson.api.RLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

@Service
public class UserUploadManager extends AbstractOrderManager<UserUploadRequest> {
@@ -47,6 +45,8 @@ public class UserUploadManager extends AbstractOrderManager<UserUploadRequest> {

@Autowired
private RegisterNoCodeManager registerNoCodeManager;
@Autowired
private AuthManager authManager;
public UserUploadManager() {
super(DataType.USER_UPLOAD);
}
@@ -65,6 +65,17 @@ public class UserUploadManager extends AbstractOrderManager<UserUploadRequest> {
@Override
protected void businessValidateInternal(ErrorMsgBuilder builder, UserUploadRequest request, ServiceLogEvent event,
Map<String, Object> dataStream) throws ServiceHandleException {
String lockKey = MyFinals.VEHICLE_LOCK_KEY + request.getOrderNo();
lock = redissonClient.getLock(lockKey);
boolean tryLock = false;
try {
tryLock = lock.tryLock(2, 30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.error("", e);
}
if (!tryLock) {
throw newBusinessException("用户信息重复上传!");
}
// 校验订单
IssueOrderinfo order = checkOrder(request.getOrderNo());
if (!IssueOrderStatus.NORMAL.equals(order.getOrderStatus())) {
@@ -87,14 +98,72 @@ public class UserUploadManager extends AbstractOrderManager<UserUploadRequest> {
// 判断手机号账号情况
String mobile = request.getMobile();
String idNum = request.getUserIdNum();
if (!UserType.PERSONAL_USER.equals(order.getUserType())){
mobile = request.getAgentTel();
idNum = request.getAgentIdNum();
}
AccountInfo accountInfo = accountInfoRepo.findByMobile(mobile);
throwBisExceptionOn(accountInfo!=null && hasText(accountInfo.getIdNum())&&!idNum.equals(accountInfo.getIdNum()), "手机号已绑定其他证件号码");
dataStream.put(ACCOUNT, accountInfo);
dataStream.put(ORDER, order);
}

@Override
protected void persistInternal(UserUploadRequest request, ServiceLogEvent event,
Map<String, Object> dataStream) throws ServiceHandleException {
// 注册用户
registerUser(request, dataStream);
// 保存基础用户
QtkCustomerInfo customerInfo = saveCustomerInfo(request);
// 保存订单
IssueOrderinfo order = updateOrder(customerInfo, request, dataStream);
// 保存办理记录日志
// String openId = hasText(request.getOpenId()) ? request.getOpenId() : "-1";
// bizServiceLog(openId, ServiceType.USERINFORMATIONCHANGE, order, order.getCustomerId());
// 操作日志
// persistOperateLog(OperateType.ISSUE_ORDER_USER_UPLOAD, order.getOrderNo(), request, openId,
// order.getCustomerId());
dataStream.put(ORDER, order);
dataStream.put(CUSTOMER_INFO, customerInfo);
}

private void registerUser(UserUploadRequest request,Map<String, Object> dataStream) throws ServiceHandleException {
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER);
AccountInfo accountInfo = (AccountInfo) dataStream.get(ACCOUNT);
LocalDate vld = checkIdNumVld(request);
// 判断手机号账号情况
String mobile = request.getMobile();
String idNum = request.getUserIdNum();
String name = request.getUserName();
IdType idType = IdType.findByCode(request.getUserIdType());
String userPosImgUrl = request.getUserPosImgUrl();// 用户证件正面照片地址
String userNegImgUrl = request.getUserNegImgUrl();// 用户证件反面照片地址
String userAddress = request.getUserAddress();
if (!UserType.PERSONAL_USER.equals(order.getUserType())) {
mobile = request.getAgentTel();
idNum = request.getAgentIdNum();
name = request.getAgentName();
idType = IdType.findByCode(request.getAgentIdType());
userPosImgUrl = request.getAgentPosImgUrl();
userNegImgUrl = request.getAgentNegImgUrl();
userAddress = request.getAgentAddress();
}
//有账户没有实名认证过的
if (accountInfo != null && !hasText(accountInfo.getIdNum())){
// throw newBusinessException("此手机号(账号)需要实名认证,登录小程序进行实名认证");
AuthRequest authRequest = new AuthRequest();
authRequest.setLoginSource(SourceType.SERVICE_HALL);//为了调接口通过,这里写死
authRequest.setOpenId(accountInfo.getOpenId());
authRequest.setIdNum(idNum);
authRequest.setIdType(idType);
authRequest.setUserName(name);
authRequest.setGender(Gender.UNKOWN);
authRequest.setUserIdImgUrl(userPosImgUrl);
authRequest.setUserIdBackImgUrl(userNegImgUrl);
authRequest.setExpireDate(vld);
authRequest.setAddress(userAddress);
authManager.serviceHandle(authRequest);
}
AccountInfo accountInfo = accountInfoRepo.findByMobile(mobile);
throwBisExceptionOn(accountInfo!=null && !accountInfo.getIdNum().equals(idNum), "手机号已绑定其他证件号码");
// 注册用户
if (accountInfo == null) {
RegisterNoCodeRequest registerReq = new RegisterNoCodeRequest();
@@ -113,25 +182,6 @@ public class UserUploadManager extends AbstractOrderManager<UserUploadRequest> {
accountInfo = accountInfoRepo.findByMobile(mobile);
if (accountInfo == null) throw GlyServiceError.BUSINESS_VALIDATE_ERR.toHandleException("注册用户失败");
}
dataStream.put(ACCOUNT, accountInfo);
dataStream.put(ORDER, order);
}

@Override
protected void persistInternal(UserUploadRequest request, ServiceLogEvent event,
Map<String, Object> dataStream) throws ServiceHandleException {
// 保存基础用户
QtkCustomerInfo customerInfo = saveCustomerInfo(request);
// 保存订单
IssueOrderinfo order = updateOrder(customerInfo, request, dataStream);
// 保存办理记录日志
// String openId = hasText(request.getOpenId()) ? request.getOpenId() : "-1";
// bizServiceLog(openId, ServiceType.USERINFORMATIONCHANGE, order, order.getCustomerId());
// 操作日志
// persistOperateLog(OperateType.ISSUE_ORDER_USER_UPLOAD, order.getOrderNo(), request, openId,
// order.getCustomerId());
dataStream.put(ORDER, order);
dataStream.put(CUSTOMER_INFO, customerInfo);
}

////同步老库及YGZ上传,后面优化移到激活后

+ 13
- 0
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/order/VehicleUploadManager.java Wyświetl plik

@@ -22,6 +22,7 @@ import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder;
import cn.com.taiji.core.model.comm.protocol.valid.FormatValidateTools;
import cn.com.taiji.ias.dict.DataType;
import cn.com.taiji.ias.manager.audit.VerificationRuleManager;
import cn.com.taiji.ias.model.MyFinals;
import cn.com.taiji.ias.model.ServiceLogEvent;
import cn.com.taiji.ias.model.issue.OrderVerificationModel;
import org.jetbrains.annotations.NotNull;
@@ -31,6 +32,7 @@ import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

@Service
public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequest> {
@@ -59,6 +61,17 @@ public class VehicleUploadManager extends AbstractOrderManager<VehicleUploadRequ
@Override
protected void businessValidateInternal(ErrorMsgBuilder builder, VehicleUploadRequest request, ServiceLogEvent event,
Map<String, Object> dataStream) throws ServiceHandleException {
String lockKey = MyFinals.VEHICLE_LOCK_KEY + request.getOrderNo();
lock = redissonClient.getLock(lockKey);
boolean tryLock = false;
try {
tryLock = lock.tryLock(2, 30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
logger.error("", e);
}
if (!tryLock) {
throw newBusinessException("车辆信息重复上传!");
}
// 校验订单
IssueOrderinfo order = checkOrder(request.getOrderNo());
// 验证渠道

+ 2
- 1
zhywpt-service-ias/src/main/java/cn/com/taiji/ias/manager/portal/AuthManager.java Wyświetl plik

@@ -29,6 +29,7 @@ public class AuthManager extends AbstractLoginManager implements LogManager<Auth
public AuthResponse serviceHandle(AuthRequest request) throws ServiceHandleException {
try {
long begin = System.currentTimeMillis();
findAndValidStaff(findOpenIdByToken(request.getAccessToken()), request.getLoginSource());
String openId = request.getLoginSource() == SourceType.WEB || request.getLoginSource() == SourceType.SERVICE_HALL ? request.getOpenId() : findOpenIdByToken(request.getAccessToken());
AccountInfo accountInfo = accountInfoRepo.findByIdNumAndIdType(request.getIdNum(), request.getIdType());
if (accountInfo != null)
@@ -46,7 +47,7 @@ public class AuthManager extends AbstractLoginManager implements LogManager<Auth
byOpenId.setAddress(request.getAddress());
byOpenId.setUpdateTime(LocalDateTime.now());
//同步修改员工的姓名
Staff staff = findAndValidStaff(openId, request.getLoginSource());
Staff staff = staffRepo.findByOpenId(openId);
if (staff != null) {
staff.setStaffName(request.getUserName());
staffRepo.save(staff);

Ładowanie…
Anuluj
Zapisz