Просмотр исходного кода

Merge branch 'dev_jzb_lipf_v20260427'

lipf 5 месяцев назад
Родитель
Сommit
abbbf408ce
26 измененных файлов с 503 добавлено и 95 удалено
  1. 24 0
      authentication/src/main/java/com/jzg/client/OrganizationClient.java
  2. 40 0
      authentication/src/main/java/com/jzg/config/FeignAuthInterceptor.java
  3. 31 8
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  4. 6 0
      commons/src/main/java/com/jzg/commons/entity/orders/vo/OrderListVo.java
  5. 3 2
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java
  6. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/SysUserAccountVo.java
  7. 3 3
      platform/src/main/java/com/jzg/controller/UserRoleController.java
  8. 6 7
      platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java
  9. 10 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  10. 6 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/build/HuaTaiApiQuoteResultsVoBuild.java
  11. 18 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/constant/HuataiBaseConstants.java
  12. 24 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/entity/vo/TimeEntity.java
  13. 175 41
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java
  14. 14 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  15. 2 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  16. 26 6
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/build/ZiJinAPIQuoteResultsVoBuild.java
  17. 13 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java
  18. 30 4
      tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java
  19. 8 1
      tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java
  20. 14 6
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java
  21. 1 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java
  22. 29 6
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDeptServiceImpl.java
  23. 6 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java
  24. 9 5
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  25. 1 1
      tenant/organization/src/main/resources/mapper/SysUserAccountMapper.xml
  26. 1 1
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

+ 24 - 0
authentication/src/main/java/com/jzg/client/OrganizationClient.java

@@ -0,0 +1,24 @@
+package com.jzg.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.user.vo.SysTennatVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(name = "jzg-organization")
+public interface OrganizationClient {
+
+    /**
+     * 获取用户的租户列表(状态为启用的租户)
+     *
+     * @param username 登录用户名
+     * @author lipf
+     * @date 2026/4/24 18:05
+     */
+    @PostMapping(value = "/userInfo/getTenantList")
+    HttpResult<List<SysTennatVo>> getTenantList(@RequestParam(required = false)String username);
+
+}

+ 40 - 0
authentication/src/main/java/com/jzg/config/FeignAuthInterceptor.java

@@ -0,0 +1,40 @@
+package com.jzg.config;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+
+/**
+ * 服务之间通过Feign进行服务间的调用,将请求头中的认证信息传递给下一个微服务
+ *     todo 目前,请求头中Authentication 中没有值
+ * @author lipf
+ * @date 2026/4/29 14:33
+ */
+@Configuration
+@Component
+public class FeignAuthInterceptor implements RequestInterceptor {
+
+
+    @Override
+    public void apply(RequestTemplate template) {
+        // 1. 获取当前请求的上下文属性
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+
+        if (attributes != null) {
+            HttpServletRequest request = attributes.getRequest();
+            // 2. 提取原始请求头中的 Authentication 信息
+            String authentication = request.getHeader("Authentication");
+
+            // 3. 如果 Authentication 不为空,则将其添加到 Feign 的请求头中
+            if (StringUtils.hasText(authentication)) {
+                template.header("Authentication", authentication);
+            }
+        }
+    }
+}

+ 31 - 8
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -1,5 +1,6 @@
 package com.jzg.config;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONUtil;
 import com.alipay.api.AlipayApiException;
@@ -9,9 +10,12 @@ import com.alipay.api.DefaultAlipayClient;
 import com.alipay.api.request.AlipaySystemOauthTokenRequest;
 import com.alipay.api.response.AlipaySystemOauthTokenResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.client.OrganizationClient;
 import com.jzg.commons.constants.RedisKeyConstants;
 import com.jzg.commons.constants.SystemConstants;
+import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.*;
+import com.jzg.commons.entity.user.vo.SysTennatVo;
 import com.jzg.commons.entity.vo.SysRoleDataScopeVo;
 import com.jzg.commons.util.MinioUtils;
 import com.jzg.commons.util.StringUtils;
@@ -38,6 +42,7 @@ import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.util.CollectionUtils;
 
+import java.io.Serial;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
@@ -50,6 +55,8 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
     private static final Logger log = LoggerFactory.getLogger(JzgAuthenticationProvider.class);
 
     private UserDetailsService userDetailsService;
+    @Autowired
+    private OrganizationClient organizationClient;
 
     private SysUserService sysUserService;
 
@@ -88,6 +95,13 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
     }
 
 
+    /**
+     * 网页端登录和手机app登录使用同一个登录接口
+     * systemCode为APP的时候表示手机app登录(手机app端会传systemCode为APP)
+     *
+     * @author lipf
+     * @date 2026/4/29 11:27
+     */
     @Override
     public Authentication authenticate(Authentication authentication) throws AuthenticationException {
         // 获取用户名和密码
@@ -101,8 +115,8 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         String type = ((JzgUsernamePasswordAuthenticationToken)authentication).getType();
         String code = ((JzgUsernamePasswordAuthenticationToken)authentication).getCode();
         boolean appLogin = ((JzgUsernamePasswordAuthenticationToken)authentication).isAppLogin();
-        log.info("登录认证:username=[{}],rawPassword=[{}],details=[{}],system=[{}], captchaId=[{}], captcha=[{}],type=[{}],code=[{}],appLogin=[{}]",
-                username,rawPassword,details,system, captchaId, captcha, type, code, appLogin);
+        log.info("登录认证:username=[{}],details=[{}],system=[{}], captchaId=[{}], captcha=[{}],type=[{}],code=[{}],appLogin=[{}]",
+                username,details,system, captchaId, captcha, type, code, appLogin);
         boolean isFirst = false;
         //调试时注销验证码
         //验证码校验
@@ -129,13 +143,19 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
                 throw new SystemException("业务员不存在");
             }
             SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfos.get(0);
-            if (!sysUserJzgInfo.canLogin()) {
-                log.info("用户被禁用,不能登录。sysUserJzgInfo=[{}]", JSONUtil.toJsonStr(sysUserJzgInfo));
-                throw new SystemException("用户已被禁用,无法登录");
+            if (sysUserJzgInfo.cannotLogin()) {
+                log.info("用户被禁用/离职,不能登录。sysUserJzgInfo=[{}]", JSONUtil.toJsonStr(sysUserJzgInfo));
+                throw new SystemException("用户已被禁用/离职,无法登录");
             }
             salt = weblogUser.getSalt();
         }
