Explorar el Código

报价详情订单改造

lixiaolong hace 1 mes
padre
commit
6d5ec138e9

+ 1 - 0
authentication/src/main/java/com/jzg/filter/TokenAuthenticationFilter.java

@@ -57,6 +57,7 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
         doList.add("/appUser/userInfoGet");
         doList.add("/appUser/distributorInvite");
         doList.add("/appUser/invitationRegister");
+        doList.add("/quote/quoteRecordDetail");
         String path = request.getRequestURI();
         for (String pattern : doList) {
             // 使用正则表达式匹配  .* 匹配所有以 pattern 开头的路径

+ 28 - 8
commons/src/main/java/com/jzg/commons/config/DataPermissionInterceptor.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHan
 import com.jzg.commons.constants.SystemConstants;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.entity.properties.DataScopeProperties;
+import com.jzg.commons.exception.TokenExpireException;
 import lombok.SneakyThrows;
 import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.expression.Expression;
@@ -99,17 +100,36 @@ public class DataPermissionInterceptor implements MultiDataPermissionHandler {
             }
         }
 
-        String currentUserDeptId = baseController.getUserDeptId();
-        String userDataScope = baseController.getUserDataScope();
-        String userSystemCode = baseController.getUserSystemCode();
+        // ====== 改动开始 ======
+        // 防御性:白名单公开接口或 token 已过期时,跳过数据权限过滤,避免在 MyBatis SQL 执行过程中
+        // 抛出 TokenExpireException 导致整个查询被包装为 MyBatisSystemException(null)。
+        String currentUserDeptId;
+        String userDataScope;
+        String userSystemCode;
+        String userName;
+        try {
+            currentUserDeptId = baseController.getUserDeptId();
+            userDataScope = baseController.getUserDataScope();
+            userSystemCode = baseController.getUserSystemCode();
+            userName = baseController.getUserName();
+        } catch (TokenExpireException e) {
+            log.debug("数据权限拦截:无有效登录信息,跳过数据权限过滤。mappedStatementId=[{}]", mappedStatementId);
+            return null;
+        }
+        // admin 账号:无条件绕过数据权限(全量查询)
+        if ("admin".equals(userName)) {
+            log.info("数据权限拦截:admin 账号绕过数据权限。mappedStatementId=[{}]", mappedStatementId);
+            return null;
+        }
+        // 平台系统码:也绕过
+        if (userSystemCode.equals(SystemConstants.SYSTEM_PLATFORM.getCode())) {
+            return null;
+        }
         JSONObject dataScope = JSONObject.parseObject(userDataScope);
