|
|
@@ -0,0 +1,366 @@
|
|
|
+package com.jzg.quotation.summary.aop;
|
|
|
+
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
|
|
|
+import com.jzg.commons.entity.orders.po.InsOrders;
|
|
|
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
|
|
|
+import com.jzg.commons.entity.orders.po.InsOrdersTrack;
|
|
|
+import com.jzg.commons.entity.quote.vo.QuoteVo;
|
|
|
+import com.jzg.commons.entity.quote.vo.aggregated.*;
|
|
|
+import com.jzg.commons.exception.SystemException;
|
|
|
+import com.jzg.quotation.commons.constant.SpElMapping;
|
|
|
+import com.jzg.quotation.commons.utils.SpElFieldExtractor;
|
|
|
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
|
|
|
+import com.jzg.quotation.summary.service.InsOrdersCarInfoService;
|
|
|
+import com.jzg.quotation.summary.service.InsOrdersService;
|
|
|
+import com.jzg.quotation.summary.service.InsOrdersTrackService;
|
|
|
+import org.aspectj.lang.ProceedingJoinPoint;
|
|
|
+import org.aspectj.lang.annotation.Around;
|
|
|
+import org.aspectj.lang.annotation.Aspect;
|
|
|
+import org.aspectj.lang.reflect.MethodSignature;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.expression.EvaluationContext;
|
|
|
+import org.springframework.expression.ExpressionParser;
|
|
|
+import org.springframework.expression.spel.standard.SpelExpressionParser;
|
|
|
+import org.springframework.expression.spel.support.StandardEvaluationContext;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.lang.reflect.Method;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+
|
|
|
+@Aspect
|
|
|
+@Component
|
|
|
+public class OrderOperationLogAspect {
|
|
|
+
|
|
|
+ public static final ExpressionParser PARSER = new SpelExpressionParser();
|
|
|
+ @Autowired
|
|
|
+ private InsOrdersService orderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InsOrdersCarInfoService carInfoService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private InsOrdersTrackService traceService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SpElFieldExtractor fieldExtractor;
|
|
|
+
|
|
|
+ @Around("@annotation(log)")
|
|
|
+ public Object handleLog(ProceedingJoinPoint joinPoint, OrderOperationLog log) throws Throwable {
|
|
|
+ // 获取方法信息和参数
|
|
|
+ MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
|
|
+ Object[] args = joinPoint.getArgs();
|
|
|
+ String[] paramNames = signature.getParameterNames();
|
|
|
+ // 设置 SpEL 上下文
|
|
|
+ EvaluationContext context = new StandardEvaluationContext();
|
|
|
+ for (int i = 0; i < args.length; i++) {
|
|
|
+ context.setVariable(paramNames[i], args[i]); // 命名参数:#dto
|
|
|
+ context.setVariable("p" + i, args[i]); // 索引参数:#p0
|
|
|
+ }
|
|
|
+ ExpressionParser parser = new SpelExpressionParser();
|
|
|
+ Object result = null;
|
|
|
+ switch (log.optType().getCode()){
|
|
|
+ // 创建订单
|
|
|
+ case 0:
|
|
|
+ // 通过 SpEL 提取 入参
|
|
|
+ QuoteVo quoteVo = parser.parseExpression(log.orderSpEl()).getValue(context, QuoteVo.class);
|
|
|
+ // 生成订单的条件
|
|
|
+ // 1个保险公司只有一个主订单 不区分险种
|
|
|
+ InsOrders mainOrders = orderService.getMainOrders(
|
|
|
+ quoteVo.getOrder().getInsuranceCompanyCode(),
|
|
|
+ quoteVo.getCarInfoVo().getLicenseNo(),
|
|
|
+ quoteVo.getCarInfoVo().getVinNo());
|
|
|
+ boolean isExistsMainOrder = false;
|
|
|
+ if (Objects.nonNull(mainOrders))
|
|
|
+ {
|
|
|
+ isExistsMainOrder = true;
|
|
|
+ }
|
|
|
+ result = joinPoint.proceed(); // 执行方法
|
|
|
+ this.createLog(result,log, quoteVo,isExistsMainOrder);
|
|
|
+ break;
|
|
|
+ // 核保
|
|
|
+ case 5:
|
|
|
+ // 通过 SpEL 提取 入参
|
|
|
+ UnderwritingVo underwritingVo = parser.parseExpression(log.orderSpEl()).getValue(context, UnderwritingVo.class);
|
|
|
+ result = joinPoint.proceed();
|
|
|
+ this.underwritingLog(underwritingVo.getOrder().getOrdersNo(),result,log);
|
|
|
+ break;
|
|
|
+ // 获取支付码
|
|
|
+ case 6:
|
|
|
+ // 通过 SpEL 提取 入参
|
|
|
+ PaymentLinkVo paymentLinkVo = parser.parseExpression(log.orderSpEl()).getValue(context, PaymentLinkVo.class);
|
|
|
+ result = joinPoint.proceed();
|
|
|
+ this.getPamentLog(paymentLinkVo.getOrder().getOrdersNo(),result,log);
|
|
|
+ break;
|
|
|
+ // 下载电子保单
|
|
|
+ case 8:
|
|
|
+ // 通过 SpEL 提取 入参
|
|
|
+ DownloadPolicyVo downloadPolicyVo = parser.parseExpression(log.orderSpEl()).getValue(context, DownloadPolicyVo.class);
|
|
|
+ result = joinPoint.proceed();
|
|
|
+ this.downloadLog("orderId",result,log);
|
|
|
+ break;
|
|
|
+ // 同步订单
|
|
|
+ case 9:
|
|
|
+ // 通过 SpEL 提取 入参
|
|
|
+ OrderStatusVo orderStatusVo = parser.parseExpression(log.orderSpEl()).getValue(context, OrderStatusVo.class);
|
|
|
+ InsOrders before = loadBeforeState(orderStatusVo.getOrder().getOrdersNo()); // 可选:旧状态
|
|
|
+ result = joinPoint.proceed();
|
|
|
+ InsOrders after = loadAfterState(orderStatusVo.getOrder().getOrdersNo()); // 可选:新状态
|
|
|
+ this.getOrderStatusLog(orderStatusVo.getOrder().getOrdersNo(),before,after,result,log);
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新订单状态日志
|
|
|
+ * @param orderId
|
|
|
+ * @param before
|
|
|
+ * @param after
|
|
|
+ * @param result
|
|
|
+ * @param log
|
|
|
+ */
|
|
|
+ private void getOrderStatusLog(String orderId, InsOrders before, InsOrders after,Object result, OrderOperationLog log) {
|
|
|
+ // 定义要提取的字段
|
|
|
+ List<SpElMapping> mappings = List.of(
|
|
|
+ new SpElMapping("msg", "#ret.msg"),
|
|
|
+ new SpElMapping("code", "#ret.code"),
|
|
|
+ new SpElMapping("data", "#ret.data")
|
|
|
+ );
|
|
|
+ // 执行提取
|
|
|
+ Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
|
|
|
+ InsOrdersCarInfo carInfo = carInfoService.getByOrderId(orderId);
|
|
|
+ if(extracted.get("code").equals("200")){
|
|
|
+ if(!before.getOrderStatus().equals(after.getOrderStatus())){
|
|
|
+ InsOrdersTrack track = new InsOrdersTrack();
|
|
|
+ track.setOrderNo(orderId);
|
|
|
+ track.setModule(log.module());
|
|
|
+ track.setSubModule(log.subModule());
|
|
|
+ track.setOptType(log.optType().getCode());
|
|
|
+ track.setOptContent(log.description());
|
|
|
+ track.setCompanyId(after.getCompanyId());
|
|
|
+ track.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ InsOrderStatusEnum beforeStatus = InsOrderStatusEnum.matchKey(before.getOrderStatus());
|
|
|
+ InsOrderStatusEnum afterStatus = InsOrderStatusEnum.matchKey(after.getOrderStatus());
|
|
|
+ track.setChangeBefore(beforeStatus.getDesc());
|
|
|
+ track.setChangeAfter(afterStatus.getDesc());
|
|
|
+ traceService.save(track);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 下载电子保单日志
|
|
|
+ * @param orderId
|
|
|
+ * @param result
|
|
|
+ * @param log
|
|
|
+ */
|
|
|
+ private void downloadLog(String orderId, Object result, OrderOperationLog log) throws Throwable {
|
|
|
+ // 定义要提取的字段
|
|
|
+ List<SpElMapping> mappings = List.of(
|
|
|
+ new SpElMapping("msg", "#ret.msg"),
|
|
|
+ new SpElMapping("code", "#ret.code"),
|
|
|
+ new SpElMapping("data", "#ret.data")
|
|
|
+ );
|
|
|
+ // 执行提取
|
|
|
+ Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
|
|
|
+ InsOrders insOrders = orderService.getById(orderId);
|
|
|
+ InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
|
|
|
+ InsOrdersTrack track = new InsOrdersTrack();
|
|
|
+ track.setOrderNo(orderId);
|
|
|
+ track.setModule(log.module());
|
|
|
+ track.setSubModule(log.subModule());
|
|
|
+ track.setOptType(log.optType().getCode());
|
|
|
+ track.setOptContent(log.description());
|
|
|
+ track.setCompanyId(insOrders.getCompanyId());
|
|
|
+ track.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ if(extracted.get("code").equals("200")){
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ track.setChangeBefore("电子保单未下载");
|
|
|
+ track.setChangeAfter("电子保单已下载");
|
|
|
+ track.setResult("下载电子保单成功");
|
|
|
+ }else{
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.FAIL.getCode());
|
|
|
+ track.setChangeBefore("电子保单未下载");
|
|
|
+ track.setChangeAfter("电子保单下载失败");
|
|
|
+ track.setResult("下载电子保单失败");
|
|
|
+ }
|
|
|
+ traceService.save(track);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取支付码日志
|
|
|
+ * @param orderId
|
|
|
+ * @param result
|
|
|
+ * @param log
|
|
|
+ */
|
|
|
+ private void getPamentLog(String orderId, Object result, OrderOperationLog log) throws Throwable {
|
|
|
+ // 定义要提取的字段
|
|
|
+ List<SpElMapping> mappings = List.of(
|
|
|
+ new SpElMapping("msg", "#ret.msg"),
|
|
|
+ new SpElMapping("code", "#ret.code"),
|
|
|
+ new SpElMapping("data", "#ret.data")
|
|
|
+ );
|
|
|
+ // 执行提取
|
|
|
+ Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
|
|
|
+ InsOrders insOrders = orderService.getById(orderId);
|
|
|
+ InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
|
|
|
+ if(extracted.get("code").equals("200")){
|
|
|
+ InsOrdersTrack track = new InsOrdersTrack();
|
|
|
+ track.setOrderNo(orderId);
|
|
|
+ track.setModule(log.module());
|
|
|
+ track.setSubModule(log.subModule());
|
|
|
+ track.setOptType(log.optType().getCode());
|
|
|
+ track.setOptContent(log.description());
|
|
|
+ track.setCompanyId(insOrders.getCompanyId());
|
|
|
+ track.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ track.setResult("调用接口获取订单支付码并生成掌柜支付码");
|
|
|
+ traceService.save(track);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 核保日志
|
|
|
+ * @param result
|
|
|
+ * @param log
|
|
|
+ */
|
|
|
+ private void underwritingLog(String orderId, Object result, OrderOperationLog log) throws Throwable {
|
|
|
+ // 定义要提取的字段
|
|
|
+ List<SpElMapping> mappings = List.of(
|
|
|
+ new SpElMapping("msg", "#ret.msg"),
|
|
|
+ new SpElMapping("code", "#ret.code"),
|
|
|
+ new SpElMapping("data", "#ret.data")
|
|
|
+ );
|
|
|
+ // 执行提取
|
|
|
+ Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
|
|
|
+ UnderwritingResultsVo res = JSON.parseObject(extracted.get("data")).toJavaObject(UnderwritingResultsVo.class);
|
|
|
+ InsOrders insOrders = orderService.getById(orderId);
|
|
|
+ InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
|
|
|
+ InsOrdersTrack track = new InsOrdersTrack();
|
|
|
+ track.setOrderNo(orderId);
|
|
|
+ track.setModule(log.module());
|
|
|
+ track.setSubModule(log.subModule());
|
|
|
+ track.setOptType(log.optType().getCode());
|
|
|
+ track.setOptContent(log.description());
|
|
|
+ track.setCompanyId(insOrders.getCompanyId());
|
|
|
+ track.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ track.setChangeBefore("待核保");
|
|
|
+
|
|
|
+ if(extracted.get("code").equals("200")){
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ track.setResult("核保通过");
|
|
|
+ track.setChangeAfter(InsOrderStatusEnum.PAY_PENDING.getDesc());
|
|
|
+ traceService.save(track);
|
|
|
+ // 获取支付码轨迹
|
|
|
+ InsOrdersTrack pamentTrack = new InsOrdersTrack();
|
|
|
+ pamentTrack.setOrderNo(orderId);
|
|
|
+ pamentTrack.setModule(log.module());
|
|
|
+ pamentTrack.setSubModule(log.subModule());
|
|
|
+ pamentTrack.setOptType(log.optType().getCode());
|
|
|
+ pamentTrack.setOptContent(log.description());
|
|
|
+ pamentTrack.setCompanyId(insOrders.getCompanyId());
|
|
|
+ pamentTrack.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ pamentTrack.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ pamentTrack.setResult("调用接口获取订单支付码并生成掌柜支付码");
|
|
|
+ traceService.save(pamentTrack);
|
|
|
+ }else{
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.FAIL.getCode());
|
|
|
+ track.setResult(res.getUnderwritingResult());
|
|
|
+ InsOrderStatusEnum orderStatusEnum = InsOrderStatusEnum.matchKey(insOrders.getOrderStatus());
|
|
|
+ track.setChangeAfter(orderStatusEnum.getDesc());
|
|
|
+ traceService.save(track);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建订单日志
|
|
|
+ *
|
|
|
+ * @param log
|
|
|
+ * @param isExistsMainOrder
|
|
|
+ */
|
|
|
+ private void createLog(Object result, OrderOperationLog log, QuoteVo quoteVo, boolean isExistsMainOrder) throws Throwable {
|
|
|
+
|
|
|
+ // 定义要提取的字段
|
|
|
+ List<SpElMapping> mappings = List.of(
|
|
|
+ new SpElMapping("msg", "#ret.msg"),
|
|
|
+ new SpElMapping("code", "#ret.code"),
|
|
|
+ new SpElMapping("data", "#ret.data")
|
|
|
+ );
|
|
|
+ // 执行提取
|
|
|
+ Map<String, String> extracted = fieldExtractor.extractFields(result, mappings);
|
|
|
+ QuoteResultsVo res = JSON.parseObject(extracted.get("data")).toJavaObject(QuoteResultsVo.class);
|
|
|
+ String orderId = res.getOrdersNo();
|
|
|
+ InsOrders insOrders = orderService.getById(orderId);
|
|
|
+ InsOrdersCarInfo carInfo = carInfoService.getByOrderId(insOrders.getId());
|
|
|
+ if (!isExistsMainOrder) {
|
|
|
+ // 创建订单轨迹
|
|
|
+ InsOrdersTrack track = new InsOrdersTrack();
|
|
|
+ track.setOrderNo(orderId);
|
|
|
+ track.setModule(log.module());
|
|
|
+ track.setSubModule(log.subModule());
|
|
|
+ track.setOptType(log.optType().getCode());
|
|
|
+ track.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ track.setOptContent(log.description());
|
|
|
+ track.setResult(log.description());
|
|
|
+ track.setCompanyId(insOrders.getCompanyId());
|
|
|
+ track.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ traceService.save(track);
|
|
|
+ }
|
|
|
+ // 报价成功
|
|
|
+ if(res.getQuoteStatusEnum()
|
|
|
+ .equals(InsOrderStatusEnum.WAIT_AUDIT) ){
|
|
|
+ // 报价成功轨迹
|
|
|
+ InsOrdersTrack trackSccess = new InsOrdersTrack();
|
|
|
+ trackSccess.setOrderNo(orderId);
|
|
|
+ trackSccess.setModule(log.module());
|
|
|
+ trackSccess.setSubModule(log.subModule());
|
|
|
+ trackSccess.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_1.getCode());
|
|
|
+ trackSccess.setStatus(QuoteNumberConstant.QuoteResult.SUCCESS.getCode());
|
|
|
+ trackSccess.setOptContent("手动报价");
|
|
|
+ // 组装报价成功返回参数
|
|
|
+ StringBuffer successResult = new StringBuffer();
|
|
|
+ successResult.append(res.getCosts().getSumPremium()+", ");
|
|
|
+ successResult.append("交强(" + res.getCosts().getCiPremium() + "), ");
|
|
|
+ successResult.append("商业(" + res.getCosts().getBiPremium() + "), ");
|
|
|
+ successResult.append("驾意险(" + res.getCosts().getNiPremium() + "), ");
|
|
|
+ successResult.append("车船税(" + res.getCosts().getVvTax() + "); ");
|
|
|
+ trackSccess.setResult(successResult.toString());
|
|
|
+ trackSccess.setCompanyId(insOrders.getCompanyId());
|
|
|
+ trackSccess.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ trackSccess.setChangeBefore("订单已提交");
|
|
|
+ trackSccess.setChangeAfter(InsOrderStatusEnum.WAIT_AUDIT.getDesc());
|
|
|
+ traceService.save(trackSccess);
|
|
|
+ }else{
|
|
|
+ // 报价失败轨迹
|
|
|
+ InsOrdersTrack trackFail = new InsOrdersTrack();
|
|
|
+ trackFail.setOrderNo(orderId);
|
|
|
+ trackFail.setModule(log.module());
|
|
|
+ trackFail.setSubModule(log.subModule());
|
|
|
+ trackFail.setOptType(QuoteNumberConstant.QuoteOptType.OPT_TYPE_1.getCode());
|
|
|
+ trackFail.setStatus(QuoteNumberConstant.QuoteResult.FAIL.getCode());
|
|
|
+ trackFail.setOptContent("手动报价");
|
|
|
+ trackFail.setResult(res.getErrorMessage());
|
|
|
+ trackFail.setCompanyId(insOrders.getCompanyId());
|
|
|
+ trackFail.setLicenseNo(carInfo.getLicenseNo());
|
|
|
+ trackFail.setChangeBefore("订单已提交");
|
|
|
+ trackFail.setChangeAfter("报价失败");
|
|
|
+ traceService.save(trackFail);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private InsOrders loadBeforeState(String orderId) {
|
|
|
+ return orderService.getById(orderId);
|
|
|
+ }
|
|
|
+
|
|
|
+ private InsOrders loadAfterState(String orderId) {
|
|
|
+ return orderService.getById(orderId);
|
|
|
+ }
|
|
|
+}
|