-
+        // modify by lipf, 用户所属租户如果被禁用,不能登录
+        HttpResult<List<SysTennatVo>> tenants = organizationClient.getTenantList(username);
+        log.info("用户[{}]有[{}]个租户,分别是tenants=[{}]",username, CollUtil.size(tenants.getData()), JSONUtil.toJsonStr(tenants));
+        if(CollectionUtil.isEmpty(tenants.getData())){
+            log.info("用户[{}]所属的租户已经被禁用,无法登录",username);
+            throw new SystemException("用户所属的租户已经被禁用,无法登录");
+        }
         //检验短信验证码
         if(Objects.nonNull(code)){
             String systemSmsCode = redissonClient.getBucket(RedisKeyConstants.SMS_CODE + username).get().toString();
@@ -143,7 +163,6 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
                 throw new SystemException("短信验证码错误,请重新输入");
             }
         }else{
-
             // 加密密码和盐值
             String encryptedPassword = PasswordUtils.encode(rawPassword,salt);
 
@@ -346,7 +365,11 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
         details = detailMap;
 
         Object finalDetails = details;
-        return new UsernamePasswordAuthenticationToken(username, rawPassword, authorities) {{
+        return new UsernamePasswordAuthenticationToken(username, rawPassword, authorities) {
+            @Serial
+            private static final long serialVersionUID = 6103193211327672348L;
+
+            {
             setDetails(finalDetails);
         }};
     }

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/orders/vo/OrderListVo.java

@@ -85,6 +85,9 @@ public class OrderListVo {
     @ExcelProperty("报价时间")
     private LocalDateTime createTime;
 
+    @ExcelProperty("录单人")
+    private String createBy;
+
     //总保费
     @ExcelProperty("总保费")
     private String sumPremium;
@@ -93,6 +96,9 @@ public class OrderListVo {
     @ExcelProperty("业务员信息")
     private String salesmanInfo;
 
+    // sys_user_jzg_info 表的序号
+    private String jzgInfoId;
+
     // 业务员类型
     @ExcelProperty("业务员类型")
     private String salesmanType;

+ 3 - 2
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java

@@ -344,11 +344,12 @@ public class SysUserJzgInfo extends BaseModel implements Serializable {
     /**
      * 判断用户是否能登录
      *      启用状态才能登录
+     *      离职 status = 8 也不能登录
      * @author lipf
      * @date 2026/4/22 11:16
      */
-    public boolean canLogin(){
-        return this.isEnable != null && this.isEnable == 0;
+    public boolean cannotLogin(){
+        return this.isEnable == 1 || this.status == 8;
     }
 
     public SysUserJzgInfo(String userName, SysUser user, String systemCode, String deptId){

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/vo/SysUserAccountVo.java

@@ -19,6 +19,9 @@ public class SysUserAccountVo extends BaseModel {
     @Schema(description = "业务员手机号")
     private String mobile;
 
+    @Schema(description = "工号")
+    private String workNumber;
+
     @Schema(description = "业务员类型1.前线人员 2:后线人员 3:合伙人 4:工作室管理员 5:团队 6:个代 7:电销 8 渠道")
     private String attrType;
 

+ 3 - 3
platform/src/main/java/com/jzg/controller/UserRoleController.java

@@ -33,8 +33,8 @@ public class UserRoleController extends BaseController {
 
     /**
      * 获取角色列表
-     * @param sysRoleVo
-     * @return
+     * @param sysRoleVo 角色信息
+     * @return HttpResult<List<SysRole>>
      */
     @Operation(summary = "角色列表")
     @PostMapping("/roleList")
@@ -45,7 +45,7 @@ public class UserRoleController extends BaseController {
 
     @Operation(summary = "角色信息查询")
     @GetMapping("/roleGet")
-    public HttpResult roleGet(String roleId){
+    public HttpResult<SysRoleVo> roleGet(String roleId){
         return HttpResult.ok(userRoleService.roleGet(roleId));
     }
 

+ 6 - 7
platform/src/main/java/com/jzg/service/impl/UserRoleServiceImpl.java

@@ -13,8 +13,9 @@ import com.jzg.commons.entity.vo.SysRoleVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.mapper.*;
-import com.jzg.service.SysSystemService;
 import com.jzg.service.UserRoleService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -27,11 +28,7 @@ import java.util.stream.Collectors;
 @Service
 public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements UserRoleService, HistoryDataService {
 
-    @Autowired
-    SysSystemService sysSystemService;
-
-    @Autowired
-    SysMenuMapper sysMenuMapper;
+    private static final Logger log = LoggerFactory.getLogger(UserRoleServiceImpl.class);
 
     @Autowired
     SysRolePermsMapper sysRolePermsMapper;
@@ -57,11 +54,13 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
 
     @Override
     public SysRoleVo roleGet(String roleId) {
+        log.info("查询角色的权限: roleId=[{}]",roleId);
         String userSystemCode = baseController.getUserSystemCode();
         SysRole sysRole = baseMapper.selectOne(new LambdaQueryWrapper<SysRole>()
                 .eq(SysRole::getId,roleId)
                 .eq(SysRole::getSystemCode,userSystemCode));
         if(Objects.isNull(sysRole)){
+            log.info("根据租户代码[{}]和roleId[{}]没有找到角色信息",userSystemCode,roleId);
             throw new SystemException("角色不存在");
         }
         List<SysRolePerms> sysRolePerms = sysRolePermsMapper.getByRoleIdNew(roleId);
@@ -76,7 +75,7 @@ public class UserRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> imp
             if (!sysRoleDataScope.equals("2")) {
                 List<SysRoleDataScopeLink> sysRoleDataScopeLinks = sysRoleDataScopeLinkMapper.selectList(new LambdaQueryWrapper<SysRoleDataScopeLink>()
                         .eq(SysRoleDataScopeLink::getRoleId, roleId));
-                vo.setDeptIds(sysRoleDataScopeLinks.stream().map(x -> x.getDeptId()).collect(Collectors.toList()));
+                vo.setDeptIds(sysRoleDataScopeLinks.stream().map(SysRoleDataScopeLink::getDeptId).collect(Collectors.toList()));
             }
             sysRoleVo.setDataScope(vo);
         }

+ 10 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -33,6 +33,16 @@ public interface OrgClient {
     HttpResult<SysUserJzgInfo> queryUserByUserId(@RequestParam("userId") String userId,
                                                  @RequestParam("systemCode") String systemCode);
 
+    /**
+     * 查询所有成员和业务员的身份
+     *
+     * @return Map<Long, String> key 表示sys_user_jzg_info 表的序号, value 标识多个岗位的标识
+     * @author lipf
+     * @date 2026/4/29 10:35
+     */
+    @GetMapping("/userInfo/queryAllTypeAttrMap")
+    Map<String, String>  queryAllTypeAttrMap();
+
     /**
      * 查找人员信息地区
      *

+ 6 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/build/HuaTaiApiQuoteResultsVoBuild.java

@@ -116,6 +116,9 @@ public class HuaTaiApiQuoteResultsVoBuild {
     //获取商业险数据
     public static HuaTaiQuotedPriceResponse.ContractDto getBiContractDto(HuaTaiQuotedPriceResponse quotedPriceResponse) {
         HuaTaiQuotedPriceResponse.ContractDto result = null;
+        if (null == quotedPriceResponse){
+            return null;
+        }
         List<HuaTaiQuotedPriceResponse.ContractDto> contractDtos = quotedPriceResponse.getBusinessData().getContract();
         List<String> huaTaiSyRiskCodes = new ArrayList<>();
         huaTaiSyRiskCodes.add(HuaTaiRiskCode.R_1251.getCode());
@@ -134,6 +137,9 @@ public class HuaTaiApiQuoteResultsVoBuild {
     //获取交强险数据
     public static HuaTaiQuotedPriceResponse.ContractDto getCiContractDto(HuaTaiQuotedPriceResponse quotedPriceResponse) {
         HuaTaiQuotedPriceResponse.ContractDto result = null;
+        if (null == quotedPriceResponse){
+            return result;
+        }
         List<HuaTaiQuotedPriceResponse.ContractDto> contractDtos = quotedPriceResponse.getBusinessData().getContract();
         for (HuaTaiQuotedPriceResponse.ContractDto contractDto : contractDtos) {
             HuaTaiQuotedPriceResponse.ContractDto.ContractMainDto contractMain = contractDto.getContractMain();

+ 18 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/constant/HuataiBaseConstants.java

@@ -0,0 +1,18 @@
+package com.jzg.quotation.huatai.api.constant;
+
+import lombok.Data;
+
+@Data
+public class HuataiBaseConstants {
+    public static final String JQ_REGEX = "交强险.+?(?:保险止期|终保日期)[是::\\s]*?([0-9\\-:]+)";
+    public static final String JQ_GUOHU_AND_JISHI_REGEX = "重复投保提示:.*?投保确认码\\s*[\\w\\d]+.*?起保日期\\s*[0-9\\-: ]+;.*?终保日期\\s*([0-9\\-: ]+);";
+    public static final String JQ_RULE = "机动车交通事故强制险";
+    public static final String SY_RULE = "机动车综合商业保险";
+    public static final String REGEX_ALONE = "(?:保险止期|终保日期)[是::\\s]*?([0-9\\-:]+)";
+    public static final String SY_REGEX = "(?:商业险|商业保险).+?(?:保险止期|终保日期)[是::\\s]*?([0-9\\-:]+)";
+    public static final String END_TIME = "23:59:59";
+
+    public static final String REDIS_YONGCHENG_QUERY_CODE_JQ = "REDIS_YONGCHENG_QUERY_CODE_JQ:";
+    public static final String REDIS_YONGCHENG_QUERY_CODE_SY = "REDIS_YONGCHENG_QUERY_CODE_SY:";
+
+}

+ 24 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/entity/vo/TimeEntity.java

@@ -0,0 +1,24 @@
+package com.jzg.quotation.huatai.api.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class TimeEntity {
+
+    private String coverageEndDate;
+
+    /**
+     * 开始时间
+     */
+    private String newStartDate;
+
+    /**
+     * 结束时间
+     */
+    private String newEndDate;
+
+}

+ 175 - 41
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java

@@ -2,6 +2,8 @@ package com.jzg.quotation.huatai.api.service.Impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.core.page.HttpResult;
@@ -17,24 +19,32 @@ import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.commons.utils.DateTimeUtil;
+import com.jzg.quotation.commons.utils.DuplicateInsuranceUtil;
 import com.jzg.quotation.huatai.api.build.HuaTaiApiQuoteResultsVoBuild;
 import com.jzg.quotation.huatai.api.component.HuaTaiRequestApiComponent;
 import com.jzg.quotation.huatai.api.component.HuiTaiUploadImageComponent;
+import com.jzg.quotation.huatai.api.constant.HuataiBaseConstants;
 import com.jzg.quotation.huatai.api.entity.HuaTaiApiOrder;
 import com.jzg.quotation.huatai.api.entity.HuaTaiBaseRequestHead;
 import com.jzg.quotation.huatai.api.entity.HuaTaiConfigureParameters;
 import com.jzg.quotation.huatai.api.entity.request.*;
 import com.jzg.quotation.huatai.api.entity.response.*;
 import com.jzg.quotation.huatai.api.entity.vo.InsHuataiContributingVo;
+import com.jzg.quotation.huatai.api.entity.vo.TimeEntity;
 import com.jzg.quotation.huatai.api.service.HuaTaiApiOrderService;
 import com.jzg.quotation.huatai.api.service.HuaTaiApiRequest;
 import com.jzg.quotation.huatai.api.utils.InMemoryZipExtractor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -56,6 +66,8 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
 
     private final PlatformClient platformClient;
 
+    private static final Logger logger = LoggerFactory.getLogger(HuaTaiApiRequestImpl.class);
+
     public String getApiUrl(String companyId) {
         // 获取保司配置url地址
         HttpResult<PtlAgreementUrl> ptlAgreementUrl = platformClient.getAgreementUrlByCompanyId(companyId);
@@ -108,22 +120,55 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
                 accidentalDrivingVo = accidentalDrivings.get(0);
             }
 
+            QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
             HuaTaiQuotedPriceRequest quotedPriceRequest = new HuaTaiQuotedPriceRequest(quoteVo, fullCarDataDto, actualValueResponse,
                     accidentalDrivingVo, parameters);
             quotedPriceRequest.setHead(baseRequestHead);
             //调用报价接口
             HuaTaiQuotedPriceResponse quotedPriceResponse = huataiRequestApiComponent.quotedPrice(quotedPriceRequest,
                     HuaTaiQuotedPriceResponse.class, parameters.getInsuredCode(), url);
+            String returnMessage = quotedPriceResponse.getHead().getReturnMessage();
+            if (StrUtil.isNotBlank(returnMessage) && returnMessage.contains("重复投保")) {
+                // 处理返回信息
+                // 1、交强险重复投保处理
+                TimeEntity jqTime = ciRepetitionInsure(quotedPriceResponse);
+                // 2、商业险重复投保处理
+                TimeEntity syTime = commerceRepetitionInsure(quotedPriceResponse);
+
+                if (ObjectUtil.isNotEmpty(jqTime)) {
+                    quoteResultsVo.setCiStartDate(jqTime.getNewStartDate());
+                    quoteResultsVo.setCiEndDate(jqTime.getNewEndDate());
+                    // 重新调报价接口组装的交强参数
+                    quoteVo.getCiRiskInfoVo().setStartDate(quoteResultsVo.getCiStartDate());
+                    quoteVo.getCiRiskInfoVo().setEndDate(quoteResultsVo.getCiEndDate());
+                }
+                if (ObjectUtil.isNotEmpty(syTime)) {
+                    quoteResultsVo.setBiStartDate(syTime.getNewStartDate());
+                    quoteResultsVo.setBiEndDate(syTime.getNewEndDate());
+                    // 重新调报价接口组装的商业参数
+                    quoteVo.getBiRiskInfoVo().setStartDate(quoteResultsVo.getBiStartDate());
+                    quoteVo.getBiRiskInfoVo().setEndDate(quoteResultsVo.getBiEndDate());
+                }
+                // 如果发生重复投保,且可以投保的时间在一个月内,则将投保时间重新设置之后,再次调用计算保费的方法
+                if (StrUtil.isNotBlank(quoteResultsVo.getCiStartDate()) || StrUtil.isNotBlank(quoteResultsVo.getBiStartDate())) {
+                    HuaTaiQuotedPriceRequest reQuotedPriceRequest = new HuaTaiQuotedPriceRequest(quoteVo, fullCarDataDto, actualValueResponse,
+                            accidentalDrivingVo, parameters);
+                    reQuotedPriceRequest.setHead(baseRequestHead);
+                    //调用报价接口
+                    quotedPriceResponse = huataiRequestApiComponent.quotedPrice(reQuotedPriceRequest,
+                            HuaTaiQuotedPriceResponse.class, parameters.getInsuredCode(), url);
+                    logger.info("华泰再次请求保费计算接口,结果为:{}", JSON.toJSONString(quotedPriceResponse));
+                }
+            }
             if (ObjectUtil.isNotNull(quotedPriceResponse) && !quotedPriceResponse.getHead().getReturnCode().equals("0")) {
                 log.error("报价失败,返回信息:{}", quotedPriceResponse.getHead().getReturnMessage());
-                QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
                 quoteResultsVo.setErrorMessage(quotedPriceResponse.getHead().getReturnMessage());
                 quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
                 return quoteResultsVo;
-            }else {
+            } else {
                 log.info("报价成功,返回信息:{}", JSONObject.toJSONString(quotedPriceResponse));
             }
-            QuoteResultsVo quoteResultsVo = HuaTaiApiQuoteResultsVoBuild.buildQuoteResultsVo(orderBase.getOrdersNo(), quoteVo, quotedPriceResponse);
+            quoteResultsVo = HuaTaiApiQuoteResultsVoBuild.buildQuoteResultsVo(orderBase.getOrdersNo(), quoteVo, quotedPriceResponse);
             //数据保存到mongodb,后续接口需要的数据
             HuaTaiApiOrder huaTaiApiOrder = new HuaTaiApiOrder();
             huaTaiApiOrder.setCarInfo(carInfoVo);
@@ -153,8 +198,8 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
             HuaTaiApiOrder save = huaTaiApiOrderService.save(huaTaiApiOrder);
             quoteResultsVo.setQuoteStatusEnum(StringUtils.isNotBlank(save.getId()) ? InsOrderStatusEnum.WAIT_AUDIT : InsOrderStatusEnum.QUOTE_FAIL);
             return quoteResultsVo;
-        }catch (Exception e){
-            log.error("报价异常",e);
+        } catch (Exception e) {
+            log.error("报价异常", e);
             throw new SystemException("报价异常");
         }
     }
@@ -176,7 +221,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         List<InsHuataiContributingVo> engageList = new ArrayList<>();//报价接口未返回特约信息
         HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
         HuaTaiSubmitRequest submitRequest = new HuaTaiSubmitRequest(huaTaiApiOrder, huaTaiParameters, engageList);
-        HuaTaiSubmitResponse submitResponse = huataiRequestApiComponent.submit(submitRequest, HuaTaiSubmitResponse.class, huaTaiParameters.getInsuredCode(),url);
+        HuaTaiSubmitResponse submitResponse = huataiRequestApiComponent.submit(submitRequest, HuaTaiSubmitResponse.class, huaTaiParameters.getInsuredCode(), url);
 
         log.info("提交保单返回信息:{}", JSONObject.toJSONString(submitResponse));
         if ("-1".equals(submitResponse.getHead().getReturnCode())) {
@@ -264,14 +309,14 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
             underwritingResultsVo.setUnderwritingResult("人工处理");
             //调用提交核保接口
-            HuaTaiSubmitStatusQueryResponse huaTaiSubmitStatusQueryResponse = submitStatus(huaTaiApiOrder, huaTaiParameters, "1",url);
+            HuaTaiSubmitStatusQueryResponse huaTaiSubmitStatusQueryResponse = submitStatus(huaTaiApiOrder, huaTaiParameters, "1", url);
 
-        }else {
+        } else {
             //核保退回
             StringBuilder sb = new StringBuilder();
             for (HuaTaiSubmitResponse.AppliResult appliResult : submitResponse.getAppliResult()) {
                 for (HuaTaiSubmitResponse.Notion notion : appliResult.getNotion()) {
-                    sb.append(StringUtils.equals("C1",notion.getUWType()) ? "交强险提示信息:%s" : " 商业险提示信息:%s").append(notion.getUWNotion());
+                    sb.append(StringUtils.equals("C1", notion.getUWType()) ? "交强险提示信息:%s" : " 商业险提示信息:%s").append(notion.getUWNotion());
                 }
             }
             underwritingResultsVo.setUnderwritingResult(sb.toString());
@@ -297,7 +342,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         HuaTaiPaymentUrlRequest huaTaiPaymentUrlRequest = new HuaTaiPaymentUrlRequest(huaTaiApiOrder, huaTaiParameters);
         huaTaiPaymentUrlRequest.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
 
-        HuaTaiPaymentUrlResponse paymentUrlResponse = huataiRequestApiComponent.getPaymentUrl(huaTaiPaymentUrlRequest, HuaTaiPaymentUrlResponse.class, huaTaiParameters.getInsuredCode(),url);
+        HuaTaiPaymentUrlResponse paymentUrlResponse = huataiRequestApiComponent.getPaymentUrl(huaTaiPaymentUrlRequest, HuaTaiPaymentUrlResponse.class, huaTaiParameters.getInsuredCode(), url);
 
         String payUrl = "";
         if (StringUtils.isNotEmpty(paymentUrlResponse.getPayUrl())) {
@@ -326,12 +371,12 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
             HuaTaiUploadImageRequest uploadImageRequest = new HuaTaiUploadImageRequest(huaTaiApiOrder, huaTaiParameters);
             uploadImageRequest.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
             //返回影像上传url
-            HuaTaiUploadImageResponse huaTaiUploadImageResponse = huataiRequestApiComponent.uploadImage(uploadImageRequest, HuaTaiUploadImageResponse.class, huaTaiParameters.getInsuredCode(),url);
+            HuaTaiUploadImageResponse huaTaiUploadImageResponse = huataiRequestApiComponent.uploadImage(uploadImageRequest, HuaTaiUploadImageResponse.class, huaTaiParameters.getInsuredCode(), url);
 
             //爬虫方式进行图片上传
             huiTaiUploadImageComponent.uploadImage(orderBase.getInsuranceCompanyCode(), huaTaiUploadImageResponse.getUrl(), insuranceUploadImageVo.getImageVoList());
-        }catch (Exception e){
-            log.error("华泰影像上传失败",e.getMessage());
+        } catch (Exception e) {
+            log.error("华泰影像上传失败", e.getMessage());
             throw new RuntimeException("华泰影像上传失败");
         }
     }
@@ -343,12 +388,13 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
 
     /**
      * 下载保单
+     *
      * @param downloadPolicyVo
      */
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         InsOrdersPolicy police = downloadPolicyVo.getPolicie();
-        if (ObjectUtil.isNull(police)){
+        if (ObjectUtil.isNull(police)) {
             throw new RuntimeException("请选择保单");
         }
         String url = getApiUrl(downloadPolicyVo.getOrder().getInsuranceCompanyId());
@@ -359,16 +405,16 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         HuaTaiInsurancePolicyPrintRequest request = new HuaTaiInsurancePolicyPrintRequest();
         request.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
         HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
-        if (StringUtils.isNotBlank(police.getJqPolicyNo())){
+        if (StringUtils.isNotBlank(police.getJqPolicyNo())) {
             request.setBusinessNo(police.getJqPolicyNo());
-            HuaTaiInsurancePolicyPrintResponse response = huataiRequestApiComponent.insurancePolicyPrint(request, HuaTaiInsurancePolicyPrintResponse.class, huaTaiParameters.getInsuredCode(),url);
+            HuaTaiInsurancePolicyPrintResponse response = huataiRequestApiComponent.insurancePolicyPrint(request, HuaTaiInsurancePolicyPrintResponse.class, huaTaiParameters.getInsuredCode(), url);
             response.getElecDownLoadResultList().forEach(elecDownLoadResultDto -> {
-                getPdfLink(elecDownLoadResultDto.getDownURL(), resultVo, true,huaTaiApiOrder.getOwnersInfo().getIdentifyNumber());
+                getPdfLink(elecDownLoadResultDto.getDownURL(), resultVo, true, huaTaiApiOrder.getOwnersInfo().getIdentifyNumber());
             });
         }
-        if (StringUtils.isNotBlank(police.getJyPolicyNo())){
+        if (StringUtils.isNotBlank(police.getJyPolicyNo())) {
             request.setBusinessNo(police.getJyPolicyNo());
-            HuaTaiInsurancePolicyPrintResponse response = huataiRequestApiComponent.insurancePolicyPrint(request, HuaTaiInsurancePolicyPrintResponse.class, huaTaiParameters.getInsuredCode(),url);
+            HuaTaiInsurancePolicyPrintResponse response = huataiRequestApiComponent.insurancePolicyPrint(request, HuaTaiInsurancePolicyPrintResponse.class, huaTaiParameters.getInsuredCode(), url);
             response.getElecDownLoadResultList().forEach(elecDownLoadResultDto -> {
                 resultVo.setJyUrl(elecDownLoadResultDto.getDownURL());
             });
@@ -377,33 +423,34 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
     }
 
 
-    public void getPdfLink(String downURL,DownloadPolicyResultVo resultVo, boolean type,String idCar){
+    public void getPdfLink(String downURL, DownloadPolicyResultVo resultVo, boolean type, String idCar) {
         try {
             Map<String, MultipartFile> inputStreamMap = InMemoryZipExtractor.extractFromUrl(downURL, idCar);
             inputStreamMap.forEach((fileName, file) -> {
                 //saveFile(file);
                 HttpResult<SysUploadFiles> upload = platformClient.upload(file);
                 System.out.println("文件名: " + upload.getData().getDownloadUrl());
-                if (type){
-                    if (fileName.contains("bz")){
+                if (type) {
+                    if (fileName.contains("bz")) {
                         resultVo.setJqFlagUrl(upload.getData().getDownloadUrl());
-                    }else {
+                    } else {
                         resultVo.setJqUrl(upload.getData().getDownloadUrl());
                     }
                 }
             });
 
-        }catch (Exception e){
-            log.error("获取保单失败",e);
+        } catch (Exception e) {
+            log.error("获取保单失败", e);
         }
     }
 
 
     /**
      * 测试文件
+     *
      * @param file
      */
-    public void saveFile(MultipartFile file){
+    public void saveFile(MultipartFile file) {
         String targetDir = "F:\\img\\xx";
         if (file.isEmpty()) {
             throw new IllegalArgumentException("文件不能为空");
@@ -414,13 +461,12 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         }
         try {
             file.transferTo(new File(targetDir + File.separator + file.getOriginalFilename()));
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
     }
 
 
-
     /**
      * 查询订单状态
      *
@@ -437,7 +483,7 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
 
         HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(orderStatusVo.getOrder().getOrdersNo());
         //获取核保状态
-        HuaTaiSubmitStatusQueryResponse submitStatusQueryResponse = submitStatus(huaTaiApiOrder, huaTaiParameters, "2",url);
+        HuaTaiSubmitStatusQueryResponse submitStatusQueryResponse = submitStatus(huaTaiApiOrder, huaTaiParameters, "2", url);
         /**
          * 0	初始状态默认值
          * 1	已通过核保已实收
@@ -447,13 +493,13 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
          * 8	已通过核保未实收
          * 9	待核保
          */
-        if (StringUtils.equals("-1",submitStatusQueryResponse.getHead().getReturnCode())){
+        if (StringUtils.equals("-1", submitStatusQueryResponse.getHead().getReturnCode())) {
             throw new SystemException("查询订单状态失败");
         }
         List<HuaTaiSubmitStatusQueryResponse.AppliResult> appliResult = submitStatusQueryResponse.getAppliResult();
         for (HuaTaiSubmitStatusQueryResponse.AppliResult result : appliResult) {
             String underWriteFlag = result.getUnderWriteFlag();
-            switch (underWriteFlag){
+            switch (underWriteFlag) {
                 case "0":
                     orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.QUOTE_ING);
                     break;
@@ -476,23 +522,23 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
             }
         }
 
-        log.info("核保状态:{}",JSONObject.toJSONString(submitStatusQueryResponse.getAppliResult()));
+        log.info("核保状态:{}", JSONObject.toJSONString(submitStatusQueryResponse.getAppliResult()));
 
         //获取见费出单结果
         HuaTaiOrderStatusRequest orderStatusRequest = new HuaTaiOrderStatusRequest(huaTaiApiOrder, huaTaiParameters);
         orderStatusRequest.setHead(baseRequestHead);
-        HuaTaiOrderStatusResponse orderStatusResponse = huataiRequestApiComponent.orderStatus(orderStatusRequest, HuaTaiOrderStatusResponse.class, huaTaiParameters.getInsuredCode(),url);
-        log.info("见费出单结果:{}",JSONObject.toJSONString(orderStatusResponse));
+        HuaTaiOrderStatusResponse orderStatusResponse = huataiRequestApiComponent.orderStatus(orderStatusRequest, HuaTaiOrderStatusResponse.class, huaTaiParameters.getInsuredCode(), url);
+        log.info("见费出单结果:{}", JSONObject.toJSONString(orderStatusResponse));
         for (HuaTaiOrderStatusResponse.PayDetaiDto payDetaiDto : orderStatusResponse.getPayDetaiList()) {
-            if (StringUtils.equals("1002",payDetaiDto.getRiskCode())){
+            if (StringUtils.equals("1002", payDetaiDto.getRiskCode())) {
                 orderStatusResultVo.setJqApplyNo(payDetaiDto.getBUSINESSNO());
                 orderStatusResultVo.setJqPolicyno(payDetaiDto.getPOLICYNO());
-            }else if(StringUtils.equals("1251",payDetaiDto.getRiskCode())){
+            } else if (StringUtils.equals("1251", payDetaiDto.getRiskCode())) {
                 orderStatusResultVo.setSyApplyNo(payDetaiDto.getBUSINESSNO());
                 orderStatusResultVo.setSyPolicyno(payDetaiDto.getPOLICYNO());
-            }else {
+            } else {
                 //
-                log.info("未知的险种:{}",payDetaiDto.getRiskCode());
+                log.info("未知的险种:{}", payDetaiDto.getRiskCode());
             }
         }
         return orderStatusResultVo;
@@ -501,17 +547,105 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
 
     /**
      * 提交核保或核保查询接口
+     *
      * @param huaTaiApiOrder
      * @param huaTaiConfigureParameters
-     * @param operateType    1为提交核保 2为查询核保状态
+     * @param operateType               1为提交核保 2为查询核保状态
      * @return
      */
-    private HuaTaiSubmitStatusQueryResponse submitStatus(HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters, String operateType,String url) {
+    private HuaTaiSubmitStatusQueryResponse submitStatus(HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters, String operateType, String url) {
         HuaTaiSubmitStatusQueryRequest huaTaiSubmitStatusQueryRequest = new HuaTaiSubmitStatusQueryRequest(huaTaiApiOrder,
                 huaTaiConfigureParameters, operateType);
         huaTaiSubmitStatusQueryRequest.setHead(new HuaTaiBaseRequestHead(huaTaiConfigureParameters));
         HuaTaiSubmitStatusQueryResponse submitStatusQueryResponse =
-                huataiRequestApiComponent.submitStatus(huaTaiSubmitStatusQueryRequest, HuaTaiSubmitStatusQueryResponse.class, huaTaiConfigureParameters.getInsuredCode(),url);
+                huataiRequestApiComponent.submitStatus(huaTaiSubmitStatusQueryRequest, HuaTaiSubmitStatusQueryResponse.class, huaTaiConfigureParameters.getInsuredCode(), url);
         return submitStatusQueryResponse;
     }
+
+    public TimeEntity ciRepetitionInsure(HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        String returnMessage = quotedPriceResponse.getHead().getReturnMessage();
+
+        logger.info("华泰API方式 -------------报价 -> 交强重复投保----------------");
+
+        TimeEntity timeEntity = getRepeatStartEndTime(returnMessage, HuataiBaseConstants.JQ_REGEX, HuataiBaseConstants.JQ_RULE);
+
+        if (org.apache.commons.lang3.StringUtils.isEmpty(timeEntity.getCoverageEndDate())) {
+            //重试第二种过户 及时起保的错误
+            TimeEntity repeatStartEndTime = getRepeatStartEndTime(returnMessage, HuataiBaseConstants.JQ_GUOHU_AND_JISHI_REGEX, "");
+            if (StringUtils.isEmpty(repeatStartEndTime.getCoverageEndDate())) {
+                return null;
+            } else {
+                //如果是及时起保的则 终保日期 + 1天
+                // 定义时间格式
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                // 解析原始时间
+                LocalDateTime dateTime = LocalDateTime.parse(repeatStartEndTime.getCoverageEndDate(), formatter);
+                LocalDateTime tomorrowMidnight = dateTime;
+                //判断是否是整点  如果是整点则不进行明天的零点操作
+                if (dateTime.getHour() != 0 || dateTime.getMinute() != 0 || dateTime.getSecond() != 0) {
+                    tomorrowMidnight = dateTime.toLocalDate().plusDays(1).atStartOfDay();
+                }
+
+                timeEntity.setCoverageEndDate(tomorrowMidnight.format(formatter));
+                LocalDateTime end = tomorrowMidnight.plusYears(1L);
+                timeEntity.setNewStartDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
+                LocalDateTime localDateTime = end.minusSeconds(1L);
+                timeEntity.setNewEndDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+            }
+        }
+
+        logger.error("----------华泰交强险新起:{}", timeEntity.getNewStartDate());
+        logger.error("----------华泰交强险新止:{}", timeEntity.getNewEndDate());
+        return timeEntity;
+    }
+
+    public TimeEntity commerceRepetitionInsure(HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        String returnMessage = quotedPriceResponse.getHead().getReturnMessage();
+
+        logger.info("华泰API方式 - ------------报价 -> 商业险重复投保----------------");
+        TimeEntity timeEntity = getRepeatStartEndTime(returnMessage, HuataiBaseConstants.SY_REGEX, HuataiBaseConstants.SY_RULE);
+
+        if (StringUtils.isEmpty(timeEntity.getCoverageEndDate())) {
+            return null;
+        }
+
+        logger.error("----------华泰商业险新起:{}", timeEntity.getNewStartDate());
+        logger.error("----------华泰商业险新止:{}", timeEntity.getNewEndDate());
+        return timeEntity;
+    }
+
+    private TimeEntity getRepeatStartEndTime(String errorMsg, String regex, String rule) {
+        String coverageEndDate = processingTime(errorMsg, regex, rule);
+        TimeEntity timeEntity = new TimeEntity();
+
+        if (coverageEndDate.isEmpty()) {
+            return timeEntity;
+        }
+
+        timeEntity.setCoverageEndDate(coverageEndDate);
+        LocalDateTime start;
+        if (coverageEndDate.contains(HuataiBaseConstants.END_TIME)) {
+            start = DateTimeUtil.parseLocalDateTime(coverageEndDate, DateTimeUtil.DATETIME_PATTERN).plusSeconds(1);
+            LocalDateTime end = start.plusYears(1L).minusDays(1L);
+            timeEntity.setNewStartDate(DateTimeUtil.getStartTimeOfDayStr(start, DateTimeUtil.DATETIME_PATTERN));
+            timeEntity.setNewEndDate(DateTimeUtil.getEndTimeOfDayStr(end, DateTimeUtil.DATETIME_PATTERN));
+        } else {
+            start = DateTimeUtil.parseLocalDateTime(coverageEndDate, DateTimeUtil.DATETIME_PATTERN);
+            LocalDateTime end = start.plusYears(1L);
+            timeEntity.setNewStartDate(DateTimeUtil.format(start, DateTimeUtil.DATETIME_PATTERN));
+            LocalDateTime localDateTime = end.minusSeconds(1L);
+            timeEntity.setNewEndDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+        }
+
+        return timeEntity;
+    }
+
+    private String processingTime(String errorMsg, String regex, String rule) {
+        String coverageEndDate = DuplicateInsuranceUtil.getEndDate(errorMsg, regex);
+
+        if (coverageEndDate.isEmpty() && errorMsg.contains(rule)) {
+            coverageEndDate = DuplicateInsuranceUtil.getEndDate(errorMsg, HuataiBaseConstants.REGEX_ALONE);
+        }
+        return coverageEndDate;
+    }
 }

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

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -944,6 +945,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 生成订单的条件
         // 1个保险公司只有一个主订单   不区分险种
         // 唯一性的判定标准:保险公司编号+ 车牌号 + 车架号
+        log.info("生成一个主订单和多个子订单:quoteVo=[{}],companyName=[{}]", JSONUtil.toJsonStr(quoteVo), companyName);
         InsOrders mainOrders = this.getMainOrders(
                 quoteVo.getOrder().getInsuranceCompanyCode(),
                 quoteVo.getCarInfoVo().getLicenseNo(),
@@ -1161,6 +1163,18 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrdersParam.setJzgInfoId(jzgInfoId);
         }
         Page<OrderListVo> orderListVoPage = insOrdersMapper.queryOrderList(insOrdersParam.getPage(), insOrdersParam);
+        // modify by lipf, 2026年4月29日11:06:02 解决业务员类型缺失的问题
+        List<OrderListVo> records = orderListVoPage.getRecords();
+        if(CollUtil.isNotEmpty(records)){
+            Map<String, String> attrTypeMap = orgClient.queryAllTypeAttrMap();
+            List<OrderListVo> list = records.stream().peek(action -> {
+                String jzgInfoId1 = action.getJzgInfoId();
+                if (StrUtil.isNotEmpty(jzgInfoId1)) {
+                    action.setSalesmanType(attrTypeMap.get(jzgInfoId1));
+                }
+            }).toList();
+            orderListVoPage.setRecords(list);
+        }
         if (StringUtils.equals("1",insOrdersParam.getIsLargeOrder())){
             processMainOrder(orderListVoPage);
         }

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

@@ -751,6 +751,7 @@
         io.product_name as productName,
         io.order_status,
         io.create_time,
+        io.create_by,
         ioci.license_no,
         ioci.vin_no,
         owner_u.name as owner_name,
@@ -768,6 +769,7 @@
         iorco.tax_premium as vvTax,
         su.username as recorder,
         suji.name as salesmanInfo,
+        suji.id as jzgInfoId,
         suji.type_attr as salesmanType,
         pa.agreement_name as agreementName,
         sd.name as deptName,

+ 26 - 6
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/build/ZiJinAPIQuoteResultsVoBuild.java

@@ -1,21 +1,24 @@
 package com.jzg.quotation.zijin.api.build;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.constants.quote.enums.quote.KindCode;
 import com.jzg.commons.entity.quote.vo.ExpenseFactor;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
-import com.jzg.commons.entity.quote.vo.RiskInfoVo;
-import com.jzg.commons.constants.quote.enums.quote.KindCode;
-import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
-import com.jzg.commons.util.StringUtils;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.api.entity.constants.enums.ResultEnum;
 import com.jzg.quotation.zijin.api.entity.response.CalculatePremiumResponse;
 import jodd.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 
@@ -26,6 +29,9 @@ import java.util.stream.Collectors;
  **/
 public final class ZiJinAPIQuoteResultsVoBuild {
 
+    private static final Logger logger = LoggerFactory.getLogger(ZiJinAPIQuoteResultsVoBuild.class);
+
+
     public ZiJinAPIQuoteResultsVoBuild() {
         throw new IllegalStateException("Utility class");
     }
@@ -50,7 +56,6 @@ public final class ZiJinAPIQuoteResultsVoBuild {
         // 商业险
         quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
 
-        // 商业险险种信息
         // 商业险险种信息
         if(CollUtil.isNotEmpty(calculatePremiumResponse.getItemKindList())){
             List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), calculatePremiumResponse.getItemKindList());
@@ -61,6 +66,21 @@ public final class ZiJinAPIQuoteResultsVoBuild {
 //        quoteResultsVo.setExpenseFactors(expenseFactors);
         // 交强保费 车船税 商业保费
         buildPremium(quoteResultsVo, calculatePremiumResponse.getPlanList());
+
+        CalculatePremiumResponse.BasePartDTO basePart = calculatePremiumResponse.getBasePart();
+        if (null != basePart){
+            // 1、交强险重复投保处理
+            if (StrUtil.isNotBlank(basePart.getStartDateCI())){
+                quoteResultsVo.setCiStartDate(StrUtil.addSuffixIfNot(basePart.getStartDateCI(), " 00:00:00"));
+                quoteResultsVo.setCiEndDate(StrUtil.addSuffixIfNot(basePart.getEndDateCI(), " 23:59:59"));
+            }
+            // 2、商业险重复投保处理
+            if (StrUtil.isNotBlank(basePart.getStartDate())) {
+                quoteResultsVo.setBiStartDate(StrUtil.addSuffixIfNot(basePart.getStartDate(), " 00:00:00"));
+                quoteResultsVo.setBiEndDate(StrUtil.addSuffixIfNot(basePart.getEndDate(), " 23:59:59"));
+            }
+        }
+
         return quoteResultsVo;
     }
 

+ 13 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/api/service/Impl/ZiJinApiRequestImpl.java

@@ -103,7 +103,19 @@ public class ZiJinApiRequestImpl implements ZiJinApiRequest {
         CalculatePremiumResponse calculatePremiumResponse = ziJinApiRequestComponent.calculatePremium(calculatePremiumRequest, httpHeaders,modelQueryRequest,queryActualValueRequest,REPEAT_NUMBER,RETRY_NUMBER);
         logger.info("紫金请求/calculatePremium保费计算接口,结果为:{}", JSON.toJSONString(calculatePremiumResponse));
         ziJinOrderService.saveOrderInfo(quoteVo, modelQueryResponse);
-        return ZiJinAPIQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, calculatePremiumResponse, modelQueryResponse.getOrderNo());
+        QuoteResultsVo quoteResultsVo = ZiJinAPIQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, calculatePremiumResponse, modelQueryResponse.getOrderNo());
+        // 如果发生重复投保,且可以投保的时间在一个月内,则将投保时间重新设置之后,再次调用计算保费的方法
+//        if (StrUtil.isNotBlank(quoteResultsVo.getCiStartDate()) || StrUtil.isNotBlank(quoteResultsVo.getBiStartDate())){
+//            quoteVo.getCiRiskInfoVo().setStartDate(quoteResultsVo.getCiStartDate());
+//            quoteVo.getCiRiskInfoVo().setEndDate(quoteResultsVo.getCiStartDate());
+//            quoteVo.getBiRiskInfoVo().setStartDate(quoteResultsVo.getBiStartDate());
+//            quoteVo.getBiRiskInfoVo().setEndDate(quoteResultsVo.getBiEndDate());
+//            CalculatePremiumRequest reCalculatePremiumRequest = new CalculatePremiumRequest(quoteVo, vehicleModelInfosDTO, queryActualValueResponse.getActualValue(), parameters, modelQueryResponse);
+//            CalculatePremiumResponse reCalculatePremiumResponse = ziJinApiRequestComponent.calculatePremium(reCalculatePremiumRequest, httpHeaders,modelQueryRequest,queryActualValueRequest,REPEAT_NUMBER,RETRY_NUMBER);
+//            logger.info("紫金再次请求/calculatePremium保费计算接口,结果为:{}", JSON.toJSONString(reCalculatePremiumResponse));
+//            quoteResultsVo = ZiJinAPIQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, reCalculatePremiumResponse, modelQueryResponse.getOrderNo());
+//        }
+        return quoteResultsVo;
     }
 
     @Override

+ 30 - 4
tenant/organization/src/main/java/com/jzg/organization/controller/UserController.java

@@ -1,5 +1,6 @@
 package com.jzg.organization.controller;
 
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.annotation.IgnoreTenant;
 import com.jzg.commons.aop.OperatorTrajectory;
@@ -16,13 +17,17 @@ import com.jzg.commons.entity.vo.*;
 import com.jzg.commons.request.RequestSingleParam;
 import com.jzg.organization.mapper.SysUserJzgInfoMapper;
 import com.jzg.organization.service.SysDeptService;
+import com.jzg.organization.service.SysUserJzgInfoSalesmanService;
 import com.jzg.organization.service.SysUserService;
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.annotation.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author quchen
@@ -32,8 +37,13 @@ import java.util.List;
 @RestController
 @RequestMapping("/userInfo")
 public class UserController extends BaseController {
+
+    private static final Logger log = LoggerFactory.getLogger(UserController.class);
+
     @Resource
     private SysUserService sysUserService;
+    @Autowired
+    private SysUserJzgInfoSalesmanService sysUserJzgInfoSalesmanService;
 
     @Autowired
     private SysDeptService sysDeptService;
@@ -48,6 +58,18 @@ public class UserController extends BaseController {
         return HttpResult.ok(userInfoList);
     }
 
+    /**
+     * 查询所有成员和业务员的身份
+     *
+     * @return Map<Long, String> key 表示sys_user_jzg_info 表的序号, value 标识多个岗位的标识
+     * @author lipf
+     * @date 2026/4/29 10:35
+     */
+    @GetMapping("queryAllTypeAttrMap")
+    public Map<String, String>  queryAllTypeAttrMap(){
+        return sysUserJzgInfoSalesmanService.queryAllTypeAttrMap();
+    }
+
     @Operation(summary = "获取待办数量接口", description = "获取待办数量接口")
     @PostMapping(value = "/getAuditCount")
     public HttpResult getAuditCount(@RequestBody SysUserInfoParam sysUserInfoParam) {
@@ -70,7 +92,7 @@ public class UserController extends BaseController {
     @OperatorTrajectory(moduleName = "业务管理/业务员管理/删除成员",type = "D",OperationDict = OperationTypeEnum.DELETE,mapperClass = SysUserJzgInfoMapper.class,entityClass = SysUserVo.class,primary = "ids")
     @Operation(summary = "删除业务员接口", description = "删除业务员接口")
     @PostMapping(value = "/delete")
-    public HttpResult deleteUser(@RequestBody IsDeleteVo isDeleteVo) {
+    public HttpResult<Boolean> deleteUser(@RequestBody IsDeleteVo isDeleteVo) {
         return sysUserService.deleteUserInfo(isDeleteVo);
     }
 
@@ -190,7 +212,7 @@ public class UserController extends BaseController {
     }
 
     /**
-     * 获取用户的租户列表
+     * 获取用户的租户列表(状态为启用的租户)
      *
      * @author lipf
      * @date 2026/4/24 18:05
@@ -198,8 +220,12 @@ public class UserController extends BaseController {
     @IgnoreTenant
     @Operation(summary = "获取用户的租户列表",description = "获取用户的租户列表")
     @PostMapping(value = "/getTenantList")
-    public HttpResult<List<SysTennatVo>> getTenantList(){
-        return HttpResult.ok(sysUserService.getTenantList(getUserName()));
+    public HttpResult<List<SysTennatVo>> getTenantList(@RequestParam(required = false)String username){
+        log.info("获取用户的租户列表: username=[{}]",username);
+        if(StrUtil.isBlank(username)){
+            username = getUserName();
+        }
+        return HttpResult.ok(sysUserService.getTenantList(username));
     }
 
     @GetMapping("/setTenantList/{systemCode}")

+ 8 - 1
tenant/organization/src/main/java/com/jzg/organization/mapper/SysUserJzgInfoMapper.java

@@ -47,7 +47,14 @@ public interface SysUserJzgInfoMapper extends BaseMapper<SysUserJzgInfo> {
 
     SysUserJzgInfo getUserByMobile(String mobile);
 
-    List<SysTennatVo> getTenantList(String userId);
+    /**
+     * 获取用户的租户列表
+     *
+     * @param userName 表示手机号或者用户登录名
+     * @author lipf
+     * @date 2026/4/29 11:30
+     */
+    List<SysTennatVo> getTenantList(String userName);
 
     SysUserJzgInfo getUserJzgInfoByUserId(String userId);
 

+ 14 - 6
tenant/organization/src/main/java/com/jzg/organization/service/SysUserService.java

@@ -20,7 +20,7 @@ import java.util.List;
 /**
  * @author Administrator
  * @description 针对表【sys_user】的数据库操作Service
- * @createDate 2023-11-15 11:23:28
+ * @date 2023-11-15 11:23:28
  */
 public interface SysUserService extends IService<SysUser> {
 
@@ -28,7 +28,7 @@ public interface SysUserService extends IService<SysUser> {
      * 获取人员信息
      *
      * @param sysUserVo
-     * @return
+     * @return List<SysUserVo>
      */
     List<SysUserVo> getUserInfo(SysUserVo sysUserVo);
 
@@ -48,7 +48,13 @@ public interface SysUserService extends IService<SysUser> {
      */
     HttpResult<String> addUserInfo(SysUserVo sysUserVo);
 
-    HttpResult deleteUserInfo(IsDeleteVo isDeleteVo);
+    /**
+     * 删除业务员
+     *
+     * @author lipf
+     * @date 2026/4/29 15:19
+     */
+    HttpResult<Boolean> deleteUserInfo(IsDeleteVo isDeleteVo);
 
     /**
      * 用户的启用/禁用/删除操作
@@ -162,11 +168,13 @@ public interface SysUserService extends IService<SysUser> {
     AuditCountVo getAuditCount(SysUserInfoParam sysUserInfoParam);
 
     /**
-     * 获取用户租户列表
+     * 获取用户的租户列表(状态为启用的租户)
      *
-     * @return userId 用户序号(sys_user 表的序号)
+     * @param userName 用户名或手机号
+     * @author lipf
+     * @date 2026/4/29 11:34
      */
-    List<SysTennatVo> getTenantList(String userId);
+    List<SysTennatVo> getTenantList(String userName);
 
     /**
      * 校验短信验证码

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java

@@ -114,7 +114,7 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
             AssertionUtils.isFail(true, "提现申请已完成付款!");
         }
         String userName = baseController.getUserName();
-        if (userName.equals(audit.getReceiveUser())) {
+        if (!userName.equals(audit.getReceiveUser())) {
             AssertionUtils.isFail(true, "已放弃提现申请付款任务!");
         }
 

+ 29 - 6
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDeptServiceImpl.java

@@ -1,6 +1,6 @@
 package com.jzg.organization.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.core.base.BaseController;
@@ -17,6 +17,8 @@ import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.commons.entity.vo.SysDeptVo;
 import com.jzg.organization.mapper.SysDeptMapper;
 import com.jzg.organization.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -28,6 +30,8 @@ import java.util.stream.Collectors;
 @Service
 public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements SysDeptService {
 
+    private static final Logger log = LoggerFactory.getLogger(SysDeptServiceImpl.class);
+
     @Autowired
     private SysDeptMapper sysDeptMapper;
 
@@ -46,15 +50,24 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
     @Autowired
     SysUserJzgInfoService sysUserJzgInfoService;
 
-    private void validateDept(SysDeptVo sysDeptVo,boolean isAdd){
+    /**
+     * 校验租户下机构的唯一性
+     *
+     * @param systemCode 租户代码
+     * @author lipf
+     * @date 2026/4/29 11:58
+     */
+    private void validateDept(SysDeptVo sysDeptVo,boolean isAdd, String systemCode){
         if(isAdd){
             if(this.count(new LambdaQueryWrapper<SysDept>()
-                    .eq(SysDept::getName, sysDeptVo.getName())) > 0){
+                    .eq(SysDept::getName, sysDeptVo.getName())
+                    .eq(SysDept::getSystemCode, systemCode)) > 0){
                 throw new SystemException("机构名称已存在");
             }
         }else{
             if(this.count(new LambdaQueryWrapper<SysDept>()
                .eq(SysDept::getName, sysDeptVo.getName())
+                    .eq(SysDept::getSystemCode, systemCode)
                .ne(SysDept::getId, sysDeptVo.getId())) > 0){
                 throw new SystemException("机构名称已存在");
            }
@@ -62,10 +75,19 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
     }
 
+    /**
+     * 租户下新增部门
+     *
+     * @author lipf
+     * @date 2026/4/29 11:56
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean addDept(SysDeptVo sysDeptVo) {
-        validateDept(sysDeptVo,true);
+        String userName = baseController.getUserName();
+        String systemCode = baseController.getSystemCode();
+        log.info("租户[{}]下的用户[{}]新增部门.部门信息[{}]", systemCode, userName, JSONUtil.toJsonStr(sysDeptVo));
+        validateDept(sysDeptVo,true,systemCode);
 
         SysDept sysDept = new SysDept();
         BeanUtils.copyProperties(sysDeptVo, sysDept);
@@ -115,10 +137,11 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
     @Override
     @Transactional
     public boolean updateDept(SysDeptVo sysDeptVo) {
-        validateDept(sysDeptVo,false);
+        String systemCode = baseController.getSystemCode();
+        log.info("修改租户[{}]下的部门信息[{}]",systemCode, JSONUtil.toJsonStr(sysDeptVo));
+        validateDept(sysDeptVo,false,systemCode);
         sysDeptMapper.updateById(getSysDept(sysDeptVo));
         return true;
-
     }
 
 

+ 6 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoSalesmanServiceImpl.java

@@ -2,8 +2,8 @@ package com.jzg.organization.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.entity.po.SysUserJzgInfoSalesman;
 import com.jzg.organization.mapper.SysUserJzgInfoSalesmanMapper;
 import com.jzg.organization.service.SysUserJzgInfoSalesmanService;
@@ -27,6 +27,9 @@ public class SysUserJzgInfoSalesmanServiceImpl extends ServiceImpl<SysUserJzgInf
 
     private static final Logger log = LoggerFactory.getLogger(SysUserJzgInfoSalesmanServiceImpl.class);
 
+    @Autowired
+    private BaseController baseController;
+
     @Autowired
     private SysUserJzgInfoSalesmanMapper sysUserJzgInfoSalesmanMapper;
 
@@ -37,8 +40,9 @@ public class SysUserJzgInfoSalesmanServiceImpl extends ServiceImpl<SysUserJzgInf
      */
     @Override
     public Map<String, String> queryAllTypeAttrMap() {
+        String systemCode = baseController.getSystemCode();
         List<SysUserJzgInfoSalesman> sysUserJzgInfoSalesmen = sysUserJzgInfoSalesmanMapper.selectList(null);
-        log.info("查询出[{}]个人员的类型信息", CollectionUtil.size(sysUserJzgInfoSalesmen));
+        log.info("查询出[{}]个人员的类型信息。systemCode=[{}]", CollectionUtil.size(sysUserJzgInfoSalesmen), systemCode);
         Map<String, String> resultMap = sysUserJzgInfoSalesmen.stream()
                 .filter(action-> StrUtil.isNotEmpty(action.getSysUserJzgInfoId()) && StrUtil.isNotEmpty(action.getTypeAttr()))
                 .filter(action-> action.getSysUserJzgInfoId() != null && action.getTypeAttr() != null)

+ 9 - 5
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -195,6 +195,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             sysUserInfoListVo.setStatus(null);
             typeStatus.add(UserState.UserStateEnum.COMPANY_REVIEW_ING.getValue());
             typeStatus.add(UserState.UserStateEnum.RESIGN_ING.getValue());
+            typeStatus.add(UserState.UserStateEnum.NOT_CERT.getValue());
             sysUserInfoListVo.setTypeStatus(typeStatus);
         }
         // 前端 查询成员和查询业务员的接口,都使用的是这个接口,但是他们区分的时候,差异很大,因此这里将查询成员和查询业务员的接口拆分开来
@@ -214,6 +215,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             );
         }else if("1".equals(sysUserInfoListVo.getIsMember())){
             // 查询成员
+            log.info("查询成员信息:sysUserInfoListVo=[{}]",JSONUtil.toJsonStr(sysUserInfoListVo)  );
             userInfoList = sysUserJzgInfoMapper.queryMember(page, sysUserInfoListVo);
         }else{
             // 其他场景先使用原来的逻辑
@@ -366,17 +368,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     }
 
     /**
-     * 获取用户的租户列表
+     * 获取用户的租户列表(状态为启用的租户)
      *
+     * @param userName 表示手机号或者用户登录名
      * @author lipf
      * @date 2026/4/24 18:05
      */
     @Override
-    public List<SysTennatVo> getTenantList(String userId) {
-        log.info("获取用户的租户列表:userId=[{}]", userId);
+    public List<SysTennatVo> getTenantList(String userName) {
+        log.info("获取用户的租户列表:userId=[{}]", userName);
         // 租户id
-        String systemCode = (String) redissonClient.getBucket(RedisKeyConstants.APP_SYSTEM_CODE + userId).get();
-        List<SysTennatVo> tenantList = sysUserJzgInfoMapper.getTenantList(userId);
+        String systemCode = (String) redissonClient.getBucket(RedisKeyConstants.APP_SYSTEM_CODE + userName).get();
+        List<SysTennatVo> tenantList = sysUserJzgInfoMapper.getTenantList(userName);
         tenantList.forEach(item -> {
             String presignedObjectUrl = MinioUtils.getPresignedObjectUrl(bucketName, item.getSysIcon());
             item.setIconAddress(presignedObjectUrl);
@@ -384,6 +387,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 item.setDefaultValue(true);
             }
         });
+        log.info("获取用户的租户列表: userName=[{}],tenantList=[{}]", userName,JSONUtil.toJsonStr(tenantList));
         return tenantList;
     }
 

+ 1 - 1
tenant/organization/src/main/resources/mapper/SysUserAccountMapper.xml

@@ -49,7 +49,7 @@
         SELECT
         sua.id,suji.name,su.mobile, suji.type_attr as attrType, so.name as organizationName,
         sd.name as deptName, sua.sum_amount as sumAmount, sua.sum_amount_paid as sumAmountPaid,
-        sua.sum_amount_unpaid as sumAmountUnpaid
+        sua.sum_amount_unpaid as sumAmountUnpaid, suji.work_number as workNumber
         FROM
         sys_user_account sua
         LEFT JOIN sys_user_jzg_info suji on suji.user_id = sua.user_id

+ 1 - 1
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -308,7 +308,7 @@
                 LEFT JOIN sys_dept sd ON sd.id = suji.dept_id
                 LEFT JOIN sys_upload_files suf on suf.id = ss.sys_icon
         WHERE
-            ( mobile = #{userId} OR username = #{userId})
+            ( mobile = #{userName} OR username = #{userName})
         AND suji.system_code != 'APP'
         AND suji.is_enable = 0
     </select>