-        //如果用户名为admin  不做数据权限
-
-        if (dataScope == null || dataScope.isEmpty()
-                || (dataScope.isEmpty() && baseController.getUserName().equals("admin"))
-                || userSystemCode.equals(SystemConstants.SYSTEM_PLATFORM.getCode())) {
+        if (dataScope == null || dataScope.isEmpty()) {
             return null;
         }
+        // ====== 改动结束 ======
         StringBuilder additionalSql = new StringBuilder();
         String tableName = getTableName(table);
         if(shouldIgnoreTable(table.getName()) && !dataScope.isEmpty()) {

+ 22 - 4
commons/src/main/java/com/jzg/commons/config/MultiTenantHandler.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.base.TenantContext;
 import com.jzg.commons.entity.properties.TenantProperties;
+import com.jzg.commons.exception.TokenExpireException;
 import com.jzg.commons.util.TenantContextUtils;
 import jakarta.servlet.http.HttpServletRequest;
 import jodd.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.schema.Column;
@@ -24,6 +26,7 @@ import java.util.Objects;
  *
  * @author dongxin
  */
+@Slf4j
 @Order(1)
 public class MultiTenantHandler implements TenantLineHandler {
 
@@ -51,7 +54,14 @@ public class MultiTenantHandler implements TenantLineHandler {
             return new StringValue(customTenantId);
         }
         // 实际应该从用户信息中获取,框架一般都有获取用户信息的接口
-        String tenant_id = controller.getUserLoginSystem();
+        // ====== 改动:防御 token 过期 ======
+        String tenant_id;
+        try {
+            tenant_id = controller.getUserLoginSystem();
+        } catch (TokenExpireException e) {
+            log.debug("多租户拦截:无有效登录信息,使用空租户ID。");
+            return new StringValue("");
+        }
         //如果使用的是APP 则从请求头中获取租户id
         if(tenant_id.equals("APP")){
             RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
@@ -92,12 +102,20 @@ public class MultiTenantHandler implements TenantLineHandler {
         if (TenantContext.isInternalInvocation()) {
             return true;
         }
-
+        // ====== 改动:防御 token 过期 ======
+        // 忽略指定用户对租户的数据过滤
+        String username;
+        try {
+            username = controller.getUserName();
+        } catch (TokenExpireException e) {
+            log.debug("多租户拦截:无有效登录信息,跳过租户过滤。tableName=[{}]", tableName);
+            return true;
+        }
         // 可以自行增加一些校验比如获取不到用户就直接 return false 之类的。
         List<String> ignoreLoginNames = properties.getIgnoreLoginNames();
         // 忽略指定用户对租户的数据过滤
-        String username = controller.getUserName();
-        if (null != ignoreLoginNames && ignoreLoginNames.contains(username)) {
+        String usernameFromController = controller.getUserName();
+        if (null != ignoreLoginNames && ignoreLoginNames.contains(usernameFromController)) {
             return true;
         }
         if (isIgnoreUrl()) {

+ 14 - 6
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -345,8 +345,10 @@ public class QuoteEchoVo extends QuoteVo {
         this.getOrder().setSigningTime(insOrdersVo.getPayTime());
         this.getOrder().setOrderType(insOrdersVo.getOrderType());
         this.getOrder().setEntryStatus(insOrdersVo.getEntryStatus());
-        this.setCiSpecialInfoVo(insOrdersVo.getSpecialInfoVo().stream().filter(companyClauseVo -> companyClauseVo.getRiskCode().equals("0507")).collect(Collectors.toList()));
-        this.setBiSpecialInfoVo(insOrdersVo.getSpecialInfoVo().stream().filter(companyClauseVo -> companyClauseVo.getRiskCode().equals("0510")).collect(Collectors.toList()));
+        if (Objects.nonNull(insOrdersVo.getSpecialInfoVo())) {
+            this.setCiSpecialInfoVo(insOrdersVo.getSpecialInfoVo().stream().filter(companyClauseVo -> companyClauseVo.getRiskCode().equals("0507")).collect(Collectors.toList()));
+            this.setBiSpecialInfoVo(insOrdersVo.getSpecialInfoVo().stream().filter(companyClauseVo -> companyClauseVo.getRiskCode().equals("0510")).collect(Collectors.toList()));
+        }
         Salesman salesman = new Salesman();
         if (!Objects.isNull(insOrdersVo.getSalesmanInfo())){
             salesman.setName(insOrdersVo.getSalesmanInfo().getName());
@@ -365,10 +367,16 @@ public class QuoteEchoVo extends QuoteVo {
 
         //车辆信息处理
         this.setCarInfoVo(insOrdersVo.getCarInfoVo());
-        insOrdersVo.getCarInfoVo().setRegisterDate(insOrdersVo.getCarInfoVo().getRegisterDate().substring(0,insOrdersVo.getCarInfoVo().getRegisterDate().indexOf(" ")));
-        insOrdersVo.getCarInfoVo().setIssueDate(insOrdersVo.getCarInfoVo().getIssueDate().substring(0,insOrdersVo.getCarInfoVo().getIssueDate().indexOf(" ")));
-        if(Objects.nonNull(insOrdersVo.getCarInfoVo().getTransferDate())) {
-            insOrdersVo.getCarInfoVo().setTransferDate(insOrdersVo.getCarInfoVo().getTransferDate().substring(0, insOrdersVo.getCarInfoVo().getTransferDate().indexOf(" ")));
+        if (Objects.nonNull(insOrdersVo.getCarInfoVo())) {
+            if (Objects.nonNull(insOrdersVo.getCarInfoVo().getRegisterDate()) && insOrdersVo.getCarInfoVo().getRegisterDate().contains(" ")) {
+                insOrdersVo.getCarInfoVo().setRegisterDate(insOrdersVo.getCarInfoVo().getRegisterDate().substring(0, insOrdersVo.getCarInfoVo().getRegisterDate().indexOf(" ")));
+            }
+            if (Objects.nonNull(insOrdersVo.getCarInfoVo().getIssueDate()) && insOrdersVo.getCarInfoVo().getIssueDate().contains(" ")) {
+                insOrdersVo.getCarInfoVo().setIssueDate(insOrdersVo.getCarInfoVo().getIssueDate().substring(0, insOrdersVo.getCarInfoVo().getIssueDate().indexOf(" ")));
+            }
+            if (Objects.nonNull(insOrdersVo.getCarInfoVo().getTransferDate()) && insOrdersVo.getCarInfoVo().getTransferDate().contains(" ")) {
+                insOrdersVo.getCarInfoVo().setTransferDate(insOrdersVo.getCarInfoVo().getTransferDate().substring(0, insOrdersVo.getCarInfoVo().getTransferDate().indexOf(" ")));
+            }
         }
 
         // 批改信息处理

+ 3 - 0
gateway/src/main/java/com/jzg/filter/AuthGlobalFilter.java

@@ -85,6 +85,9 @@ public class AuthGlobalFilter implements GlobalFilter {
 
         // 本地生活
         WHITELIST.add("/signIn/updateSignCompleteRuleIn");
+
+        // 报价详情
+        WHITELIST.add("/quote/getQuoteDetail");
     }
 
     @Override

+ 3 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/InsOrdersController.java

@@ -172,14 +172,14 @@ public class InsOrdersController extends BaseController {
 
     /**
      * 获取订单详情
-     *
+     * from=share 表示从分享链接进入,否则表示从订单列表进入
      * @author lipf
      * @date 2026/4/28 16:00
      */
     @GetMapping("getOrderDetail")
     @Operation(summary = "获取订单详情")
-    public HttpResult<QuoteEchoVo> getOrderDetail(String ordersNo) {
-        return HttpResult.ok(insOrdersService.getOrderDetail(ordersNo));
+    public HttpResult<QuoteEchoVo> getOrderDetail(String ordersNo, String from) {
+        return HttpResult.ok(insOrdersService.getOrderDetail(ordersNo, from));
     }
 
     /**

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersService.java

@@ -128,7 +128,7 @@ public interface InsOrdersService extends IService<InsOrders> {
      * @param ordersNo 订单号
      * @return QuoteEchoVo 订单详情
      */
-    QuoteEchoVo getOrderDetail(String ordersNo);
+    QuoteEchoVo getOrderDetail(String ordersNo, String from);
 
     /**
      * 获取历史报价信息

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -270,7 +270,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     public QuoteEchoVo auditInfo(String orderNo) {
         //险种和订单类型以及业务员对应的管理员
         log.info("查看订单审核详情:orderNo=[{}]",JSONUtil.toJsonStr(orderNo));
-        QuoteEchoVo detailVo = insOrdersService.getOrderDetail(orderNo);
+        QuoteEchoVo detailVo = insOrdersService.getOrderDetail(orderNo, "audit");
         log.debug("查看订单审核详情:orderNo=[{}], detailVo=[{}]",orderNo, JSONUtil.toJsonStr(detailVo));
         InsFeeAudit audit = this.getById(orderNo);
         detailVo.setAuditStatus(audit.getAuditStatus());

+ 128 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -624,6 +624,131 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         return insOrdersVo;
     }
 
+    public InsOrdersVo selectByIdNoSalesmanInfo(Long id) {
+        log.info("根据id查询订单信息。订单的序号(订单号)id=[{}]", id);
+        // 1. 查询订单信息
+        InsOrdersVo insOrdersVo = insOrdersMapper.getById(id);
+        if (insOrdersVo == null) {
+            log.info("根据id没有找到订单信息。订单的序号(不是订单号)id=[{}]。", id);
+            throw new SystemException("查询结果为空,无法处理订单信息");
+        }
+        // 协议名称、协议类型
+        if (Objects.nonNull(insOrdersVo.getInsOrders().getAgreementId())) {
+            HttpResult<AgreementInfoVo> ptlAgreement = orgClient.queryAgreementById(insOrdersVo.getInsOrders().getAgreementId());
+            // modify by lipf 2026年4月14日16:59:27 解决查看后补订单没有协议时查看不到数据的bug
+            //AssertionUtils.isFail(ptlAgreement.getCode() == 500, ptlAgreement.getMsg() + ",请联系管理处理");
+            if (ptlAgreement.getData() != null && ptlAgreement.getData().getAgreement() != null) {
+                insOrdersVo.setAgreementType(ptlAgreement.getData().getAgreement().getAgreementType());
+                insOrdersVo.setAgreementName(ptlAgreement.getData().getAgreement().getAgreementName());
+            }
+        }
+        // 2. 处理车辆用户信息列表
+        if (CollectionUtil.isNotEmpty(insOrdersVo.getCarUserInfoList())) {
+            for (InsOrdersCarUserInfo carUserInfo : insOrdersVo.getCarUserInfoList()) {
+                // 使用映射逻辑处理用户信息
+                CustomerInfoVo customerInfoVo = mapCarUserInfoToCustomerInfo(carUserInfo);
+                setPolicyPersonInfo(insOrdersVo, carUserInfo.getPolicyPersonType(), customerInfoVo);
+            }
+            insOrdersVo.setCarUserInfoList(null);
+        }
+        InsTaskImagesVo imagesAdds = insOrdersVo.getImagesAdds();
+        if (ObjectUtil.isNotEmpty(imagesAdds)) {
+            imagesAdds.getImages().forEach(image -> {
+                if (StringUtils.isNotEmpty(image.getBucketName()) && StringUtils.isNotEmpty(image.getFileName())) {
+                    image.setDownloadUrl(MinioUtils.getPresignedObjectUrl(image.getBucketName(), image.getFileName()));
+                }
+            });
+        }
+
+        if (Objects.nonNull(insOrdersVo.getOwnersInfo())) {
+            insOrdersVo.getOwnersInfo().setIdentifyType(insOrdersVo.getOwnersInfo().getPersonType());
+        }
+        if (Objects.nonNull(insOrdersVo.getPolicyHolderInfo())) {
+            insOrdersVo.getPolicyHolderInfo().setIdentifyType(insOrdersVo.getPolicyHolderInfo().getPersonType());
+        }
+        if (Objects.nonNull(insOrdersVo.getInsuredPersonInfo())) {
+            insOrdersVo.getInsuredPersonInfo().setIdentifyType(insOrdersVo.getInsuredPersonInfo().getPersonType());
+        }
+
+        // 费用信息
+        InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectOne(new LambdaQueryWrapper<InsFeeOrders>()
+                .eq(InsFeeOrders::getOrderNo, insOrdersVo.getInsOrders().getId()));
+        // 比例信息 分销员信息
+        if (insFeeOrders != null) {
+            if(insFeeOrders.getFirstDistributorId() != null && insFeeOrders.getSecondDistributorId() != null &&
+                    insFeeOrders.getThirdDistributorId() != null){
+                HttpResult<SysUserJzgInfo> firstDistributor = orgClient.getUserInfoById(insFeeOrders.getFirstDistributorId());
+                HttpResult<SysUserJzgInfo> secondDistributor = orgClient.getUserInfoById(insFeeOrders.getSecondDistributorId());
+                HttpResult<SysUserJzgInfo> thirdDistributor = orgClient.getUserInfoById(insFeeOrders.getThirdDistributorId());
+                if (firstDistributor.getData() != null) {
+                    insFeeOrders.setFirstDistributorName(firstDistributor.getData().getName());
+                }
+                if (secondDistributor.getData() != null) {
+                    insFeeOrders.setSecondDistributorName(secondDistributor.getData().getName());
+                }
+                if (thirdDistributor.getData() != null) {
+                    insFeeOrders.setThirdDistributorName(thirdDistributor.getData().getName());
+                }
+
+            }
+            insOrdersVo.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
+            insOrdersVo.setFeeOrdersVo(new InsFeeOrdersVo(insFeeOrders));
+        }
+
+        if (CollectionUtil.isNotEmpty(insOrdersVo.getInsOrdersRiskList())) {
+            insOrdersVo.getInsOrdersRiskList().forEach(riskInfo -> {
+                insOrdersVo.setBiRiskInfoVo(getRiskInfoVo(riskInfo));
+                insOrdersVo.setCiRiskInfoVo(getRiskInfoVo(riskInfo));
+            });
+        }
+        // 订单电子保单信息
+        insOrdersVo.setInsOrdersPdfUrl(insOrdersPdfUrlService.getById(id));
+        if (insOrdersVo.getInsOrdersPdfUrl() == null) {
+            insOrdersVo.setInsOrdersPdfUrl(new InsOrdersPdfUrl());
+        }
+        // 驾意险信息
+        List<InsOrdersAccidentalDriving> insOrdersAccidentalDrivings = insOrdersAccidentalDrivingService
+                .list(new LambdaQueryWrapper<InsOrdersAccidentalDriving>().eq(InsOrdersAccidentalDriving::getOrderNo, id));
+        if (insOrdersAccidentalDrivings != null) {
+            List<AccidentalDrivingVo> accidentalDrivingVos = new ArrayList<>();
+            for (InsOrdersAccidentalDriving insOrdersAccidentalDriving : insOrdersAccidentalDrivings) {
+                AccidentalDrivingVo accidentalDrivingVo = new AccidentalDrivingVo();
+                accidentalDrivingVo.setProductCode(insOrdersAccidentalDriving.getRiskCode());
+                accidentalDrivingVo.setProductName(insOrdersAccidentalDriving.getRiskName());
+                accidentalDrivingVo.setQuantity(insOrdersAccidentalDriving.getQuantity());
+                accidentalDrivingVo.setSumAmount(insOrdersAccidentalDriving.getAmount());
+                accidentalDrivingVo.setPremium(insOrdersAccidentalDriving.getAmount());
+                accidentalDrivingVos.add(accidentalDrivingVo);
+            }
+            insOrdersVo.setAccidentalDrivings(accidentalDrivingVos);
+        }
+        // 特约查询
+        List<InsOrdersClause> insOrdersClauseList = insOrdersClauseService
+                .list(new LambdaQueryWrapper<InsOrdersClause>().eq(InsOrdersClause::getOrderNo, id));
+        if (insOrdersClauseList != null) {
+            List<InsCompanyClause> companyClauseList = new ArrayList<>();
+            for (InsOrdersClause insOrdersClause : insOrdersClauseList) {
+                InsCompanyClause companyClause = platformClient.getClause(insOrdersClause.getClauseId());
+                companyClauseList.add(companyClause);
+            }
+            insOrdersVo.setSpecialInfoVo(companyClauseList);
+        }
+
+        // 批改明细查询
+        if (insOrdersVo.getInsOrderAdjust() != null) {
+            LambdaQueryWrapper<InsOrderAdjustInfo> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(InsOrderAdjustInfo::getAdjustId, insOrdersVo.getInsOrderAdjust().getId());
+            wrapper.eq(InsOrderAdjustInfo::getIsDelete, 0);
+            List<InsOrderAdjustInfo> infos = orderAdjustInfoService.list(wrapper);
+            if (CollectionUtil.isNotEmpty(infos)) {
+                insOrdersVo.getInsOrderAdjust().setAdjustInfoList(infos);
+            }
+        }
+        insOrdersVo.setInsOrdersTax(insOrdersTaxService.getById(id));
+        setInsOrdersExternalPolicy(insOrdersVo.getInsOrdersExternalPolicy());
+        return insOrdersVo;
+    }
+
 
     private RiskInfoVo getRiskInfoVo(InsOrdersRisk riskInfo) {
         RiskInfoVo riskInfoVo = new RiskInfoVo();
@@ -1328,9 +1453,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
      * @return QuoteEchoVo 订单详情
      */
     @Override
-    public QuoteEchoVo getOrderDetail(String ordersNo) {
-        log.info("获取订单详情.ordersNo=[{}]", ordersNo);
-        InsOrdersVo insOrdersVo = selectById(Long.parseLong(ordersNo));
+    public QuoteEchoVo getOrderDetail(String ordersNo, String from) {
+        log.info("获取订单详情.ordersNo=[{}], from=[{}]", ordersNo, from);
+        InsOrdersVo insOrdersVo = selectByIdNoSalesmanInfo(Long.parseLong(ordersNo));
         log.info("根据orderNo=[{}]查询到的订单明细[{}]", ordersNo, JSONUtil.toJsonStr(insOrdersVo));
         AssertionUtils.isFail(Objects.isNull(insOrdersVo), "订单不存在");
         QuoteEchoVo resultVo = new QuoteEchoVo(insOrdersVo);

+ 3 - 3
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -215,12 +215,12 @@
         <association property="insOrdersExternalPolicy" column="{orderNo=id}" select="selectExternalPolicyMap"/>
         <association property="vehicleAndVesselTaxVo" column="{orderNo=id}" select="selectOrdersTaxMap"/>
         <association property="imagesAdds" column="{orderNo=quote_no}" select="selectImageByOrderNo"/>
+        <association property="insOrderAdjust" column="{orderNo=id}" select="selectOrderAdjust"/>
+        <association property="insOrdersCosts" column="{orderNo=id}" select="selectOrdersCostsByOrderNo"/>
+        <association property="insOrdersPolicy" column="{orderNo=id}" select="selectOrdersPolicyByOrderNo"/>
         <collection property="insOrdersRiskList" column="{orderNo=id}" select="selectOrdersRisk"/>
-        <collection property="insOrderAdjust" column="{orderNo=id}" select="selectOrderAdjust"/>
         <collection property="carUserInfoList" column="{orderNo=id}" select="selectCarUserInfo"/>
         <collection property="kindInfoVo" column="{orderNo=id}" select="selectKindMap"/>
-        <collection property="insOrdersCosts" column="{orderNo=id}" select="selectOrdersCostsByOrderNo"/>
-        <collection property="insOrdersPolicy" column="{orderNo=id}" select="selectOrdersPolicyByOrderNo"/>
         <collection property="accidentalDrivings" column="{orderNo=id}"
                     select="selectOrdersAccidentalDrivingByOrderNo"/>
         <collection property="feeOrdersVo" column="{orderNo=id}"